Django 3.2 support

This commit is contained in:
Antoine Nguyen
2022-04-20 11:39:43 +02:00
parent b8582d7cec
commit 4ef53a8cd7
14 changed files with 26 additions and 19 deletions
+8 -4
View File
@@ -163,7 +163,14 @@ class MailboxSerializer(serializers.ModelSerializer):
def validate_full_address(self, value):
"""Lower case address."""
return value.lower()
value = value.lower()
address, domain_name = email_utils.split_mailbox(value)
domain = get_object_or_404(
admin_models.Domain, name=domain_name)
creator = self.context["request"].user
if not creator.can_access(domain):
raise serializers.ValidationError(_("Permission denied."))
return value
def validate_quota(self, value):
"""Convert quota to MB."""
@@ -353,9 +360,6 @@ class WritableAccountSerializer(AccountSerializer):
address, domain_name = email_utils.split_mailbox(full_address)
domain = get_object_or_404(
admin_models.Domain, name=domain_name)
if not creator.can_access(domain):
raise serializers.ValidationError({
"domain": _("Permission denied.")})
try:
core_signals.can_create_object.send(
sender=self.__class__, context=creator,
+5 -3
View File
@@ -249,7 +249,7 @@ class AccountAPITestCase(ModoAPITestCase):
def setUp(self):
"""Test setup."""
super(AccountAPITestCase, self).setUp()
super().setUp()
self.set_global_parameters({
"enable_admin_limits": False,
"enable_domain_limits": False
@@ -400,15 +400,17 @@ class AccountAPITestCase(ModoAPITestCase):
data["mailbox"]["quota"] = 1000
url = reverse("v1:account-list")
response = self.client.post(url, data, format="json")
# Should fail because domain quota is exceeded
self.assertEqual(response.status_code, 400)
data["username"] = "fromapi@test2.com"
data["mailbox"].update({"full_address": "fromapi@test2.com",
"quota": 10})
url = reverse("v1:account-list")
response = self.client.post(url, data, format="json")
# Should fail because admin has no access to @test2.com domain
self.assertEqual(response.status_code, 400)
errors = response.json()
self.assertIn("domain", errors)
self.assertIn("mailbox", errors)
def test_create_account_bad_master_user(self):
"""Try to create a new account."""
+1 -1
View File
@@ -6,9 +6,9 @@ from .app_settings import load_admin_settings
class AdminConfig(AppConfig):
"""App configuration."""
default_auto_field = "django.db.models.BigAutoField"
name = "modoboa.admin"
verbose_name = "Modoboa admin console"
+1 -2
View File
@@ -4,7 +4,7 @@ from reversion import revisions as reversion
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from django.utils.encoding import python_2_unicode_compatible, smart_text
from django.utils.encoding import smart_text
from django.utils.translation import ugettext as _, ugettext_lazy
from modoboa.core import models as core_models, signals as core_signals
@@ -26,7 +26,6 @@ class DomainAliasManager(models.Manager):
return self.get_queryset().filter(owners__user=admin)
@python_2_unicode_compatible
class DomainAlias(AdminObject):
"""Domain aliases."""
+1
View File
@@ -26,6 +26,7 @@ def load_core_settings():
class CoreConfig(AppConfig):
"""App configuration."""
default_auto_field = "django.db.models.BigAutoField"
name = "modoboa.core"
verbose_name = "Modoboa core"
+1
View File
@@ -2,4 +2,5 @@ from django.apps import AppConfig
class DnstoolsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'modoboa.dnstools'
-2
View File
@@ -4,7 +4,6 @@ import datetime
from django.db import models
from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext as _
from . import constants
@@ -35,7 +34,6 @@ class DNSRecordManager(models.Manager):
return record
@python_2_unicode_compatible
class DNSRecord(models.Model):
"""A model to store DNS records for Domain."""
+2 -2
View File
@@ -56,7 +56,7 @@ def render_field(
@register.simple_tag
def render_fields_group(form, pattern):
"""Render a group of fields."""
first = forms.forms.BoundField(form, form.fields[pattern], pattern)
first = forms.BoundField(form, form.fields[pattern], pattern)
configure_field_classes(first)
label = first.label
group = [first]
@@ -66,7 +66,7 @@ def render_fields_group(form, pattern):
fname = "%s_%d" % (pattern, cpt)
if fname not in form.fields:
break
bfield = forms.forms.BoundField(form, form.fields[fname], fname)
bfield = forms.BoundField(form, form.fields[fname], fname)
if len(bfield.errors):
haserror = True
configure_field_classes(bfield)
+1 -1
View File
@@ -18,9 +18,9 @@ def load_limits_settings():
class LimitsConfig(AppConfig):
"""App configuration."""
default_auto_field = "django.db.models.BigAutoField"
name = "modoboa.limits"
verbose_name = "Modoboa admin limits"
+1
View File
@@ -8,6 +8,7 @@ from .forms import load_settings
class MaillogConfig(AppConfig):
"""App configuration."""
default_auto_field = "django.db.models.BigAutoField"
name = "modoboa.maillog"
verbose_name = "Modoboa graphical statistics"
+1 -1
View File
@@ -2,4 +2,4 @@ from django.apps import AppConfig
class ParametersConfig(AppConfig):
name = "parameters"
name = "modoboa.parameters"
+1 -1
View File
@@ -4,9 +4,9 @@ from django.apps import AppConfig
class RelayDomainsConfig(AppConfig):
"""App configuration."""
default_auto_field = "django.db.models.BigAutoField"
name = "modoboa.relaydomains"
verbose_name = "Modoboa relay domains"
+1
View File
@@ -2,6 +2,7 @@ from django.apps import AppConfig
class TransportConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "modoboa.transport"
def ready(self):
+2 -2
View File
@@ -1,7 +1,7 @@
django>=2.2,<2.3
django<4.0
django-ckeditor==6.3.0
django-phonenumber-field[phonenumbers]==6.1.0
django-reversion==3.0.9
django-reversion==5.0.0
django-xforwardedfor-middleware==2.0
django-otp==1.1.3
django-filter