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 %}