diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 7dedf3285..50b2dda21 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -61,7 +61,7 @@ class AccountFormGeneral(forms.ModelForm): model = User fields = ( "username", "first_name", "last_name", "role", "is_active", - "master_user" + "master_user", ) labels = { "is_active": ugettext_lazy("Enabled") @@ -190,6 +190,14 @@ class AccountFormGeneral(forms.ModelForm): return account +class AccountProfileForm(forms.ModelForm): + """Form to edit account profile.""" + + class Meta: + model = User + fields = ("secondary_email", "phone_number", "language") + + class AccountFormMail(forms.Form, DynamicForm): """Form to handle mail part.""" @@ -457,6 +465,9 @@ class AccountForm(TabForms): "formtpl": "admin/account_general_form.html", "cls": AccountFormGeneral, "new_args": [self.user], "mandatory": True}, + {"id": "profile", "title": _("Profile"), + "formtpl": "admin/account_profile_form.html", + "cls": AccountProfileForm}, {"id": "mail", "title": _("Mail"), "formtpl": "admin/mailform.html", "cls": AccountFormMail, @@ -521,10 +532,11 @@ class AccountForm(TabForms): As forms interact with each other, it is simpler to make custom code to save them. """ - self.forms[1]["instance"].save(self.user, self.account) - if len(self.forms) <= 2: + self.forms[1]["instance"].save() + self.forms[2]["instance"].save(self.user, self.account) + if len(self.forms) <= 3: return - for f in self.forms[2:]: + for f in self.forms[3:]: f["instance"].save() def done(self): diff --git a/modoboa/admin/templates/admin/account_profile_form.html b/modoboa/admin/templates/admin/account_profile_form.html new file mode 100644 index 000000000..45f882adf --- /dev/null +++ b/modoboa/admin/templates/admin/account_profile_form.html @@ -0,0 +1,3 @@ +{% load form_tags %} + +{% render_form form %} diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index a9dcd887b..f1d3114e9 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -53,10 +53,16 @@ class AccountTestCase(ModoTestCase): alias__internal=True).exists() ) - values.update({"username": "pouet@test.com"}) + values.update({ + "username": "pouet@test.com", "language": "en", + "secondary_email": "homer@simpson.com", + "phone_number": "123456789" + }) self.ajax_post( reverse("admin:account_change", args=[account.id]), values ) + account.refresh_from_db() + self.assertEqual(account.secondary_email, values["secondary_email"]) mb = models.Mailbox.objects.get(pk=mb.pk) self.assertEqual(mb.full_address, "pouet@test.com") self.assertEqual(mb.quota_value.username, "pouet@test.com") @@ -87,7 +93,8 @@ class AccountTestCase(ModoTestCase): ) values = { "username": "user@test.com", "role": "DomainAdmins", - "is_active": True, "email": "user@test.com" + "is_active": True, "email": "user@test.com", + "language": "en" } account = User.objects.get(username="user@test.com") self.ajax_post( @@ -101,7 +108,8 @@ class AccountTestCase(ModoTestCase): "username": "user@test.com", "first_name": "Tester", "last_name": "Toto", "role": "SimpleUsers", "quota_act": True, "is_active": True, "email": "user@test.com", - "senderaddress": "test@titi.com", "senderaddress_1": "toto@go.com" + "senderaddress": "test@titi.com", "senderaddress_1": "toto@go.com", + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[account.pk]), values) @@ -174,7 +182,8 @@ class AccountTestCase(ModoTestCase): account = User.objects.get(username=email) values = { "username": email, "role": "SimpleUsers", "quota_act": False, - "is_active": True, "quota": value, "email": email + "is_active": True, "quota": value, "email": email, + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[account.id]), @@ -294,7 +303,7 @@ class PermissionsTestCase(ModoTestCase): self.values = { "username": self.user.username, "role": "DomainAdmins", "is_active": self.user.is_active, "email": "user@test.com", - "quota_act": True + "quota_act": True, "language": "en" } def tearDown(self): @@ -342,7 +351,8 @@ class PermissionsTestCase(ModoTestCase): values = { "username": "admin@test.com", "first_name": "Admin", "password1": "", "password2": "", - "quota": 10, "is_active": True, "email": "admin@test.com" + "quota": 10, "is_active": True, "email": "admin@test.com", + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[admin.id]), @@ -366,7 +376,7 @@ class PermissionsTestCase(ModoTestCase): values = { "username": self.reseller.username, "first_name": "Reseller", "password1": "", "password2": "", - "is_active": True + "is_active": True, "language": "en" } self.ajax_post( reverse("admin:account_change", args=[self.reseller.pk]), diff --git a/modoboa/admin/tests/test_alias.py b/modoboa/admin/tests/test_alias.py index b75310b24..046b85275 100644 --- a/modoboa/admin/tests/test_alias.py +++ b/modoboa/admin/tests/test_alias.py @@ -26,7 +26,8 @@ class AliasTestCase(ModoTestCase): values = dict( username="user@test.com", role=user.role, is_active=user.is_active, email="user@test.com", - aliases="toto@test.com", aliases_1="titi@test.com" + aliases="toto@test.com", aliases_1="titi@test.com", + language="en" ) self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -68,7 +69,7 @@ class AliasTestCase(ModoTestCase): values = dict( username="user@test.com", role=user.role, is_active=user.is_active, email="user@test.com", - aliases="Toto@test.com" + aliases="Toto@test.com", language="en" ) self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -97,7 +98,8 @@ class AliasTestCase(ModoTestCase): user = User.objects.get(username="user@test.com") values = dict( username="user@test.com", role=user.role, - is_active=user.is_active, email="user@test.com" + is_active=user.is_active, email="user@test.com", + language="en" ) self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -252,7 +254,8 @@ class AliasTestCase(ModoTestCase): values = dict( username=user.username, first_name="Tester", last_name="Toto", password1="Toto1234", password2="Toto1234", role="SimpleUsers", - quota_act=True, is_active=True, email=user.email + quota_act=True, is_active=True, email=user.email, + language="en" ) self.ajax_post(reverse("admin:account_change", args=[user.id]), values) @@ -277,7 +280,8 @@ class AliasTestCase(ModoTestCase): values = dict( username="user@test.com", role=user.role, is_active=user.is_active, email="user@test.com", - aliases="toto@test.com", aliases_1="titi@test2.com" + aliases="toto@test.com", aliases_1="titi@test2.com", + language="en" ) response = self.ajax_post( reverse("admin:account_change", args=[user.id]), diff --git a/modoboa/admin/tests/test_mailbox_operations.py b/modoboa/admin/tests/test_mailbox_operations.py index bfcf9491e..2f9a719ee 100644 --- a/modoboa/admin/tests/test_mailbox_operations.py +++ b/modoboa/admin/tests/test_mailbox_operations.py @@ -65,7 +65,8 @@ class MailboxOperationTestCase(ModoTestCase): address="admin", domain__name="test.com") values = { "username": "admin2@test.com", "role": "DomainAdmins", - "is_active": True, "email": "admin2@test.com" + "is_active": True, "email": "admin2@test.com", + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[mb.user.pk]), values diff --git a/modoboa/admin/views/identity.py b/modoboa/admin/views/identity.py index a38bc430d..0c0086741 100644 --- a/modoboa/admin/views/identity.py +++ b/modoboa/admin/views/identity.py @@ -178,7 +178,8 @@ def editaccount(request, pk): raise PermDeniedException mb = account.mailbox if hasattr(account, "mailbox") else None - instances = dict(general=account, mail=mb, perms=account) + instances = dict( + general=account, profile=account, mail=mb, perms=account) results = signals.get_account_form_instances.send( sender="editaccount", user=request.user, account=account) for result in results: diff --git a/modoboa/limits/tests/test_domain_limits.py b/modoboa/limits/tests/test_domain_limits.py index 0122c418f..3d9f44f99 100644 --- a/modoboa/limits/tests/test_domain_limits.py +++ b/modoboa/limits/tests/test_domain_limits.py @@ -92,7 +92,7 @@ class DomainLimitsTestCase(lib_tests.ModoTestCase): "username": user.username, "role": user.role, "is_active": user.is_active, "email": user.email, "quota_act": True, "domains": "test2.com", - "domains_1": "test.com" + "domains_1": "test.com", "language": "en" } self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -146,7 +146,8 @@ class DomainLimitsTestCase(lib_tests.ModoTestCase): "username": user.username, "role": user.role, "is_active": user.is_active, "email": user.email, "quota_act": True, - "aliases": "alias@test.com", "aliases_1": "alias1@test.com" + "aliases": "alias@test.com", "aliases_1": "alias1@test.com", + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[user.id]), diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index 004a0f585..a7ce5c33b 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -175,7 +175,8 @@ class DomainAdminTestCase(ResourceTestCase): values = dict( username=user.username, role=user.role, is_active=user.is_active, email=user.email, quota_act=True, - aliases="alias1@test.com", aliases_1="alias2@test.com" + aliases="alias1@test.com", aliases_1="alias2@test.com", + language="en" ) self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -262,7 +263,7 @@ class ResellerTestCase(ResourceTestCase): values = { "username": user.username, "role": "DomainAdmins", "quota_act": True, "is_active": user.is_active, - "email": user.email + "email": user.email, "language": "en" } resp = self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -362,7 +363,8 @@ class ResellerTestCase(ResourceTestCase): values = { 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2 + 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2, + 'language': 'en' } self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -389,7 +391,8 @@ class ResellerTestCase(ResourceTestCase): values = { 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2 + 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2, + 'language': 'en' } self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -421,7 +424,8 @@ class ResellerTestCase(ResourceTestCase): values = { 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2 + 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2, + 'language': 'en' } self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -436,6 +440,7 @@ class ResellerTestCase(ResourceTestCase): 'username': user.username, 'role': 'SimpleUsers', 'quota_act': True, 'is_active': user.is_active, 'email': user.email, + 'language': 'en', } self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -453,7 +458,8 @@ class ResellerTestCase(ResourceTestCase): values = { 'username': user.username, 'role': user.role, 'quota_act': True, 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 2, 'mailbox_aliases_limit': 3 + 'mailboxes_limit': 2, 'mailbox_aliases_limit': 3, + 'language': 'en' } resp = self.ajax_post( reverse("admin:account_change", args=[user.id]),