diff --git a/modoboa/admin/templates/admin/information.html b/modoboa/admin/templates/admin/information.html new file mode 100644 index 000000000..ed6275672 --- /dev/null +++ b/modoboa/admin/templates/admin/information.html @@ -0,0 +1,17 @@ +{% load i18n libextras %} +

{% trans "Information" %} {% trans "Various information about Modoboa" %}


+

Modoboa {% get_version %} {% trans "is currently in use." %}

+ +

{% trans "Active users" %}

+ + + + + + + {% connected_users as users %}{% for u in users %} + + + + {% endfor %} +
{% trans "Name" %}{% trans "Group name" %}{% trans "Last login" %}
{{ u.username }}{{ u.group }}{{ u.last_login }}
diff --git a/modoboa/admin/templatetags/admin_extras.py b/modoboa/admin/templatetags/admin_extras.py index 21ff4f8a9..115821911 100644 --- a/modoboa/admin/templatetags/admin_extras.py +++ b/modoboa/admin/templatetags/admin_extras.py @@ -54,6 +54,10 @@ def settings_menu(selection, user): "url" : "parameters/", "img" : "", "label" : _("Parameters")}, + {"name" : "info", + "class" : "ajaxlink", + "url" : "info/", + "label" : _("Information")} ] return render_to_string('common/menu.html', { "entries" : entries, diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index aea38672a..7837441ed 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -16,6 +16,7 @@ urlpatterns = patterns( (r'^settings/parameters/save/$', 'saveparameters'), (r'^settings/extensions/$', 'viewextensions'), (r'^settings/extensions/save/$', 'saveextensions'), + (r'^settings/info/$', 'information'), (r'^permissions/remove/$', 'remove_permission'), diff --git a/modoboa/admin/views.py b/modoboa/admin/views.py index 28ea0ac8d..fef28f6e7 100644 --- a/modoboa/admin/views.py +++ b/modoboa/admin/views.py @@ -560,6 +560,14 @@ def saveextensions(request): status="ok", respmsg=_("Modifications applied.") )) +@login_required +@user_passes_test(lambda u: u.is_superuser) +def information(request, tplname="admin/information.html"): + return ajax_simple_response({ + "status" : "ok", + "content" : render_to_string(tplname, {}) + }) + def import_domain(user, row): """Specific code for domains import""" dom = Domain() diff --git a/modoboa/lib/templatetags/libextras.py b/modoboa/lib/templatetags/libextras.py index c34bf28e3..315bb39de 100644 --- a/modoboa/lib/templatetags/libextras.py +++ b/modoboa/lib/templatetags/libextras.py @@ -1,12 +1,14 @@ # coding: utf-8 import os -import datetime +from django.utils import timezone from django.conf import settings from django import template from django.contrib import messages from django.template import Template, Context from django.template.loader import render_to_string from django.core.urlresolvers import reverse +from django.contrib.sessions.models import Session +from datetime import datetime from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.lib import events from modoboa.lib.sysutils import exec_cmd @@ -16,16 +18,8 @@ register = template.Library() @register.simple_tag def get_version(): - if os.path.isdir("%s/.hg" % settings.MODOBOA_DIR): - version = "dev-" - code, output = exec_cmd("hg id -i", cwd=settings.MODOBOA_DIR) - version += output.rstrip() - return version - elif os.path.exists("%s/VERSION" % settings.MODOBOA_DIR): - code, output = exec_cmd("cat %s/VERSION" % settings.MODOBOA_DIR) - return output.rstrip() - else: - return "Unknown" + import pkg_resources + return pkg_resources.get_distribution("modoboa").version @register.simple_tag def join(items, sep=','): @@ -180,3 +174,32 @@ def progress_color(value): @register.filter def fromunix(value): return datetime.datetime.fromtimestamp(int(value)) + +class ConnectedUsers(template.Node): + def __init__(self, varname): + self.varname = varname + + def render(self, context): + from modoboa.admin.models import User + + sessions = Session.objects.filter(expire_date__gte=timezone.now()) + uid_list = [] + + # Build a list of user ids from that query + for session in sessions: + data = session.get_decoded() + uid = data.get('_auth_user_id', None) + if uid: + uid_list.append(uid) + + # Query all logged in users based on id list + context[self.varname] = [User.objects.get(pk=uid) for uid in uid_list] + return '' + +@register.tag +def connected_users(parser, token): + try: + tag, a, varname = token.split_contents() + except ValueError: + raise template.TemplateSyntaxError('connected_users usage: {% connected_users as users %}') + return ConnectedUsers(varname)