diff --git a/modoboa/extensions/admin/app_settings.py b/modoboa/extensions/admin/app_settings.py index 0ab9f3106..27b01a351 100644 --- a/modoboa/extensions/admin/app_settings.py +++ b/modoboa/extensions/admin/app_settings.py @@ -22,10 +22,20 @@ class AdminParametersForm(parameters.AdminParametersForm): help_text=ugettext_lazy("The UNIX account who owns mailboxes on the filesystem") ) + default_domain_quota = forms.IntegerField( + label=ugettext_lazy("Default domain quota"), + initial=0, + help_text=ugettext_lazy( + "Default quota (in MB) applied to freshly created domains with no " + "value specified. A value of 0 means no quota." + ), + widget=forms.TextInput(attrs={'class': 'span2'}) + ) + auto_account_removal = YesNoField( label=ugettext_lazy("Automatic account removal"), initial="no", - help_text=ugettext_lazy("When a mailbox is removed, also remove the associated account"), + help_text=ugettext_lazy("When a mailbox is removed, also remove the associated account") ) # Visibility rules @@ -46,3 +56,11 @@ class AdminParametersForm(parameters.AdminParametersForm): if hide_fields: del self.fields["handle_mailboxes"] del self.fields["mailboxes_owner"] + + def clean_default_domain_quota(self): + """Ensure quota is a positive integer.""" + if self.cleaned_data['default_domain_quota'] < 0: + raise forms.ValidationError( + ugettext_lazy('Must be a positive integer') + ) + return self.cleaned_data['default_domain_quota'] diff --git a/modoboa/extensions/admin/forms/account.py b/modoboa/extensions/admin/forms/account.py index 187a96894..ca9470f61 100644 --- a/modoboa/extensions/admin/forms/account.py +++ b/modoboa/extensions/admin/forms/account.py @@ -162,6 +162,22 @@ class AccountFormMail(forms.Form, DynamicForm): """Ensure lower case emails""" return self.cleaned_data["email"].lower() + def clean(self): + """Custom fields validation. + + Check if quota is >= 0 only when the domain value is not used. + """ + super(AccountFormMail, self).clean() + if self._errors: + raise forms.ValidationError(self._errors) + if not self.cleaned_data["quota_act"] \ + and self.cleaned_data['quota'] is not None: + if self.cleaned_data["quota"] < 0: + self._errors["quota"] = self.error_class( + [_("Must be a valid integer")]) + del self.cleaned_data["quota"] + return self.cleaned_data + def create_mailbox(self, user, account): locpart, domname = split_mailbox(self.cleaned_data["email"]) try: diff --git a/modoboa/extensions/admin/forms/domain.py b/modoboa/extensions/admin/forms/domain.py index c19b60d68..9bdfe81c5 100644 --- a/modoboa/extensions/admin/forms/domain.py +++ b/modoboa/extensions/admin/forms/domain.py @@ -1,7 +1,7 @@ from django import forms from django.http import QueryDict from django.utils.translation import ugettext as _, ugettext_lazy -from modoboa.lib import events +from modoboa.lib import events, parameters from modoboa.lib.exceptions import Conflict from modoboa.lib.formutils import ( DomainNameField, YesNoField, DynamicForm, TabForms @@ -13,6 +13,15 @@ from modoboa.extensions.admin.models import ( class DomainFormGeneral(forms.ModelForm, DynamicForm): + quota = forms.IntegerField( + label=ugettext_lazy("Quota"), + required=False, + help_text=ugettext_lazy( + "Default quota in MB applied to mailboxes. Leave empty to use the " + "default value." + ), + widget=forms.TextInput(attrs={"class": "span1"}) + ) aliases = DomainNameField( label=ugettext_lazy("Alias(es)"), required=False, @@ -25,9 +34,6 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm): class Meta: model = Domain fields = ("name", "quota", "aliases", "enabled") - widgets = dict( - quota=forms.widgets.TextInput(attrs={"class": "span1"}) - ) def __init__(self, *args, **kwargs): self.oldname = None @@ -43,6 +49,13 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm): name = "aliases_%d" % (pos + 1) self._create_field(forms.CharField, name, dalias.name, 3) + def clean_quota(self): + if self.cleaned_data['quota'] is None: + return int(parameters.get_admin('DEFAULT_DOMAIN_QUOTA')) + if self.cleaned_data['quota'] < 0: + raise forms.ValidationError(_("Must be a positive integer")) + return self.cleaned_data['quota'] + def clean(self): """Custom fields validation. diff --git a/modoboa/extensions/admin/models/domain.py b/modoboa/extensions/admin/models/domain.py index e7467d592..7c19710dd 100644 --- a/modoboa/extensions/admin/models/domain.py +++ b/modoboa/extensions/admin/models/domain.py @@ -27,9 +27,7 @@ class Domain(AdminObject): """ name = models.CharField(ugettext_lazy('name'), max_length=100, unique=True, help_text=ugettext_lazy("The domain name")) - quota = models.IntegerField( - help_text=ugettext_lazy("Default quota in MB applied to mailboxes") - ) + quota = models.IntegerField() enabled = models.BooleanField( ugettext_lazy('enabled'), help_text=ugettext_lazy("Check to activate this domain") diff --git a/modoboa/extensions/admin/tests/account.py b/modoboa/extensions/admin/tests/account.py index 547e170ab..8a79674bf 100644 --- a/modoboa/extensions/admin/tests/account.py +++ b/modoboa/extensions/admin/tests/account.py @@ -85,7 +85,8 @@ class PermissionsTestCase(ModoTestCase): self.user = User.objects.get(username='user@test.com') self.values = dict( username=self.user.username, role="DomainAdmins", - is_active=self.user.is_active, email="user@test.com" + is_active=self.user.is_active, email="user@test.com", + quota_act=True ) def tearDown(self): diff --git a/modoboa/extensions/admin/tests/domain.py b/modoboa/extensions/admin/tests/domain.py index 929afd3c8..9e3fba111 100644 --- a/modoboa/extensions/admin/tests/domain.py +++ b/modoboa/extensions/admin/tests/domain.py @@ -1,5 +1,6 @@ from django.core.urlresolvers import reverse from modoboa.core.models import User +from modoboa.lib import parameters from modoboa.lib.tests import ModoTestCase from modoboa.extensions.admin.models import ( Domain, Alias @@ -66,6 +67,22 @@ class DomainTestCase(ModoTestCase): self.assertIn(da.mailbox_set.all()[0], al.mboxes.all()) self.assertTrue(da.can_access(al)) + def test_create_using_default_quota(self): + parameters.save_admin('DEFAULT_DOMAIN_QUOTA', 50, app='admin') + values = { + "name": "pouet.com", "create_dom_admin": "yes", + "dom_admin_username": "toto", "create_aliases": "yes", + "stepid": 'step2' + } + self.ajax_post( + reverse("modoboa.extensions.admin.views.domain.newdomain"), + values + ) + dom = Domain.objects.get(name="pouet.com") + self.assertEqual(dom.quota, 50) + da = User.objects.get(username="toto@pouet.com") + self.assertEqual(da.mailbox_set.all()[0].quota, 50) + def test_modify(self): """Test the modification of a domain