diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index e160b6530..1622a8f62 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -6,8 +6,9 @@ from collections import OrderedDict from functools import reduce from django import forms -from django.urls import reverse +from django.conf import settings from django.http import QueryDict +from django.urls import reverse from django.utils.translation import ugettext as _, ugettext_lazy from django.contrib.auth import password_validation @@ -202,6 +203,8 @@ class AccountFormGeneral(forms.ModelForm): if self.user == account and not self.cleaned_data["is_active"]: raise lib_exceptions.PermDeniedException( _("You can't disable your own account")) + if not account.pk: + account.language = settings.LANGUAGE_CODE if commit: if self.cleaned_data.get("password2", "") != "": account.set_password(self.cleaned_data["password2"]) diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 2759f0a18..4d28233da 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals +from django.conf import settings from django.core.exceptions import ValidationError from django.shortcuts import get_object_or_404 from django.utils.translation import ugettext as _, ugettext_lazy @@ -308,6 +309,8 @@ class WritableAccountSerializer(AccountSerializer): else: password = validated_data.pop("password") user.set_password(password) + if "language" not in validated_data: + user.language = settings.LANGUAGE_CODE user.save(creator=creator) if mailbox_data: self._create_mailbox(creator, user, mailbox_data) diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index 3f6f2144d..cddbe6297 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -107,6 +107,25 @@ class AccountTestCase(ModoTestCase): alias__internal=True).exists() ) + @override_settings(LANGUAGE_CODE="fr") + def test_create_account_default_lang(self): + """Check if default language is applied.""" + values = { + "username": "tester@test.com", + "first_name": "Tester", + "last_name": "Toto", + "password1": "Toto1234", + "password2": "Toto1234", + "role": "SimpleUsers", + "quota_act": True, + "is_active": True, + "email": "tester@test.com", + "stepid": "step2" + } + self.ajax_post(reverse("admin:account_add"), values) + account = User.objects.get(username=values["username"]) + self.assertEqual(account.language, "fr") + def test_aliases_update_on_rename(self): """Check if aliases are updated on mailbox rename.""" account = User.objects.get(username="user@test.com") diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index afe4eab2e..bd5c2582c 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -10,6 +10,7 @@ import json import dns.resolver from mock import patch +from django.test import override_settings from django.urls import reverse from rest_framework.authtoken.models import Token @@ -89,7 +90,8 @@ class DomainAPITestCase(ModoAPITestCase): mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result response = self.client.post( - url, {"name": "no-mx.example.com", "quota": 0, "default_mailbox_quota": 10} + url, {"name": "no-mx.example.com", "quota": 0, + "default_mailbox_quota": 10} ) self.assertEqual(response.status_code, 400) self.assertEqual( @@ -305,6 +307,25 @@ class AccountAPITestCase(ModoAPITestCase): response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 201) + @override_settings(LANGUAGE_CODE="fr") + def test_create_account_default_lang(self): + """Try to create a new account with(out) language.""" + url = reverse("api:account-list") + data = dict(self.ACCOUNT_DATA) + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, 201) + account = response.json() + user = core_models.User.objects.filter(pk=account["pk"]).first() + self.assertEqual(user.language, "fr") + + user.delete() + data["language"] = "pl_PL" + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, 201) + account = response.json() + user = core_models.User.objects.filter(pk=account["pk"]).first() + self.assertEqual(user.language, data["language"]) + def test_create_domainadmin_account(self): """Try to create a domain admin.""" data = copy.deepcopy(self.ACCOUNT_DATA) diff --git a/modoboa/core/handlers.py b/modoboa/core/handlers.py index d5983626e..ea1084010 100644 --- a/modoboa/core/handlers.py +++ b/modoboa/core/handlers.py @@ -4,9 +4,9 @@ from __future__ import unicode_literals import logging -from django.urls import reverse from django.db.models import signals from django.dispatch import receiver +from django.urls import reverse from django.utils.encoding import smart_text from django.utils.translation import ugettext as _ diff --git a/modoboa/core/management/commands/communicate_with_public_api.py b/modoboa/core/management/commands/communicate_with_public_api.py index 39dbdde28..0aec393d1 100644 --- a/modoboa/core/management/commands/communicate_with_public_api.py +++ b/modoboa/core/management/commands/communicate_with_public_api.py @@ -50,5 +50,4 @@ class Command(BaseCommand): admin_models.Alias.objects.filter(internal=False).count()), "extensions": extensions } - if not self.client.update_instance(local_config.api_pk, data): - raise CommandError("Failed to update instance.") + self.client.update_instance(local_config.api_pk, data) diff --git a/modoboa/core/models.py b/modoboa/core/models.py index b7587d178..c3e7c0a74 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -5,8 +5,9 @@ from __future__ import unicode_literals from email.header import Header import re -from django.urls import reverse +from django.conf import settings from django.db import models +from django.urls import reverse from django.utils.encoding import ( python_2_unicode_compatible, smart_bytes, smart_text, force_str ) @@ -349,6 +350,7 @@ class User(AbstractUser): self.first_name = row[3].strip() self.last_name = row[4].strip() self.is_active = (row[5].strip().lower() in ["true", "1", "yes", "y"]) + self.language = settings.LANGUAGE_CODE self.save() self.role = desired_role self.post_create(user) diff --git a/modoboa/lib/api_client.py b/modoboa/lib/api_client.py index 098e5f8d6..afdb80584 100644 --- a/modoboa/lib/api_client.py +++ b/modoboa/lib/api_client.py @@ -66,9 +66,7 @@ class ModoAPIClient(object): """Update instance and send stats.""" url = "{}instances/{}/".format(self._api_url, pk) response = requests.put(url, data=data) - if response.status_code != 200: - return False - return True + response.raise_for_status() def versions(self): """Fetch core and extension versions.""" diff --git a/modoboa/lib/authbackends.py b/modoboa/lib/authbackends.py index b46db0855..18171afbb 100644 --- a/modoboa/lib/authbackends.py +++ b/modoboa/lib/authbackends.py @@ -40,7 +40,9 @@ class SMTPBackend(object): """ user, created = User.objects.get_or_create( username__iexact=username, defaults={ - "username": username.lower(), "email": username.lower() + "username": username.lower(), + "email": username.lower(), + "language": settings.LANGUAGE_CODE } ) if created: @@ -90,7 +92,11 @@ try: return None user, created = User.objects.get_or_create( username__iexact=username, - defaults={'username': username.lower(), 'is_local': False} + defaults={ + "username": username.lower(), + "is_local": False, + "language": settings.LANGUAGE_CODE + } ) if created: populate_callback(user, group)