From a9432e1d25e3f43750fa5f04c96a4ca368e1d687 Mon Sep 17 00:00:00 2001 From: Andreas Kaiser Date: Tue, 21 Apr 2015 17:04:21 +0200 Subject: [PATCH 01/16] Update German translation --- modoboa/locale/de/LC_MESSAGES/django.po | 60 ++++++++++++------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/modoboa/locale/de/LC_MESSAGES/django.po b/modoboa/locale/de/LC_MESSAGES/django.po index 1f22c4168..47c29cb19 100644 --- a/modoboa/locale/de/LC_MESSAGES/django.po +++ b/modoboa/locale/de/LC_MESSAGES/django.po @@ -22,13 +22,13 @@ msgstr "" #: core/__init__.py:60 core/__init__.py:61 msgid "General" -msgstr "Grundsätzlich" +msgstr "Allgemein" #: core/__init__.py:80 #, fuzzy #| msgid "An update is available!" msgid "One or more updates are available" -msgstr "Ein Update ist Verfügbar!" +msgstr "Ein Update ist verfügbar!" #: core/app_settings.py:34 msgid "Authentication" @@ -44,11 +44,11 @@ msgstr "Lokal" #: core/app_settings.py:41 msgid "The backend used for authentication" -msgstr "Das backend, das zur Authentifizierung genutzt wird" +msgstr "Backend für die Authentifizierung" #: core/app_settings.py:46 msgid "Default password scheme" -msgstr "Standard Passwortschema" +msgstr "Standard-Passwortschema" #: core/app_settings.py:49 msgid "md5crypt (weak)" @@ -136,7 +136,7 @@ msgstr "Direkter Bind" #: core/app_settings.py:106 msgid "Choose the authentication method to use" -msgstr "Wählen Sie die Authentifizierungsmethode aus" +msgstr "Wählen Sie die Authentifizierungsmethode" #: core/app_settings.py:111 msgid "Bind DN" @@ -174,7 +174,7 @@ msgid "" "An optional filter string (e.g. '(objectClass=person)'). In order to be " "valid, it must be enclosed in parentheses." msgstr "" -"Ein optionaler Filter z.B. (objectClass=person). Das Filter muss " +"Ein optionaler Filter, z.B. '(objectClass=person)'. Der Filter muss " "entsprechend der LDAP-Konvention in Klammern gesetzt werden." #: core/app_settings.py:155 @@ -187,7 +187,7 @@ msgid "" "The template used to construct a user's DN. It should contain one " "placeholder (ie. %(user)s)" msgstr "" -"Die Vorlage für einen User DN. Sie sollte einen Platzhalter z.B. %(user)s " +"Die Vorlage für einen User DN. Sie sollte einen Platzhalter, z.B. %(user)s " "enthalten." #: core/app_settings.py:166 @@ -216,7 +216,7 @@ msgid "" "Use ';' characters to separate groups." msgstr "" "Mitglieder dieser LDAP Posix-Gruppe werden als Domain-Administratoren " -"angelegt werden. Nutzen sie ';', um Gruppen zu separieren." +"angelegt werden. Nutzen Sie ';', um Gruppen zu separieren." #: core/app_settings.py:190 msgid "Groups search base" @@ -232,11 +232,11 @@ msgstr "Verschiedenes" #: core/app_settings.py:201 msgid "Top notifications check interval" -msgstr "Benachrichtigungs Prüfintervall" +msgstr "Benachrichtigungs-Prüfintervall" #: core/app_settings.py:203 msgid "Interval between two top notification checks" -msgstr "Prüfintervall nach neuen Benachrichtigungen" +msgstr "Intervall zwischen Benachrichtigungs-Ptüfungen" #: core/app_settings.py:208 msgid "Check new versions" @@ -248,7 +248,7 @@ msgstr "Überprüft automatisch ob eine neuere Version verfügbar ist." #: core/app_settings.py:215 msgid "Maximum log record age" -msgstr "Maximales Alter eines Log-Eintrags" +msgstr "Maximales Alter für Log-Einträge" #: core/app_settings.py:217 msgid "The maximum age in days of a log record" @@ -264,7 +264,7 @@ msgstr "Anzahl dargestellter Einträge pro Seite" #: core/app_settings.py:229 msgid "Default top redirection" -msgstr "Standard Top-Redirect" +msgstr "Standardumleitung" #: core/app_settings.py:233 msgid "The default redirection used when no application is specified" @@ -352,7 +352,7 @@ msgstr "Ungültige Zeile" #: core/models.py:347 msgid "You can't import an account with a role greater than yours" -msgstr "Sie können kein Konto einer höheren Rolle importieren" +msgstr "Sie können kein Konto mit einer höheren Rolle als Ihrer eigenen importieren" #: core/models.py:359 #, python-format @@ -395,17 +395,17 @@ msgstr "Verschiedene Informationen über Modoboa" #, fuzzy #| msgid "An update is available!" msgid "One or more updates are available!" -msgstr "Ein Update ist Verfügbar!" +msgstr "Ein Update ist verfügbar!" #: core/templates/core/information.html:6 msgid "Check the following list to find the component(s) that can be updated." -msgstr "" +msgstr "Überprüfen Sie die folgende Liste auf Komponenten, die aktualisiert werden können." #: core/templates/core/information.html:10 #, fuzzy #| msgid "Authentication" msgid "Applications" -msgstr "Authentifizierung" +msgstr "Anwendungen" #: core/templates/core/information.html:14 #: core/templates/core/information.html:36 @@ -414,13 +414,13 @@ msgstr "Name" #: core/templates/core/information.html:15 msgid "Installed version" -msgstr "" +msgstr "Installierte Version" #: core/templates/core/information.html:16 #, fuzzy #| msgid "Last login" msgid "Last version" -msgstr "Letzte Anmeldung" +msgstr "Letzte Version" #: core/templates/core/information.html:17 msgid "Description" @@ -452,7 +452,7 @@ msgstr "Datum" #: core/templates/core/logs.html:7 msgid "Level" -msgstr "Level" +msgstr "Stufe" #: core/templates/core/logs.html:8 msgid "Logger" @@ -498,7 +498,7 @@ msgstr "Profil" #: core/templates/core/user_profile.html:2 msgid "Update your personal information" -msgstr "Aktualisieren sie ihre persönlichen Daten" +msgstr "Aktualisieren Sie Ihre persönlichen Daten" #: core/templates/core/user_profile.html:8 lib/form_utils.py:333 msgid "Update" @@ -516,7 +516,7 @@ msgstr "Logout" #, fuzzy #| msgid "Welcome to Modoboa" msgid "The core part of Modoboa" -msgstr "Willkommen zu Modoboa" +msgstr "Der Kern von Modoboa" #: core/views/admin.py:52 msgid "Parameters saved" @@ -525,7 +525,7 @@ msgstr "Parameter gespeichert" #: core/views/auth.py:33 #, python-format msgid "User '%s' successfully logged in" -msgstr "Identität '%s' hat sich erfolgreich angemeldet" +msgstr "Benutzer '%s' hat sich erfolgreich angemeldet" #: core/views/auth.py:48 msgid "Your username and password didn't match. Please try again." @@ -536,7 +536,7 @@ msgstr "" #: core/views/auth.py:76 #, python-format msgid "User '%s' logged out" -msgstr "Identität '%s' hat sich abgemeldet" +msgstr "Benutzer '%s' hat sich abgemeldet" #: core/views/user.py:39 msgid "Profile updated" @@ -554,11 +554,11 @@ msgstr "Verbindung zu Datenbank %s nicht konfiguriert" #: lib/exceptions.py:67 #, python-format msgid "Permission denied: %s" -msgstr "Erlaubnis verweigert: %s" +msgstr "Zugriff verweigert: %s" #: lib/exceptions.py:68 msgid "Permission denied" -msgstr "Berechtigung verweigert" +msgstr "Zugriff verweigert" #: lib/form_utils.py:88 msgid "Submit" @@ -599,11 +599,11 @@ msgstr "Entschuldigung" #: templates/404.html:5 msgid "The requested page does not exist." -msgstr "Die angeforderte Seite existiert nicht" +msgstr "Die angeforderte Seite existiert nicht." #: templates/500.html:5 msgid "An internal error occured." -msgstr "Ein interne Fehler ist aufgetreten" +msgstr "Ein interner Fehler ist aufgetreten." #: templates/common/email_searchbar.html:5 msgid "Search..." @@ -611,7 +611,7 @@ msgstr "Suchen..." #: templates/common/email_searchbar.html:10 msgid "From address" -msgstr "From:-Adresse" +msgstr "Absender-Adresse" #: templates/common/email_searchbar.html:17 msgid "Subject" @@ -634,7 +634,7 @@ msgstr "Hilfe:" #: templates/common/generic_modal.html:13 templates/common/wizard_forms.html:6 #: templates/common/wizard_forms.html:27 msgid "Close" -msgstr "Schliessen" +msgstr "Schließen" #: templates/common/wizard_forms.html:31 msgid "Previous" @@ -650,7 +650,7 @@ msgstr "Willkommen zu Modoboa" #: templates/registration/login.html:41 msgid "Remember me" -msgstr "Erinnere mich" +msgstr "An mich erinnern" #: templates/registration/login.html:44 msgid "Log in" From 956cac19f28b8169865d632b54294cc34be46d03 Mon Sep 17 00:00:00 2001 From: Andreas Kaiser Date: Tue, 21 Apr 2015 17:05:45 +0200 Subject: [PATCH 02/16] Update django.po --- modoboa/locale/de/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/locale/de/LC_MESSAGES/django.po b/modoboa/locale/de/LC_MESSAGES/django.po index 47c29cb19..c69764612 100644 --- a/modoboa/locale/de/LC_MESSAGES/django.po +++ b/modoboa/locale/de/LC_MESSAGES/django.po @@ -236,7 +236,7 @@ msgstr "Benachrichtigungs-Prüfintervall" #: core/app_settings.py:203 msgid "Interval between two top notification checks" -msgstr "Intervall zwischen Benachrichtigungs-Ptüfungen" +msgstr "Intervall zwischen Benachrichtigungs-Prüfungen" #: core/app_settings.py:208 msgid "Check new versions" From d387f33898f4edfb45e7938aad64c47f620aa7b3 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 22 Apr 2015 16:52:12 +0200 Subject: [PATCH 03/16] Do not rely on django yet. --- modoboa/core/commands/deploy.py | 5 ++++- modoboa/lib/api_client.py | 11 +++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index 071e6102e..794bbedfa 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -151,7 +151,10 @@ class DeployCommand(Command): """ if "all" in extensions: - official_exts = ModoAPIClient().list_extensions() + # We hardcode the API url here to avoid a loading of + # django's settings since they are not available yet... + url = "http://api.modoboa.org/" + official_exts = ModoAPIClient(url).list_extensions() extensions = [extension["name"] for extension in official_exts] pip_args = ["install"] + extensions diff --git a/modoboa/lib/api_client.py b/modoboa/lib/api_client.py index 698ce6141..c94439d3f 100644 --- a/modoboa/lib/api_client.py +++ b/modoboa/lib/api_client.py @@ -6,8 +6,6 @@ import pkg_resources import requests from requests.exceptions import RequestException -from django.conf import settings - from versionfield.constants import DEFAULT_NUMBER_BITS from versionfield.version import Version @@ -18,10 +16,11 @@ class ModoAPIClient(object): def __init__(self, api_url=None): """Constructor.""" - self._api_url = ( - settings.MODOBOA_API_URL if api_url is None - else api_url - ) + if api_url is None: + from django.conf import settings + self._api_url = settings.MODOBOA_API_URL + else: + self._api_url = api_url self._local_core_version = None self._latest_core_version = None self.changelog_url = None From bab8c2cc5216ce1b9335f57036d56582976f1e50 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 22 Apr 2015 16:53:56 +0200 Subject: [PATCH 04/16] Same here. --- modoboa/lib/api_client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modoboa/lib/api_client.py b/modoboa/lib/api_client.py index c94439d3f..08690e11a 100644 --- a/modoboa/lib/api_client.py +++ b/modoboa/lib/api_client.py @@ -6,9 +6,6 @@ import pkg_resources import requests from requests.exceptions import RequestException -from versionfield.constants import DEFAULT_NUMBER_BITS -from versionfield.version import Version - class ModoAPIClient(object): @@ -54,6 +51,9 @@ class ModoAPIClient(object): def new_core_version(self, site): """Check the latest version.""" + from versionfield.constants import DEFAULT_NUMBER_BITS + from versionfield.version import Version + url = os.path.join(self._api_url, "current_version/") params = {"client_version": self.local_core_version, "site": site} resp = self.__send_request(url, params) From 93beb3a881b418be24e316bef0b3939a23bf15e9 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 22 Apr 2015 17:09:48 +0200 Subject: [PATCH 05/16] Resolve extension list before installation. --- modoboa/core/commands/deploy.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index 794bbedfa..1fa808f64 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -143,6 +143,16 @@ class DeployCommand(Command): info['PASSWORD'] = getpass.getpass('Password: ') return info + def _get_extension_list(self): + """Ask the API to get the list of all extensions. + + We hardcode the API url here to avoid a loading of + django's settings since they are not available yet... + """ + url = "http://api.modoboa.org/" + official_exts = ModoAPIClient(url).list_extensions() + return [extension["name"] for extension in official_exts] + def install_extensions(self, extensions): """Install one or more extensions. @@ -150,13 +160,6 @@ class DeployCommand(Command): include in the final configuration. """ - if "all" in extensions: - # We hardcode the API url here to avoid a loading of - # django's settings since they are not available yet... - url = "http://api.modoboa.org/" - official_exts = ModoAPIClient(url).list_extensions() - extensions = [extension["name"] for extension in official_exts] - pip_args = ["install"] + extensions pip.main(pip_args) extra_settings = [] @@ -206,8 +209,11 @@ class DeployCommand(Command): allowed_host = "localhost" extra_settings = [] - if parsed_args.dont_install_extensions and parsed_args.extensions: - extra_settings = self.install_extensions(parsed_args.extensions) + extensions = parsed_args.extensions + if "all" in extensions: + extensions = self._get_extension_list() + if not parsed_args.dont_install_extensions and extensions: + extra_settings = self.install_extensions(extensions) bower_components_dir = os.path.realpath( os.path.join(os.path.dirname(__file__), "../../bower_components") @@ -224,7 +230,7 @@ class DeployCommand(Command): 'timezone': parsed_args.timezone, 'bower_components_dir': bower_components_dir, 'devmode': parsed_args.devel, - 'extensions': parsed_args.extensions, + 'extensions': extensions, 'extra_settings': extra_settings } ) From a8e4c8b2565fa89eef6ef16c132404812fda6a2c Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 22 Apr 2015 17:14:16 +0200 Subject: [PATCH 06/16] Do not mix package name and module name. --- modoboa/core/commands/deploy.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index 1fa808f64..ae750d3f5 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -160,16 +160,15 @@ class DeployCommand(Command): include in the final configuration. """ - pip_args = ["install"] + extensions + pip_args = ["install"] + [extension[0] for extension in extensions] pip.main(pip_args) extra_settings = [] for extension in extensions: - extension = extension.replace("-", "_") - module = __import__(extension, locals(), globals(), []) + module = __import__(extension[1], locals(), globals(), []) basedir = os.path.dirname(module.__file__) if not os.path.exists("{0}/settings.py".format(basedir)): continue - extra_settings.append(extension) + extra_settings.append(extension[1]) return extra_settings def handle(self, parsed_args): @@ -212,6 +211,8 @@ class DeployCommand(Command): extensions = parsed_args.extensions if "all" in extensions: extensions = self._get_extension_list() + extensions = [(extension, extension.replace("-", "_")) + for extension in extensions] if not parsed_args.dont_install_extensions and extensions: extra_settings = self.install_extensions(extensions) @@ -230,7 +231,7 @@ class DeployCommand(Command): 'timezone': parsed_args.timezone, 'bower_components_dir': bower_components_dir, 'devmode': parsed_args.devel, - 'extensions': extensions, + 'extensions': [extension[1] for extension in extensions], 'extra_settings': extra_settings } ) From 1ab600072e92f9d982c430fca7e54edca0b62241 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 22 Apr 2015 17:28:32 +0200 Subject: [PATCH 07/16] Don't rely on django settings here. --- modoboa/core/commands/postfix_maps.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modoboa/core/commands/postfix_maps.py b/modoboa/core/commands/postfix_maps.py index ddcbed991..06e3c9270 100644 --- a/modoboa/core/commands/postfix_maps.py +++ b/modoboa/core/commands/postfix_maps.py @@ -11,7 +11,6 @@ from django.template import Context, Template import dj_database_url -from modoboa.lib.api_client import ModoAPIClient from . import Command MAP_FILE_TEMPLATE = """user = {{ dbuser }} @@ -85,8 +84,11 @@ class MapFilesGenerator(object): def __load_extensions(self, extensions): """Load specified extensions.""" if "all" in extensions: + from modoboa.lib.api_client import ModoAPIClient + # Retrieve extension list from the API - official_exts = ModoAPIClient().list_extensions() + url = "http://api.modoboa.org/" + official_exts = ModoAPIClient(url).list_extensions() extensions = [extension["name"] for extension in official_exts] for extension in extensions: From 0b580d0f2337999c80a2f01e89d42011a88471f7 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 22 Apr 2015 17:42:42 +0200 Subject: [PATCH 08/16] Few fixes. --- doc/getting_started/install.rst | 2 +- modoboa/core/commands/templates/settings.py.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/getting_started/install.rst b/doc/getting_started/install.rst index bdd09dbee..e4b6bc5ec 100644 --- a/doc/getting_started/install.rst +++ b/doc/getting_started/install.rst @@ -110,7 +110,7 @@ Deployment prefix. The primary connection must use the ``default:`` prefix (as shown in the example above). For the `amavis extension `_ extension, use the - ``amavis:`` prefix like this ``--dburl amavis:``. + ``amavis:`` prefix like this ``amavis:``. Your database url should meet the following syntax ``scheme://[user:pass@][host:port]/dbname`` **OR** diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl index 8ba295fc8..8f6ebc359 100644 --- a/modoboa/core/commands/templates/settings.py.tpl +++ b/modoboa/core/commands/templates/settings.py.tpl @@ -164,5 +164,5 @@ LOGGING = { } } {% for extension in extra_settings %} -import {{ extension }}.settings +from {{ extension }}.settings import * {% endfor %} From 5d9749099b0ff3f03453ca3709fcc66f2387ba6a Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 22 Apr 2015 19:08:53 +0200 Subject: [PATCH 09/16] Fix unit tests. --- modoboa/core/commands/__init__.py | 11 ++++++----- modoboa/core/commands/deploy.py | 18 ++++++++++-------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/modoboa/core/commands/__init__.py b/modoboa/core/commands/__init__.py index b1b2cf62e..6ab7b00aa 100644 --- a/modoboa/core/commands/__init__.py +++ b/modoboa/core/commands/__init__.py @@ -14,9 +14,10 @@ class Command(object): A valid administrative command must inherit from this class. """ + help = "No help available." - def __init__(self, commands, verbose=False, **kwargs): + def __init__(self, commands, verbose=False): self._commands = commands self._parser = argparse.ArgumentParser() self._verbose = verbose @@ -25,10 +26,10 @@ class Command(object): self._templates_dir = "%s/templates" % os.path.dirname(__file__) def _render_template(self, tplfile, env): - fp = open(tplfile) - t = Template(fp.read()) - fp.close() - return t.render(Context(env)) + """Render an HTML template.""" + with open(tplfile) as fp: + tpl = Template(fp.read()) + return tpl.render(Context(env)) def run(self, cmdline): args = self._parser.parse_args(cmdline) diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index ae750d3f5..8d965cba6 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -172,6 +172,7 @@ class DeployCommand(Command): return extra_settings def handle(self, parsed_args): + import pdb django.setup() management.call_command( 'startproject', parsed_args.name, verbosity=False @@ -206,15 +207,16 @@ class DeployCommand(Command): ) if not allowed_host: allowed_host = "localhost" - extra_settings = [] extensions = parsed_args.extensions - if "all" in extensions: - extensions = self._get_extension_list() - extensions = [(extension, extension.replace("-", "_")) - for extension in extensions] - if not parsed_args.dont_install_extensions and extensions: - extra_settings = self.install_extensions(extensions) + if extensions: + if "all" in extensions: + extensions = self._get_extension_list() + extensions = [(extension, extension.replace("-", "_")) + for extension in extensions] + if not parsed_args.dont_install_extensions: + extra_settings = self.install_extensions(extensions) + extensions = [extension[1] for extension in extensions] bower_components_dir = os.path.realpath( os.path.join(os.path.dirname(__file__), "../../bower_components") @@ -231,7 +233,7 @@ class DeployCommand(Command): 'timezone': parsed_args.timezone, 'bower_components_dir': bower_components_dir, 'devmode': parsed_args.devel, - 'extensions': [extension[1] for extension in extensions], + 'extensions': extensions, 'extra_settings': extra_settings } ) From a3464522769f8dc80bce7a95126775059a2e055f Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 23 Apr 2015 14:05:42 +0200 Subject: [PATCH 10/16] Try not to eat + characters before a POST request. --- modoboa/static/js/global.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modoboa/static/js/global.js b/modoboa/static/js/global.js index 6794534a8..88eeea8df 100644 --- a/modoboa/static/js/global.js +++ b/modoboa/static/js/global.js @@ -247,12 +247,20 @@ function parse_qs(raw) { * * Ref: http://stackoverflow.com/questions/901115/get-query-string-values-in-javascript */ -function get_parameter_by_name(url, name) { +function get_parameter_by_name(url, name, dont_replace_plus) { name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), results = regex.exec(url); - return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); + if (results === null) { + return ""; + } + + var result = results[1]; + if (dont_replace_plus === undefined || !dont_replace_plus) { + result = result.replace("/\+/g", ""); + } + return decodeURIComponent(result); } /** From e9121365ad2441c4afc50f63c645be4e036be19a Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 24 Apr 2015 13:34:49 +0200 Subject: [PATCH 11/16] Adding comments. --- modoboa/core/factories.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modoboa/core/factories.py b/modoboa/core/factories.py index 768ca8546..3d5b12653 100644 --- a/modoboa/core/factories.py +++ b/modoboa/core/factories.py @@ -9,6 +9,8 @@ from . import models class PermissionFactory(factory.DjangoModelFactory): + """A base factory to handle permissions.""" + class Meta: abstract = True @@ -21,6 +23,8 @@ class PermissionFactory(factory.DjangoModelFactory): class GroupFactory(factory.DjangoModelFactory): + """A factory to create Group instances.""" + class Meta: model = Group @@ -29,6 +33,8 @@ class GroupFactory(factory.DjangoModelFactory): class UserFactory(PermissionFactory): + """A factory to create User instances.""" + class Meta: model = models.User django_get_or_create = ("username", ) From 17369c1bc67028e004af61cd20948edfaf67315a Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 24 Apr 2015 16:56:24 +0200 Subject: [PATCH 12/16] Adding comment. --- modoboa/lib/parameters.py | 1 + 1 file changed, 1 insertion(+) diff --git a/modoboa/lib/parameters.py b/modoboa/lib/parameters.py index e430f02de..a18463030 100644 --- a/modoboa/lib/parameters.py +++ b/modoboa/lib/parameters.py @@ -216,6 +216,7 @@ def __is_defined(app, level, name): def save_admin(name, value, app=None): + """Set a new value for a given parameter.""" from .models import Parameter if app is None: From 25eb10fdcbeec9a35270e9651b20455ec77d1644 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 24 Apr 2015 17:44:28 +0200 Subject: [PATCH 13/16] README update. --- README.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index da985ae2b..549a36f0d 100644 --- a/README.rst +++ b/README.rst @@ -26,13 +26,13 @@ frameworks. Main features ************* -* Administration panel -* `Amavisd-new `_ frontend -* Webmail -* Per-user Sieve filters -* Autoreply messages for Postfix -* Graphical statistics about email traffic -* `Radicale `_ management frontend +* `Administration panel `_ +* `Amavisd-new `_ `frontend `_ +* `Webmail `_ +* `Per-user Sieve filters `_ +* `Autoreply messages for Postfix `_ +* `Graphical statistics about email traffic `_ +* `Radicale `_ `management frontend `_ ************* Documentation From 35560eb974e208efb2cf3ba208ebde6460583a58 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 25 Apr 2015 10:32:03 +0200 Subject: [PATCH 14/16] Fix obsolete call. --- modoboa/lib/web_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modoboa/lib/web_utils.py b/modoboa/lib/web_utils.py index f79484023..7d9467a27 100644 --- a/modoboa/lib/web_utils.py +++ b/modoboa/lib/web_utils.py @@ -12,7 +12,7 @@ from django import template from django.conf import settings from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse -from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.shortcuts import render from django.template.loader import render_to_string @@ -88,7 +88,7 @@ def ajax_response(request, status="ok", respmsg=None, if url is not None: jsonctx["url"] = url jsonctx["norefresh"] = norefresh - return HttpResponse(json.dumps(jsonctx), mimetype="application/json") + return JsonResponse(jsonctx) def render_to_json_response(context, **response_kwargs): From dbc5d4754d04d4d8b174e4e3004f9745953faf4f Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 25 Apr 2015 14:43:34 +0200 Subject: [PATCH 15/16] fix wrong icon. --- modoboa/static/js/top_notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/static/js/top_notifications.js b/modoboa/static/js/top_notifications.js index adaaaa020..3e29911f4 100644 --- a/modoboa/static/js/top_notifications.js +++ b/modoboa/static/js/top_notifications.js @@ -39,7 +39,7 @@ TopNotifications.prototype = { data.level + "'>" + data.counter + " " + data.text; } else { - content = " " + data.text; + content = " " + data.text; } return content; }, From 24356afc5a85c309c7f56f376e753c7e6a5b5048 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 25 Apr 2015 14:54:47 +0200 Subject: [PATCH 16/16] Fixtures removed --- modoboa/lib/fixtures/demo.json | 234 --------------------------------- 1 file changed, 234 deletions(-) delete mode 100644 modoboa/lib/fixtures/demo.json diff --git a/modoboa/lib/fixtures/demo.json b/modoboa/lib/fixtures/demo.json deleted file mode 100644 index 737dff0b0..000000000 --- a/modoboa/lib/fixtures/demo.json +++ /dev/null @@ -1,234 +0,0 @@ -[ - { - "pk": 2, - "model": "lib.parameter", - "fields": { - "name": "core.PASSWORD_SCHEME", - "value": "crypt" - } - }, - { - "pk": 3, - "model": "lib.parameter", - "fields": { - "name": "core.ITEMS_PER_PAGE", - "value": "30" - } - }, - { - "pk": 4, - "model": "lib.parameter", - "fields": { - "name": "core.DEFAULT_TOP_REDIRECTION", - "value": "user" - } - }, - { - "pk": 8, - "model": "lib.parameter", - "fields": { - "name": "core.AUTHENTICATION_TYPE", - "value": "local" - } - }, - { - "pk": 9, - "model": "lib.parameter", - "fields": { - "name": "admin.MAILBOXES_OWNER", - "value": "vmail" - } - }, - { - "pk": 13, - "model": "lib.parameter", - "fields": { - "name": "amavis_quarantine.USER_CAN_RELEASE", - "value": "no" - } - }, - { - "pk": 14, - "model": "lib.parameter", - "fields": { - "name": "amavis_quarantine.CHECK_REQUESTS_INTERVAL", - "value": "30" - } - }, - { - "pk": 15, - "model": "lib.parameter", - "fields": { - "name": "amavis_quarantine.AM_PDP_PORT", - "value": "9998" - } - }, - { - "pk": 16, - "model": "lib.parameter", - "fields": { - "name": "webmail.IMAP_SECURED", - "value": "no" - } - }, - { - "pk": 17, - "model": "lib.parameter", - "fields": { - "name": "postfix_autoreply.AUTOREPLIES_TIMEOUT", - "value": "86400" - } - }, - { - "pk": 18, - "model": "lib.parameter", - "fields": { - "name": "sievefilters.AUTHENTICATION_MECH", - "value": "PLAIN" - } - }, - { - "pk": 19, - "model": "lib.parameter", - "fields": { - "name": "amavis.AM_PDP_SOCKET", - "value": "/var/amavis/amavisd.sock" - } - }, - { - "pk": 20, - "model": "lib.parameter", - "fields": { - "name": "amavis.AM_PDP_MODE", - "value": "inet" - } - }, - { - "pk": 21, - "model": "lib.parameter", - "fields": { - "name": "amavis.SELF_SERVICE", - "value": "no" - } - }, - { - "pk": 22, - "model": "lib.parameter", - "fields": { - "name": "webmail.IMAP_PORT", - "value": "143" - } - }, - { - "pk": 23, - "model": "lib.parameter", - "fields": { - "name": "webmail.SMTP_SECURED_MODE", - "value": "none" - } - }, - { - "pk": 24, - "model": "lib.parameter", - "fields": { - "name": "sievefilters.SERVER", - "value": "127.0.0.1" - } - }, - { - "pk": 25, - "model": "lib.parameter", - "fields": { - "name": "webmail.SMTP_SERVER", - "value": "127.0.0.1" - } - }, - { - "pk": 26, - "model": "lib.parameter", - "fields": { - "name": "webmail.SMTP_AUTHENTICATION", - "value": "no" - } - }, - { - "pk": 27, - "model": "lib.parameter", - "fields": { - "name": "webmail.MAX_ATTACHMENT_SIZE", - "value": "512K" - } - }, - { - "pk": 28, - "model": "lib.parameter", - "fields": { - "name": "stats.RRD_ROOTDIR", - "value": "/srv/www/modoboa/tmp" - } - }, - { - "pk": 29, - "model": "lib.parameter", - "fields": { - "name": "amavis.RELEASED_MSGS_CLEANUP", - "value": "no" - } - }, - { - "pk": 30, - "model": "lib.parameter", - "fields": { - "name": "amavis.MAX_MESSAGES_AGE", - "value": "14" - } - }, - { - "pk": 31, - "model": "lib.parameter", - "fields": { - "name": "webmail.SMTP_PORT", - "value": "25" - } - }, - { - "pk": 33, - "model": "lib.parameter", - "fields": { - "name": "webmail.IMAP_SERVER", - "value": "127.0.0.1" - } - }, - { - "pk": 34, - "model": "lib.parameter", - "fields": { - "name": "sievefilters.STARTTLS", - "value": "yes" - } - }, - { - "pk": 35, - "model": "lib.parameter", - "fields": { - "name": "sievefilters.PORT", - "value": "2000" - } - }, - { - "pk": 36, - "model": "lib.parameter", - "fields": { - "name": "amavis.AM_PDP_HOST", - "value": "localhost" - } - }, - { - "pk": 37, - "model": "lib.parameter", - "fields": { - "name": "stats.LOGFILE", - "value": "/var/log/mail.log" - } - } -]