diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 19effd8ab..db0a312ce 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -6,7 +6,7 @@ from collections import OrderedDict from functools import reduce from django import forms -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import QueryDict from django.utils.translation import ugettext as _, ugettext_lazy diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index 23e2e9343..558b6e89f 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals from functools import reduce from django import forms -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import QueryDict from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.encoding import force_text diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index c51e01b27..da360c6d8 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import signals from django.dispatch import receiver from django.utils.translation import ugettext as _ diff --git a/modoboa/admin/migrations/0001_initial.py b/modoboa/admin/migrations/0001_initial.py index ec5eb96bb..9be649089 100644 --- a/modoboa/admin/migrations/0001_initial.py +++ b/modoboa/admin/migrations/0001_initial.py @@ -31,8 +31,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('address', models.EmailField(max_length=75)), - ('alias', models.ForeignKey(to='admin.Alias')), - ('r_alias', models.ForeignKey(related_name='alias_recipient_aliases', blank=True, to='admin.Alias', null=True)), + ('alias', models.ForeignKey(to='admin.Alias', on_delete=models.CASCADE)), + ('r_alias', models.ForeignKey(related_name='alias_recipient_aliases', blank=True, to='admin.Alias', null=True, on_delete=models.CASCADE)), ], options={ 'db_table': 'modoboa_admin_aliasrecipient', @@ -85,7 +85,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('type', models.CharField(max_length=20, choices=[(b'rename', b'rename'), (b'delete', b'delete')])), ('argument', models.TextField()), - ('mailbox', models.ForeignKey(blank=True, to='admin.Mailbox', null=True)), + ('mailbox', models.ForeignKey(blank=True, to='admin.Mailbox', null=True, on_delete=models.CASCADE)), ], options={ }, @@ -116,43 +116,43 @@ class Migration(migrations.Migration): migrations.AddField( model_name='mailbox', name='dates', - field=models.ForeignKey(to='admin.ObjectDates'), + field=models.ForeignKey(to='admin.ObjectDates', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='mailbox', name='domain', - field=models.ForeignKey(to='admin.Domain'), + field=models.ForeignKey(to='admin.Domain', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='mailbox', name='user', - field=models.OneToOneField(to=settings.AUTH_USER_MODEL), + field=models.OneToOneField(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='domainalias', name='dates', - field=models.ForeignKey(to='admin.ObjectDates'), + field=models.ForeignKey(to='admin.ObjectDates', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='domainalias', name='target', - field=models.ForeignKey(verbose_name='target', to='admin.Domain', help_text='The domain this alias points to'), + field=models.ForeignKey(verbose_name='target', to='admin.Domain', help_text='The domain this alias points to', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='domain', name='dates', - field=models.ForeignKey(to='admin.ObjectDates'), + field=models.ForeignKey(to='admin.ObjectDates', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='aliasrecipient', name='r_mailbox', - field=models.ForeignKey(blank=True, to='admin.Mailbox', null=True), + field=models.ForeignKey(blank=True, to='admin.Mailbox', null=True, on_delete=models.CASCADE), preserve_default=True, ), migrations.AlterUniqueTogether( @@ -162,13 +162,13 @@ class Migration(migrations.Migration): migrations.AddField( model_name='alias', name='dates', - field=models.ForeignKey(to='admin.ObjectDates'), + field=models.ForeignKey(to='admin.ObjectDates', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='alias', name='domain', - field=models.ForeignKey(to='admin.Domain', null=True), + field=models.ForeignKey(to='admin.Domain', null=True, on_delete=models.CASCADE), preserve_default=True, ), migrations.AlterUniqueTogether( diff --git a/modoboa/admin/models/alias.py b/modoboa/admin/models/alias.py index 59b796725..225ed9e78 100644 --- a/modoboa/admin/models/alias.py +++ b/modoboa/admin/models/alias.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import hashlib import random -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import models from django.utils.encoding import ( python_2_unicode_compatible, smart_text, force_str, force_bytes @@ -37,7 +37,7 @@ class Alias(AdminObject): "The alias address." ) ) - domain = models.ForeignKey(Domain, null=True) + domain = models.ForeignKey(Domain, null=True, on_delete=models.CASCADE) enabled = models.BooleanField( ugettext_lazy("enabled"), help_text=ugettext_lazy("Check to activate this alias"), @@ -210,13 +210,15 @@ class AliasRecipient(models.Model): """An alias recipient.""" address = models.EmailField() - alias = models.ForeignKey(Alias) + alias = models.ForeignKey(Alias, on_delete=models.CASCADE) # if recipient is a local mailbox - r_mailbox = models.ForeignKey(Mailbox, blank=True, null=True) + r_mailbox = models.ForeignKey(Mailbox, blank=True, null=True, + on_delete=models.CASCADE) # if recipient is a local alias r_alias = models.ForeignKey( - Alias, related_name="alias_recipient_aliases", blank=True, null=True) + Alias, related_name="alias_recipient_aliases", blank=True, null=True, + on_delete=models.CASCADE) class Meta: app_label = "admin" diff --git a/modoboa/admin/models/domain_alias.py b/modoboa/admin/models/domain_alias.py index c9047886d..51ccfba69 100644 --- a/modoboa/admin/models/domain_alias.py +++ b/modoboa/admin/models/domain_alias.py @@ -40,7 +40,8 @@ class DomainAlias(AdminObject): help_text=ugettext_lazy("The alias name")) target = models.ForeignKey( Domain, verbose_name=ugettext_lazy('target'), - help_text=ugettext_lazy("The domain this alias points to") + help_text=ugettext_lazy("The domain this alias points to"), + on_delete=models.CASCADE ) enabled = models.BooleanField( ugettext_lazy('enabled'), diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index 1cf18320d..790cf9fbb 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -100,8 +100,8 @@ class Mailbox(AdminObject): ) quota = models.PositiveIntegerField(default=0) use_domain_quota = models.BooleanField(default=False) - domain = models.ForeignKey(Domain) - user = models.OneToOneField(User) + domain = models.ForeignKey(Domain, on_delete=models.CASCADE) + user = models.OneToOneField(User, on_delete=models.CASCADE) objects = MailboxManager() @@ -354,7 +354,7 @@ class SenderAddress(models.Model): """Extra sender address for Mailbox.""" address = models.EmailField() - mailbox = models.ForeignKey(Mailbox) + mailbox = models.ForeignKey(Mailbox, on_delete=models.CASCADE) class Meta: app_label = "admin" @@ -373,7 +373,8 @@ reversion.register(SenderAddress) class MailboxOperation(models.Model): """An operation on a mailbox.""" - mailbox = models.ForeignKey(Mailbox, blank=True, null=True) + mailbox = models.ForeignKey(Mailbox, blank=True, null=True, + on_delete=models.CASCADE) type = models.CharField( max_length=20, choices=(('rename', 'rename'), ('delete', 'delete')) ) diff --git a/modoboa/admin/models/mxrecord.py b/modoboa/admin/models/mxrecord.py index b48645430..4a4f71e5b 100644 --- a/modoboa/admin/models/mxrecord.py +++ b/modoboa/admin/models/mxrecord.py @@ -58,7 +58,7 @@ class MXRecordManager(models.Manager): class MXRecord(models.Model): """A model used to store MX records for Domain.""" - domain = models.ForeignKey("admin.Domain") + domain = models.ForeignKey("admin.Domain", on_delete=models.CASCADE) name = models.CharField(max_length=254) address = models.GenericIPAddressField() managed = models.BooleanField(default=False) @@ -86,9 +86,9 @@ class DNSBLQuerySet(models.QuerySet): class DNSBLResult(models.Model): """Store a DNSBL query result.""" - domain = models.ForeignKey("admin.Domain") + domain = models.ForeignKey("admin.Domain", on_delete=models.CASCADE) provider = models.CharField(max_length=254, db_index=True) - mx = models.ForeignKey(MXRecord) + mx = models.ForeignKey(MXRecord, on_delete=models.CASCADE) status = models.CharField(max_length=45, blank=True, db_index=True) objects = models.Manager.from_queryset(DNSBLQuerySet)() diff --git a/modoboa/admin/templatetags/admin_tags.py b/modoboa/admin/templatetags/admin_tags.py index 750ce39c3..202088157 100644 --- a/modoboa/admin/templatetags/admin_tags.py +++ b/modoboa/admin/templatetags/admin_tags.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals from functools import reduce from django import template -from django.core.urlresolvers import reverse +from django.urls import reverse from django.template.loader import render_to_string from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _, ugettext_lazy diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index acf1baf9d..3f6f2144d 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals from unittest import skipIf -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import override_settings from modoboa.core import factories as core_factories diff --git a/modoboa/admin/tests/test_alias.py b/modoboa/admin/tests/test_alias.py index 046b85275..3df90621d 100644 --- a/modoboa/admin/tests/test_alias.py +++ b/modoboa/admin/tests/test_alias.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals """Admin test cases.""" -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.core.models import User from modoboa.lib.tests import ModoTestCase diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index 3e897ce18..718adecc6 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -9,7 +9,7 @@ import json import dns.resolver from mock import patch -from django.core.urlresolvers import reverse +from django.urls import reverse from rest_framework.authtoken.models import Token diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index b3eeabfeb..553a861a8 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -7,7 +7,7 @@ from __future__ import unicode_literals import dns.resolver from mock import patch -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.core import factories as core_factories from modoboa.core.models import User diff --git a/modoboa/admin/tests/test_domain_alias.py b/modoboa/admin/tests/test_domain_alias.py index 76f92fb16..5dd667702 100644 --- a/modoboa/admin/tests/test_domain_alias.py +++ b/modoboa/admin/tests/test_domain_alias.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.lib.tests import ModoTestCase diff --git a/modoboa/admin/tests/test_export.py b/modoboa/admin/tests/test_export.py index f7ba5177f..c48e3486d 100644 --- a/modoboa/admin/tests/test_export.py +++ b/modoboa/admin/tests/test_export.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.encoding import force_text from modoboa.lib.tests import ModoTestCase diff --git a/modoboa/admin/tests/test_import_.py b/modoboa/admin/tests/test_import_.py index b40445f77..370c2087c 100644 --- a/modoboa/admin/tests/test_import_.py +++ b/modoboa/admin/tests/test_import_.py @@ -6,7 +6,7 @@ from mock import patch import dns.resolver from django.core.files.base import ContentFile -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.core import factories as core_factories from modoboa.core.models import User diff --git a/modoboa/admin/tests/test_mailbox_operations.py b/modoboa/admin/tests/test_mailbox_operations.py index 2f9a719ee..81c02de97 100644 --- a/modoboa/admin/tests/test_mailbox_operations.py +++ b/modoboa/admin/tests/test_mailbox_operations.py @@ -9,7 +9,7 @@ import tempfile import mock from django.core.management import call_command -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import override_settings from modoboa.lib.tests import ModoTestCase diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 2e2a39b10..53d2a94c6 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -6,7 +6,7 @@ from mock import patch from django.core import mail from django.core import management -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import override_settings from modoboa.core import factories as core_factories diff --git a/modoboa/admin/tests/test_password_schemes.py b/modoboa/admin/tests/test_password_schemes.py index 160d1e0b2..277d202b9 100644 --- a/modoboa/admin/tests/test_password_schemes.py +++ b/modoboa/admin/tests/test_password_schemes.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.core.models import User from modoboa.lib.tests import ModoTestCase diff --git a/modoboa/admin/tests/test_user.py b/modoboa/admin/tests/test_user.py index 2eccfc900..1c55760ff 100644 --- a/modoboa/admin/tests/test_user.py +++ b/modoboa/admin/tests/test_user.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.core.models import User from modoboa.lib.tests import ModoTestCase diff --git a/modoboa/admin/views/alias.py b/modoboa/admin/views/alias.py index 20b1c4635..a7c97f58b 100644 --- a/modoboa/admin/views/alias.py +++ b/modoboa/admin/views/alias.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import IntegrityError from django.shortcuts import render from django.utils.translation import ugettext as _, ungettext diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index 2fd0f777e..4618b294a 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals from functools import reduce -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import Sum from django.http import HttpResponseRedirect from django.shortcuts import render diff --git a/modoboa/admin/views/export.py b/modoboa/admin/views/export.py index 89e6dabb0..f916ea8c5 100644 --- a/modoboa/admin/views/export.py +++ b/modoboa/admin/views/export.py @@ -9,7 +9,7 @@ from rfc6266 import build_header from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponse from django.shortcuts import render from django.utils.translation import ugettext as _ diff --git a/modoboa/admin/views/import_.py b/modoboa/admin/views/import_.py index 44921471c..1291b41ee 100644 --- a/modoboa/admin/views/import_.py +++ b/modoboa/admin/views/import_.py @@ -9,7 +9,7 @@ from io import StringIO from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import transaction from django.shortcuts import render from django.utils.translation import ugettext as _ diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index ee7e699f6..0f69de5ad 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -11,7 +11,7 @@ from django.contrib.auth import password_validation from modoboa.lib import fields as lib_fields from modoboa.lib.cryptutils import random_key from modoboa.lib.form_utils import ( - YesNoField, SeparatorField, InlineRadioSelect + YesNoField, SeparatorField, HorizontalRadioSelect ) from modoboa.parameters import forms as param_forms from modoboa.parameters import tools as param_tools @@ -44,7 +44,7 @@ class GeneralParametersForm(param_forms.AdminParametersForm): ('ldap', "LDAP")], initial="local", help_text=ugettext_lazy("The backend used for authentication"), - widget=InlineRadioSelect + widget=HorizontalRadioSelect() ) password_scheme = forms.ChoiceField( diff --git a/modoboa/core/handlers.py b/modoboa/core/handlers.py index c146dc89f..6f6c43649 100644 --- a/modoboa/core/handlers.py +++ b/modoboa/core/handlers.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import logging -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import signals from django.dispatch import receiver from django.utils.encoding import smart_text diff --git a/modoboa/core/middleware.py b/modoboa/core/middleware.py index f8f66b403..df8f6939a 100644 --- a/modoboa/core/middleware.py +++ b/modoboa/core/middleware.py @@ -2,10 +2,12 @@ from __future__ import unicode_literals +from django.utils.deprecation import MiddlewareMixin + from . import models -class LocalConfigMiddleware(object): +class LocalConfigMiddleware(MiddlewareMixin): """A middleware to inject LocalConfig into request.""" def process_request(self, request): diff --git a/modoboa/core/migrations/0001_initial.py b/modoboa/core/migrations/0001_initial.py index 3824558f1..1be0eae38 100644 --- a/modoboa/core/migrations/0001_initial.py +++ b/modoboa/core/migrations/0001_initial.py @@ -67,8 +67,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('object_id', models.PositiveIntegerField()), ('is_owner', models.BooleanField(default=False)), - ('content_type', models.ForeignKey(to='contenttypes.ContentType')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ }, diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 0d2b203f4..4750f645e 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals from email.header import Header import re -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import models from django.utils.encoding import ( python_2_unicode_compatible, smart_bytes, smart_text, force_str @@ -407,8 +407,8 @@ def populate_callback(user, group="SimpleUsers"): @python_2_unicode_compatible class ObjectAccess(models.Model): - user = models.ForeignKey(User) - content_type = models.ForeignKey(ContentType) + user = models.ForeignKey(User, on_delete=models.CASCADE) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') is_owner = models.BooleanField(default=False) @@ -435,7 +435,7 @@ class LocalConfig(models.Model): """Store instance configuration here.""" api_pk = models.PositiveIntegerField(null=True) - site = models.ForeignKey("sites.Site") + site = models.ForeignKey("sites.Site", on_delete=models.CASCADE) # API results cache api_versions = jsonfield.JSONField() diff --git a/modoboa/core/templatetags/core_tags.py b/modoboa/core/templatetags/core_tags.py index 44d0735a4..20017f015 100644 --- a/modoboa/core/templatetags/core_tags.py +++ b/modoboa/core/templatetags/core_tags.py @@ -10,7 +10,7 @@ import re from django import template from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.template.loader import render_to_string from django.utils import timezone from django.utils.encoding import smart_text diff --git a/modoboa/core/tests/test_authentication.py b/modoboa/core/tests/test_authentication.py index 22df9d964..08c7fb4dc 100644 --- a/modoboa/core/tests/test_authentication.py +++ b/modoboa/core/tests/test_authentication.py @@ -10,7 +10,7 @@ from unittest import skipIf from mock import patch from django.core import mail -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import override_settings from modoboa.lib.tests import ModoTestCase diff --git a/modoboa/core/tests/test_core.py b/modoboa/core/tests/test_core.py index 6ca505c39..5efa811c5 100644 --- a/modoboa/core/tests/test_core.py +++ b/modoboa/core/tests/test_core.py @@ -8,7 +8,7 @@ from dateutil.relativedelta import relativedelta from six import StringIO from django.core import management -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import TestCase from django.utils import timezone diff --git a/modoboa/core/tests/test_ldap.py b/modoboa/core/tests/test_ldap.py index d7b166594..2de9be271 100644 --- a/modoboa/core/tests/test_ldap.py +++ b/modoboa/core/tests/test_ldap.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals from unittest import skipIf -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import override_settings from django.utils.functional import cached_property diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index 8e06bdfce..0c433c16b 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals from testfixtures import compare from django import forms -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.lib.tests import ModoTestCase from modoboa.parameters import forms as param_forms diff --git a/modoboa/core/views/auth.py b/modoboa/core/views/auth.py index 2ca28c56a..577263144 100644 --- a/modoboa/core/views/auth.py +++ b/modoboa/core/views/auth.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import logging -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponse, HttpResponseRedirect from django.template.loader import render_to_string from django.utils import translation diff --git a/modoboa/core/views/base.py b/modoboa/core/views/base.py index 8d4634bf3..7b6291bac 100644 --- a/modoboa/core/views/base.py +++ b/modoboa/core/views/base.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.http import is_safe_url from django.views import generic diff --git a/modoboa/lib/form_utils.py b/modoboa/lib/form_utils.py index 9aa259ff7..b9065bc30 100644 --- a/modoboa/lib/form_utils.py +++ b/modoboa/lib/form_utils.py @@ -11,12 +11,8 @@ import re from django.forms import TypedChoiceField from django.forms.fields import Field from django.forms.widgets import RadioSelect -from django.forms.widgets import RadioChoiceInput from django.shortcuts import render -from django.utils.encoding import ( - python_2_unicode_compatible, force_text, force_str) -from django.utils.html import conditional_escape -from django.utils.safestring import mark_safe +from django.utils.encoding import force_str from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.lib.exceptions import BadRequest @@ -371,41 +367,9 @@ class TabForms(object): # -@python_2_unicode_compatible -class CustomRadioInput(RadioChoiceInput): - """Custom radio input.""" - - def __str__(self): - if "id" in self.attrs: - label_for = ' for="%s"' % self.attrs["id"] - else: - label_for = "" - choice_label = conditional_escape(force_text(self.choice_label)) - return mark_safe( - "" - % (label_for, self.tag(), choice_label) - ) - - -class InlineRadioRenderer(RadioSelect.renderer): - """Custom inline radio renderer.""" - - def __iter__(self): - for i, choice in enumerate(self.choices): - yield CustomRadioInput( - self.name, self.value, self.attrs.copy(), choice, i - ) - - def render(self): - return mark_safe( - u"\n".join([u"%s\n" % force_text(w) for w in self]) - ) - - -class InlineRadioSelect(RadioSelect): - """Custom inline radio widget.""" - - renderer = InlineRadioRenderer +class HorizontalRadioSelect(RadioSelect): + template_name = "common/horizontal_select.html" + option_template_name = "common/horizontal_select_option.html" class SeparatorField(Field): @@ -426,7 +390,7 @@ class YesNoField(TypedChoiceField): (True, ugettext_lazy("Yes")), (False, ugettext_lazy("No")) ), - "widget": InlineRadioSelect, + "widget": HorizontalRadioSelect(), "coerce": lambda x: x == "True" }) super(YesNoField, self).__init__(*args, **kwargs) diff --git a/modoboa/lib/middleware.py b/modoboa/lib/middleware.py index 6fd7c77f2..684726d65 100644 --- a/modoboa/lib/middleware.py +++ b/modoboa/lib/middleware.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals from django.http import HttpResponseRedirect from django.utils.encoding import smart_text +from django.utils.deprecation import MiddlewareMixin from modoboa.lib.exceptions import ModoboaException from modoboa.lib import signals as lib_signals @@ -14,7 +15,7 @@ from modoboa.lib.web_utils import ( ) -class AjaxLoginRedirect(object): +class AjaxLoginRedirect(MiddlewareMixin): def process_response(self, request, response): if request.is_ajax(): @@ -23,7 +24,7 @@ class AjaxLoginRedirect(object): return response -class CommonExceptionCatcher(object): +class CommonExceptionCatcher(MiddlewareMixin): """Modoboa exceptions catcher.""" def process_exception(self, request, exception): @@ -44,7 +45,7 @@ class CommonExceptionCatcher(object): ) -class RequestCatcherMiddleware(object): +class RequestCatcherMiddleware(MiddlewareMixin): """Simple middleware to store the current request.""" def process_request(self, request): diff --git a/modoboa/lib/migrations/0001_initial.py b/modoboa/lib/migrations/0001_initial.py index 02453b798..6f5cd6f93 100644 --- a/modoboa/lib/migrations/0001_initial.py +++ b/modoboa/lib/migrations/0001_initial.py @@ -29,7 +29,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=255)), ('value', models.CharField(max_length=255)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ }, diff --git a/modoboa/limits/migrations/0001_initial.py b/modoboa/limits/migrations/0001_initial.py index 468235c9b..2c1d96230 100644 --- a/modoboa/limits/migrations/0001_initial.py +++ b/modoboa/limits/migrations/0001_initial.py @@ -29,7 +29,7 @@ class Migration(migrations.Migration): name='LimitsPool', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ 'db_table': 'limits_limitspool', @@ -39,7 +39,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='limit', name='pool', - field=models.ForeignKey(to='limits.LimitsPool'), + field=models.ForeignKey(to='limits.LimitsPool', on_delete=models.CASCADE), preserve_default=True, ), migrations.AlterUniqueTogether( diff --git a/modoboa/limits/migrations/0003_auto_20160413_1046.py b/modoboa/limits/migrations/0003_auto_20160413_1046.py index 438479931..625a90568 100644 --- a/modoboa/limits/migrations/0003_auto_20160413_1046.py +++ b/modoboa/limits/migrations/0003_auto_20160413_1046.py @@ -58,8 +58,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=254)), ('max_value', models.IntegerField(default=-2)), - ('content_type', models.ForeignKey(to='contenttypes.ContentType')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], ), migrations.AlterUniqueTogether( diff --git a/modoboa/limits/migrations/0005_auto_20160415_1654.py b/modoboa/limits/migrations/0005_auto_20160415_1654.py index ab97e7807..9b05b9f08 100644 --- a/modoboa/limits/migrations/0005_auto_20160415_1654.py +++ b/modoboa/limits/migrations/0005_auto_20160415_1654.py @@ -33,7 +33,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=254)), ('max_value', models.IntegerField(default=0)), - ('domain', models.ForeignKey(to='admin.Domain')), + ('domain', models.ForeignKey(to='admin.Domain', on_delete=models.CASCADE)), ], bases=(modoboa.limits.models.ObjectLimitMixin, models.Model), ), diff --git a/modoboa/limits/models.py b/modoboa/limits/models.py index 0797a7557..114a933c6 100644 --- a/modoboa/limits/models.py +++ b/modoboa/limits/models.py @@ -69,9 +69,10 @@ class ObjectLimitMixin(object): class UserObjectLimit(ObjectLimitMixin, models.Model): """Object level limit.""" - user = models.ForeignKey(settings.AUTH_USER_MODEL) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) name = models.CharField(max_length=254) - content_type = models.ForeignKey("contenttypes.ContentType") + content_type = models.ForeignKey("contenttypes.ContentType", + on_delete=models.CASCADE) max_value = models.IntegerField(default=0) class Meta(object): @@ -132,7 +133,7 @@ class UserObjectLimit(ObjectLimitMixin, models.Model): class DomainObjectLimit(ObjectLimitMixin, models.Model): """Per-domain limits on object creation.""" - domain = models.ForeignKey("admin.Domain") + domain = models.ForeignKey("admin.Domain", on_delete=models.CASCADE) name = models.CharField(max_length=254) max_value = models.IntegerField(default=0) diff --git a/modoboa/limits/tests/test_api.py b/modoboa/limits/tests/test_api.py index ecfbe9d8f..4707c244b 100644 --- a/modoboa/limits/tests/test_api.py +++ b/modoboa/limits/tests/test_api.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals from testfixtures import compare -from django.core.urlresolvers import reverse +from django.urls import reverse from rest_framework.authtoken.models import Token diff --git a/modoboa/limits/tests/test_domain_limits.py b/modoboa/limits/tests/test_domain_limits.py index 3d9f44f99..92f6c8749 100644 --- a/modoboa/limits/tests/test_domain_limits.py +++ b/modoboa/limits/tests/test_domain_limits.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.admin import factories as admin_factories from modoboa.admin.models import Domain diff --git a/modoboa/limits/tests/test_import.py b/modoboa/limits/tests/test_import.py index dc743b438..1b61fd0c5 100644 --- a/modoboa/limits/tests/test_import.py +++ b/modoboa/limits/tests/test_import.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django.core.files.base import ContentFile -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.admin import factories as admin_factories from modoboa.admin import models as admin_models diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index 2d87d0a72..39168a24b 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.admin.factories import populate_database from modoboa.admin.models import Alias, Domain diff --git a/modoboa/relaydomains/migrations/0001_initial.py b/modoboa/relaydomains/migrations/0001_initial.py index 0f6bff791..84cf66c6a 100644 --- a/modoboa/relaydomains/migrations/0001_initial.py +++ b/modoboa/relaydomains/migrations/0001_initial.py @@ -17,8 +17,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('target_host', models.CharField(help_text='Remote destination of this domain', max_length=255, verbose_name='target host')), ('verify_recipients', models.BooleanField(default=False, help_text='Check for valid recipients', verbose_name='verify recipients')), - ('dates', models.ForeignKey(to='admin.ObjectDates')), - ('domain', models.OneToOneField(null=True, to='admin.Domain')), + ('dates', models.ForeignKey(to='admin.ObjectDates', on_delete=models.CASCADE)), + ('domain', models.OneToOneField(null=True, to='admin.Domain', on_delete=models.CASCADE)), ], options={ 'ordering': ['domain__name'], @@ -40,7 +40,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='relaydomain', name='service', - field=models.ForeignKey(to='relaydomains.Service'), + field=models.ForeignKey(to='relaydomains.Service', on_delete=models.CASCADE), preserve_default=True, ), ] diff --git a/modoboa/relaydomains/tests.py b/modoboa/relaydomains/tests.py index e071fee22..86c1e4fef 100644 --- a/modoboa/relaydomains/tests.py +++ b/modoboa/relaydomains/tests.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django.core.files.base import ContentFile -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import TestCase from modoboa.admin import factories as admin_factories diff --git a/modoboa/templates/common/horizontal_select.html b/modoboa/templates/common/horizontal_select.html new file mode 100644 index 000000000..d7145f734 --- /dev/null +++ b/modoboa/templates/common/horizontal_select.html @@ -0,0 +1,7 @@ +{% with id=widget.attrs.id %}
{% endwith %} \ No newline at end of file diff --git a/modoboa/templates/common/horizontal_select_option.html b/modoboa/templates/common/horizontal_select_option.html new file mode 100644 index 000000000..80f603bf9 --- /dev/null +++ b/modoboa/templates/common/horizontal_select_option.html @@ -0,0 +1,2 @@ + +{% if wrap_label %}{% endif %} \ No newline at end of file diff --git a/modoboa/transport/handlers.py b/modoboa/transport/handlers.py index 91a581022..aae87601a 100644 --- a/modoboa/transport/handlers.py +++ b/modoboa/transport/handlers.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals -from django.core.urlresolvers import reverse +from django.urls import reverse from django.dispatch import receiver from django.utils.translation import ugettext as _ diff --git a/modoboa/transport/tests.py b/modoboa/transport/tests.py index 052128fd6..5a35dd917 100644 --- a/modoboa/transport/tests.py +++ b/modoboa/transport/tests.py @@ -2,7 +2,7 @@ import json -from django.core.urlresolvers import reverse +from django.urls import reverse from modoboa.lib.tests import ModoAPITestCase, ModoTestCase diff --git a/modoboa/transport/views.py b/modoboa/transport/views.py index 944c97a9c..91298a082 100644 --- a/modoboa/transport/views.py +++ b/modoboa/transport/views.py @@ -1,7 +1,7 @@ """Transport views.""" from django import http -from django.core.urlresolvers import reverse, reverse_lazy +from django.urls import reverse, reverse_lazy from django.utils.translation import ugettext as _, ugettext_lazy from django.views import generic diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index c24c7f136..0cf7bdcde 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -69,7 +69,7 @@ INSTALLED_APPS += MODOBOA_APPS AUTH_USER_MODEL = 'core.User' -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( 'x_forwarded_for.middleware.XForwardedForMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware',