mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Django 3.2 support
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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."""
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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."""
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -2,4 +2,5 @@ from django.apps import AppConfig
|
||||
|
||||
|
||||
class DnstoolsConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'modoboa.dnstools'
|
||||
|
||||
@@ -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."""
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -2,4 +2,4 @@ from django.apps import AppConfig
|
||||
|
||||
|
||||
class ParametersConfig(AppConfig):
|
||||
name = "parameters"
|
||||
name = "modoboa.parameters"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user