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" %}
+
+
+ | {% trans "Name" %} |
+ {% trans "Group name" %} |
+ {% trans "Last login" %} |
+
+ {% connected_users as users %}{% for u in users %}
+ | {{ u.username }} |
+ {{ u.group }} |
+ {{ u.last_login }} |
+
{% endfor %}
+
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)