From bf0bffad909016a9bdabb09fc4944db585d374e5 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 1 May 2014 17:54:21 +0200 Subject: [PATCH] Adapt identities state based on domain's state. fix #542 --- modoboa/extensions/admin/forms/account.py | 33 +++++++++++++++---- modoboa/extensions/admin/forms/alias.py | 5 +++ .../templates/admin/account_general_form.html | 12 +++++++ .../admin/templates/admin/aliasform.html | 4 +++ .../templates/admin/identities_table.html | 2 +- .../admin/templatetags/admin_tags.py | 15 +++++++++ modoboa/templates/common/generic_field.html | 4 +-- 7 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 modoboa/extensions/admin/templates/admin/account_general_form.html diff --git a/modoboa/extensions/admin/forms/account.py b/modoboa/extensions/admin/forms/account.py index 3c9f3d7c0..5056c7660 100644 --- a/modoboa/extensions/admin/forms/account.py +++ b/modoboa/extensions/admin/forms/account.py @@ -6,7 +6,7 @@ from modoboa.lib.exceptions import PermDeniedException, Conflict, NotFound from modoboa.lib.permissions import get_account_roles from modoboa.lib.emailutils import split_mailbox from modoboa.lib.formutils import ( - DomainNameField, DynamicForm, TabForms, YesNoField + DomainNameField, DynamicForm, TabForms ) from modoboa.core.models import User from modoboa.extensions.admin.models import ( @@ -58,18 +58,35 @@ class AccountFormGeneral(forms.ModelForm): if 'instance' in kwargs else get_account_roles(user) if "instance" in kwargs: - if args \ - and (args[0].get("password1", "") == "" - and args[0].get("password2", "") == ""): - self.fields["password1"].required = False - self.fields["password2"].required = False account = kwargs["instance"] + domain_disabled = account.mailbox_set.count() and \ + not account.mailbox_set.all()[0].domain.enabled + if domain_disabled: + self.fields["is_active"].widget.attrs['disabled'] = "disabled" + if args: + if args[0].get("password1", "") == "" \ + and args[0].get("password2", "") == "": + self.fields["password1"].required = False + self.fields["password2"].required = False + if domain_disabled: + del self.fields["is_active"] self.fields["role"].initial = account.group if not account.is_local \ and parameters.get_admin("LDAP_AUTH_METHOD", app="core") == "directbind": del self.fields["password1"] del self.fields["password2"] + def domain_is_disabled(self): + """Little shortcut to get the domain's state. + + We need this information inside a template and the form is the + only object available... + + """ + if not self.instance.mailbox_set.count(): + return False + return self.instance.mailbox_set.all()[0].domain.enabled == False + def clean_role(self): if self.user.group == "DomainAdmins": if self.instance == self.user: @@ -323,7 +340,9 @@ class AccountForm(TabForms): def __init__(self, user, *args, **kwargs): self.user = user self.forms = [ - dict(id="general", title=_("General"), cls=AccountFormGeneral, + dict(id="general", title=_("General"), + formtpl="admin/account_general_form.html", + cls=AccountFormGeneral, new_args=[user], mandatory=True), dict(id="mail", title=_("Mail"), formtpl="admin/mailform.html", cls=AccountFormMail), diff --git a/modoboa/extensions/admin/forms/alias.py b/modoboa/extensions/admin/forms/alias.py index 555b98802..a16b14257 100644 --- a/modoboa/extensions/admin/forms/alias.py +++ b/modoboa/extensions/admin/forms/alias.py @@ -37,10 +37,15 @@ class AliasForm(forms.ModelForm, DynamicForm): self.fields.keyOrder = ['email', 'recipients', 'enabled'] if len(args) and isinstance(args[0], QueryDict): + if "instance" in kwargs: + if not kwargs["instance"].domain.enabled: + del self.fields["enabled"] self._load_from_qdict(args[0], "recipients", forms.EmailField) elif "instance" in kwargs: dlist = kwargs["instance"] self.fields["email"].initial = dlist.full_address + if not dlist.domain.enabled: + self.fields["enabled"].widget.attrs["disabled"] = "disabled" cpt = 1 for al in dlist.aliases.all(): name = "recipients_%d" % cpt diff --git a/modoboa/extensions/admin/templates/admin/account_general_form.html b/modoboa/extensions/admin/templates/admin/account_general_form.html new file mode 100644 index 000000000..a7980337b --- /dev/null +++ b/modoboa/extensions/admin/templates/admin/account_general_form.html @@ -0,0 +1,12 @@ +{% load lib_tags %} +{% render_field form.role %} +{% render_field form.username %} +{% render_field form.first_name %} +{% render_field form.last_name %} +{% render_field form.password1 %} +{% render_field form.password2 %} +{% if form.domain_is_disabled %} +{% include "common/generic_field.html" with field=form.is_active inline_message=_("Domain is disabled") extra_classes="info" %} +{% else %} +{% render_field form.is_active %} +{% endif %} diff --git a/modoboa/extensions/admin/templates/admin/aliasform.html b/modoboa/extensions/admin/templates/admin/aliasform.html index 6a13e26c9..b82adfbf9 100644 --- a/modoboa/extensions/admin/templates/admin/aliasform.html +++ b/modoboa/extensions/admin/templates/admin/aliasform.html @@ -2,5 +2,9 @@ {% block formbody %} {% render_field form.email %} {% render_fields_group form "recipients" %} +{% if form.instance.domain.enabled %} {% render_field form.enabled %} +{% else %} +{% include "common/generic_field.html" with field=form.enabled inline_message=_("Domain is disabled") extra_classes="info" %} +{% endif %} {% endblock %} diff --git a/modoboa/extensions/admin/templates/admin/identities_table.html b/modoboa/extensions/admin/templates/admin/identities_table.html index 0d5200c6c..31d9693bb 100644 --- a/modoboa/extensions/admin/templates/admin/identities_table.html +++ b/modoboa/extensions/admin/templates/admin/identities_table.html @@ -10,7 +10,7 @@ {% for ident in identities %} - + {% identity_modify_link ident %} {{ ident.name_or_rcpt }} {% render_tags ident.tags %} diff --git a/modoboa/extensions/admin/templatetags/admin_tags.py b/modoboa/extensions/admin/templatetags/admin_tags.py index 3f934ddce..40d723203 100644 --- a/modoboa/extensions/admin/templatetags/admin_tags.py +++ b/modoboa/extensions/admin/templatetags/admin_tags.py @@ -256,3 +256,18 @@ def get_extra_admin_content(user, target, currentpage): "ExtraAdminContent", user, target, currentpage ) return "".join(res) + + +@register.simple_tag +def disable_identity(identity): + """Disable an identity. + + Finding this information depends on the identity type. + """ + if identity.__class__.__name__ == "User": + if identity.is_active and identity.mailbox_set.count() \ + and identity.mailbox_set.all()[0].domain.enabled: + return "" + elif identity.enabled and identity.domain.enabled: + return "" + return "muted" diff --git a/modoboa/templates/common/generic_field.html b/modoboa/templates/common/generic_field.html index 05dd55fc8..0f6e6bf36 100644 --- a/modoboa/templates/common/generic_field.html +++ b/modoboa/templates/common/generic_field.html @@ -1,9 +1,9 @@ {% load i18n core_tags lib_tags %} -