From 8ef3dc8e063c058b7b6ae1fcfc5d39fe33172925 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 16 Feb 2017 11:28:40 +0100 Subject: [PATCH] Added support for reseller quota. see #1035 --- modoboa/admin/forms/account.py | 4 +- modoboa/admin/forms/domain.py | 8 ++-- modoboa/admin/handlers.py | 2 +- modoboa/admin/lib.py | 4 +- modoboa/admin/models/alias.py | 2 +- modoboa/admin/models/base.py | 12 +++++ modoboa/admin/models/domain.py | 3 ++ modoboa/admin/serializers.py | 12 +++-- .../admin/templates/admin/domain_detail.html | 8 +++- modoboa/admin/views/alias.py | 2 +- modoboa/admin/views/domain.py | 2 +- modoboa/core/signals.py | 2 +- modoboa/limits/app_settings.py | 10 ++++ modoboa/limits/constants.py | 9 +++- modoboa/limits/handlers.py | 14 +++--- .../migrations/0006_auto_20170216_1112.py | 32 +++++++++++++ modoboa/limits/models.py | 41 ++++++++++++---- modoboa/limits/tests/test_api.py | 5 +- modoboa/limits/tests/test_import.py | 48 +++++++++---------- modoboa/limits/tests/test_user_limits.py | 35 ++++++++++---- 20 files changed, 188 insertions(+), 67 deletions(-) create mode 100644 modoboa/limits/migrations/0006_auto_20170216_1112.py diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index fd9b1035b..44f4cb2d4 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -306,7 +306,7 @@ class AccountFormMail(forms.Form, DynamicForm): if not user.can_access(self.domain): raise lib_exceptions.PermDeniedException core_signals.can_create_object.send( - self.__class__, context=user, object_type="mailboxes") + self.__class__, context=user, klass=models.Mailbox) self.mb = models.Mailbox( address=self.locpart, domain=self.domain, user=account, use_domain_quota=self.cleaned_data["quota_act"]) @@ -330,7 +330,7 @@ class AccountFormMail(forms.Form, DynamicForm): if not self.aliases: return core_signals.can_create_object.send( - self.__class__, context=user, object_type="mailbox_aliases", + self.__class__, context=user, klass=models.Alias, count=len(self.aliases)) core_signals.can_create_object.send( self.__class__, context=self.mb.domain, diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index 5205a96e5..12db86505 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -128,6 +128,8 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm): """ d = super(DomainFormGeneral, self).save(commit=False) + core_signals.can_create_object.send( + sender=self.__class__, context=user, klass=Domain, instance=d) if not commit: return d d.save() @@ -138,7 +140,7 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm): self.aliases.remove(dalias.name) if self.aliases: core_signals.can_create_object.send( - self.__class__, context=user, object_type="domain_aliases", + self.__class__, context=user, klass=DomainAlias, count=len(self.aliases)) core_signals.can_create_object.send( self.__class__, context=d, object_type="domain_aliases", @@ -224,7 +226,7 @@ class DomainFormOptions(forms.Form): else: raise Conflict(_("User '%s' already exists") % username) core_signals.can_create_object.send( - self.__class__, context=user, object_type="mailboxes") + self.__class__, context=user, klass=Mailbox) da = User(username=username, email=username, is_active=True) da.set_password( param_tools.get_global_parameter("default_password", app="core")) @@ -248,7 +250,7 @@ class DomainFormOptions(forms.Form): ) if condition: core_signals.can_create_object.send( - self.__class__, context=user, object_type="mailbox_aliases") + self.__class__, context=user, klass=Alias) address = u"postmaster@{}".format(domain.name) alias = Alias.objects.create( address=address, domain=domain, enabled=True) diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index 53e7e7bd8..14d8dd860 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -205,7 +205,7 @@ def import_account_mailbox(sender, user, account, row, **kwargs): if not user.can_access(domain): raise exceptions.PermDeniedException core_signals.can_create_object.send( - sender="import", context=user, object_type="mailboxes") + sender="import", context=user, klass=models.Mailbox) core_signals.can_create_object.send( sender="import", context=domain, object_type="mailboxes") account.save() diff --git a/modoboa/admin/lib.py b/modoboa/admin/lib.py index 1888f0826..368757300 100644 --- a/modoboa/admin/lib.py +++ b/modoboa/admin/lib.py @@ -121,7 +121,7 @@ def import_domain(user, row, formopts): if not user.has_perm("admin.add_domain"): raise PermDeniedException(_("You are not allowed to import domains")) core_signals.can_create_object.send( - sender="import", context=user, object_type="domains") + sender="import", context=user, klass=Domain) dom = Domain() dom.from_csv(user, row) @@ -132,7 +132,7 @@ def import_domainalias(user, row, formopts): raise PermDeniedException( _("You are not allowed to import domain aliases.")) core_signals.can_create_object.send( - sender="import", context=user, object_type="domain_aliases") + sender="import", context=user, klass=DomainAlias) domalias = DomainAlias() domalias.from_csv(user, row) diff --git a/modoboa/admin/models/alias.py b/modoboa/admin/models/alias.py index db6c8ca9c..2d0c7b24b 100644 --- a/modoboa/admin/models/alias.py +++ b/modoboa/admin/models/alias.py @@ -180,7 +180,7 @@ class Alias(AdminObject): if not user.can_access(domain): raise PermDeniedException core_signals.can_create_object.send( - sender="import", context=user, object_type="mailbox_aliases") + sender="import", context=user, klass=Alias) core_signals.can_create_object.send( sender="import", context=domain, object_type="mailbox_aliases") if Alias.objects.filter(address=address).exists(): diff --git a/modoboa/admin/models/base.py b/modoboa/admin/models/base.py index 7b1e7c5e7..b58ab912a 100644 --- a/modoboa/admin/models/base.py +++ b/modoboa/admin/models/base.py @@ -23,6 +23,18 @@ class AdminObject(models.Model): class Meta: abstract = True + def __init__(self, *args, **kwargs): + """Custom constructor.""" + super(AdminObject, self).__init__(*args, **kwargs) + self._loaded_values = {} + + @classmethod + def from_db(cls, db, field_names, values): + """Store loaded values.""" + instance = super(AdminObject, cls).from_db(db, field_names, values) + instance._loaded_values = dict(zip(field_names, values)) + return instance + @property def objectname(self): if self._objectname is None: diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index 49547189e..666514796 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -266,6 +266,9 @@ class Domain(AdminObject): .format(self.name) ) self.enabled = (row[4].strip() in ["True", "1", "yes", "y"]) + core_signals.can_create_object.send( + sender=self.__class__, context=user, klass=Domain, + instance=self) self.save(creator=user) def to_csv(self, csvwriter): diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index e0a6a33b0..20a4e10fd 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -30,7 +30,11 @@ class DomainSerializer(serializers.ModelSerializer): def create(self, validated_data): """Set permissions.""" domain = models.Domain(**validated_data) - domain.save(creator=self.context["request"].user) + creator = self.context["request"].user + core_signals.can_create_object.send( + sender=self.__class__, context=creator, + klass=models.Domain, instance=domain) + domain.save(creator=creator) return domain @@ -54,7 +58,7 @@ class DomainAliasSerializer(serializers.ModelSerializer): try: core_signals.can_create_object.send( sender=self.__class__, context=creator, - object_type="domain_aliases") + klass=models.DomainAlias) core_signals.can_create_object.send( sender=self.__class__, context=domain_alias.target, object_type="domain_aliases") @@ -231,7 +235,7 @@ class WritableAccountSerializer(AccountSerializer): try: core_signals.can_create_object.send( sender=self.__class__, context=creator, - object_type="mailboxes") + klass=admin_models.Mailbox) core_signals.can_create_object.send( sender=self.__class__, context=domain, object_type="mailboxes") @@ -324,7 +328,7 @@ class AliasSerializer(serializers.ModelSerializer): try: core_signals.can_create_object.send( sender=self.__class__, context=creator, - object_type="mailbox_aliases") + klass=admin_models.Alias) core_signals.can_create_object.send( sender=self.__class__, context=self.domain, object_type="mailbox_aliases") diff --git a/modoboa/admin/templates/admin/domain_detail.html b/modoboa/admin/templates/admin/domain_detail.html index 0299af528..fbe3db7b4 100644 --- a/modoboa/admin/templates/admin/domain_detail.html +++ b/modoboa/admin/templates/admin/domain_detail.html @@ -1,7 +1,11 @@ {% extends "admin/header.html" %} -{% load i18n %} -{% load admin_tags %} +{% load admin_tags i18n lib_tags %} + +{% block extra_css %} + {{ block.super }} + {% extra_static_content "domains" "css" user %} +{% endblock %} {% block leftcol %}