diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py
index f73996c71..9ccac780a 100644
--- a/modoboa/admin/handlers.py
+++ b/modoboa/admin/handlers.py
@@ -254,7 +254,7 @@ def admin_menu(sender, location, user, **kwargs):
if location != "top_menu":
return []
entries = []
- if user.has_perm("admin.view_domains"):
+ if user.has_perm("admin.view_domain"):
entries += [
{"name": "domains",
"url": reverse("admin:domain_list"),
diff --git a/modoboa/admin/migrations/0001_initial.py b/modoboa/admin/migrations/0001_initial.py
index afa54f6ba..09a6edb57 100644
--- a/modoboa/admin/migrations/0001_initial.py
+++ b/modoboa/admin/migrations/0001_initial.py
@@ -19,7 +19,6 @@ class Migration(migrations.Migration):
],
options={
'ordering': ['address'],
- 'permissions': (('view_aliases', 'View aliases'),),
},
bases=(models.Model,),
),
@@ -47,7 +46,6 @@ class Migration(migrations.Migration):
],
options={
'ordering': ['name'],
- 'permissions': (('view_domain', 'View domain'), ('view_domains', 'View domains')),
},
bases=(models.Model,),
),
@@ -58,9 +56,6 @@ class Migration(migrations.Migration):
('name', models.CharField(help_text='The alias name', unique=True, max_length=100, verbose_name='name')),
('enabled', models.BooleanField(default=True, help_text='Check to activate this alias', verbose_name='enabled')),
],
- options={
- 'permissions': (('view_domaliases', 'View domain aliases'),),
- },
bases=(models.Model,),
),
migrations.CreateModel(
@@ -71,9 +66,6 @@ class Migration(migrations.Migration):
('quota', models.PositiveIntegerField()),
('use_domain_quota', models.BooleanField(default=False)),
],
- options={
- 'permissions': (('view_mailboxes', 'View mailboxes'),),
- },
bases=(models.Model,),
),
migrations.CreateModel(
diff --git a/modoboa/admin/migrations/0015_rename_view_permissions.py b/modoboa/admin/migrations/0015_rename_view_permissions.py
new file mode 100644
index 000000000..744469a87
--- /dev/null
+++ b/modoboa/admin/migrations/0015_rename_view_permissions.py
@@ -0,0 +1,44 @@
+# Generated by Django 2.1.15 on 2020-01-13 09:22
+
+import sys
+
+from django.db import IntegrityError, migrations, transaction
+
+VIEW_PERMISSION_CODENAMES = {
+ 'view_aliases': 'view_alias',
+ 'view_domaliases': 'view_domainalias',
+ 'view_mailboxes': 'view_mailbox',
+}
+
+
+def rename_view_permissions(apps, schema_editor):
+ Permission = apps.get_model('auth', 'Permission')
+ db_alias = schema_editor.connection.alias
+ # Iterate over permissions and try to rename the codename
+ for perm in Permission.objects.using(db_alias).filter(
+ codename__in=VIEW_PERMISSION_CODENAMES.keys()
+ ):
+ codename = perm.codename
+ try:
+ with transaction.atomic():
+ perm.codename = VIEW_PERMISSION_CODENAMES[perm.codename]
+ perm.save()
+ except IntegrityError:
+ print(
+ (
+ "Unable to rename '{}' to '{}', a permission with this "
+ "codename already exists.".format(codename, perm.codename)
+ ),
+ file=sys.stderr,
+ )
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('admin', '0014_auto_20181017_1628'),
+ ]
+
+ operations = [
+ migrations.RunPython(rename_view_permissions),
+ ]
diff --git a/modoboa/admin/models/alias.py b/modoboa/admin/models/alias.py
index fb2d959b4..468b335df 100644
--- a/modoboa/admin/models/alias.py
+++ b/modoboa/admin/models/alias.py
@@ -48,9 +48,6 @@ class Alias(AdminObject):
_objectname = "MailboxAlias"
class Meta:
- permissions = (
- ("view_aliases", "View aliases"),
- )
ordering = ["address"]
unique_together = (("address", "internal"), )
app_label = "admin"
diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py
index c040ad260..eb478f3b3 100644
--- a/modoboa/admin/models/domain.py
+++ b/modoboa/admin/models/domain.py
@@ -63,10 +63,6 @@ class Domain(AdminObject):
dkim_private_key_path = models.CharField(max_length=254, blank=True)
class Meta:
- permissions = (
- ("view_domain", "View domain"),
- ("view_domains", "View domains"),
- )
ordering = ["name"]
app_label = "admin"
diff --git a/modoboa/admin/models/domain_alias.py b/modoboa/admin/models/domain_alias.py
index 055f0ff1e..6caa0a9cd 100644
--- a/modoboa/admin/models/domain_alias.py
+++ b/modoboa/admin/models/domain_alias.py
@@ -49,9 +49,6 @@ class DomainAlias(AdminObject):
objects = DomainAliasManager()
class Meta:
- permissions = (
- ("view_domaliases", "View domain aliases"),
- )
app_label = "admin"
def __str__(self):
diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py
index 21ede9a5f..df3e178ff 100644
--- a/modoboa/admin/models/mailbox.py
+++ b/modoboa/admin/models/mailbox.py
@@ -104,9 +104,6 @@ class Mailbox(AdminObject):
objects = MailboxManager()
class Meta:
- permissions = (
- ("view_mailboxes", "View mailboxes"),
- )
app_label = "admin"
def __init__(self, *args, **kwargs):
diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py
index 29550c8fc..89b151cb5 100644
--- a/modoboa/admin/views/domain.py
+++ b/modoboa/admin/views/domain.py
@@ -34,8 +34,8 @@ def index(request):
@login_required
@user_passes_test(
- lambda u: u.has_perm("admin.view_domains") or
- u.has_perm("admin.view_mailboxes")
+ lambda u: u.has_perm("admin.view_domain") or
+ u.has_perm("admin.view_mailbox")
)
def _domains(request):
sort_order, sort_dir = get_sort_order(request.GET, "name")
@@ -92,8 +92,8 @@ def _domains(request):
@login_required
@ensure_csrf_cookie
def domains(request, tplname="admin/domains.html"):
- if not request.user.has_perm("admin.view_domains"):
- if request.user.has_perm("admin.view_mailboxes"):
+ if not request.user.has_perm("admin.view_domain"):
+ if request.user.has_perm("admin.view_mailbox"):
return HttpResponseRedirect(
reverse("admin:identity_list")
)
@@ -113,8 +113,8 @@ def domains(request, tplname="admin/domains.html"):
@login_required
@user_passes_test(
- lambda u: u.has_perm("admin.view_domains") or
- u.has_perm("admin.view_mailboxes") or
+ lambda u: u.has_perm("admin.view_domain") or
+ u.has_perm("admin.view_mailbox") or
u.has_perm("admin.add_domain")
)
def get_next_page(request):
@@ -170,7 +170,7 @@ def newdomain(request):
@login_required
-@permission_required("admin.view_domains")
+@permission_required("admin.view_domain")
@reversion.create_revision()
def editdomain(request, dom_id):
"""Edit domain view."""
diff --git a/modoboa/core/constants.py b/modoboa/core/constants.py
index c0db2af39..99a0b0b2b 100644
--- a/modoboa/core/constants.py
+++ b/modoboa/core/constants.py
@@ -59,16 +59,15 @@ PERMISSIONS = {
["core", "user", "add_user"],
["core", "user", "change_user"],
["core", "user", "delete_user"],
- ["admin", "domain", "view_domains"],
["admin", "domain", "view_domain"],
["admin", "mailbox", "add_mailbox"],
["admin", "mailbox", "change_mailbox"],
["admin", "mailbox", "delete_mailbox"],
- ["admin", "mailbox", "view_mailboxes"],
+ ["admin", "mailbox", "view_mailbox"],
["admin", "alias", "add_alias"],
["admin", "alias", "change_alias"],
["admin", "alias", "delete_alias"],
- ["admin", "alias", "view_aliases"],
+ ["admin", "alias", "view_alias"],
["admin", "senderaddress", "add_senderaddress"],
["admin", "senderaddress", "change_senderaddress"],
["admin", "senderaddress", "delete_senderaddress"],
@@ -77,23 +76,21 @@ PERMISSIONS = {
["core", "user", "add_user"],
["core", "user", "change_user"],
["core", "user", "delete_user"],
- ["admin", "domain", "view_domains"],
- ["admin", "domain", "view_domain"],
["admin", "mailbox", "add_mailbox"],
["admin", "mailbox", "change_mailbox"],
["admin", "mailbox", "delete_mailbox"],
- ["admin", "mailbox", "view_mailboxes"],
+ ["admin", "mailbox", "view_mailbox"],
["admin", "alias", "add_alias"],
["admin", "alias", "change_alias"],
["admin", "alias", "delete_alias"],
- ["admin", "alias", "view_aliases"],
+ ["admin", "alias", "view_alias"],
["admin", "senderaddress", "add_senderaddress"],
["admin", "senderaddress", "change_senderaddress"],
["admin", "senderaddress", "delete_senderaddress"],
- ["admin", "domain", "view_domains"],
["admin", "domain", "add_domain"],
["admin", "domain", "change_domain"],
["admin", "domain", "delete_domain"],
+ ["admin", "domain", "view_domain"],
["admin", "domainalias", "add_domainalias"],
["admin", "domainalias", "change_domainalias"],
["admin", "domainalias", "delete_domainalias"],
diff --git a/modoboa/core/views/base.py b/modoboa/core/views/base.py
index 33f893f41..1c5378b34 100644
--- a/modoboa/core/views/base.py
+++ b/modoboa/core/views/base.py
@@ -16,7 +16,7 @@ def find_nextlocation(request, user):
nextlocation = request.POST.get("next", request.GET.get("next"))
condition = (
nextlocation and
- is_safe_url(nextlocation, host=request.get_host())
+ is_safe_url(nextlocation, request.get_host())
)
if condition:
return nextlocation
diff --git a/modoboa/templates/common/horizontal_select_option.html b/modoboa/templates/common/horizontal_select_option.html
index 80f603bf9..78558af69 100644
--- a/modoboa/templates/common/horizontal_select_option.html
+++ b/modoboa/templates/common/horizontal_select_option.html
@@ -1,2 +1,2 @@
-{% if wrap_label %}{% endif %}
\ No newline at end of file
+{% if widget.wrap_label %}{% endif %}
diff --git a/requirements.txt b/requirements.txt
index f41b24baa..92c9484a9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-django>=2.0,<2.1
+django>=2.1,<2.2
django-braces==1.14.0
django-ckeditor==5.8.0
django-reversion==3.0.5