diff --git a/admin/forms.py b/admin/forms.py
index 04d5ef26b..9222f8207 100644
--- a/admin/forms.py
+++ b/admin/forms.py
@@ -55,27 +55,22 @@ class AliasForm(forms.ModelForm):
model = Alias
fields = ('address', 'mboxes', 'enabled')
-class PermissionForm(forms.Form):
- domain = forms.ModelChoiceField(queryset=Domain.objects.all(), label=_("Domain"),
- required=True,
- help_text=_("Select a domain in the list"))
- user = forms.ChoiceField(label=_("User"), required=True,
- help_text=_("Select a user in the list"))
- role = forms.ChoiceField(label=_("Role"), required=True,
- choices=(("SuperAdmins", _("Super administrator")),
- ("DomainAdmins", _("Domain administrator"))),
- help_text=_("Select the role you want this user to have"))
-
class SuperAdminForm(forms.Form):
- user = forms.ModelChoiceField(queryset=User.objects.all(),
- label=_("User"), required=True,
+ user = forms.ModelChoiceField([], label=_("User"), required=True,
+ empty_label=_("Select a user"),
help_text=_("Select a user in the list"))
+ def __init__(self, user, *args, **kwargs):
+ super(SuperAdminForm, self).__init__(*args, **kwargs)
+ self.fields["user"].queryset = User.objects.exclude(pk__in=[1, user.id])
+
class DomainAdminForm(forms.Form):
domain = forms.ModelChoiceField(queryset=Domain.objects.all(), label=_("Domain"),
required=True,
+ empty_label=_("Select a domain"),
help_text=_("Select a domain in the list"))
user = forms.ChoiceField(label=_("User"), required=True,
+ choices=[("", _("Empty"))],
help_text=_("Select a user in the list"))
class SuperAdminsTable(tables.Table):
diff --git a/admin/permissions.py b/admin/permissions.py
index 8f8086443..8892d4c4a 100644
--- a/admin/permissions.py
+++ b/admin/permissions.py
@@ -2,7 +2,7 @@
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User, Group
-from modoboa.lib import _render
+from modoboa.lib import _render, getctx, _render_to_string
from forms import *
class Permissions(object):
@@ -23,20 +23,23 @@ class Permissions(object):
raise NotImplementedError
class SuperAdminsPerms(Permissions):
+ title = _("Add super administrator")
+ role = "super_admins"
+
@staticmethod
def is_auhorized(user):
return user.is_superuser
def get_add_form(self, request):
- form = SuperAdminForm()
+ form = SuperAdminForm(request.user)
return _render(request, 'admin/add_permission.html', {
"form" : form,
- "title" : _("Add super administrator"),
- "role": "super_admins"
+ "title" : self.title,
+ "role": self.role
})
def add(self, request):
- form = SuperAdminForm(request.POST)
+ form = SuperAdminForm(request.user, request.POST)
if form.is_valid():
user = User.objects.get(pk=request.POST["user"])
user.is_superuser = True
@@ -44,10 +47,12 @@ class SuperAdminsPerms(Permissions):
user.save()
return True, None
- ctx = _ctx_ko("admin/add_superadmin.html", {
- "form" : form
+ content = _render_to_string(request, "admin/add_permission.html", {
+ "form" : form,
+ "title" : self.title,
+ "role" : self.role
})
- return False, ctx
+ return False, getctx("ko", content=content)
def delete(self, selection):
for s in selection:
@@ -69,32 +74,38 @@ class SuperAdminsPerms(Permissions):
class DomainAdminsPerms(Permissions):
+ title = _("Add domain administrator")
+ role = "domain_admins"
+
@staticmethod
- def is_auhorized(user):
- return True
+ def is_authorized(user):
+ return user.has_perm("admin.view_domains")
def get_add_form(self, request):
form = DomainAdminForm()
return _render(request, 'admin/add_domain_admin.html', {
- "form" : form, "title" : _("Add domain administrator"),
- "role" : "domain_admins"
+ "form" : form,
+ "title" : self.title,
+ "role" : self.role
})
def add(self, request):
form = DomainAdminForm(request.POST)
- mboxid = request.POST['user']
- form.fields["user"].choices = \
- [(mboxid, Mailbox.objects.get(pk=mboxid)),]
+ if request.POST.has_key("user") and request.POST["user"] != "":
+ mboxid = request.POST['user']
+ mb = Mailbox.objects.get(pk=mboxid)
+ form.fields["user"].choices = [(mboxid, mb),]
if form.is_valid():
- mb = Mailbox.objects.get(pk=request.POST["user"])
mb.user.is_superuser = False
mb.user.groups.add(Group.objects.get(name="DomainAdmins"))
mb.user.save()
return True, None
- ctx = _ctx_ko("admin/add_domain_admin.html", {
- "form" : form
+ content = _render_to_string(request, "admin/add_domain_admin.html", {
+ "form" : form,
+ "title" : self.title,
+ "role" : self.role
})
- return False, ctx
+ return False, getctx("ko", content=content)
def delete(self, selection):
for s in selection:
@@ -111,6 +122,19 @@ class DomainAdminsPerms(Permissions):
return DomainAdminsTable(domadmins_list).render(request)
def get_perms_class(user, role):
+ """Retrieves the class associated to a given role
+
+ The provided user must have the required permission to retrieve
+ this class.
+
+ If "role" is one of those provided by the admin component, its
+ class is directly returned. Otherwise, a "PermsGetClass" event is
+ raised to check if one of the active plugins provide the desired
+ class.
+
+ :param user: a User object
+ :param role: the role to look for
+ """
parts = role.split("_")
cname = ""
for p in parts:
@@ -120,4 +144,7 @@ def get_perms_class(user, role):
if globals()[cname].is_auhorized(user):
return globals()[cname]
return None
- # else raise event for plugins
+ res = events.raiseQueryEvent("PermsGetClass", role=role)
+ if not len(res):
+ return None
+ return res[0]
diff --git a/admin/views.py b/admin/views.py
index 873c93c63..f158a4a4b 100644
--- a/admin/views.py
+++ b/admin/views.py
@@ -115,7 +115,7 @@ def editdomain(request, dom_id):
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
form = DomainForm(instance=domain)
- return render_to_response('admin/editdomain.html', {
+ return _render(request, 'admin/editdomain.html', {
"domain" : domain, "form" : form
})
@@ -142,7 +142,7 @@ def mailboxes(request, dom_id=None):
@good_domain
@permission_required("admin.view_mailboxes")
def mailboxes_raw(request, dom_id=None):
- mailboxes = Mailbox.objects.filter(domain=dom_id)
+ mailboxes = Mailbox.objects.filter(domain=dom_id).exclude(user__id=request.user.id)
return _render(request, 'admin/mailboxes_raw.html', {
"mailboxes" : mailboxes
})
@@ -310,7 +310,7 @@ def newalias(request, dom_id):
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
form = AliasForm(domain=domain)
- return render_to_response('admin/newalias.html', {
+ return _render(request, 'admin/newalias.html', {
"domain" : dom_id, "form" : form, "noerrors" : True
})
diff --git a/extensions/webmail/static/css/webmail.css b/extensions/webmail/static/css/webmail.css
index f89ad4ac2..84553db93 100644
--- a/extensions/webmail/static/css/webmail.css
+++ b/extensions/webmail/static/css/webmail.css
@@ -44,7 +44,7 @@ html > body #listing {
border-bottom: 1px solid #C8D6E8;
user-select: none; /* CSS3 */
-moz-user-select: none; /* Gecko (Firefox) */
- -khtml-user-select:none; /* Webkit (Safari, Chrome) */
+ -khtml-user-select: none; /* Webkit (Safari, Chrome) */
}
tr.selected {
diff --git a/extensions/webmail/templates/webmail/index.html b/extensions/webmail/templates/webmail/index.html
index f4eb45c47..aa616bd3c 100644
--- a/extensions/webmail/templates/webmail/index.html
+++ b/extensions/webmail/templates/webmail/index.html
@@ -211,12 +211,6 @@
var fromrow = -1;
var torow = -1;
- $(document.body).addEvent("keydown", function(event) {
- if (event.shift) {
- event.stop();
- }
- });
-
/* The IE way for disabling default selection */
$$("tbody>tr").set("unselectable", "on");
diff --git a/lib/events.py b/lib/events.py
index afb65a3ce..6372f9be7 100644
--- a/lib/events.py
+++ b/lib/events.py
@@ -16,6 +16,7 @@ events = ["CreateDomain",
"AdminMenuDisplay",
"PermsGetTables",
+ "PermsGetClass",
"UserLogin",
"UserLogout"]
diff --git a/static/css/default.css b/static/css/default.css
index d89bcc6ed..d086af317 100644
--- a/static/css/default.css
+++ b/static/css/default.css
@@ -349,7 +349,7 @@ div.row {
div.row label {
float: left;
- width: 200px;
+ width: 300px;
padding: 3px 0;
}
diff --git a/static/js/form.js b/static/js/form.js
index 73e4d1776..b40b57f01 100644
--- a/static/js/form.js
+++ b/static/js/form.js
@@ -33,7 +33,12 @@ window.addEvent("domready", function() {
generic_submit(this, event, "aliasform", alias_submit);
};
permission_submit = function(event) {
- generic_submit(this, event, "permform", permission_submit);
+ generic_submit(this, event, "permform", permission_submit, function() {
+ if ($defined($("id_domain"))) {
+ $("id_domain").options[0].setProperty("selected", "selected");
+ domadminform_init();
+ }
+ });
};
chpassword_submit = function(event) {
generic_submit(this, event, "chpwdform", chpassword_submit);
diff --git a/templates/admin/add_domain_admin.html b/templates/admin/add_domain_admin.html
index 2ae58fd3f..d6217ca2c 100644
--- a/templates/admin/add_domain_admin.html
+++ b/templates/admin/add_domain_admin.html
@@ -3,18 +3,23 @@
{{ block.super }}
{% endblock %}
diff --git a/templates/admin/mailboxes_raw.html b/templates/admin/mailboxes_raw.html
index f77fbdd7e..3c4d9974a 100644
--- a/templates/admin/mailboxes_raw.html
+++ b/templates/admin/mailboxes_raw.html
@@ -1,3 +1,5 @@
+{% load i18n %}
+
{% for mb in mailboxes %}
-{% endfor %}
\ No newline at end of file
+{% endfor %}