diff --git a/admin/forms.py b/admin/forms.py index 446bfab63..4028ddf2f 100644 --- a/admin/forms.py +++ b/admin/forms.py @@ -14,10 +14,13 @@ class DomainForm(forms.ModelForm): class MailboxForm(forms.ModelForm): quota = forms.IntegerField(label=_("Quota"), required=False) - password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) - password2 = forms.CharField(label=_("Confirmation"), widget=forms.PasswordInput) + password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput, + help_text=_("Password used to log in")) + password2 = forms.CharField(label=_("Confirmation"), widget=forms.PasswordInput, + help_text=_("Password confirmation")) enabled = forms.BooleanField(label=gender("Enabled", "f"), required=False, - initial=True) + initial=True, + help_text=_("Check to activate this mailbox")) class Meta: model = Mailbox @@ -50,8 +53,11 @@ class AliasForm(forms.ModelForm): class PermissionForm(forms.Form): domain = forms.ModelChoiceField(queryset=Domain.objects.all(), label=_("Domain"), - required=True) - user = forms.ChoiceField(label=_("User"), required=True) + 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")))) + ("DomainAdmins", _("Domain administrator"))), + help_text=_("Select the role you want this user to have")) diff --git a/admin/models.py b/admin/models.py index c384c3c1c..6c4c6fe04 100644 --- a/admin/models.py +++ b/admin/models.py @@ -6,9 +6,11 @@ from mailng.lib import exec_pipe, exec_as_vuser import os class Domain(models.Model): - name = models.CharField(_('name'), max_length=100) - quota = models.IntegerField() - enabled = models.BooleanField(_('enabled')) + name = models.CharField(_('name'), max_length=100, + help_text=_("The domain name")) + quota = models.IntegerField(help_text=_("Default quota in MB applied to mailboxes")) + enabled = models.BooleanField(_('enabled'), + help_text=_("Check to activate this domain")) class Meta: permissions = ( @@ -33,11 +35,13 @@ class Domain(models.Model): return self.name class Mailbox(models.Model): - name = models.CharField(_('name'), max_length=100) - address = models.CharField(_('address'), max_length=100) + name = models.CharField(_('name'), max_length=100, + help_text=_("First name and last name of mailbox owner")) + address = models.CharField(_('address'), max_length=100, + help_text=_("Mailbox address (without the @domain.tld part)")) full_address = models.CharField(max_length=150) password = models.CharField(_('password'), max_length=100) - quota = models.IntegerField() + quota = models.IntegerField(help_text=_("Mailbox quota in MB (default to domain quota if blank)")) uid = models.IntegerField() gid = models.IntegerField() path = models.CharField(max_length=200) @@ -99,10 +103,13 @@ class Mailbox(models.Model): self.domain.name, self.address)) class Alias(models.Model): - address = models.CharField(_('address'), max_length=100) + address = models.CharField(_('address'), max_length=100, + help_text=_("The alias address (without the domain part)")) full_address = models.CharField(max_length=150) - mbox = models.ForeignKey(Mailbox, verbose_name=_('mailbox')) - enabled = models.BooleanField(_('enabled')) + mbox = models.ForeignKey(Mailbox, verbose_name=_('mailbox'), + help_text=_("The mailbox this alias points to")) + enabled = models.BooleanField(_('enabled'), + help_text=_("Check to activate this alias")) class Meta: permissions = ( diff --git a/admin/views.py b/admin/views.py index efcbd14e9..cbeae3cf2 100644 --- a/admin/views.py +++ b/admin/views.py @@ -4,6 +4,7 @@ from django.template import RequestContext from django.http import HttpResponse, HttpResponseRedirect from django.utils import simplejson from django.utils.translation import ugettext as _ +from django.utils.http import urlquote from django.core import serializers from django.core.urlresolvers import reverse from django.contrib.auth.decorators \ @@ -23,6 +24,21 @@ def is_superuser(user): return False return True +def good_domain(f): + def dec(request, dom_id, **kwargs): + if request.user.is_superuser: + return f(request, dom_id, **kwargs) + mb = Mailbox.objects.get(user=request.user.id) + domid = isinstance(dom_id, str) and "%d" % dom_id or dom_id + if domid == mb.domain.id: + return f(request, domid, **kwargs) + + from django.conf import settings + path = urlquote(request.get_full_path()) + login_url = settings.LOGIN_URL + return HttpResponseRedirect("%s?next=%s" % (login_url, path)) + return dec + @login_required def domains(request): if not request.user.has_perm("admin.view_domains"): @@ -41,10 +57,8 @@ def domains(request): }) @login_required -@permission_required("admin.add_mailbox") +@permission_required("admin.add_domain") def newdomain(request): - if not is_superuser(request.user): - return mailboxes(request, dom_id) if request.method == "POST": form = DomainForm(request.POST) error = None @@ -71,10 +85,8 @@ def newdomain(request): }) @login_required -@permission_required("admin.change_mailbox") +@permission_required("admin.change_domain") def editdomain(request, dom_id): - if not is_superuser(request.user): - return mailboxes(request, dom_id) domain = Domain.objects.get(pk=dom_id) if request.method == "POST": form = DomainForm(request.POST, instance=domain) @@ -110,6 +122,7 @@ def deldomain(request, dom_id): return HttpResponseRedirect('/mailng/admin/') @login_required +@good_domain @permission_required("admin.view_mailboxes") def mailboxes(request, dom_id=None): domain = Domain.objects.get(pk=dom_id) @@ -119,6 +132,7 @@ def mailboxes(request, dom_id=None): }) @login_required +@good_domain @permission_required("admin.view_mailboxes") def mailboxes_raw(request, dom_id=None): mailboxes = Mailbox.objects.filter(domain=dom_id) @@ -127,6 +141,7 @@ def mailboxes_raw(request, dom_id=None): }) @login_required +@good_domain @permission_required("admin.add_mailbox") def newmailbox(request, dom_id=None): domain = Domain.objects.get(pk=dom_id) @@ -183,6 +198,7 @@ def newmailbox(request, dom_id=None): }) @login_required +@good_domain @permission_required("admin.change_mailbox") def editmailbox(request, dom_id, mbox_id=None): mb = Mailbox.objects.get(pk=mbox_id) @@ -231,6 +247,7 @@ def editmailbox(request, dom_id, mbox_id=None): }) @login_required +@good_domain @permission_required("admin.delete_mailbox") def delmailbox(request, dom_id, mbox_id=None): mb = Mailbox.objects.get(pk=mbox_id) @@ -246,6 +263,7 @@ def delmailbox(request, dom_id, mbox_id=None): # args=[dom_id])) @login_required +@good_domain @permission_required("admin.view_aliases") def aliases(request, dom_id=None, mbox_id=None): domain = Domain.objects.get(pk=dom_id) @@ -261,6 +279,7 @@ def aliases(request, dom_id=None, mbox_id=None): }) @login_required +@good_domain @permission_required("admin.add_alias") def newalias(request, dom_id, mbox_id): mbox = Mailbox.objects.get(pk=mbox_id) @@ -289,6 +308,7 @@ def newalias(request, dom_id, mbox_id): }) @login_required +@good_domain @permission_required("admin.change_alias") def editalias(request, dom_id, alias_id): alias = Alias.objects.get(pk=alias_id) @@ -318,6 +338,7 @@ def editalias(request, dom_id, alias_id): }) @login_required +@good_domain @permission_required("admin.delete_alias") def delalias(request, dom_id, alias_id): alias = Alias.objects.get(pk=alias_id) diff --git a/extensions/amavis_quarantine/main.py b/extensions/amavis_quarantine/main.py index 3797f5529..d5d66a931 100644 --- a/extensions/amavis_quarantine/main.py +++ b/extensions/amavis_quarantine/main.py @@ -83,13 +83,12 @@ def render_listing(request, cursor): "subject" : row[2], "content" : row[3], "mailid" : row[4], "time" : datetime.fromtimestamp(row[5]), "type" : row[6]}) - paginator = Paginator(emails, 10) try: pagenum = int(request.GET.get('page', '1')) except ValueError: pagenum = 1 - page = paginator.page(pagenum) + page = paginator.page(pagenum) return render_to_string("amavis_quarantine/listing.html", { "count" : len(rows), "emails" : page, "current_page" : pagenum, diff --git a/extensions/amavis_quarantine/templates/index.html b/extensions/amavis_quarantine/templates/index.html index 0424e96fc..d50041d40 100644 --- a/extensions/amavis_quarantine/templates/index.html +++ b/extensions/amavis_quarantine/templates/index.html @@ -106,13 +106,15 @@ window.addEvent("domready", function() { mysubmit(event, "release"); }); - $("selectall").addEvent("click", function(event) { - if ($("selectall").checked) { - toggleSelection(true); - } else { - toggleSelection(false); - } - }); + if ($("selectall")) { + $("selectall").addEvent("click", function(event) { + if ($("selectall").checked) { + toggleSelection(true); + } else { + toggleSelection(false); + } + }); + } {% url extensions.amavis_quarantine.main.search as s_url %} $("searchfield").addEvent("change", function(event) { diff --git a/extensions/amavis_quarantine/templates/listing.html b/extensions/amavis_quarantine/templates/listing.html index 0b105b2ae..9ce78ec9c 100644 --- a/extensions/amavis_quarantine/templates/listing.html +++ b/extensions/amavis_quarantine/templates/listing.html @@ -1,5 +1,8 @@ {% load i18n %} +{% if not count %} +