diff --git a/modoboa/admin/callbacks.py b/modoboa/admin/callbacks.py index 163bf49aa..f65df4147 100644 --- a/modoboa/admin/callbacks.py +++ b/modoboa/admin/callbacks.py @@ -85,7 +85,7 @@ def grant_access_to_all_objects(user, role): def export_admin_domains(admin): result = [admin.mailbox.quota] \ if hasattr(admin, "mailbox") else [""] - if admin.group != "DomainAdmins": + if admin.role != "DomainAdmins": return result return result + [dom.name for dom in Domain.objects.get_for_admin(admin)] @@ -139,7 +139,7 @@ def import_account_mailbox(user, account, row): quota, override_rules=user.has_perm("admin.change_domain") ) mb.save(creator=user) - if account.group == "DomainAdmins": + if account.role == "DomainAdmins": for domname in row[2:]: try: dom = Domain.objects.get(name=domname.strip()) @@ -157,7 +157,7 @@ def account_auto_created(user): if parameters.get_admin("AUTO_CREATE_DOMAIN_AND_MAILBOX") == "no": return localpart, domname = split_mailbox(user.username) - if user.group != 'SimpleUsers' and domname is None: + if user.role != 'SimpleUsers' and domname is None: return sadmins = User.objects.filter(is_superuser=True) try: diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index cbcbbf587..401829c21 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -38,7 +38,7 @@ class AccountFormGeneral(forms.ModelForm): ) role = forms.ChoiceField( label=ugettext_lazy("Role"), - choices=[('', ugettext_lazy("Choose"))], + choices=[("", ugettext_lazy("Choose"))], help_text=ugettext_lazy("What level of permission this user will have") ) password1 = PasswordField( @@ -59,52 +59,63 @@ class AccountFormGeneral(forms.ModelForm): "username", "first_name", "last_name", "role", "is_active", "master_user" ) + labels = { + "is_active": ugettext_lazy("Enabled") + } def __init__(self, user, *args, **kwargs): super(AccountFormGeneral, self).__init__(*args, **kwargs) self.fields = OrderedDict( (key, self.fields[key]) for key in - ['role', 'username', 'first_name', 'last_name', 'password1', - 'password2', 'master_user', 'is_active'] + ["role", "username", "first_name", "last_name", "password1", + "password2", "master_user", "is_active"] ) - self.fields["is_active"].label = _("Enabled") self.user = user - if user.group == "DomainAdmins": + condition = ( + user.role == "DomainAdmins" or + user.role == "Resellers" and self.instance == user + ) + if condition: self.fields["role"] = forms.CharField( label="", widget=forms.HiddenInput(attrs={"class": "form-control"}), required=False ) else: - self.fields["role"].choices = [('', ugettext_lazy("Choose"))] - self.fields["role"].choices += \ - get_account_roles(user, kwargs['instance']) \ - if 'instance' in kwargs else get_account_roles(user) + self.fields["role"].choices += ( + get_account_roles(user, self.instance) + if self.instance.pk else get_account_roles(user) + ) if not user.is_superuser: del self.fields["master_user"] - if "instance" in kwargs: - account = kwargs["instance"] - domain_disabled = ( - hasattr(account, "mailbox") and - not account.mailbox.domain.enabled - ) + if not self.instance.pk: + return + + domain_disabled = ( + hasattr(self.instance, "mailbox") and + not self.instance.mailbox.domain.enabled + ) + if domain_disabled: + self.fields["is_active"].widget.attrs["disabled"] = "disabled" + if args: + empty_password = ( + args[0].get("password1", "") == "" and + args[0].get("password2", "") == "") + if empty_password: + self.fields["password1"].required = False + self.fields["password2"].required = False 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"] + del self.fields["is_active"] + self.fields["role"].initial = self.instance.role + condition = ( + not self.instance.is_local and + parameters.get_admin( + "LDAP_AUTH_METHOD", app="core") == "directbind") + if condition: + del self.fields["password1"] + del self.fields["password2"] def domain_is_disabled(self): """Little shortcut to get the domain's state. @@ -118,10 +129,12 @@ class AccountFormGeneral(forms.ModelForm): return not self.instance.mailbox.domain.enabled def clean_role(self): - if self.user.group == "DomainAdmins": + if self.user.role == "DomainAdmins": if self.instance == self.user: return "DomainAdmins" return "SimpleUsers" + elif self.user.role == "Resellers" and self.instance == self.user: + return "Resellers" return self.cleaned_data["role"] def clean_username(self): @@ -459,10 +472,12 @@ class AccountForm(TabForms): }) def check_perms(self, account): - if account.is_superuser: - return False - return self.user.has_perm("admin.add_domain") \ - and account.has_perm("core.add_user") + """Check if perms form must displayed or not.""" + return ( + self.user.is_superuser and + not account.is_superuser and + account.has_perm("core.add_user") + ) def _before_is_valid(self, form): if form["id"] == "general": @@ -480,9 +495,8 @@ class AccountForm(TabForms): return True def is_valid(self): - """Two steps validation. - """ - self.instances["general"].oldgroup = self.instances["general"].group + """Two steps validation.""" + self.instances["general"].oldgroup = self.instances["general"].role if super(AccountForm, self).is_valid(mandatory_only=True): self.account = self.forms[0]["instance"].save() return super(AccountForm, self).is_valid(optional_only=True) diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index c74b45c3d..f499dbc0e 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -8,7 +8,7 @@ from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.core.models import User from modoboa.core import signals as core_signals from modoboa.lib import events, parameters -from modoboa.lib.exceptions import ModoboaException, Conflict +from modoboa.lib.exceptions import Conflict from modoboa.lib.fields import DomainNameField from modoboa.lib.form_utils import ( YesNoField, WizardForm, WizardStep, DynamicForm, TabForms @@ -279,17 +279,13 @@ class DomainForm(TabForms): super(DomainForm, self).__init__(request, *args, **kwargs) def extra_context(self, context): - domadmins = [u for u in self.domain.admins - if self.request.user.can_access(u) and not u.is_superuser] - if not self.request.user.is_superuser: - domadmins = [u for u in domadmins if u.group == "DomainAdmins"] + """Add information to template context.""" context.update({ "title": self.domain.name, "action": reverse( "admin:domain_change", args=[self.domain.pk]), "formid": "domform", - "domain": self.domain, - "domadmins": domadmins + "domain": self.domain }) def is_valid(self): diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index 3c44842cb..6ed568c83 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -283,7 +283,7 @@ class Mailbox(AdminObject): newaddress = None if values["email"] != self.full_address: newaddress = values["email"] - elif (self.user.group == "SimpleUsers" and + elif (self.user.role == "SimpleUsers" and self.user.username != self.full_address): newaddress = self.user.username if newaddress is not None: diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 47de388b0..8a842f5ae 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -102,7 +102,7 @@ class AccountSerializer(serializers.ModelSerializer): def get_role(self, account): """Return role.""" - return account.group + return account.role def get_domains(self, account): """Return domains administered by this account.""" diff --git a/modoboa/admin/templates/admin/domain_statistics.html b/modoboa/admin/templates/admin/domain_statistics.html index 1123c93bf..08eceb08c 100644 --- a/modoboa/admin/templates/admin/domain_statistics.html +++ b/modoboa/admin/templates/admin/domain_statistics.html @@ -16,7 +16,7 @@