- {% if enable_mx_checks == "yes" or enable_dnsbl_checks == "yes" %}
+ {% if enable_mx_checks or enable_dnsbl_checks %}
{% trans "DNS status" %}
{% if domain.awaiting_checks %}
{% trans "Awaiting checks" %}
{% else %}
- {% if enable_mx_checks == "yes" %}
+ {% if enable_mx_checks %}
MX
{% endif %}
- {% if enable_dnsbl_checks == "yes" %}
+ {% if enable_dnsbl_checks %}
DNSBL
{% endif %}
{% endif %}
diff --git a/modoboa/admin/templates/admin/domains.html b/modoboa/admin/templates/admin/domains.html
index 08440de2f..f9e0a6b4e 100644
--- a/modoboa/admin/templates/admin/domains.html
+++ b/modoboa/admin/templates/admin/domains.html
@@ -34,7 +34,7 @@ $(document).ready(function() {
{% trans "Name" %} |
{% trans "Alias(es)" %} |
{% trans "Tags" %} |
- {% if enable_mx_checks == "yes" or enable_dnsbl_checks == "yes" %}
+ {% if enable_mx_checks or enable_dnsbl_checks %}
{% trans "DNS status" %} |
{% endif %}
{% trans "Actions" %} |
diff --git a/modoboa/admin/templates/admin/domains_table.html b/modoboa/admin/templates/admin/domains_table.html
index 5278c1829..cc1940d1e 100644
--- a/modoboa/admin/templates/admin/domains_table.html
+++ b/modoboa/admin/templates/admin/domains_table.html
@@ -11,10 +11,10 @@
{% if domain.awaiting_checks %}
{% trans "Awaiting checks" %}
{% else %}
- {% if enable_mx_checks == "yes" %}
+ {% if enable_mx_checks %}
MX
{% endif %}
- {% if enable_dnsbl_checks == "yes" %}
+ {% if enable_dnsbl_checks %}
DNSBL
{% endif %}
{% endif %}
diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py
index e44914df6..6266efcb1 100644
--- a/modoboa/admin/tests/test_account.py
+++ b/modoboa/admin/tests/test_account.py
@@ -8,9 +8,9 @@ from django.test import override_settings
from modoboa.core import factories as core_factories
from modoboa.core.tests import test_core
from modoboa.core.models import User
-from modoboa.lib import parameters
from modoboa.lib.tests import ModoTestCase
from modoboa.lib.tests import NO_LDAP
+from modoboa.limits import utils as limits_utils
from .. import factories
from .. import models
@@ -201,8 +201,7 @@ class AccountTestCase(ModoTestCase):
def test_account_detail_view(self):
"""Test account detail view."""
- parameters.save_admin(
- "ENABLE_ADMIN_LIMITS", "no", app="limits")
+ self.set_global_parameter("enable_admin_limits", False, app="limits")
account = User.objects.get(username="admin@test.com")
url = reverse("admin:account_detail", args=[account.pk])
response = self.client.get(url)
@@ -210,8 +209,7 @@ class AccountTestCase(ModoTestCase):
self.assertIn("Summary", response.content)
self.assertIn("Administered domains", response.content)
self.assertNotIn("Resources usage", response.content)
- parameters.save_admin(
- "ENABLE_ADMIN_LIMITS", "yes", app="limits")
+ self.set_global_parameter("enable_admin_limits", True, app="limits")
response = self.client.get(url)
self.assertIn("Resources usage", response.content)
@@ -228,7 +226,7 @@ class LDAPAccountTestCase(test_core.LDAPTestCaseMixin, ModoTestCase):
"""Check if objects are not created as expected."""
self.activate_ldap_authentication()
self.searchbind_mode()
- parameters.save_admin("AUTO_CREATE_DOMAIN_AND_MAILBOX", "no")
+ self.set_global_parameter("auto_create_domain_and_mailbox", False)
username = "testuser@example.com"
self.authenticate(username, "test")
self.assertFalse(
@@ -242,15 +240,12 @@ class PermissionsTestCase(ModoTestCase):
@classmethod
def setUpTestData(cls):
"""Create test data."""
- from modoboa.lib import parameters
- from modoboa.limits import utils as limits_utils
-
super(PermissionsTestCase, cls).setUpTestData()
+ parameters = {}
for name, tpl in limits_utils.get_user_limit_templates():
- parameters.save_admin(
- "DEFLT_USER_{0}_LIMIT".format(name.upper()), 2,
- app="limits"
- )
+ parameters["deflt_user_{0}_limit".format(name)] = 2
+ cls.localconfig.parameters.set_values(parameters, app="limits")
+ cls.localconfig.save()
factories.populate_database()
cls.reseller = core_factories.UserFactory(username="reseller")
cls.reseller.role = "Resellers"
diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py
index 157b92e2d..c6d09f489 100644
--- a/modoboa/admin/tests/test_api.py
+++ b/modoboa/admin/tests/test_api.py
@@ -10,7 +10,6 @@ from rest_framework.authtoken.models import Token
from modoboa.admin import models as admin_models
from modoboa.core import models as core_models
-from modoboa.lib import parameters
from modoboa.lib.tests import ModoAPITestCase
from .. import factories
@@ -196,8 +195,10 @@ class AccountAPITestCase(ModoAPITestCase):
def setUp(self):
"""Test setup."""
super(AccountAPITestCase, self).setUp()
- parameters.save_admin("ENABLE_ADMIN_LIMITS", "no", app="limits")
- parameters.save_admin("ENABLE_DOMAIN_LIMITS", "no", app="limits")
+ self.set_global_parameters({
+ "enable_admin_limits": False,
+ "enable_domain_limits": False
+ }, app="limits")
def test_get_accounts(self):
"""Retrieve a list of accounts."""
@@ -461,7 +462,9 @@ class AliasAPITestCase(ModoAPITestCase):
def setUpTestData(cls):
"""Create test data."""
super(AliasAPITestCase, cls).setUpTestData()
- parameters.save_admin("ENABLE_ADMIN_LIMITS", "no", app="limits")
+ cls.localconfig.parameters.set_value(
+ "enable_admin_limits", False, app="limits")
+ cls.localconfig.save()
factories.populate_database()
cls.da_token = Token.objects.create(
user=core_models.User.objects.get(username="admin@test.com"))
diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py
index 39577811f..bdf153d78 100644
--- a/modoboa/admin/tests/test_domain.py
+++ b/modoboa/admin/tests/test_domain.py
@@ -7,7 +7,6 @@ import json
from django.core.urlresolvers import reverse
from modoboa.core.models import User
-from modoboa.lib import parameters
from modoboa.lib.tests import ModoTestCase
from .. import factories
@@ -15,7 +14,6 @@ from ..models import Domain, Alias
class DomainTestCase(ModoTestCase):
-
"""Test case for Domain."""
@classmethod
@@ -27,7 +25,7 @@ class DomainTestCase(ModoTestCase):
def test_create(self):
"""Test the creation of a domain."""
values = {
- "name": "pouet.com", "quota": 100, "create_dom_admin": "no",
+ "name": "pouet.com", "quota": 100, "create_dom_admin": False,
"type": "domain", "stepid": "step3"
}
self.ajax_post(reverse("admin:domain_add"), values)
@@ -40,7 +38,7 @@ class DomainTestCase(ModoTestCase):
def test_create_utf8(self):
"""Test the creation of a domain with non-ASCII characters."""
values = {
- "name": "pouét.com", "quota": 100, "create_dom_admin": "no",
+ "name": "pouét.com", "quota": 100, "create_dom_admin": False,
"type": "domain", "stepid": "step3"
}
self.ajax_post(reverse("admin:domain_add"), values)
@@ -51,12 +49,10 @@ class DomainTestCase(ModoTestCase):
self.assertFalse(dom.admins)
def test_create_with_template(self):
- """Test the creation of a domain with a template
-
- """
+ """Test the creation of a domain with a template."""
values = {
- "name": "pouet.com", "quota": 100, "create_dom_admin": "yes",
- "dom_admin_username": "toto", "create_aliases": "yes",
+ "name": "pouet.com", "quota": 100, "create_dom_admin": True,
+ "dom_admin_username": "toto", "create_aliases": True,
"type": "domain", "stepid": 'step3'
}
self.ajax_post(
@@ -76,8 +72,8 @@ class DomainTestCase(ModoTestCase):
def test_create_with_template_and_empty_quota(self):
"""Test the creation of a domain with a template and no quota"""
values = {
- "name": "pouet.com", "quota": 0, "create_dom_admin": "yes",
- "dom_admin_username": "toto", "create_aliases": "yes",
+ "name": "pouet.com", "quota": 0, "create_dom_admin": True,
+ "dom_admin_username": "toto", "create_aliases": True,
"type": "domain", "stepid": 'step3'
}
self.ajax_post(
@@ -95,10 +91,10 @@ class DomainTestCase(ModoTestCase):
self.assertTrue(da.can_access(al))
def test_create_using_default_quota(self):
- parameters.save_admin('DEFAULT_DOMAIN_QUOTA', 50, app='admin')
+ self.set_global_parameter("default_domain_quota", 50)
values = {
- "name": "pouet.com", "create_dom_admin": "yes",
- "dom_admin_username": "toto", "create_aliases": "yes",
+ "name": "pouet.com", "create_dom_admin": True,
+ "dom_admin_username": "toto", "create_aliases": True,
"type": "domain", "stepid": 'step3'
}
self.ajax_post(
@@ -149,8 +145,7 @@ class DomainTestCase(ModoTestCase):
def test_domain_detail_view(self):
"""Test Domain detail view."""
- parameters.save_admin(
- "ENABLE_DOMAIN_LIMITS", "no", app="limits")
+ self.set_global_parameter("enable_domain_limits", False, app="limits")
domain = Domain.objects.get(name="test.com")
url = reverse("admin:domain_detail", args=[domain.pk])
response = self.client.get(url)
@@ -158,8 +153,7 @@ class DomainTestCase(ModoTestCase):
self.assertIn("Summary", response.content)
self.assertIn("Administrators", response.content)
self.assertNotIn("Resources usage", response.content)
- parameters.save_admin(
- "ENABLE_DOMAIN_LIMITS", "yes", app="limits")
+ self.set_global_parameter("enable_domain_limits", True, app="limits")
response = self.client.get(url)
self.assertIn("Resources usage", response.content)
diff --git a/modoboa/admin/tests/test_import_.py b/modoboa/admin/tests/test_import_.py
index c9f7f4027..4fe2adf88 100644
--- a/modoboa/admin/tests/test_import_.py
+++ b/modoboa/admin/tests/test_import_.py
@@ -3,7 +3,6 @@ from django.core.files.base import ContentFile
from django.core.urlresolvers import reverse
from modoboa.core.models import User
-from modoboa.lib import parameters
from modoboa.lib.tests import ModoTestCase
from .. import factories
@@ -16,7 +15,9 @@ class ImportTestCase(ModoTestCase):
def setUpTestData(cls):
"""Create test data."""
super(ImportTestCase, cls).setUpTestData()
- parameters.save_admin("ENABLE_ADMIN_LIMITS", "no", app="limits")
+ cls.localconfig.parameters.set_value(
+ "enable_admin_limits", False, app="limits")
+ cls.localconfig.save()
factories.populate_database()
def test_domains_import(self):
diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py
index 427123802..8513bcb4a 100644
--- a/modoboa/admin/tests/test_mx.py
+++ b/modoboa/admin/tests/test_mx.py
@@ -5,7 +5,6 @@ from django.core.urlresolvers import reverse
from django.test import override_settings
from modoboa.lib.tests import ModoTestCase
-from modoboa.lib import parameters
from .. import factories
from .. import models
@@ -21,7 +20,8 @@ class MXTestCase(ModoTestCase):
cls.domain = factories.DomainFactory(name="modoboa.org")
# should not exist
cls.bad_domain = factories.DomainFactory(name="pouet.com")
- parameters.save_admin("VALID_MXS", "127.0.0.1")
+ cls.localconfig.parameters.set_value("valid_mxs", "127.0.0.1")
+ cls.localconfig.save()
models.MXRecord.objects.all().delete()
def test_management_command(self):
diff --git a/modoboa/admin/tests/test_password_schemes.py b/modoboa/admin/tests/test_password_schemes.py
index f19ba7bf3..113c5d90b 100644
--- a/modoboa/admin/tests/test_password_schemes.py
+++ b/modoboa/admin/tests/test_password_schemes.py
@@ -2,7 +2,6 @@ from django.core.urlresolvers import reverse
from modoboa.core.models import User
from modoboa.lib.tests import ModoTestCase
-from modoboa.lib import parameters
from .. import factories
@@ -28,7 +27,7 @@ class PasswordSchemesTestCase(ModoTestCase):
)
def _test_scheme(self, name, startpattern):
- parameters.save_admin('PASSWORD_SCHEME', name, app='core')
+ self.set_global_parameter("password_scheme", name, app="core")
self._create_account()
account = User.objects.get(username='tester@test.com')
self.assertTrue(account.password.startswith(startpattern))
diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py
index bd1a7a4df..3c2b2dea5 100644
--- a/modoboa/admin/views/domain.py
+++ b/modoboa/admin/views/domain.py
@@ -16,7 +16,7 @@ from reversion import revisions as reversion
from modoboa.core.models import User
from modoboa.core import signals as core_signals
-from modoboa.lib import parameters, events
+from modoboa.lib import events
from modoboa.lib.web_utils import (
_render_to_string, render_to_json_response
)
@@ -61,20 +61,22 @@ def _domains(request):
domainlist = sorted(domainlist, key=lambda d: d.tags[0],
reverse=sort_dir == '-')
context = {
- "handle_mailboxes": parameters.get_admin(
- "HANDLE_MAILBOXES", raise_error=False),
- "auto_account_removal": parameters.get_admin("AUTO_ACCOUNT_REMOVAL"),
+ "handle_mailboxes": request.localconfig.parameters.get_value(
+ "handle_mailboxes", raise_exception=False),
+ "auto_account_removal": request.localconfig.parameters.get_value(
+ "auto_account_removal"),
}
page = get_listing_page(domainlist, request.GET.get("page", 1))
if page is None:
context["length"] = 0
else:
+ parameters = request.localconfig.parameters
context["rows"] = _render_to_string(
request, "admin/domains_table.html", {
"domains": page.object_list,
- "enable_mx_checks": parameters.get_admin("ENABLE_MX_CHECKS"),
+ "enable_mx_checks": parameters.get_value("enable_mx_checks"),
"enable_dnsbl_checks": (
- parameters.get_admin("ENABLE_DNSBL_CHECKS")),
+ parameters.get_value("enable_dnsbl_checks"))
}
)
context["pages"] = [page.number]
@@ -90,10 +92,11 @@ def domains(request, tplname="admin/domains.html"):
reverse("admin:identity_list")
)
return HttpResponseRedirect(reverse("core:user_index"))
+ parameters = request.localconfig.parameters
return render(request, tplname, {
"selection": "domains",
- "enable_mx_checks": parameters.get_admin("ENABLE_MX_CHECKS"),
- "enable_dnsbl_checks": parameters.get_admin("ENABLE_DNSBL_CHECKS")
+ "enable_mx_checks": parameters.get_value("enable_mx_checks"),
+ "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks")
})
@@ -189,10 +192,11 @@ class DomainDetailView(
context = super(DomainDetailView, self).get_context_data(**kwargs)
result = signals.extra_domain_dashboard_widgets.send(
self.__class__, user=self.request.user, domain=self.object)
+ parameters = self.request.localconfig.parameters
context.update({
"templates": {"left": [], "right": []},
- "enable_mx_checks": parameters.get_admin("ENABLE_MX_CHECKS"),
- "enable_dnsbl_checks": parameters.get_admin("ENABLE_DNSBL_CHECKS"),
+ "enable_mx_checks": parameters.get_value("enable_mx_checks"),
+ "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks"),
})
for receiver, widgets in result:
for widget in widgets:
diff --git a/modoboa/admin/views/identity.py b/modoboa/admin/views/identity.py
index 23035c087..1518c6682 100644
--- a/modoboa/admin/views/identity.py
+++ b/modoboa/admin/views/identity.py
@@ -49,8 +49,8 @@ def _identities(request):
objects = sorted(idents_list, key=lambda o: o.tags[0],
reverse=sort_dir == '-')
context = {
- "handle_mailboxes": parameters.get_admin(
- "HANDLE_MAILBOXES", raise_error=False)
+ "handle_mailboxes": request.localconfig.parameters.get_value(
+ "handle_mailboxes", raise_exception=False)
}
page = get_listing_page(objects, request.GET.get("page", 1))
if page is None:
diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py
index 28d1f1fe5..c6633cd81 100644
--- a/modoboa/core/app_settings.py
+++ b/modoboa/core/app_settings.py
@@ -99,7 +99,7 @@ class GeneralParametersForm(parameters.AdminParametersForm):
ldap_secured = YesNoField(
label=ugettext_lazy("Use a secured connection"),
- initial="no",
+ initial=False,
help_text=ugettext_lazy(
"Use an SSL/TLS connection to access the LDAP server")
)
@@ -177,7 +177,7 @@ class GeneralParametersForm(parameters.AdminParametersForm):
ldap_is_active_directory = YesNoField(
label=ugettext_lazy("Active Directory"),
- initial="no",
+ initial=False,
help_text=ugettext_lazy(
"Tell if the LDAP server is an Active Directory one")
)
@@ -224,21 +224,21 @@ class GeneralParametersForm(parameters.AdminParametersForm):
enable_api_communication = YesNoField(
label=ugettext_lazy("Enable communication"),
- initial="yes",
+ initial=True,
help_text=ugettext_lazy(
"Enable communication with Modoboa public API")
)
check_new_versions = YesNoField(
label=ugettext_lazy("Check new versions"),
- initial="yes",
+ initial=True,
help_text=ugettext_lazy(
"Automatically checks if a newer version is available")
)
send_statistics = YesNoField(
label=ugettext_lazy("Send statistics"),
- initial="yes",
+ initial=True,
help_text=ugettext_lazy(
"Send statistics to Modoboa public API "
"(counters and used extensions)")
@@ -296,8 +296,8 @@ class GeneralParametersForm(parameters.AdminParametersForm):
"ldap_admin_groups": "authentication_type=ldap",
"ldap_group_type": "authentication_type=ldap",
"ldap_groups_search_base": "authentication_type=ldap",
- "check_new_versions": "enable_api_communication=yes",
- "send_statistics": "enable_api_communication=yes",
+ "check_new_versions": "enable_api_communication=True",
+ "send_statistics": "enable_api_communication=True",
}
def __init__(self, *args, **kwargs):
@@ -369,7 +369,7 @@ class GeneralParametersForm(parameters.AdminParametersForm):
"email": "mail",
"last_name": "sn"
})
- ldap_uri = 'ldaps://' if values["ldap_secured"] == "yes" else "ldap://"
+ ldap_uri = "ldaps://" if values["ldap_secured"] else "ldap://"
ldap_uri += "%s:%s" % (
values["ldap_server_address"], values["ldap_server_port"])
setattr(settings, "AUTH_LDAP_SERVER_URI", ldap_uri)
@@ -400,7 +400,7 @@ class GeneralParametersForm(parameters.AdminParametersForm):
settings, "AUTH_LDAP_USER_DN_TEMPLATE",
values["ldap_user_dn_template"]
)
- if values["ldap_is_active_directory"] == "yes":
+ if values["ldap_is_active_directory"]:
if not hasattr(settings, "AUTH_LDAP_GLOBAL_OPTIONS"):
setattr(settings, "AUTH_LDAP_GLOBAL_OPTIONS", {
ldap.OPT_REFERRALS: False
diff --git a/modoboa/core/context_processors.py b/modoboa/core/context_processors.py
index 94f24385a..69e3a338a 100644
--- a/modoboa/core/context_processors.py
+++ b/modoboa/core/context_processors.py
@@ -1,18 +1,16 @@
-"""
-Custom context processors.
-"""
-from modoboa.lib import events, parameters
+"""Custom context processors."""
+
+from modoboa.lib import events
def top_notifications(request):
- """
- A context processor to include top notifications.
- """
+ """A context processor to include top notifications."""
if request.user.is_anonymous():
return {}
+ interval = request.localconfig.parameters.get_value(
+ "top_notifications_check_interval")
return {
- "notifications_check_interval":
- int(parameters.get_admin("TOP_NOTIFICATIONS_CHECK_INTERVAL")) * 1000,
+ "notifications_check_interval": interval * 1000,
"top_notifications": events.raiseQueryEvent(
"TopNotifications", request, False)
}
diff --git a/modoboa/core/management/commands/communicate_with_public_api.py b/modoboa/core/management/commands/communicate_with_public_api.py
index e06a45956..dcd003a54 100644
--- a/modoboa/core/management/commands/communicate_with_public_api.py
+++ b/modoboa/core/management/commands/communicate_with_public_api.py
@@ -4,7 +4,7 @@ from django.core.management.base import BaseCommand, CommandError
from modoboa.admin import models as admin_models
from modoboa.core.extensions import exts_pool
-from modoboa.lib import api_client, parameters
+from modoboa.lib import api_client
from ... import models
@@ -16,18 +16,18 @@ class Command(BaseCommand):
def handle(self, *args, **options):
"""Command entry point."""
- if parameters.get_admin("ENABLE_API_COMMUNICATION") == "no":
- return
- self.client = api_client.ModoAPIClient()
local_config = (
models.LocalConfig.objects.select_related("site").first())
+ if not local_config.parameters.get_value("enable_api_communication"):
+ return
+ self.client = api_client.ModoAPIClient()
if not local_config.api_pk:
pk = self.client.register_instance(local_config.site.domain)
if pk is None:
raise CommandError("Instance registration failed.")
local_config.api_pk = pk
- if parameters.get_admin("CHECK_NEW_VERSIONS") == "yes":
+ if local_config.parameters.get_value("check_new_versions"):
versions = self.client.versions()
if versions is None:
raise CommandError("Failed to retrieve versions from the API.")
@@ -35,7 +35,7 @@ class Command(BaseCommand):
local_config.save()
- if parameters.get_admin("SEND_STATISTICS") == "no":
+ if not local_config.parameters.get_value("send_statistics"):
return
extensions = [ext["name"] for ext in exts_pool.list_all()]
data = {
diff --git a/modoboa/core/management/commands/load_initial_data.py b/modoboa/core/management/commands/load_initial_data.py
index bdda736c3..58ac166d0 100644
--- a/modoboa/core/management/commands/load_initial_data.py
+++ b/modoboa/core/management/commands/load_initial_data.py
@@ -10,13 +10,14 @@ from django.core.management.base import BaseCommand
from modoboa.core import PERMISSIONS
from modoboa.core.extensions import exts_pool
-from modoboa.core.models import User, ObjectAccess
from modoboa.lib.cryptutils import random_key
from modoboa.lib import events
from modoboa.lib import models as lib_models
from modoboa.lib.permissions import add_permissions_to_group
import modoboa.relaydomains.models as relay_models
+from ... import models
+
class Command(BaseCommand):
@@ -37,25 +38,26 @@ class Command(BaseCommand):
def handle(self, *args, **options):
"""Command entry point."""
- if not User.objects.filter(is_superuser=True).count():
- admin = User(username=options["admin_username"], is_superuser=True)
+ if not models.User.objects.filter(is_superuser=True).count():
+ admin = models.User(
+ username=options["admin_username"], is_superuser=True)
admin.set_password("password")
admin.save()
- ObjectAccess.objects.create(
+ models.ObjectAccess.objects.create(
user=admin, content_object=admin, is_owner=True)
- param_name = "core.SECRET_KEY"
- qset = lib_models.Parameter.objects.filter(name=param_name)
- if not qset.exists():
- lib_models.Parameter.objects.create(
- name=param_name, value=random_key())
+ lc = models.LocalConfig.objects.first()
+ secret_key = lc.parameters.get_value("secret_key")
+ if not secret_key:
+ lc.parameters.set_value("secret_key", random_key())
+ lc.save()
- for service_name in ['relay', 'smtp']:
+ for service_name in ["relay", "smtp"]:
relay_models.Service.objects.get_or_create(name=service_name)
exts_pool.load_all()
- superadmin = User.objects.filter(is_superuser=True).first()
+ superadmin = models.User.objects.filter(is_superuser=True).first()
groups = PERMISSIONS.keys() + [
role[0] for role
in events.raiseQueryEvent("GetExtraRoles", superadmin, None)
@@ -75,6 +77,6 @@ class Command(BaseCommand):
extension.load_initial_data()
events.raiseEvent("InitialDataLoaded", extname)
- if options['extra_fixtures']:
+ if options["extra_fixtures"]:
from modoboa.admin import factories
factories.populate_database()
diff --git a/modoboa/core/middleware.py b/modoboa/core/middleware.py
new file mode 100644
index 000000000..c1463be56
--- /dev/null
+++ b/modoboa/core/middleware.py
@@ -0,0 +1,11 @@
+"""Core middlewares."""
+
+from . import models
+
+
+class LocalConfigMiddleware(object):
+ """A middleware to inject LocalConfig into request."""
+
+ def process_request(self, request):
+ """Inject LocalConfig instance to request."""
+ request.localconfig = models.LocalConfig.objects.first()
diff --git a/modoboa/core/models.py b/modoboa/core/models.py
index 9b24424b0..2f0ba8503 100644
--- a/modoboa/core/models.py
+++ b/modoboa/core/models.py
@@ -20,12 +20,14 @@ import jsonfield
from reversion import revisions as reversion
from modoboa.core.password_hashers import get_password_hasher
-from modoboa.lib import events, parameters
+from modoboa.lib import events
+from modoboa.lib import parameters as lib_parameters
from modoboa.lib.exceptions import (
PermDeniedException, InternalError, BadRequest, Conflict
)
from . import constants
+from . import parameters
try:
@@ -67,7 +69,8 @@ class User(PermissionsMixin):
ugettext_lazy('last login'), blank=True, null=True
)
- language = models.CharField(ugettext_lazy("language"),
+ language = models.CharField(
+ ugettext_lazy("language"),
max_length=10, default="en", choices=constants.LANGUAGES,
help_text=ugettext_lazy(
"Prefered language to display pages."
@@ -139,11 +142,11 @@ class User(PermissionsMixin):
"""
try:
- scheme = parameters.get_admin("PASSWORD_SCHEME")
+ scheme = lib_parameters.get_admin("PASSWORD_SCHEME")
except parameters.NotDefined:
from modoboa.core.apps import load_core_settings
load_core_settings()
- scheme = parameters.get_admin("PASSWORD_SCHEME")
+ scheme = lib_parameters.get_admin("PASSWORD_SCHEME")
if isinstance(raw_value, unicode):
raw_value = raw_value.encode("utf-8")
@@ -505,3 +508,10 @@ class LocalConfig(models.Model):
# API results cache
api_versions = jsonfield.JSONField()
+
+ _parameters = jsonfield.JSONField()
+
+ def __init__(self, *args, **kwargs):
+ """Load parameter manager."""
+ super(LocalConfig, self).__init__(*args, **kwargs)
+ self.parameters = parameters.Manager("admin", self._parameters)
diff --git a/modoboa/core/parameters.py b/modoboa/core/parameters.py
new file mode 100644
index 000000000..7a13a6baa
--- /dev/null
+++ b/modoboa/core/parameters.py
@@ -0,0 +1,144 @@
+"""Parameters management."""
+
+from modoboa.lib import exceptions
+from modoboa.lib import form_utils
+from modoboa.lib.sysutils import guess_extension_name
+
+
+class NotDefined(exceptions.ModoboaException):
+ """Custom exception for undefined parameters."""
+
+ http_code = 404
+
+ def __init__(self, app, name=None):
+ self.app = app
+ self.name = name
+
+ def __str__(self):
+ if self.name is None:
+ return "Application {} not registered".format(self.app)
+ return "Parameter {} not defined for app {}".format(
+ self.name, self.app)
+
+
+class Registry(object):
+ """A registry for parameters."""
+
+ def __init__(self):
+ """Constructor."""
+ self._registry = {
+ "admin": {},
+ "user": {}
+ }
+
+ def add(self, level, formclass, label):
+ """Add a new class containing parameters."""
+ self._registry[level][formclass.app] = {
+ "label": label, "formclass": formclass, "defaults": {}
+ }
+
+ def _load_default_values(self, level):
+ """Load default values."""
+ for app, data in self._registry[level].items():
+ form = data["formclass"](load_values_from_db=False)
+ for name, field in form.fields.items():
+ if type(field) is form_utils.SeparatorField:
+ continue
+ data["defaults"][name] = field.initial
+
+ def get_forms(self, level, *args, **kwargs):
+ """Return form instances for all app of the given level."""
+ sorted_apps = []
+ first_app = "core"
+ if first_app in self._registry[level]:
+ sorted_apps.append(first_app)
+ sorted_apps += sorted(
+ [a for a in self._registry[level].keys() if a != first_app],
+ key=lambda a: self._registry[level][a]["label"]
+ )
+ result = []
+ for app in sorted_apps:
+ data = self._registry[level][app]
+ result.append({
+ "label": data["label"],
+ "form": data["formclass"](*args, **kwargs)
+ })
+ return result
+
+ def exists(self, level, app, parameter=None):
+ """Check if parameter exists."""
+ parameters = self._registry[level]
+ result = app in parameters
+ if parameter:
+ result = result and parameter in parameters[app]["defaults"]
+ return result
+
+ def get_default(self, level, app, parameter):
+ """Retrieve default value for parameter."""
+ if app not in self._registry[level]:
+ raise NotDefined(app)
+ if parameter not in self._registry[level][app]["defaults"]:
+ raise NotDefined(app, parameter)
+ return self._registry[level][app]["defaults"][parameter]
+
+ def get_defaults(self, level, app):
+ """Retrieve default values for application."""
+ if app not in self._registry[level]:
+ raise NotDefined(app)
+ return self._registry[level][app]["defaults"]
+
+registry = Registry()
+
+
+class Manager(object):
+ """A manager for parameters."""
+
+ def __init__(self, level, parameters):
+ """Constructor."""
+ self._level = level
+ self._parameters = parameters
+ registry._load_default_values(level)
+
+ def get_value(self, parameter, app=None, raise_exception=True):
+ """Return the value associated to the specified parameter."""
+ if app is None:
+ app = guess_extension_name()
+ # Compat. with the old way...
+ parameter = parameter.lower()
+ try:
+ default = registry.get_default(self._level, app, parameter)
+ except NotDefined:
+ if raise_exception:
+ raise
+ return None
+ if app in self._parameters:
+ return self._parameters[app][parameter]
+ return default
+
+ def get_values(self, app=None):
+ """Return all values for the given level/app."""
+ if app is None:
+ app = guess_extension_name()
+ values = registry.get_defaults(self._level, app)
+ for parameter, value in values.iteritems():
+ yield (parameter, self._parameters[app].get(parameter, value))
+
+ def set_value(self, parameter, value, app=None):
+ """Set parameter for the given app."""
+ if app is None:
+ app = guess_extension_name()
+ if not registry.exists(self._level, app, parameter):
+ raise NotDefined(app, parameter)
+ if app not in self._parameters:
+ self._parameters[app] = registry.get_defaults(self._level, app)
+ self._parameters[app][parameter] = value
+
+ def set_values(self, values, app=None):
+ """Set/update values for the given app."""
+ if app is None:
+ app = guess_extension_name()
+ if not registry.exists(self._level, app):
+ raise NotDefined(app)
+ if app not in self._parameters:
+ self._parameters[app] = registry.get_defaults(self._level, app)
+ self._parameters[app].update(values)
diff --git a/modoboa/core/tests/test_core.py b/modoboa/core/tests/test_core.py
index 598124fd9..35db7af34 100644
--- a/modoboa/core/tests/test_core.py
+++ b/modoboa/core/tests/test_core.py
@@ -102,9 +102,10 @@ class LDAPTestCaseMixin(object):
def activate_ldap_authentication(self):
"""Modify settings."""
- parameters.save_admin(
- "AUTHENTICATION_TYPE", "ldap")
- parameters.save_admin("LDAP_SERVER_PORT", "3389")
+ self.set_global_parameters({
+ "authentication_type": "ldap",
+ "ldap_server_port": 3389
+ })
def restore_user_password(self, username, new_password):
"""Restore user password to its initial state."""
@@ -131,16 +132,19 @@ class LDAPTestCaseMixin(object):
def searchbind_mode(self):
"""Apply settings required by the searchbind mode."""
- parameters.save_admin("LDAP_AUTH_METHOD", "searchbind")
- parameters.save_admin("LDAP_BIND_DN", "cn=admin,dc=example,dc=com")
- parameters.save_admin("LDAP_BIND_PASSWORD", "test")
- parameters.save_admin("LDAP_SEARCH_BASE", "ou=users,dc=example,dc=com")
+ self.set_global_parameters({
+ "ldap_auth_method": "searchbind",
+ "ldap_bind_dn": "cn=admin,dc=example,dc=com",
+ "ldap_bind_password": "test",
+ "ldap_search_base": "ou=users,dc=example,dc=com"
+ })
def directbind_mode(self):
"""Apply settings required by the directbind mode."""
- parameters.save_admin("LDAP_AUTH_METHOD", "directbind")
- parameters.save_admin(
- "LDAP_USER_DN_TEMPLATE", "cn=%(user)s,ou=users,dc=example,dc=com")
+ self.set_global_parameters({
+ "ldap_auth_method": "directbind",
+ "ldap_user_dn_template": "cn=%(user)s,ou=users,dc=example,dc=com"
+ })
@override_settings(AUTHENTICATION_BACKENDS=(
diff --git a/modoboa/core/views/admin.py b/modoboa/core/views/admin.py
index 9d1fc83b6..54c10b250 100644
--- a/modoboa/core/views/admin.py
+++ b/modoboa/core/views/admin.py
@@ -9,6 +9,7 @@ from django.template.loader import render_to_string
from django.utils.translation import ugettext as _
from modoboa.core.models import Log
+from modoboa.core import parameters as core_parameters
from modoboa.core.utils import check_for_updates
from modoboa.lib import events, parameters
from modoboa.lib.listing import get_sort_order, get_listing_page
@@ -31,7 +32,8 @@ def viewparameters(request, tplname='core/parameters.html'):
return render_to_json_response({
"left_selection": "parameters",
"content": _render_to_string(request, tplname, {
- "forms": parameters.get_admin_forms
+ "forms": core_parameters.registry.get_forms(
+ "admin", localconfig=request.localconfig)
})
})
@@ -39,7 +41,10 @@ def viewparameters(request, tplname='core/parameters.html'):
@login_required
@user_passes_test(lambda u: u.is_superuser)
def saveparameters(request):
- for formdef in parameters.get_admin_forms(request.POST):
+ """Save all parameters."""
+ forms = core_parameters.registry.get_forms(
+ "admin", request.POST, localconfig=request.localconfig)
+ for formdef in forms:
form = formdef["form"]
if form.is_valid():
form.save()
@@ -48,6 +53,7 @@ def saveparameters(request):
return render_to_json_response(
{'form_errors': form.errors, 'prefix': form.app}, status=400
)
+ request.localconfig.save()
return render_to_json_response(_("Parameters saved"))
diff --git a/modoboa/core/views/base.py b/modoboa/core/views/base.py
index bb61722e9..be3708641 100644
--- a/modoboa/core/views/base.py
+++ b/modoboa/core/views/base.py
@@ -5,8 +5,6 @@ from django.views import generic
from django.contrib.auth import mixins as auth_mixins
-from modoboa.lib import parameters
-
from ..extensions import exts_pool
@@ -18,7 +16,8 @@ def find_nextlocation(request, user):
nextlocation = request.POST.get("next", None)
if nextlocation is None or nextlocation == "None":
if request.user.role == "SimpleUsers":
- topredir = parameters.get_admin("DEFAULT_TOP_REDIRECTION")
+ topredir = request.localconfig.parameters.get_value(
+ "default_top_redirection")
if topredir != "user":
infos = exts_pool.get_extension_infos(topredir)
nextlocation = infos["url"] if infos["url"] else infos["name"]
diff --git a/modoboa/lib/form_utils.py b/modoboa/lib/form_utils.py
index b7abb9c3b..b1cd0e54b 100644
--- a/modoboa/lib/form_utils.py
+++ b/modoboa/lib/form_utils.py
@@ -6,7 +6,7 @@ import abc
from collections import OrderedDict
import re
-from django.forms import ChoiceField
+from django.forms import TypedChoiceField
from django.forms.fields import Field
from django.forms.widgets import RadioSelect
from django.forms.widgets import RadioChoiceInput
@@ -371,19 +371,23 @@ class TabForms(object):
class CustomRadioInput(RadioChoiceInput):
+ """Custom radio input."""
+
def __unicode__(self):
- if 'id' in self.attrs:
- label_for = ' for="%s"' % self.attrs['id']
+ if "id" in self.attrs:
+ label_for = ' for="%s"' % self.attrs["id"]
else:
- label_for = ''
+ label_for = ""
choice_label = conditional_escape(force_unicode(self.choice_label))
return mark_safe(
- u'
'
+ u"
"
% (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(
@@ -392,24 +396,35 @@ class InlineRadioRenderer(RadioSelect.renderer):
def render(self):
return mark_safe(
- u'\n'.join([u'%s\n' % force_unicode(w) for w in self])
+ u"\n".join([u"%s\n" % force_unicode(w) for w in self])
)
class InlineRadioSelect(RadioSelect):
+ """Custom inline radio widget."""
+
renderer = InlineRadioRenderer
class SeparatorField(Field):
+ """Custom field to represent a separator."""
+
def __init__(self, *args, **kwargs):
kwargs["required"] = False
super(SeparatorField, self).__init__(*args, **kwargs)
-class YesNoField(ChoiceField):
+class YesNoField(TypedChoiceField):
+ """A yes/no form field."""
+
def __init__(self, *args, **kwargs):
- kwargs["choices"] = [
- ("yes", ugettext_lazy("Yes")), ("no", ugettext_lazy("No"))
- ]
- kwargs["widget"] = InlineRadioSelect
+ """Constructor."""
+ kwargs.update({
+ "choices": (
+ (True, ugettext_lazy("Yes")),
+ (False, ugettext_lazy("No"))
+ ),
+ "widget": InlineRadioSelect,
+ "coerce": lambda x: x == "True"
+ })
super(YesNoField, self).__init__(*args, **kwargs)
diff --git a/modoboa/lib/parameters.py b/modoboa/lib/parameters.py
index dc23d4538..1da89f896 100644
--- a/modoboa/lib/parameters.py
+++ b/modoboa/lib/parameters.py
@@ -12,28 +12,18 @@ Only super users will be able to access this part of the web interface.
from django import forms
+from modoboa.core import parameters as core_parameters
from modoboa.lib import events
-from modoboa.lib.exceptions import ModoboaException
+from modoboa.lib import signals
from modoboa.lib.sysutils import guess_extension_name
from . import db_utils
+from . import form_utils
_params = {'A': {}, 'U': {}}
-class NotDefined(ModoboaException):
- http_code = 404
-
- def __init__(self, app, name):
- self.app = app
- self.name = name
-
- def __str__(self):
- return "Application '%s' and/or parameter '%s' not defined" \
- % (self.app, self.name)
-
-
class GenericParametersForm(forms.Form):
"""Base class for parameter forms.
@@ -43,10 +33,12 @@ class GenericParametersForm(forms.Form):
visibility_rules = None
def __init__(self, *args, **kwargs):
+ """Constructor."""
if self.app is None:
raise NotImplementedError
kwargs["prefix"] = self.app
+ load_values_from_db = kwargs.pop("load_values_from_db", True)
super(GenericParametersForm, self).__init__(*args, **kwargs)
self.visirules = {}
@@ -58,7 +50,7 @@ class GenericParametersForm(forms.Form):
}
self.visirules["%s-%s" % (self.app, key)] = visibility
- if not args:
+ if not args and load_values_from_db:
self._load_initial_values()
def _load_initial_values(self):
@@ -89,42 +81,44 @@ class GenericParametersForm(forms.Form):
class AdminParametersForm(GenericParametersForm):
+ """Base form to declare admin level parameters."""
+
+ def __init__(self, *args, **kwargs):
+ """Store LocalConfig instance."""
+ self.localconfig = kwargs.pop("localconfig", None)
+ super(AdminParametersForm, self).__init__(*args, **kwargs)
def _load_initial_values(self):
- from .models import Parameter
-
- if not db_utils.db_table_exists("lib_parameter"):
+ """Load form initial values from database."""
+ condition = (
+ not db_utils.db_table_exists("core_localconfig") or
+ not self.localconfig)
+ if condition:
return
- names = [
- "%s.%s" % (self.app, name.upper()) for name in self.fields.keys()
- ]
- for p in Parameter.objects.filter(name__in=names):
- self.fields[p.shortname].initial = self._decode_value(p.value)
+ values = self.localconfig.parameters.get_values(app=self.app)
+ for key, value in values:
+ self.fields[key].initial = value
def save(self):
- from .models import Parameter
- from modoboa.lib.form_utils import SeparatorField
-
+ """Save parameters to database."""
+ parameters = {}
for name, value in self.cleaned_data.items():
- if type(self.fields[name]) is SeparatorField:
+ if type(self.fields[name]) is form_utils.SeparatorField:
continue
- fullname = "%s.%s" % (self.app, name.upper())
- try:
- p = Parameter.objects.get(name=fullname)
- except Parameter.DoesNotExist:
- p = Parameter()
- p.name = fullname
- self._save_parameter(p, name, value)
+ parameters[name] = value
+ self.localconfig.parameters.set_values(parameters, app=self.app)
def to_django_settings(self):
+ """Inject parameters into django settings module."""
pass
def get_current_values(self):
+ """Return current values from the database."""
values = {}
for key in self.fields.keys():
try:
values[key] = get_admin(key.upper(), app=self.app)
- except NotDefined:
+ except core_parameters.NotDefined:
pass
return values
@@ -170,7 +164,7 @@ class UserParametersForm(GenericParametersForm):
def register(formclass, label):
- """Register a form class containing parameters
+ """Register a form class containing parameters.
formclass must inherit from ``AdminParametersForm`` or
``UserParametersForm``.
@@ -178,22 +172,13 @@ def register(formclass, label):
:param formclass: a form class
:param string label: the label to display in parameters or settings pages
"""
- from modoboa.lib.form_utils import SeparatorField
-
if issubclass(formclass, AdminParametersForm):
- level = 'A'
+ level = "admin"
elif issubclass(formclass, UserParametersForm):
- level = 'U'
+ level = "user"
else:
raise RuntimeError("Unknown parameter class")
- _params[level][formclass.app] = {
- "label": label, "form": formclass, "defaults": {}
- }
- form = formclass()
- for name, field in form.fields.items():
- if type(field) is SeparatorField:
- continue
- _params[level][formclass.app]["defaults"][name.upper()] = field.initial
+ core_parameters.registry.add(level, formclass, label)
def unregister(app=None):
@@ -257,7 +242,7 @@ def save_user(user, name, value, app=None):
def get_admin(name, app=None, raise_error=True):
- """Return an administrative parameter
+ """Return an administrative parameter.
A ``NotDefined`` exception if the parameter doesn't exist.
@@ -265,21 +250,17 @@ def get_admin(name, app=None, raise_error=True):
:param app: the application owning the parameter
:return: the corresponding value as a string
"""
- from .models import Parameter
-
+ # FIXME: deprecate this function
+ request = signals.get_request()
+ if request:
+ localconfig = request.localconfig
+ else:
+ from modoboa.core import models as core_models
+ localconfig = core_models.LocalConfig.objects.first()
if app is None:
app = guess_extension_name()
- try:
- __is_defined(app, "A", name)
- except NotDefined:
- if raise_error:
- raise
- return None
- try:
- p = Parameter.objects.get(name="%s.%s" % (app, name))
- except Parameter.DoesNotExist:
- return _params["A"][app]["defaults"][name]
- return p.value.decode("unicode_escape").replace('\\r\\n', '\n')
+ return localconfig.parameters.get_value(
+ name, app=app, raise_exception=raise_error)
def get_user(user, name, app=None, raise_error=True):
@@ -331,10 +312,8 @@ def get_admin_forms(*args, **kwargs):
Generates an instance of each declared form.
"""
- for app in get_sorted_apps('A'):
- formdef = _params['A'][app]
- yield {"label": formdef["label"],
- "form": formdef["form"](*args, **kwargs)}
+ return core_parameters.registry.get_forms(
+ "admin", *args, **kwargs)
def get_user_forms(user, *args, **kwargs):
diff --git a/modoboa/lib/tests.py b/modoboa/lib/tests.py
index 271e972e7..f36ea16b9 100644
--- a/modoboa/lib/tests.py
+++ b/modoboa/lib/tests.py
@@ -13,6 +13,8 @@ from rest_framework.test import APITestCase
from modoboa.lib import parameters
from modoboa.core import models as core_models
+from . import sysutils
+
try:
import ldap # NOQA
NO_LDAP = False
@@ -20,16 +22,41 @@ except ImportError:
NO_LDAP = True
-class ModoTestCase(TestCase):
+class ParametersMixin(object):
+ """Add tools to manage parameters."""
+ @classmethod
+ def setUpTestData(cls):
+ """Set LocalConfig instance."""
+ super(ParametersMixin, cls).setUpTestData()
+ cls.localconfig = core_models.LocalConfig.objects.first()
+
+ def set_global_parameter(self, name, value, app=None):
+ """Set global parameter for the given app."""
+ if app is None:
+ app = sysutils.guess_extension_name()
+ self.localconfig.parameters.set_value(name, value, app=app)
+ self.localconfig.save()
+
+ def set_global_parameters(self, parameters, app=None):
+ """Set/update global parameters for the given app."""
+ if app is None:
+ app = sysutils.guess_extension_name()
+ self.localconfig.parameters.set_values(parameters, app=app)
+ self.localconfig.save()
+
+
+class ModoTestCase(ParametersMixin, TestCase):
"""All test cases must inherit from this one."""
@classmethod
def setUpTestData(cls):
"""Create a default user."""
+ super(ModoTestCase, cls).setUpTestData()
management.call_command("load_initial_data")
def setUp(self, username="admin", password="password"):
+ """Initiate test context."""
self.assertEqual(
self.client.login(username=username, password=password), True)
@@ -54,13 +81,13 @@ class ModoTestCase(TestCase):
return self.ajax_request('get', *args, **kwargs)
-class ModoAPITestCase(APITestCase):
-
+class ModoAPITestCase(ParametersMixin, APITestCase):
"""All test cases must inherit from this one."""
@classmethod
def setUpTestData(cls):
"""Create a default user."""
+ super(ModoAPITestCase, cls).setUpTestData()
management.call_command("load_initial_data")
cls.token = Token.objects.create(
user=core_models.User.objects.get(username="admin"))
diff --git a/modoboa/limits/app_settings.py b/modoboa/limits/app_settings.py
index ff729a668..f94c17d10 100644
--- a/modoboa/limits/app_settings.py
+++ b/modoboa/limits/app_settings.py
@@ -16,7 +16,7 @@ class ParametersForm(AdminParametersForm):
enable_admin_limits = YesNoField(
label=_("Enable per-admin limits"),
- initial="yes",
+ initial=True,
help_text=_("Enable or disable per-admin limits")
)
@@ -77,7 +77,7 @@ class ParametersForm(AdminParametersForm):
enable_domain_limits = YesNoField(
label=_("Enable per-domain limits"),
- initial="no",
+ initial=False,
help_text=_("Enable or disable per-domain limits")
)
@@ -125,17 +125,17 @@ class ParametersForm(AdminParametersForm):
)
visibility_rules = {
- "deflt_user_domains_limit": "enable_admin_limits=yes",
- "deflt_user_domain_aliases_limit": "enable_admin_limits=yes",
- "deflt_user_mailboxes_limit": "enable_admin_limits=yes",
- "deflt_user_mailbox_aliases_limit": "enable_admin_limits=yes",
- "deflt_user_domain_admins_limit": "enable_admin_limits=yes",
- "deflt_domain_mailboxes_limit": "enable_domain_limits=yes",
- "deflt_domain_mailbox_aliases_limit": "enable_domain_limits=yes",
- "deflt_domain_domain_aliases_limit": "enable_domain_limits=yes",
- "deflt_domain_domain_admins_limit": "enable_domain_limits=yes",
+ "deflt_user_domains_limit": "enable_admin_limits=True",
+ "deflt_user_domain_aliases_limit": "enable_admin_limits=True",
+ "deflt_user_mailboxes_limit": "enable_admin_limits=True",
+ "deflt_user_mailbox_aliases_limit": "enable_admin_limits=True",
+ "deflt_user_domain_admins_limit": "enable_admin_limits=True",
+ "deflt_domain_mailboxes_limit": "enable_domain_limits=True",
+ "deflt_domain_mailbox_aliases_limit": "enable_domain_limits=True",
+ "deflt_domain_domain_aliases_limit": "enable_domain_limits=True",
+ "deflt_domain_domain_admins_limit": "enable_domain_limits=True",
}
def __init__(self, *args, **kwargs):
- super(AdminParametersForm, self).__init__(*args, **kwargs)
+ super(ParametersForm, self).__init__(*args, **kwargs)
self._load_extra_parameters('A')
diff --git a/modoboa/limits/controls.py b/modoboa/limits/controls.py
index 16921728c..8a5325e4d 100644
--- a/modoboa/limits/controls.py
+++ b/modoboa/limits/controls.py
@@ -40,7 +40,7 @@ def user_can_set_role(user, role, account=None):
:param str newrole: role to check
"""
condition = (
- parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no" or
+ not parameters.get_admin("ENABLE_ADMIN_LIMITS") or
role != "DomainAdmins")
if condition:
return [True]
diff --git a/modoboa/limits/general_callbacks.py b/modoboa/limits/general_callbacks.py
index 3d8e5f104..f7abf0475 100644
--- a/modoboa/limits/general_callbacks.py
+++ b/modoboa/limits/general_callbacks.py
@@ -12,7 +12,7 @@ from . import utils
@events.observe("ExtraAdminContent")
def display_pool_usage(user, target, currentpage):
condition = (
- parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no" or
+ not parameters.get_admin("ENABLE_ADMIN_LIMITS") or
target != "leftcol" or user.is_superuser)
if condition:
return []
@@ -40,7 +40,7 @@ def display_pool_usage(user, target, currentpage):
@events.observe("ExtraAccountForm")
def extra_account_form(user, account=None):
- if parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no":
+ if not parameters.get_admin("ENABLE_ADMIN_LIMITS"):
return []
if user.role not in ["SuperAdmins", "Resellers"]:
return []
@@ -61,7 +61,7 @@ def extra_account_form(user, account=None):
@events.observe("ExtraDomainForm")
def extra_domain_form(user, domain):
"""Include domain limits form."""
- if parameters.get_admin("ENABLE_DOMAIN_LIMITS") == "no":
+ if not parameters.get_admin("ENABLE_DOMAIN_LIMITS"):
return []
if not user.has_perm("admin.change_domain"):
return []
@@ -74,7 +74,7 @@ def extra_domain_form(user, domain):
@events.observe("FillDomainInstances")
def fill_domain_instances(user, domain, instances):
"""Set domain instance for resources form."""
- if parameters.get_admin("ENABLE_DOMAIN_LIMITS") == "no":
+ if not parameters.get_admin("ENABLE_DOMAIN_LIMITS"):
return
if not user.has_perm("admin.change_domain"):
return
@@ -93,7 +93,7 @@ def check_form_access(account, form):
@events.observe("FillAccountInstances")
def fill_account_instances(user, account, instances):
condition = (
- parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no" or
+ not parameters.get_admin("ENABLE_ADMIN_LIMITS") or
(not user.is_superuser and user.role != "Resellers")
)
if condition:
@@ -106,7 +106,7 @@ def fill_account_instances(user, account, instances):
@events.observe("GetStaticContent")
def get_static_content(caller, st_type, user):
condition = (
- parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no" or
+ not parameters.get_admin("ENABLE_ADMIN_LIMITS") or
caller not in ["domains", "identities"] or
user.role in ["SuperAdmins", "SimpleUsers"]
)
diff --git a/modoboa/limits/handlers.py b/modoboa/limits/handlers.py
index d8ca5b388..af063501b 100644
--- a/modoboa/limits/handlers.py
+++ b/modoboa/limits/handlers.py
@@ -21,13 +21,13 @@ from . import utils
def check_object_limit(sender, context, object_type, **kwargs):
"""Check if user can create a new object."""
if context.__class__.__name__ == "User":
- if parameters.get_admin("ENABLE_ADMIN_LIMITS") == "no":
+ if not parameters.get_admin("ENABLE_ADMIN_LIMITS"):
return
if context.is_superuser:
return True
limit = context.userobjectlimit_set.get(name=object_type)
elif context.__class__.__name__ == "Domain":
- if parameters.get_admin("ENABLE_DOMAIN_LIMITS") == "no":
+ if not parameters.get_admin("ENABLE_DOMAIN_LIMITS"):
return
limit = context.domainobjectlimit_set.get(name=object_type)
else:
@@ -72,7 +72,7 @@ def create_domain_limits(sender, instance, **kwargs):
@receiver(admin_signals.extra_domain_dashboard_widgets)
def display_domain_limits(sender, user, domain, **kwargs):
"""Display resources usage for domain."""
- if parameters.get_admin("ENABLE_DOMAIN_LIMITS") == "no":
+ if not parameters.get_admin("ENABLE_DOMAIN_LIMITS"):
return []
return [{
"column": "right",
@@ -87,7 +87,7 @@ def display_domain_limits(sender, user, domain, **kwargs):
def display_admin_limits(sender, user, account, **kwargs):
"""Display resources usage for admin."""
condition = (
- parameters.get_admin("ENABLE_ADMIN_LIMITS") == "yes" and
+ parameters.get_admin("ENABLE_ADMIN_LIMITS") and
account.role in ["DomainAdmins", "Resellers"]
)
if not condition:
diff --git a/modoboa/limits/tests/test_api.py b/modoboa/limits/tests/test_api.py
index 5d7c99a7d..687df663d 100644
--- a/modoboa/limits/tests/test_api.py
+++ b/modoboa/limits/tests/test_api.py
@@ -9,7 +9,6 @@ from modoboa.admin.factories import populate_database
from modoboa.admin.models import Domain
from modoboa.core import factories as core_factories
from modoboa.core.models import User
-from modoboa.lib import parameters
from modoboa.lib import tests as lib_tests
from .. import utils
@@ -23,8 +22,9 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase):
"""Create test data."""
super(APIAdminLimitsTestCase, cls).setUpTestData()
for name, tpl in utils.get_user_limit_templates():
- parameters.save_admin(
- "DEFLT_USER_{}_LIMIT".format(name.upper()), 2)
+ cls.localconfig.parameters.set_value(
+ "deflt_user_{0}_limit".format(name), 2)
+ cls.localconfig.save()
populate_database()
cls.user = User.objects.get(username="admin@test.com")
cls.da_token = Token.objects.create(user=cls.user)
@@ -181,10 +181,12 @@ class APIDomainLimitsTestCase(lib_tests.ModoAPITestCase):
def setUpTestData(cls):
"""Create test data."""
super(APIDomainLimitsTestCase, cls).setUpTestData()
- parameters.save_admin("ENABLE_DOMAIN_LIMITS", "yes")
+ cls.localconfig.parameters.set_value(
+ "enable_domain_limits", True)
for name, tpl in utils.get_domain_limit_templates():
- parameters.save_admin(
- "DEFLT_DOMAIN_{}_LIMIT".format(name.upper()), 2)
+ cls.localconfig.parameters.set_value(
+ "deflt_domain_{0}_limit".format(name), 2)
+ cls.localconfig.save()
populate_database()
def test_mailboxes_limit(self):
diff --git a/modoboa/limits/tests/test_domain_limits.py b/modoboa/limits/tests/test_domain_limits.py
index 3552b22fb..214145c63 100644
--- a/modoboa/limits/tests/test_domain_limits.py
+++ b/modoboa/limits/tests/test_domain_limits.py
@@ -7,7 +7,6 @@ from modoboa.admin import factories as admin_factories
from modoboa.admin.models import Domain
from modoboa.core import factories as core_factories
from modoboa.core.models import User
-from modoboa.lib import parameters
from modoboa.lib import tests as lib_tests
from .. import utils
@@ -20,11 +19,14 @@ class DomainLimitsTestCase(lib_tests.ModoTestCase):
def setUpTestData(cls):
"""Create test data."""
super(DomainLimitsTestCase, cls).setUpTestData()
- parameters.save_admin("ENABLE_ADMIN_LIMITS", "no")
- parameters.save_admin("ENABLE_DOMAIN_LIMITS", "yes")
+ cls.localconfig.parameters.set_values({
+ "enable_admin_limits": False,
+ "enable_domain_limits": True
+ })
for name, tpl in utils.get_domain_limit_templates():
- parameters.save_admin(
- "DEFLT_DOMAIN_{}_LIMIT".format(name.upper()), 2)
+ cls.localconfig.parameters.set_value(
+ "deflt_domain_{0}_limit".format(name), 2)
+ cls.localconfig.save()
admin_factories.populate_database()
def test_set_limits(self):
diff --git a/modoboa/limits/tests/test_import.py b/modoboa/limits/tests/test_import.py
index e58139a1b..dc222f426 100644
--- a/modoboa/limits/tests/test_import.py
+++ b/modoboa/limits/tests/test_import.py
@@ -6,7 +6,6 @@ from modoboa.admin import factories as admin_factories
from modoboa.admin import models as admin_models
from modoboa.core import factories as core_factories
from modoboa.core import models as core_models
-from modoboa.lib import parameters
from modoboa.lib.tests import ModoTestCase
from .. import utils
@@ -135,9 +134,11 @@ class UserLimitImportTestCase(LimitImportTestCase):
@classmethod
def setUpTestData(cls):
"""Create test data."""
+ localconfig = core_models.LocalConfig.objects.first()
for name, tpl in utils.get_user_limit_templates():
- parameters.save_admin(
- "DEFLT_USER_{}_LIMIT".format(name.upper()), 2)
+ localconfig.parameters.set_value(
+ "deflt_user_{0}_limit".format(name), 2)
+ localconfig.save()
super(UserLimitImportTestCase, cls).setUpTestData()
def test_domains_import(self):
@@ -192,11 +193,15 @@ class DomainLimitImportTestCase(LimitImportTestCase):
@classmethod
def setUpTestData(cls):
"""Create test data."""
- parameters.save_admin("ENABLE_DOMAIN_LIMITS", "yes")
- parameters.save_admin("ENABLE_ADMIN_LIMITS", "no")
+ localconfig = core_models.LocalConfig.objects.first()
+ localconfig.parameters.set_values({
+ "enable_domain_limits": True,
+ "enable_admin_limits": False
+ })
for name, tpl in utils.get_domain_limit_templates():
- parameters.save_admin(
- "DEFLT_DOMAIN_{}_LIMIT".format(name.upper()), 2)
+ localconfig.parameters.set_value(
+ "deflt_domain_{0}_limit".format(name), 2)
+ localconfig.save()
super(DomainLimitImportTestCase, cls).setUpTestData()
mb = admin_factories.MailboxFactory(
user__username="user@test4.com",
diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py
index 98ccf4e2c..494482abf 100644
--- a/modoboa/limits/tests/test_user_limits.py
+++ b/modoboa/limits/tests/test_user_limits.py
@@ -7,7 +7,6 @@ from modoboa.admin.factories import populate_database
from modoboa.admin.models import Alias, Domain
from modoboa.core.factories import UserFactory
from modoboa.core.models import User
-from modoboa.lib import parameters
from modoboa.lib import tests as lib_tests
from .. import utils
@@ -48,13 +47,14 @@ class ResourceTestCase(lib_tests.ModoTestCase):
def setUpTestData(cls):
"""Custom setUpTestData method."""
super(ResourceTestCase, cls).setUpTestData()
- parameters.save_admin("ENABLE_ADMIN_LIMITS", "yes")
- parameters.save_admin("ENABLE_DOMAIN_LIMITS", "no")
+ cls.localconfig.parameters.set_values({
+ "enable_admin_limits": True,
+ "enable_domain_limits": False
+ })
for name, tpl in utils.get_user_limit_templates():
- parameters.save_admin(
- "DEFLT_USER_{0}_LIMIT".format(name.upper()), 2,
- app="limits"
- )
+ cls.localconfig.parameters.set_value(
+ "deflt_user_{0}_limit".format(name), 2)
+ cls.localconfig.save()
populate_database()
def _create_account(self, username, role='SimpleUsers', status=200):
@@ -78,13 +78,15 @@ class ResourceTestCase(lib_tests.ModoTestCase):
def _create_domain(self, name, status=200, withtpl=False):
values = {
- "name": name, "quota": 100, "create_dom_admin": "no",
- "create_aliases": "no", "stepid": 'step3', "type": "domain"
+ "name": name, "quota": 100, "create_dom_admin": False,
+ "create_aliases": False, "stepid": "step3", "type": "domain"
}
if withtpl:
- values['create_dom_admin'] = 'yes'
- values['dom_admin_username'] = 'admin'
- values['create_aliases'] = 'yes'
+ values.update({
+ "create_dom_admin": True,
+ "dom_admin_username": "admin",
+ "create_aliases": True
+ })
response = self.ajax_post(
reverse("admin:domain_add"), values, status
)
diff --git a/modoboa/relaydomains/app_settings.py b/modoboa/relaydomains/app_settings.py
index cb308249f..054c78329 100644
--- a/modoboa/relaydomains/app_settings.py
+++ b/modoboa/relaydomains/app_settings.py
@@ -1,6 +1,4 @@
-"""
-Relay domains settings definition.
-"""
+"""Relay domains settings definition."""
from django import forms
from django.utils.translation import ugettext_lazy
@@ -10,7 +8,6 @@ from modoboa.lib.form_utils import SeparatorField
class AdminParametersForm(parameters.AdminParametersForm):
-
"""Admin parameters definition."""
app = "relaydomains"
diff --git a/modoboa/relaydomains/tests.py b/modoboa/relaydomains/tests.py
index 6e008491e..695e62a6c 100644
--- a/modoboa/relaydomains/tests.py
+++ b/modoboa/relaydomains/tests.py
@@ -6,7 +6,6 @@ from django.test import TestCase
from modoboa.admin import factories as admin_factories
from modoboa.admin import models as admin_models
from modoboa.core.factories import UserFactory
-from modoboa.lib import parameters
from modoboa.lib.tests import ModoTestCase
from modoboa.lib.test_utils import MapFilesTestCaseMixin
from modoboa.limits import utils as limits_utils
@@ -20,7 +19,7 @@ class Operations(object):
def _create_relay_domain(self, name, status=200):
srv, created = Service.objects.get_or_create(name='dummy')
values = {
- "name": name, "create_dom_admin": "no", "type": "relaydomain",
+ "name": name, "create_dom_admin": False, "type": "relaydomain",
"target_host": "external.host.tld", "service": srv.id,
"enabled": True, "stepid": "step3"
}
@@ -213,15 +212,18 @@ class RelayDomainsTestCase(ModoTestCase, Operations):
"enabled": True
}
self.ajax_post(reverse("admin:alias_add"), values)
- alias = admin_models.Alias.objects.get(address="alias@relaydomain.tld")
+ self.assertTrue(
+ admin_models.Alias.objects.filter(
+ address="alias@relaydomain.tld").exists())
values = {
"address": "alias2@relaydomain.tld",
"recipients": "local@relaydomain.tld",
"enabled": True
}
self.ajax_post(reverse("admin:alias_add"), values)
- alias = admin_models.Alias.objects.get(
- address="alias2@relaydomain.tld")
+ self.assertTrue(
+ admin_models.Alias.objects.filter(
+ address="alias2@relaydomain.tld").exists())
class LimitsTestCase(ModoTestCase, Operations):
@@ -230,11 +232,10 @@ class LimitsTestCase(ModoTestCase, Operations):
def setUpTestData(cls):
"""Create test data."""
super(LimitsTestCase, cls).setUpTestData()
-
for name, tpl in limits_utils.get_user_limit_templates():
- parameters.save_admin(
- "DEFLT_USER_{0}_LIMIT".format(name.upper()), 2, app="limits"
- )
+ cls.localconfig.parameters.set_value(
+ "deflt_user_{0}_limit".format(name), 2, app="limits")
+ cls.localconfig.save()
cls.user = UserFactory.create(
username='reseller', groups=('Resellers',)
)