From 1eb7f9357236fec6031d274df85f4e5adb5a0b4f Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 13:09:30 +0000 Subject: [PATCH 01/42] add .editorconfig --- .editorconfig | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..f93002ab0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,30 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{css,js,py}] +charset = utf-8 +indent_style = space +indent_size = 4 + +[Makefile] +indent_style = tab + +[{.travis.yml,codecov.yml}] +indent_style = space +indent_size = 2 + +# Ignore paths +[/modoboa/bower_components/**] +charset = none +end_of_line = none +insert_final_newline = none +trim_trailing_whitespace = none +indent_style = none +indent_size = none From 0e466a98e6fdba27e27f411fdb9b242c8b3071f2 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 14:52:10 +0000 Subject: [PATCH 02/42] setup.cfg isort cfg --- setup.cfg | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 66d21b5cc..2d0868dfd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,26 @@ [bdist_wheel] universal = 1 + +[isort] +atomic = true +combine_as_imports = true +combine_star = true +default_section = THIRDPARTY +indent = ' ' +known_django=django +known_drf=rest_framework +known_first_party = modoboa,test_project +multi_line_output = 5 +no_lines_before=LOCALFOLDER +not_skip = __init__.py +sections=FUTURE,STDLIB,THIRDPARTY,DJANGO,DRF,FIRSTPARTY,LOCALFOLDER +skip_glob = **/migrations/*.py +use_parentheses = true + [pep8] -max-line-length = 80 exclude = migrations +max-line-length = 80 + +[flake8] +exclude = migrations +max-line-length = 80 From 8a1d5736c990078b74d6eb436f2547e2d6e67342 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 13:16:16 +0000 Subject: [PATCH 03/42] fix quotes This ensures all files use " for quotes with the exception of migrations, as this are auto generated I've not modified them. pip install unify unify --in-place --recursive --quote \" . --- doc/conf.py | 34 +-- modoboa/admin/api.py | 4 +- modoboa/admin/factories.py | 32 +-- modoboa/admin/forms/__init__.py | 10 +- modoboa/admin/forms/account.py | 12 +- modoboa/admin/forms/domain.py | 2 +- modoboa/admin/handlers.py | 2 +- modoboa/admin/lib.py | 4 +- .../commands/handle_mailbox_operations.py | 2 +- .../commands/subcommands/_export.py | 4 +- .../commands/subcommands/_import.py | 2 +- modoboa/admin/models/alias.py | 4 +- modoboa/admin/models/domain.py | 4 +- modoboa/admin/models/domain_alias.py | 4 +- modoboa/admin/models/mailbox.py | 18 +- modoboa/admin/postfix_maps.py | 8 +- modoboa/admin/templatetags/admin_tags.py | 12 +- modoboa/admin/tests/test_account.py | 16 +- modoboa/admin/tests/test_api.py | 16 +- modoboa/admin/tests/test_domain.py | 6 +- modoboa/admin/tests/test_domain_alias.py | 2 +- modoboa/admin/tests/test_import_.py | 2 +- modoboa/admin/tests/test_password_schemes.py | 22 +- modoboa/admin/tests/test_repair.py | 2 +- modoboa/admin/urls.py | 2 +- modoboa/admin/views/alias.py | 14 +- modoboa/admin/views/domain.py | 8 +- modoboa/admin/views/export.py | 4 +- modoboa/admin/views/identity.py | 12 +- modoboa/admin/views/import_.py | 6 +- modoboa/admin/views/user.py | 2 +- modoboa/core/app_settings.py | 14 +- modoboa/core/commands/__init__.py | 8 +- modoboa/core/commands/deploy.py | 106 +++---- modoboa/core/commands/help.py | 4 +- modoboa/core/extensions.py | 2 +- modoboa/core/models.py | 4 +- modoboa/core/password_hashers/__init__.py | 4 +- modoboa/core/password_hashers/advanced.py | 8 +- modoboa/core/password_hashers/base.py | 14 +- modoboa/core/templatetags/core_tags.py | 10 +- modoboa/core/tests/test_authentication.py | 8 +- modoboa/core/tests/test_core.py | 6 +- modoboa/core/tests/test_ldap.py | 12 +- modoboa/core/tests/test_views.py | 4 +- modoboa/core/views/admin.py | 4 +- modoboa/core/views/auth.py | 2 +- modoboa/core/views/user.py | 4 +- modoboa/lib/authbackends.py | 2 +- modoboa/lib/cryptutils.py | 2 +- modoboa/lib/db_utils.py | 4 +- modoboa/lib/email_utils.py | 10 +- modoboa/lib/exceptions.py | 6 +- modoboa/lib/form_utils.py | 14 +- modoboa/lib/imap_utf7.py | 80 +++--- modoboa/lib/ldap_utils.py | 4 +- modoboa/lib/singleton.py | 2 +- modoboa/lib/templatetags/lib_tags.py | 4 +- modoboa/lib/tests/__init__.py | 14 +- modoboa/lib/tests/test_u2u_decode.py | 10 +- modoboa/lib/web_utils.py | 6 +- modoboa/limits/tests/test_api.py | 12 +- modoboa/limits/tests/test_user_limits.py | 272 +++++++++--------- modoboa/parameters/apps.py | 2 +- modoboa/relaydomains/tests.py | 80 +++--- modoboa/test_settings.py | 52 ++-- modoboa/transport/apps.py | 2 +- modoboa/urls.py | 10 +- test_project/test_project/settings.py | 222 +++++++------- tests.py | 2 +- 70 files changed, 649 insertions(+), 649 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 37b46b5e5..dcc403c67 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -26,20 +26,20 @@ import sys, os # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ - 'sphinx.ext.intersphinx', + "sphinx.ext.intersphinx", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['.templates'] +templates_path = [".templates"] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. project = u'Modoboa' @@ -50,9 +50,9 @@ copyright = u'2018, Antoine Nguyen' # built documents. # # The short X.Y version. -version = '1.10' +version = "1.10" # The full version, including alpha/beta/rc tags. -release = '1.10.0' +release = "1.10.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -66,7 +66,7 @@ release = '1.10.0' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['.build'] +exclude_patterns = [".build"] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None @@ -83,7 +83,7 @@ exclude_patterns = ['.build'] #show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] @@ -94,11 +94,11 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -on_rtd = os.environ.get('READTHEDOCS', None) == 'True' +on_rtd = os.environ.get("READTHEDOCS", None) == "True" if on_rtd: - html_theme = 'default' + html_theme = "default" else: - html_theme = 'nature' + html_theme = "nature" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -127,7 +127,7 @@ else: # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. @@ -171,7 +171,7 @@ html_static_path = ['_static'] #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'Modoboadoc' +htmlhelp_basename = "Modoboadoc" # -- Options for LaTeX output -------------------------------------------------- @@ -185,8 +185,8 @@ htmlhelp_basename = 'Modoboadoc' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'Modoboa.tex', u'Modoboa Documentation', - u'Antoine Nguyen', 'manual'), + ("index", "Modoboa.tex", u'Modoboa Documentation', + u'Antoine Nguyen', "manual"), ] # The name of an image file (relative to this directory) to place at the top of @@ -218,10 +218,10 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'modoboa', u'Modoboa Documentation', + ("index", "modoboa", u'Modoboa Documentation', [u'Antoine Nguyen'], 1) ] intersphinx_mapping = { - 'amavis': ('http://modoboa-amavis.readthedocs.org/en/latest/', None) + "amavis": ("http://modoboa-amavis.readthedocs.org/en/latest/", None) } diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index a0e91e439..4afb9065a 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -81,7 +81,7 @@ class AccountViewSet(viewsets.ModelViewSet): user = self.request.user ids = user.objectaccess_set \ .filter(content_type=ContentType.objects.get_for_model(user)) \ - .values_list('object_id', flat=True) + .values_list("object_id", flat=True) queryset = core_models.User.objects.filter(pk__in=ids) domain = self.request.query_params.get("domain") if domain: @@ -139,7 +139,7 @@ class AliasViewSet(viewsets.ModelViewSet): ids = ( user.objectaccess_set.filter( content_type=ContentType.objects.get_for_model(models.Alias)) - .values_list('object_id', flat=True) + .values_list("object_id", flat=True) ) queryset = models.Alias.objects.filter(pk__in=ids) domain = self.request.query_params.get("domain") diff --git a/modoboa/admin/factories.py b/modoboa/admin/factories.py index b62ba877a..3f9b3f26c 100644 --- a/modoboa/admin/factories.py +++ b/modoboa/admin/factories.py @@ -79,44 +79,44 @@ def populate_database(): """ dom = DomainFactory(name="test.com", quota=50) admin = UserFactory( - username="admin@test.com", groups=('DomainAdmins', ), - password='{PLAIN}toto' + username="admin@test.com", groups=("DomainAdmins", ), + password="{PLAIN}toto" ) - MailboxFactory(address='admin', domain=dom, user=admin) + MailboxFactory(address="admin", domain=dom, user=admin) account = UserFactory.create( - username="user@test.com", groups=('SimpleUsers',), + username="user@test.com", groups=("SimpleUsers",), ) - MailboxFactory.create(address='user', domain=dom, user=account) + MailboxFactory.create(address="user", domain=dom, user=account) al = AliasFactory.create( - address='forward@test.com', domain=dom + address="forward@test.com", domain=dom ) AliasRecipientFactory.create( - address='user@external.com', alias=al) + address="user@external.com", alias=al) al = AliasFactory.create( - address='alias@test.com', domain=dom + address="alias@test.com", domain=dom ) mb = account.mailbox AliasRecipientFactory.create( address=mb.full_address, alias=al, r_mailbox=mb) al = AliasFactory.create( - address='postmaster@test.com', domain=dom + address="postmaster@test.com", domain=dom ) - for address in ['toto@titi.com', 'test@truc.fr']: + for address in ["toto@titi.com", "test@truc.fr"]: AliasRecipientFactory.create(address=address, alias=al) dom.add_admin(admin) - dom2 = DomainFactory.create(name='test2.com', default_mailbox_quota=0) + dom2 = DomainFactory.create(name="test2.com", default_mailbox_quota=0) admin = UserFactory.create( - username='admin@test2.com', groups=('DomainAdmins',), - password='{PLAIN}toto' + username="admin@test2.com", groups=("DomainAdmins",), + password="{PLAIN}toto" ) - MailboxFactory.create(address='admin', domain=dom2, user=admin) + MailboxFactory.create(address="admin", domain=dom2, user=admin) u = UserFactory.create( - username='user@test2.com', groups=('SimpleUsers',) + username="user@test2.com", groups=("SimpleUsers",) ) - MailboxFactory.create(address='user', domain=dom2, user=u) + MailboxFactory.create(address="user", domain=dom2, user=u) dom2.add_admin(admin) diff --git a/modoboa/admin/forms/__init__.py b/modoboa/admin/forms/__init__.py index b7811a0d9..263ea5808 100644 --- a/modoboa/admin/forms/__init__.py +++ b/modoboa/admin/forms/__init__.py @@ -13,9 +13,9 @@ from .import_ import ImportDataForm, ImportIdentitiesForm from .export import ExportDataForm, ExportDomainsForm, ExportIdentitiesForm __all__ = [ - 'DomainFormGeneral', 'DomainFormOptions', 'DomainForm', - 'AccountFormGeneral', 'AccountFormMail', 'AccountPermissionsForm', - 'AccountForm', 'AliasForm', 'ImportDataForm', 'ImportIdentitiesForm', - 'ExportDataForm', 'ExportDomainsForm', 'ExportIdentitiesForm', - 'ForwardForm', 'DomainWizard', 'AccountWizard' + "DomainFormGeneral", "DomainFormOptions", "DomainForm", + "AccountFormGeneral", "AccountFormMail", "AccountPermissionsForm", + "AccountForm", "AliasForm", "ImportDataForm", "ImportIdentitiesForm", + "ExportDataForm", "ExportDomainsForm", "ExportIdentitiesForm", + "ForwardForm", "DomainWizard", "AccountWizard" ] diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 1622a8f62..a2987fa8c 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -527,9 +527,9 @@ class AccountForm(TabForms): def extra_context(self, context): account = self.instances["general"] context.update({ - 'title': account.username, - 'formid': 'accountform', - 'action': reverse("admin:account_change", + "title": account.username, + "formid": "accountform", + "action": reverse("admin:account_change", args=[account.id]), }) @@ -604,9 +604,9 @@ class AccountWizard(WizardForm): def extra_context(self, context): context.update({ - 'title': _("New account"), - 'action': reverse("admin:account_add"), - 'formid': 'newaccount_form' + "title": _("New account"), + "action": reverse("admin:account_add"), + "formid": "newaccount_form" }) def done(self): diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index ddd4bf070..7b2a0ce69 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -82,7 +82,7 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm): """Check unicity and more.""" name = self.cleaned_data["name"] label = lib.check_if_domain_exists( - name, [(DomainAlias, _('domain alias'))]) + name, [(DomainAlias, _("domain alias"))]) if label is not None: raise forms.ValidationError( _("A %s with this name already exists") % force_text(label)) diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index a91a12667..bc673e85a 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -161,7 +161,7 @@ def account_auto_created(sender, user, **kwargs): if not param_tools.get_global_parameter("auto_create_domain_and_mailbox"): return localpart, domname = split_mailbox(user.username) - if user.role != 'SimpleUsers' and domname is None: + if user.role != "SimpleUsers" and domname is None: return sadmins = core_models.User.objects.filter(is_superuser=True) try: diff --git a/modoboa/admin/lib.py b/modoboa/admin/lib.py index e85ca33cc..f2541946d 100644 --- a/modoboa/admin/lib.py +++ b/modoboa/admin/lib.py @@ -59,7 +59,7 @@ def get_identities(user, searchquery=None, idtfilter=None, grpfilter=None): if idtfilter is None or not idtfilter or idtfilter == "account": ids = user.objectaccess_set \ .filter(content_type=ContentType.objects.get_for_model(user)) \ - .values_list('object_id', flat=True) + .values_list("object_id", flat=True) q = Q(pk__in=ids) if searchquery is not None: q &= Q(username__icontains=searchquery) \ @@ -76,7 +76,7 @@ def get_identities(user, searchquery=None, idtfilter=None, grpfilter=None): or (idtfilter in ["alias", "forward", "dlist"]): alct = ContentType.objects.get_for_model(Alias) ids = user.objectaccess_set.filter(content_type=alct) \ - .values_list('object_id', flat=True) + .values_list("object_id", flat=True) q = Q(pk__in=ids, internal=False) if searchquery is not None: q &= ( diff --git a/modoboa/admin/management/commands/handle_mailbox_operations.py b/modoboa/admin/management/commands/handle_mailbox_operations.py index 8888cb9eb..a5f86613d 100644 --- a/modoboa/admin/management/commands/handle_mailbox_operations.py +++ b/modoboa/admin/management/commands/handle_mailbox_operations.py @@ -80,7 +80,7 @@ class Command(BaseCommand): ) if not code: return False - with open(path, 'w') as fp: + with open(path, "w") as fp: print(os.getpid(), file=fp) return True diff --git a/modoboa/admin/management/commands/subcommands/_export.py b/modoboa/admin/management/commands/subcommands/_export.py index bad0e0afd..ed53b8026 100644 --- a/modoboa/admin/management/commands/subcommands/_export.py +++ b/modoboa/admin/management/commands/subcommands/_export.py @@ -46,12 +46,12 @@ class ExportCommand(BaseCommand): dumped_aliases += [alias.pk] qset = ( models.Alias.objects.exclude(pk__in=dumped_aliases) - .prefetch_related('aliasrecipient_set') + .prefetch_related("aliasrecipient_set") ) for alias in qset: alias.to_csv(self.csvwriter) def handle(self, *args, **options): exts_pool.load_all() - self.csvwriter = csv.writer(sys.stdout, delimiter=options['sepchar']) + self.csvwriter = csv.writer(sys.stdout, delimiter=options["sepchar"]) getattr(self, "export_{}".format(options["objtype"]))() diff --git a/modoboa/admin/management/commands/subcommands/_import.py b/modoboa/admin/management/commands/subcommands/_import.py index 1c9c16d89..80e3a6ad5 100644 --- a/modoboa/admin/management/commands/subcommands/_import.py +++ b/modoboa/admin/management/commands/subcommands/_import.py @@ -30,7 +30,7 @@ class ImportCommand(BaseCommand): help="Separator used in file.") parser.add_argument( "--continue-if-exists", action="store_true", - dest='continue_if_exists', default=False, + dest="continue_if_exists", default=False, help="Continue even if an entry already exists.") parser.add_argument( "--crypt-password", action="store_true", diff --git a/modoboa/admin/models/alias.py b/modoboa/admin/models/alias.py index 225ed9e78..b689eb841 100644 --- a/modoboa/admin/models/alias.py +++ b/modoboa/admin/models/alias.py @@ -48,7 +48,7 @@ class Alias(AdminObject): ugettext_lazy("Description"), blank=True) expire_at = models.DateTimeField( ugettext_lazy("Expire at"), blank=True, null=True) - _objectname = 'MailboxAlias' + _objectname = "MailboxAlias" class Meta: permissions = ( @@ -139,7 +139,7 @@ class Alias(AdminObject): domain=domain, address=local_part).first() if rcpt is None: rcpt = Alias.objects.filter( - address='%s@%s' % (local_part, domname) + address="%s@%s" % (local_part, domname) ).first() if rcpt is None: raise NotFound( diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index fa0337a3a..ff2c72f27 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -27,7 +27,7 @@ from .. import constants class Domain(AdminObject): """Mail domain.""" - name = models.CharField(ugettext_lazy('name'), max_length=100, unique=True, + name = models.CharField(ugettext_lazy("name"), max_length=100, unique=True, help_text=ugettext_lazy("The domain name")) quota = models.PositiveIntegerField( default=0, @@ -45,7 +45,7 @@ class Domain(AdminObject): ) ) enabled = models.BooleanField( - ugettext_lazy('enabled'), + ugettext_lazy("enabled"), help_text=ugettext_lazy("Check to activate this domain"), default=True ) diff --git a/modoboa/admin/models/domain_alias.py b/modoboa/admin/models/domain_alias.py index 51ccfba69..508e3a91c 100644 --- a/modoboa/admin/models/domain_alias.py +++ b/modoboa/admin/models/domain_alias.py @@ -39,12 +39,12 @@ class DomainAlias(AdminObject): name = models.CharField(ugettext_lazy("name"), max_length=100, unique=True, help_text=ugettext_lazy("The alias name")) target = models.ForeignKey( - Domain, verbose_name=ugettext_lazy('target'), + Domain, verbose_name=ugettext_lazy("target"), help_text=ugettext_lazy("The domain this alias points to"), on_delete=models.CASCADE ) enabled = models.BooleanField( - ugettext_lazy('enabled'), + ugettext_lazy("enabled"), help_text=ugettext_lazy("Check to activate this alias"), default=True ) diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index d32005959..278cc41c9 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -66,9 +66,9 @@ class MailboxManager(Manager): """ qf = None if squery is not None: - if '@' in squery: - parts = squery.split('@') - addrfilter = '@'.join(parts[:-1]) + if "@" in squery: + parts = squery.split("@") + addrfilter = "@".join(parts[:-1]) domfilter = parts[-1] qf = ( Q(address__contains=addrfilter) & @@ -81,7 +81,7 @@ class MailboxManager(Manager): ) ids = admin.objectaccess_set \ .filter(content_type=ContentType.objects.get_for_model(Mailbox)) \ - .values_list('object_id', flat=True) + .values_list("object_id", flat=True) if qf is not None: qf = Q(pk__in=ids) & qf else: @@ -94,7 +94,7 @@ class Mailbox(AdminObject): """User mailbox.""" address = models.CharField( - ugettext_lazy('address'), max_length=252, + ugettext_lazy("address"), max_length=252, help_text=ugettext_lazy( "Mailbox address (without the @domain.tld part)") ) @@ -376,7 +376,7 @@ class MailboxOperation(models.Model): mailbox = models.ForeignKey(Mailbox, blank=True, null=True, on_delete=models.CASCADE) type = models.CharField( - max_length=20, choices=(('rename', 'rename'), ('delete', 'delete')) + max_length=20, choices=(("rename", "rename"), ("delete", "delete")) ) argument = models.TextField() @@ -384,6 +384,6 @@ class MailboxOperation(models.Model): app_label = "admin" def __str__(self): - if self.type == 'rename': - return 'Rename %s -> %s' % (self.argument, self.mailbox.mail_home) - return 'Delete %s' % self.argument + if self.type == "rename": + return "Rename %s -> %s" % (self.argument, self.mailbox.mail_home) + return "Delete %s" % self.argument diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index c904a7eeb..373500154 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -7,7 +7,7 @@ class DomainsMap(object): """Map to list all domains.""" - filename = 'sql-domains.cf' + filename = "sql-domains.cf" mysql = ( "SELECT name FROM admin_domain " "WHERE name='%s' AND type='domain' AND enabled=1" @@ -26,7 +26,7 @@ class DomainsAliasesMap(object): """Map to list all domain aliases.""" - filename = 'sql-domain-aliases.cf' + filename = "sql-domain-aliases.cf" mysql = ( "SELECT dom.name FROM admin_domain dom " "INNER JOIN admin_domainalias domal ON dom.id=domal.target_id " @@ -48,7 +48,7 @@ class AliasesMap(object): """A map to list all mailbox aliases.""" - filename = 'sql-aliases.cf' + filename = "sql-aliases.cf" mysql = ( "SELECT alr.address FROM modoboa_admin_aliasrecipient AS alr " "INNER JOIN admin_alias AS al ON alr.alias_id=al.id " @@ -73,7 +73,7 @@ class MaintainMap(object): """Map files to list non available mailboxes.""" - filename = 'sql-maintain.cf' + filename = "sql-maintain.cf" mysql = ( "SELECT '450 Requested mail action not taken: mailbox unavailable' " "FROM admin_mailbox mb INNER JOIN admin_domain dom " diff --git a/modoboa/admin/templatetags/admin_tags.py b/modoboa/admin/templatetags/admin_tags.py index 202088157..7f0601230 100644 --- a/modoboa/admin/templatetags/admin_tags.py +++ b/modoboa/admin/templatetags/admin_tags.py @@ -75,7 +75,7 @@ def domains_menu(selection, user, ajax_mode=True): "modalcb": "admin.exportform_cb"} ] - return render_to_string('common/menulist.html', { + return render_to_string("common/menulist.html", { "entries": entries, "selection": selection, "user": user @@ -123,7 +123,7 @@ def identities_menu(user, selection=None, ajax_mode=True): "modalcb": "admin.exportform_cb"} ] - return render_to_string('common/menulist.html', { + return render_to_string("common/menulist.html", { "entries": entries, "user": user }) @@ -229,15 +229,15 @@ def domain_aliases(domain): :rtype: str """ if not domain.aliases.count(): - return '---' - res = '' + return "---" + res = "" for alias in domain.aliases.all(): - res += '%s
' % alias.name + res += "%s
" % alias.name return mark_safe(res) @register.simple_tag -def identity_modify_link(identity, active_tab='default'): +def identity_modify_link(identity, active_tab="default"): """Return the appropriate modification link. According to the identity type, a specific modification link (URL) diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index cddbe6297..1428c3d47 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -28,7 +28,7 @@ class AuthenticationTestCase(ModoTestCase): cls.mb = factories.MailboxFactory( domain__name="test.com", address="user", user__username="user@test.com", - user__groups=('SimpleUsers',) + user__groups=("SimpleUsers",) ) def test_authentication_unicode(self): @@ -56,7 +56,7 @@ class AccountTestCase(ModoTestCase): username="tester@test.com", first_name="Tester", last_name="Toto", password1="Toto1234", password2="Toto1234", role="SimpleUsers", quota_act=True, - is_active=True, email="tester@test.com", stepid='step2' + is_active=True, email="tester@test.com", stepid="step2" ) self.ajax_post(reverse("admin:account_add"), values) @@ -459,8 +459,8 @@ class AccountTestCase(ModoTestCase): @skipIf(NO_LDAP, "No ldap module installed") @override_settings(AUTHENTICATION_BACKENDS=( - 'modoboa.lib.authbackends.LDAPBackend', - 'django.contrib.auth.backends.ModelBackend', + "modoboa.lib.authbackends.LDAPBackend", + "django.contrib.auth.backends.ModelBackend", )) class LDAPAccountTestCase(test_ldap.LDAPTestCaseMixin, ModoTestCase): """Check LDAP related code.""" @@ -597,7 +597,7 @@ class PermissionsTestCase(ModoTestCase): response = self.client.get( reverse("admin:account_change", args=[self.user.id]), - HTTP_X_REQUESTED_WITH='XMLHttpRequest') + HTTP_X_REQUESTED_WITH="XMLHttpRequest") self.assertNotEqual(response["Content-Type"], "application/json") def test_domainadmin_deletes_superadmin(self): @@ -611,7 +611,7 @@ class PermissionsTestCase(ModoTestCase): username="superadmin2@test.com", first_name="Super", last_name="Admin", password1="Toto1234", password2="Toto1234", role="SuperAdmins", is_active=True, - email="superadmin2@test.com", stepid='step2' + email="superadmin2@test.com", stepid="step2" ) self.ajax_post( reverse("admin:account_add"), @@ -641,7 +641,7 @@ class PermissionsTestCase(ModoTestCase): username="user10@test.com", first_name="Test", last_name="Test", password1="Toto1234", password2="Toto1234", role="SimpleUsers", is_active=True, master_user=True, - email="user10@test.com", stepid='step2' + email="user10@test.com", stepid="step2" ) self.ajax_post( reverse("admin:account_add"), @@ -656,7 +656,7 @@ class PermissionsTestCase(ModoTestCase): dom = models.Domain.objects.get(name="test.com") mb = factories.MailboxFactory( domain=dom, address="admin2", - user__username="admin2@test.com", user__groups=('DomainAdmins', ), + user__username="admin2@test.com", user__groups=("DomainAdmins", ), user__password="{PLAIN}toto") dom.add_admin(mb.user) self.client.logout() diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index bd5c2582c..060ef940d 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -69,7 +69,7 @@ class DomainAPITestCase(ModoAPITestCase): self.assertIn("default_mailbox_quota", response.data) self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) response = self.client.post( url, {"name": "test4.com", "default_mailbox_quota": 10}) self.assertEqual(response.status_code, 403) @@ -84,7 +84,7 @@ class DomainAPITestCase(ModoAPITestCase): reseller = core_factories.UserFactory( username="reseller", groups=("Resellers", )) token = Token.objects.create(user=reseller) - self.client.credentials(HTTP_AUTHORIZATION='Token ' + token.key) + self.client.credentials(HTTP_AUTHORIZATION="Token " + token.key) url = reverse("api:domain-list") mock_query.side_effect = utils.mock_dns_query_result @@ -169,7 +169,7 @@ class DomainAliasAPITestCase(ModoAPITestCase): self.assertEqual(len(response.data), 1) self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) response = self.client.get(reverse("api:domain_alias-list")) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data), 0) @@ -191,7 +191,7 @@ class DomainAliasAPITestCase(ModoAPITestCase): self.assertEqual(dalias.target, target) self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) response = self.client.post( url, {"name": "dalias4.com", "target": target.pk}, format="json") self.assertEqual(response.status_code, 403) @@ -389,7 +389,7 @@ class AccountAPITestCase(ModoAPITestCase): def test_create_account_as_domadmin(self): """As DomainAdmin, try to create a new account.""" self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) data = copy.deepcopy(self.ACCOUNT_DATA) data["mailbox"]["quota"] = 1000 url = reverse("api:account-list") @@ -604,7 +604,7 @@ class AliasAPITestCase(ModoAPITestCase): response = self.client.post(url, self.ALIAS_DATA, format="json") self.assertEqual(response.status_code, 201) - alias = json.loads(response.content.decode('utf-8')) + alias = json.loads(response.content.decode("utf-8")) alias = models.Alias.objects.filter(pk=alias["pk"]).first() domadmin = core_models.User.objects.get(username="admin@test.com") self.assertTrue(domadmin.can_access(alias)) @@ -626,7 +626,7 @@ class AliasAPITestCase(ModoAPITestCase): def test_create_alias_as_domadmin(self): """As DomainAdmin, try to create a new alias.""" self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) url = reverse("api:alias-list") response = self.client.post(url, self.ALIAS_DATA, format="json") self.assertEqual(response.status_code, 201) @@ -723,7 +723,7 @@ class SenderAddressAPITestCase(ModoAPITestCase): self.assertEqual(response.status_code, 201) self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) data = {"address": "user@test2.com", "mailbox": mbox.pk} response = self.client.post(url, data) self.assertEqual(response.status_code, 400) diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index cabab25e3..f009a8609 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -176,7 +176,7 @@ class DomainTestCase(ModoTestCase): values = { "name": "pouet.com", "quota": 10, "default_mailbox_quota": 100, "create_dom_admin": True, "dom_admin_username": "toto", - "create_aliases": True, "type": "domain", "stepid": 'step3' + "create_aliases": True, "type": "domain", "stepid": "step3" } response = self.ajax_post( reverse("admin:domain_add"), @@ -347,13 +347,13 @@ class DomainTestCase(ModoTestCase): url = reverse("core:dashboard") response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertIn("Global statistics", response.content.decode('utf-8')) + self.assertIn("Global statistics", response.content.decode("utf-8")) self.client.force_login( User.objects.get(username="admin@test.com")) response = self.client.get(url) self.assertEqual(response.status_code, 200) - content = response.content.decode('utf-8') + content = response.content.decode("utf-8") self.assertNotIn("Global statistics", content) self.assertIn("Per-domain statistics", content) diff --git a/modoboa/admin/tests/test_domain_alias.py b/modoboa/admin/tests/test_domain_alias.py index 5dd667702..4c11bb7d7 100644 --- a/modoboa/admin/tests/test_domain_alias.py +++ b/modoboa/admin/tests/test_domain_alias.py @@ -17,7 +17,7 @@ class DomainAliasTestCase(ModoTestCase): """Create test data.""" super(DomainAliasTestCase, cls).setUpTestData() factories.populate_database() - cls.dom = Domain.objects.get(name='test.com') + cls.dom = Domain.objects.get(name="test.com") def test_model(self): dom = Domain.objects.get(name="test.com") diff --git a/modoboa/admin/tests/test_import_.py b/modoboa/admin/tests/test_import_.py index cfe9f7317..a11dcef8a 100644 --- a/modoboa/admin/tests/test_import_.py +++ b/modoboa/admin/tests/test_import_.py @@ -217,7 +217,7 @@ account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com; ; t reverse("admin:identity_import"), {"sourcefile": f, "crypt_password": True} ) - self.assertIn('wrong quota value', resp.content.decode()) + self.assertIn("wrong quota value", resp.content.decode()) def test_import_domain_by_domainadmin(self): """Check if a domain admin is not allowed to import a domain.""" diff --git a/modoboa/admin/tests/test_password_schemes.py b/modoboa/admin/tests/test_password_schemes.py index 277d202b9..99392ccef 100644 --- a/modoboa/admin/tests/test_password_schemes.py +++ b/modoboa/admin/tests/test_password_schemes.py @@ -21,7 +21,7 @@ class PasswordSchemesTestCase(ModoTestCase): username="tester@test.com", first_name="Tester", last_name="Toto", password1="Toto1234", password2="Toto1234", role="SimpleUsers", quota_act=True, - is_active=True, email="tester@test.com", stepid='step2' + is_active=True, email="tester@test.com", stepid="step2" ) self.ajax_post( reverse("admin:account_add"), @@ -31,30 +31,30 @@ class PasswordSchemesTestCase(ModoTestCase): def _test_scheme(self, name, startpattern): self.set_global_parameter("password_scheme", name, app="core") self._create_account() - account = User.objects.get(username='tester@test.com') + account = User.objects.get(username="tester@test.com") self.assertTrue(account.password.startswith(startpattern)) - self.assertTrue(account.check_password('Toto1234')) + self.assertTrue(account.check_password("Toto1234")) def test_bcrypt_scheme(self): - self._test_scheme('blfcrypt', '{BLF-CRYPT}') + self._test_scheme("blfcrypt", "{BLF-CRYPT}") def test_sha512crypt_scheme(self): - self._test_scheme('sha512crypt', '{SHA512-CRYPT}') + self._test_scheme("sha512crypt", "{SHA512-CRYPT}") def test_sha256crypt_scheme(self): - self._test_scheme('sha256crypt', '{SHA256-CRYPT}') + self._test_scheme("sha256crypt", "{SHA256-CRYPT}") def test_md5crypt_scheme(self): - self._test_scheme('md5crypt', '{MD5-CRYPT}') + self._test_scheme("md5crypt", "{MD5-CRYPT}") def test_sha256_scheme(self): - self._test_scheme('sha256', '{SHA256}') + self._test_scheme("sha256", "{SHA256}") def test_md5_scheme(self): - self._test_scheme('md5', '{MD5}') + self._test_scheme("md5", "{MD5}") def test_crypt(self): - self._test_scheme('crypt', '{CRYPT}') + self._test_scheme("crypt", "{CRYPT}") def test_plain(self): - self._test_scheme('plain', '{PLAIN}') + self._test_scheme("plain", "{PLAIN}") diff --git a/modoboa/admin/tests/test_repair.py b/modoboa/admin/tests/test_repair.py index e3e3b67ef..623892ce8 100644 --- a/modoboa/admin/tests/test_repair.py +++ b/modoboa/admin/tests/test_repair.py @@ -49,7 +49,7 @@ class RepairTestCase(ModoTestCase): def test_management_command_with_nul_domain(self): """Just assume nothing raise when an alias has no domain.""" - models.Alias.objects.create(address='@modoboa.xxx') + models.Alias.objects.create(address="@modoboa.xxx") ret = management.call_command("modo", "repair", "--quiet") assert ret is None diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index eff6fc2bb..3a9e2c38f 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -27,7 +27,7 @@ urlpatterns = [ name="domain_quota_list"), url(r'^domains/flatlist/$', domain_views.domains_list, name="domain_flat_list"), - url(r'^domains/new/', domain_views.newdomain, name='domain_add'), + url(r'^domains/new/', domain_views.newdomain, name="domain_add"), url(r'^domains/(?P\d+)/edit/$', domain_views.editdomain, name="domain_change"), url(r'^domains/(?P\d+)/delete/$', domain_views.deldomain, diff --git a/modoboa/admin/views/alias.py b/modoboa/admin/views/alias.py index a7c97f58b..5a4151df2 100644 --- a/modoboa/admin/views/alias.py +++ b/modoboa/admin/views/alias.py @@ -37,7 +37,7 @@ def _validate_alias(request, form, successmsg, callback=None): callback(request.user, alias) return render_to_json_response(successmsg) - return render_to_json_response({'form_errors': form.errors}, status=400) + return render_to_json_response({"form_errors": form.errors}, status=400) def _new_alias(request, title, action, successmsg, @@ -87,12 +87,12 @@ def editalias(request, alid, tplname="admin/aliasform.html"): return _validate_alias(request, form, successmsg) ctx = { - 'action': reverse("admin:alias_change", args=[alias.id]), - 'formid': 'aliasform', - 'title': alias.address, - 'action_label': _('Update'), - 'action_classes': 'submit', - 'form': AliasForm(request.user, instance=alias) + "action": reverse("admin:alias_change", args=[alias.id]), + "formid": "aliasform", + "title": alias.address, + "action_label": _("Update"), + "action_classes": "submit", + "form": AliasForm(request.user, instance=alias) } return render(request, tplname, ctx) diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index 4618b294a..e0b970d5a 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -51,16 +51,16 @@ def _domains(request): (flt, request.GET.get(flt, None)) for flt in ["domfilter", "searchquery"] + extra_filters ) - request.session['domains_filters'] = filters + request.session["domains_filters"] = filters domainlist = get_domains(request.user, **filters) - if sort_order == 'name': + if sort_order == "name": domainlist = sorted( domainlist, - key=lambda d: getattr(d, sort_order), reverse=sort_dir == '-' + key=lambda d: getattr(d, sort_order), reverse=sort_dir == "-" ) else: domainlist = sorted(domainlist, key=lambda d: d.tags[0]["name"], - reverse=sort_dir == '-') + reverse=sort_dir == "-") context = { "handle_mailboxes": request.localconfig.parameters.get_value( "handle_mailboxes", raise_exception=False), diff --git a/modoboa/admin/views/export.py b/modoboa/admin/views/export.py index a2d82e79e..8cbfa4af8 100644 --- a/modoboa/admin/views/export.py +++ b/modoboa/admin/views/export.py @@ -52,7 +52,7 @@ def export_identities(request): fp = six.StringIO() csvwriter = csv.writer(fp, delimiter=form.cleaned_data["sepchar"]) identities = get_identities( - request.user, **request.session['identities_filters']) + request.user, **request.session["identities_filters"]) for ident in identities: ident.to_csv(csvwriter) content = fp.getvalue() @@ -80,7 +80,7 @@ def export_domains(request): fp = six.StringIO() csvwriter = csv.writer(fp, delimiter=form.cleaned_data["sepchar"]) for dom in get_domains(request.user, - **request.session['domains_filters']): + **request.session["domains_filters"]): dom.to_csv(csvwriter) content = fp.getvalue() fp.close() diff --git a/modoboa/admin/views/identity.py b/modoboa/admin/views/identity.py index 669a49b62..4f3ba61ab 100644 --- a/modoboa/admin/views/identity.py +++ b/modoboa/admin/views/identity.py @@ -37,17 +37,17 @@ from .. import signals ) def _identities(request): filters = dict((fname, request.GET.get(fname, None)) - for fname in ['searchquery', 'idtfilter', 'grpfilter']) - request.session['identities_filters'] = filters + for fname in ["searchquery", "idtfilter", "grpfilter"]) + request.session["identities_filters"] = filters idents_list = get_identities(request.user, **filters) sort_order, sort_dir = get_sort_order(request.GET, "identity", ["identity", "name_or_rcpt", "tags"]) if sort_order in ["identity", "name_or_rcpt"]: objects = sorted(idents_list, key=lambda o: getattr(o, sort_order), - reverse=sort_dir == '-') + reverse=sort_dir == "-") else: objects = sorted(idents_list, key=lambda o: o.tags[0], - reverse=sort_dir == '-') + reverse=sort_dir == "-") context = { "handle_mailboxes": request.localconfig.parameters.get_value( "handle_mailboxes", raise_exception=False) @@ -104,7 +104,7 @@ def list_quotas(request): "* 1048576)) * 100" ) mboxes = mboxes.extra( - select={'quota_usage': select}, + select={"quota_usage": select}, where=["admin_quota.username=%s" % where], tables=["admin_quota", "admin_domain"], order_by=["%s%s" % (sort_dir, sort_order)] @@ -157,7 +157,7 @@ def identities(request, tplname="admin/identities.html"): @permission_required("core.add_user") def accounts_list(request): accs = User.objects.filter(is_superuser=False) \ - .exclude(groups__name='SimpleUsers') + .exclude(groups__name="SimpleUsers") res = [a.username for a in accs.all()] return render_to_json_response(res) diff --git a/modoboa/admin/views/import_.py b/modoboa/admin/views/import_.py index e63a4e849..e05e858b1 100644 --- a/modoboa/admin/views/import_.py +++ b/modoboa/admin/views/import_.py @@ -39,8 +39,8 @@ def importdata(request, formclass=ImportDataForm): if form.is_valid(): try: infile = io.TextIOWrapper( - request.FILES['sourcefile'].file, encoding="utf8") - reader = csv.reader(infile, delimiter=form.cleaned_data['sepchar']) + request.FILES["sourcefile"].file, encoding="utf8") + reader = csv.reader(infile, delimiter=form.cleaned_data["sepchar"]) except csv.Error as inst: error = smart_text(inst) else: @@ -63,7 +63,7 @@ def importdata(request, formclass=ImportDataForm): continue raise Conflict( _("Object already exists: %s" - % form.cleaned_data['sepchar'].join(row[:2])) + % form.cleaned_data["sepchar"].join(row[:2])) ) cpt += 1 msg = _("%d objects imported successfully" % cpt) diff --git a/modoboa/admin/views/user.py b/modoboa/admin/views/user.py index 424111919..072f68890 100644 --- a/modoboa/admin/views/user.py +++ b/modoboa/admin/views/user.py @@ -40,7 +40,7 @@ def forward(request, tplname="admin/forward.html"): return render_to_json_response(_("Forward updated")) return render_to_json_response( - {'form_errors': form.errors}, status=400 + {"form_errors": form.errors}, status=400 ) form = ForwardForm() diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index 8934c9773..8be3c572a 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -40,8 +40,8 @@ class GeneralParametersForm(param_forms.AdminParametersForm): authentication_type = forms.ChoiceField( label=ugettext_lazy("Authentication type"), - choices=[('local', ugettext_lazy("Local")), - ('ldap', "LDAP")], + choices=[("local", ugettext_lazy("Local")), + ("ldap", "LDAP")], initial="local", help_text=ugettext_lazy("The backend used for authentication"), widget=HorizontalRadioSelect() @@ -115,16 +115,16 @@ class GeneralParametersForm(param_forms.AdminParametersForm): ldap_auth_method = forms.ChoiceField( label=ugettext_lazy("Authentication method"), - choices=[('searchbind', ugettext_lazy("Search and bind")), - ('directbind', ugettext_lazy("Direct bind"))], - initial='searchbind', + choices=[("searchbind", ugettext_lazy("Search and bind")), + ("directbind", ugettext_lazy("Direct bind"))], + initial="searchbind", help_text=ugettext_lazy("Choose the authentication method to use"), widget=forms.Select(attrs={"class": "form-control"}) ) ldap_bind_dn = forms.CharField( label=ugettext_lazy("Bind DN"), - initial='', + initial="", help_text=ugettext_lazy( "The distinguished name to use when binding to the LDAP server. " "Leave empty for an anonymous bind" @@ -135,7 +135,7 @@ class GeneralParametersForm(param_forms.AdminParametersForm): ldap_bind_password = forms.CharField( label=ugettext_lazy("Bind password"), - initial='', + initial="", help_text=ugettext_lazy( "The password to use when binding to the LDAP server " "(with 'Bind DN')" diff --git a/modoboa/core/commands/__init__.py b/modoboa/core/commands/__init__.py index f21b36fa7..6a25852a6 100644 --- a/modoboa/core/commands/__init__.py +++ b/modoboa/core/commands/__init__.py @@ -90,10 +90,10 @@ def handle_command_line(): epilog="""Available commands: %s """ % "\n".join(["\t%s" % c for c in sorted(commands)])) - parser.add_argument('--verbose', action='store_true', - help='Activate verbose output') - parser.add_argument('command', type=str, - help='A valid command name') + parser.add_argument("--verbose", action="store_true", + help="Activate verbose output") + parser.add_argument("command", type=str, + help="A valid command name") (args, remaining) = parser.parse_known_args() if args.command not in commands: diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index 11f079f2f..959b9c12b 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -58,40 +58,40 @@ class DeployCommand(Command): def __init__(self, *args, **kwargs): super(DeployCommand, self).__init__(*args, **kwargs) - self._parser.add_argument('name', type=str, - help='The name of your Modoboa instance') + self._parser.add_argument("name", type=str, + help="The name of your Modoboa instance") self._parser.add_argument( - '--collectstatic', action='store_true', default=False, - help='Run django collectstatic command' + "--collectstatic", action="store_true", default=False, + help="Run django collectstatic command" ) self._parser.add_argument( - '--dburl', type=str, nargs="+", default=None, - help='A database-url with a name') + "--dburl", type=str, nargs="+", default=None, + help="A database-url with a name") self._parser.add_argument( - '--domain', type=str, default=None, - help='The domain under which you want to deploy modoboa') + "--domain", type=str, default=None, + help="The domain under which you want to deploy modoboa") self._parser.add_argument( - '--lang', type=str, default="en-us", + "--lang", type=str, default="en-us", help="Set the default language" ) self._parser.add_argument( - '--timezone', type=str, default="UTC", + "--timezone", type=str, default="UTC", help="Set the local timezone" ) self._parser.add_argument( - '--devel', action='store_true', default=False, - help='Create a development instance' + "--devel", action="store_true", default=False, + help="Create a development instance" ) self._parser.add_argument( - '--extensions', type=str, nargs='*', + "--extensions", type=str, nargs="*", help="The list of extension to deploy" ) self._parser.add_argument( - '--dont-install-extensions', action='store_true', default=False, - help='Do not install extensions using pip' + "--dont-install-extensions", action="store_true", default=False, + help="Do not install extensions using pip" ) self._parser.add_argument( - '--admin-username', default='admin', + "--admin-username", default="admin", help="Username of the initial super administrator" ) @@ -101,7 +101,7 @@ class DeployCommand(Command): :param name: the command name :param cwd: the directory where the command must be executed """ - cmd = [sys.executable, 'manage.py', name] + cmd = [sys.executable, "manage.py", name] cmd.extend(args) if not self._verbose: p = subprocess.Popen( @@ -120,7 +120,7 @@ class DeployCommand(Command): ) print("%s failed, check your configuration" % cmd, file=sys.stderr) - def ask_db_info(self, name='default'): + def ask_db_info(self, name="default"): """Prompt the user for database information Gather all information required to create a new database @@ -130,33 +130,33 @@ class DeployCommand(Command): """ print("Configuring database connection: %s" % name) info = { - 'conn_name': name, - 'ENGINE': input( - 'Database type (mysql, postgres or sqlite3): ') + "conn_name": name, + "ENGINE": input( + "Database type (mysql, postgres or sqlite3): ") } - if info['ENGINE'] not in ['mysql', 'postgres', 'sqlite3']: - raise RuntimeError('Unsupported database engine') + if info["ENGINE"] not in ["mysql", "postgres", "sqlite3"]: + raise RuntimeError("Unsupported database engine") - if info['ENGINE'] == 'sqlite3': - info['ENGINE'] = 'django.db.backends.sqlite3' - info['NAME'] = '%s.db' % name + if info["ENGINE"] == "sqlite3": + info["ENGINE"] = "django.db.backends.sqlite3" + info["NAME"] = "%s.db" % name return info - if info['ENGINE'] == 'postgres': - info['ENGINE'] = 'django.db.backends.postgresql_psycopg2' + if info["ENGINE"] == "postgres": + info["ENGINE"] = "django.db.backends.postgresql_psycopg2" default_port = 5432 else: - info['ENGINE'] = 'django.db.backends.mysql' + info["ENGINE"] = "django.db.backends.mysql" default_port = 3306 - info['HOST'] = input("Database host (default: 'localhost'): ") - info['PORT'] = input( + info["HOST"] = input("Database host (default: 'localhost'): ") + info["PORT"] = input( "Database port (default: '%s'): " % default_port) # leave port setting empty, if default value is supplied and # leave it to django - if info['PORT'] == default_port: - info['PORT'] = '' - info['NAME'] = input('Database name: ') - info['USER'] = input('Username: ') - info['PASSWORD'] = getpass.getpass('Password: ') + if info["PORT"] == default_port: + info["PORT"] = "" + info["NAME"] = input("Database name: ") + info["USER"] = input("Username: ") + info["PASSWORD"] = getpass.getpass("Password: ") return info def _get_extension_list(self): @@ -188,9 +188,9 @@ class DeployCommand(Command): def handle(self, parsed_args): django.setup() management.call_command( - 'startproject', parsed_args.name, verbosity=False + "startproject", parsed_args.name, verbosity=False ) - path = "%(name)s/%(name)s" % {'name': parsed_args.name} + path = "%(name)s/%(name)s" % {"name": parsed_args.name} sys.path.append(parsed_args.name) conn_tpl = Template(DBCONN_TPL) @@ -206,7 +206,7 @@ class DeployCommand(Command): info = self.ask_db_info(conn_name) # If we set this earlier, our fallback method will never # be triggered - info['conn_name'] = conn_name + info["conn_name"] = conn_name connections[conn_name] = conn_tpl.render(Context(info)) else: connections["default"] = conn_tpl.render( @@ -216,7 +216,7 @@ class DeployCommand(Command): allowed_host = parsed_args.domain else: allowed_host = input( - 'What will be the hostname used to access Modoboa? ') + "What will be the hostname used to access Modoboa? ") if not allowed_host: allowed_host = "localhost" extra_settings = [] @@ -238,20 +238,20 @@ class DeployCommand(Command): ) mod = __import__( - parsed_args.name, globals(), locals(), [smart_str('settings')] + parsed_args.name, globals(), locals(), [smart_str("settings")] ) tpl = self._render_template( "%s/settings.py.tpl" % self._templates_dir, { - 'db_connections': connections, - 'secret_key': mod.settings.SECRET_KEY, - 'name': parsed_args.name, - 'allowed_host': allowed_host, - 'lang': parsed_args.lang, - 'timezone': parsed_args.timezone, - 'bower_components_dir': bower_components_dir, - 'devmode': parsed_args.devel, - 'extensions': extensions, - 'extra_settings': extra_settings + "db_connections": connections, + "secret_key": mod.settings.SECRET_KEY, + "name": parsed_args.name, + "allowed_host": allowed_host, + "lang": parsed_args.lang, + "timezone": parsed_args.timezone, + "bower_components_dir": bower_components_dir, + "devmode": parsed_args.devel, + "extensions": extensions, + "extra_settings": extra_settings } ) with codecs.open("%s/settings.py" % path, "w", "utf-8") as fp: @@ -264,7 +264,7 @@ class DeployCommand(Command): if isfile("%s/settings.pyc" % path): os.unlink("%s/settings.pyc" % path) self._exec_django_command( - "migrate", parsed_args.name, '--noinput' + "migrate", parsed_args.name, "--noinput" ) self._exec_django_command( "load_initial_data", parsed_args.name, @@ -272,7 +272,7 @@ class DeployCommand(Command): ) if parsed_args.collectstatic: self._exec_django_command( - "collectstatic", parsed_args.name, '--noinput' + "collectstatic", parsed_args.name, "--noinput" ) self._exec_django_command( "set_default_site", parsed_args.name, allowed_host diff --git a/modoboa/core/commands/help.py b/modoboa/core/commands/help.py index 88c7efc0b..d7257bc03 100644 --- a/modoboa/core/commands/help.py +++ b/modoboa/core/commands/help.py @@ -13,8 +13,8 @@ class HelpCommand(Command): def __init__(self, *args, **kwargs): super(HelpCommand, self).__init__(*args, **kwargs) - self._parser.add_argument('name', type=str, - help='A command name') + self._parser.add_argument("name", type=str, + help="A command name") def handle(self, parsed_args): if parsed_args.name not in self._commands: diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index a6ea04909..79323e1d1 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -79,7 +79,7 @@ class ExtensionsPool(object): def load_extension(self, name): """Load a registered extension.""" - __import__(name, locals(), globals(), [smart_str('modo_extension')]) + __import__(name, locals(), globals(), [smart_str("modo_extension")]) extinstance = self.get_extension(name) if extinstance is None: return None diff --git a/modoboa/core/models.py b/modoboa/core/models.py index c3e7c0a74..39c9e7d42 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -83,7 +83,7 @@ class User(AbstractUser): class Meta(object): ordering = ["username"] index_together = [ - ['email', 'is_active'] + ["email", "is_active"] ] password_expr = re.compile(r'\{([\w\-]+)\}(.+)') @@ -412,7 +412,7 @@ class ObjectAccess(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() - content_object = GenericForeignKey('content_type', 'object_id') + content_object = GenericForeignKey("content_type", "object_id") is_owner = models.BooleanField(default=False) class Meta(object): diff --git a/modoboa/core/password_hashers/__init__.py b/modoboa/core/password_hashers/__init__.py index 6269c666c..e47231f1f 100644 --- a/modoboa/core/password_hashers/__init__.py +++ b/modoboa/core/password_hashers/__init__.py @@ -22,8 +22,8 @@ def get_password_hasher(scheme): :return: The hasher class """ try: - scheme = scheme.replace('-', '') - hasher = globals()['%sHasher' % scheme.upper()] + scheme = scheme.replace("-", "") + hasher = globals()["%sHasher" % scheme.upper()] except KeyError: hasher = PLAINHasher return hasher diff --git a/modoboa/core/password_hashers/advanced.py b/modoboa/core/password_hashers/advanced.py index 0f526221c..1ab654b26 100644 --- a/modoboa/core/password_hashers/advanced.py +++ b/modoboa/core/password_hashers/advanced.py @@ -22,7 +22,7 @@ class BLFCRYPTHasher(PasswordHasher): """ @property def scheme(self): - return '{BLF-CRYPT}' if self._target == 'local' else '{CRYPT}' + return "{BLF-CRYPT}" if self._target == "local" else "{CRYPT}" def _b64encode(self, pwhash): return pwhash @@ -50,7 +50,7 @@ class MD5CRYPTHasher(PasswordHasher): """ @property def scheme(self): - return '{MD5-CRYPT}' if self._target == 'local' else '{CRYPT}' + return "{MD5-CRYPT}" if self._target == "local" else "{CRYPT}" def _b64encode(self, pwhash): return pwhash @@ -72,7 +72,7 @@ class SHA256CRYPTHasher(PasswordHasher): """ @property def scheme(self): - return '{SHA256-CRYPT}' if self._target == 'local' else '{CRYPT}' + return "{SHA256-CRYPT}" if self._target == "local" else "{CRYPT}" def _b64encode(self, pwhash): return pwhash @@ -96,7 +96,7 @@ class SHA512CRYPTHasher(PasswordHasher): """ @property def scheme(self): - return '{SHA512-CRYPT}' if self._target == 'local' else '{CRYPT}' + return "{SHA512-CRYPT}" if self._target == "local" else "{CRYPT}" def _b64encode(self, pwhash): return pwhash diff --git a/modoboa/core/password_hashers/base.py b/modoboa/core/password_hashers/base.py index a449c8088..59f8d7a64 100644 --- a/modoboa/core/password_hashers/base.py +++ b/modoboa/core/password_hashers/base.py @@ -22,7 +22,7 @@ class PasswordHasher(object): Base class of all hashers. """ - def __init__(self, target='local'): + def __init__(self, target="local"): self._target = target def _encrypt(self, clearvalue, salt=None): @@ -34,7 +34,7 @@ class PasswordHasher(object): :param str pwhash: password hash :return: base64 encoded hash or original hash """ - if self._target == 'ldap': + if self._target == "ldap": return base64.b64encode(pwhash) return pwhash @@ -52,7 +52,7 @@ class PasswordHasher(object): :return: encrypted password """ pwhash = self._b64encode(self._encrypt(force_text(clearvalue))) - return '%s%s' % (self.scheme, force_text(pwhash)) + return "%s%s" % (self.scheme, force_text(pwhash)) def verify(self, clearvalue, hashed_value): """Verify a password against a hashed value. @@ -74,7 +74,7 @@ class PLAINHasher(PasswordHasher): """ @property def scheme(self): - return '{PLAIN}' + return "{PLAIN}" def _encrypt(self, clearvalue, salt=None): return clearvalue @@ -89,7 +89,7 @@ class CRYPTHasher(PasswordHasher): """ @property def scheme(self): - return '{CRYPT}' + return "{CRYPT}" def _encrypt(self, clearvalue, salt=None): if salt is None: @@ -106,7 +106,7 @@ class MD5Hasher(PasswordHasher): """ @property def scheme(self): - return '{MD5}' + return "{MD5}" def _encrypt(self, clearvalue, salt=None): obj = hashlib.md5(force_bytes(clearvalue)) @@ -122,7 +122,7 @@ class SHA256Hasher(PasswordHasher): """ @property def scheme(self): - return '{SHA256}' + return "{SHA256}" def _encrypt(self, clearvalue, salt=None): return hashlib.sha256(force_bytes(clearvalue)).digest() diff --git a/modoboa/core/templatetags/core_tags.py b/modoboa/core/templatetags/core_tags.py index 25ef503af..ce6a3b2bc 100644 --- a/modoboa/core/templatetags/core_tags.py +++ b/modoboa/core/templatetags/core_tags.py @@ -72,7 +72,7 @@ def admin_menu(selection, user): "img": "", "label": _("Parameters")}, ] - return render_to_string('common/menu.html', { + return render_to_string("common/menu.html", { "entries": entries, "css": "nav nav-sidebar", "selection": selection, @@ -163,7 +163,7 @@ def tohtml(message): @register.simple_tag def visirule(field): - if not hasattr(field, 'form') or \ + if not hasattr(field, "form") or \ not hasattr(field.form, "visirules") or \ field.html_name not in field.form.visirules: return "" @@ -191,7 +191,7 @@ class ConnectedUsers(template.Node): # Build a list of user ids from that query for session in sessions: data = session.get_decoded() - uid = data.get('_auth_user_id', None) + uid = data.get("_auth_user_id", None) if uid: uid_list.append(uid) @@ -202,7 +202,7 @@ class ConnectedUsers(template.Node): context[self.varname].append(User.objects.get(pk=uid)) except User.DoesNotExist: pass - return '' + return "" @register.tag @@ -211,7 +211,7 @@ def connected_users(parser, token): tag, a, varname = token.split_contents() except ValueError: raise template.TemplateSyntaxError( - 'connected_users usage: {% connected_users as users %}' + "connected_users usage: {% connected_users as users %}" ) return ConnectedUsers(varname) diff --git a/modoboa/core/tests/test_authentication.py b/modoboa/core/tests/test_authentication.py index 08c7fb4dc..93581e3f7 100644 --- a/modoboa/core/tests/test_authentication.py +++ b/modoboa/core/tests/test_authentication.py @@ -28,7 +28,7 @@ class AuthenticationTestCase(ModoTestCase): """Create test data.""" super(AuthenticationTestCase, cls).setUpTestData() cls.account = factories.UserFactory( - username="user@test.com", groups=('SimpleUsers',) + username="user@test.com", groups=("SimpleUsers",) ) def test_authentication(self): @@ -75,10 +75,10 @@ class PasswordResetTestCase(ModoTestCase): super(PasswordResetTestCase, cls).setUpTestData() cls.account_ok = factories.UserFactory( username="user@test.com", secondary_email="test@ext.com", - groups=('SimpleUsers',) + groups=("SimpleUsers",) ) cls.account_ko = factories.UserFactory( - username="user2@test.com", groups=('SimpleUsers',) + username="user2@test.com", groups=("SimpleUsers",) ) def test_reset_password(self): @@ -104,7 +104,7 @@ class PasswordResetTestCase(ModoTestCase): self.assertEqual(len(mail.outbox), 0) -@skipIf(NO_SMTP, 'No SMTP server available') +@skipIf(NO_SMTP, "No SMTP server available") @override_settings(AUTHENTICATION_BACKENDS=( "modoboa.lib.authbackends.SMTPBackend", "django.contrib.auth.backends.ModelBackend" diff --git a/modoboa/core/tests/test_core.py b/modoboa/core/tests/test_core.py index 73ffa4b11..0e39f633d 100644 --- a/modoboa/core/tests/test_core.py +++ b/modoboa/core/tests/test_core.py @@ -28,7 +28,7 @@ class AuthenticationTestCase(ModoTestCase): """Create test data.""" super(AuthenticationTestCase, cls).setUpTestData() cls.account = factories.UserFactory( - username="user@test.com", groups=('SimpleUsers',) + username="user@test.com", groups=("SimpleUsers",) ) def test_authentication(self): @@ -109,7 +109,7 @@ class ProfileTestCase(ModoTestCase): """Create test data.""" super(ProfileTestCase, cls).setUpTestData() cls.account = factories.UserFactory( - username="user@test.com", groups=('SimpleUsers',) + username="user@test.com", groups=("SimpleUsers",) ) def test_update_profile(self): @@ -168,7 +168,7 @@ class APIAccessFormTestCase(ModoTestCase): """Create test data.""" super(APIAccessFormTestCase, cls).setUpTestData() cls.account = factories.UserFactory( - username="user@test.com", groups=('SimpleUsers',) + username="user@test.com", groups=("SimpleUsers",) ) def test_form_access(self): diff --git a/modoboa/core/tests/test_ldap.py b/modoboa/core/tests/test_ldap.py index 2de9be271..5b2a19631 100644 --- a/modoboa/core/tests/test_ldap.py +++ b/modoboa/core/tests/test_ldap.py @@ -16,7 +16,7 @@ from .. import factories from .. import models -@skipIf(NO_LDAP, 'No ldap module installed') +@skipIf(NO_LDAP, "No ldap module installed") class LDAPTestCaseMixin(object): """Set of methods used to test LDAP features.""" @@ -71,8 +71,8 @@ class LDAPTestCaseMixin(object): @override_settings(AUTHENTICATION_BACKENDS=( - 'modoboa.lib.authbackends.LDAPBackend', - 'django.contrib.auth.backends.ModelBackend' + "modoboa.lib.authbackends.LDAPBackend", + "django.contrib.auth.backends.ModelBackend" )) class LDAPAuthenticationTestCase(LDAPTestCaseMixin, ModoTestCase): """Validate LDAP authentication scenarios.""" @@ -137,12 +137,12 @@ class ProfileTestCase(LDAPTestCaseMixin, ModoTestCase): """Create test data.""" super(ProfileTestCase, cls).setUpTestData() cls.account = factories.UserFactory( - username="user@test.com", groups=('SimpleUsers',) + username="user@test.com", groups=("SimpleUsers",) ) @override_settings(AUTHENTICATION_BACKENDS=( - 'modoboa.lib.authbackends.LDAPBackend', - 'django.contrib.auth.backends.ModelBackend' + "modoboa.lib.authbackends.LDAPBackend", + "django.contrib.auth.backends.ModelBackend" )) def test_update_password_ldap(self): """Update password for an LDAP user.""" diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index c9d5a004a..dcb2047d8 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -108,12 +108,12 @@ class DashboardTestCase(ModoTestCase): url = reverse("core:dashboard") response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertIn("Latest news", response.content.decode('utf-8')) + self.assertIn("Latest news", response.content.decode("utf-8")) self.client.logout() self.client.login(username=self.dadmin.username, password="toto") response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertIn("Latest news", response.content.decode('utf-8')) + self.assertIn("Latest news", response.content.decode("utf-8")) self.client.logout() self.client.login(username=self.user.username, password="toto") response = self.client.get(url) diff --git a/modoboa/core/views/admin.py b/modoboa/core/views/admin.py index 6771dedb1..3be4ef1d7 100644 --- a/modoboa/core/views/admin.py +++ b/modoboa/core/views/admin.py @@ -22,7 +22,7 @@ from .. import signals @login_required @user_passes_test(lambda u: u.is_superuser) -def viewsettings(request, tplname='core/settings_header.html'): +def viewsettings(request, tplname="core/settings_header.html"): return render(request, tplname, { "selection": "settings" }) @@ -71,7 +71,7 @@ def get_logs_page(request, page_id=None): """Return a page of logs.""" sort_order, sort_dir = get_sort_order( request.GET, "date_created", - allowed_values=['date_created', 'level', 'logger', 'message'] + allowed_values=["date_created", "level", "logger", "message"] ) if page_id is None: page_id = request.GET.get("page", None) diff --git a/modoboa/core/views/auth.py b/modoboa/core/views/auth.py index 577263144..336d0d5bf 100644 --- a/modoboa/core/views/auth.py +++ b/modoboa/core/views/auth.py @@ -29,7 +29,7 @@ def dologin(request): if request.method == "POST": form = forms.LoginForm(request.POST) if form.is_valid(): - logger = logging.getLogger('modoboa.auth') + logger = logging.getLogger("modoboa.auth") user = authenticate(username=form.cleaned_data["username"], password=form.cleaned_data["password"]) if user and user.is_active: diff --git a/modoboa/core/views/user.py b/modoboa/core/views/user.py index 91acaff35..cafe1aeb2 100644 --- a/modoboa/core/views/user.py +++ b/modoboa/core/views/user.py @@ -27,7 +27,7 @@ def index(request, tplname="core/user_index.html"): @login_required -def profile(request, tplname='core/user_profile.html'): +def profile(request, tplname="core/user_profile.html"): """Profile detail/update view.""" update_password = True results = signals.allow_password_change.send( @@ -50,7 +50,7 @@ def profile(request, tplname='core/user_profile.html'): request.user.language) return render_to_json_response(_("Profile updated")) return render_to_json_response( - {'form_errors': form.errors}, status=400) + {"form_errors": form.errors}, status=400) form = ProfileForm(update_password, instance=request.user) return render_to_json_response({ diff --git a/modoboa/lib/authbackends.py b/modoboa/lib/authbackends.py index 18171afbb..0ff7fb645 100644 --- a/modoboa/lib/authbackends.py +++ b/modoboa/lib/authbackends.py @@ -86,7 +86,7 @@ try: if grp.strip() in ldap_user.group_names: group = "DomainAdmins" break - if group == 'SimpleUsers': + if group == "SimpleUsers": lpart, domain = split_mailbox(username) if domain is None: return None diff --git a/modoboa/lib/cryptutils.py b/modoboa/lib/cryptutils.py index 5f729bf50..25bc3ac9f 100644 --- a/modoboa/lib/cryptutils.py +++ b/modoboa/lib/cryptutils.py @@ -15,7 +15,7 @@ from cryptography.fernet import Fernet def random_key(length=16): """Generate a new key used to encrypt user passwords in session storage.""" - chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)' + chars = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)" return get_random_string(length, chars) diff --git a/modoboa/lib/db_utils.py b/modoboa/lib/db_utils.py index 8f6999aad..31f642e71 100644 --- a/modoboa/lib/db_utils.py +++ b/modoboa/lib/db_utils.py @@ -25,7 +25,7 @@ def db_type(cname="default"): if cname not in settings.DATABASES: raise InternalError( _("Connection to database %s not configured" % cname)) - for t in ['postgres', 'mysql', 'sqlite']: - if settings.DATABASES[cname]['ENGINE'].find(t) != -1: + for t in ["postgres", "mysql", "sqlite"]: + if settings.DATABASES[cname]["ENGINE"].find(t) != -1: return t return None diff --git a/modoboa/lib/email_utils.py b/modoboa/lib/email_utils.py index f043c039c..ae12a13c7 100644 --- a/modoboa/lib/email_utils.py +++ b/modoboa/lib/email_utils.py @@ -128,7 +128,7 @@ class Email(object): # msg parameter to maintain compatibility with # modoboa_webmail.lib.imapemail.ImapEmail if header in msg: - return "".join([smart_text(v, encoding=(e or 'ascii')) + return "".join([smart_text(v, encoding=(e or "ascii")) for v, e in email.header.decode_header(msg[header]) ]) return "" @@ -188,7 +188,7 @@ class Email(object): cid = None if "Content-ID" in msg: cid = msg["Content-ID"] - if cid.startswith('<') and cid.endswith('>'): + if cid.startswith("<") and cid.endswith(">"): cid = cid[1:-1] else: matches = _RE_CID.match(msg["Content-Type"]) @@ -379,7 +379,7 @@ def set_email_headers(msg, subject, sender, rcpt): """ import pkg_resources - msg["Subject"] = Header(subject, 'utf8') + msg["Subject"] = Header(subject, "utf8") msg["From"] = sender msg["To"] = prepare_addresses(rcpt) msg["Message-ID"] = make_msgid() @@ -388,7 +388,7 @@ def set_email_headers(msg, subject, sender, rcpt): msg["Date"] = formatdate(time.time(), True) -def __sendmail(sender, rcpt, msgstring, server='localhost', port=25): +def __sendmail(sender, rcpt, msgstring, server="localhost", port=25): """Message sending Return a tuple (True, None) on success, (False, error message) @@ -425,7 +425,7 @@ def sendmail_simple( :param content: message's content :return: tuple """ - msg = MIMEText(content, _charset='utf-8') + msg = MIMEText(content, _charset="utf-8") set_email_headers(msg, subject, sender, rcpt) return __sendmail(sender, rcpt, msg.as_string(), **kwargs) diff --git a/modoboa/lib/exceptions.py b/modoboa/lib/exceptions.py index 4bdd15896..3bfb5915f 100644 --- a/modoboa/lib/exceptions.py +++ b/modoboa/lib/exceptions.py @@ -17,9 +17,9 @@ class ModoboaException(Exception): http_code = None def __init__(self, *args, **kwargs): - if 'http_code' in kwargs: - self.http_code = kwargs['http_code'] - del kwargs['http_code'] + if "http_code" in kwargs: + self.http_code = kwargs["http_code"] + del kwargs["http_code"] super(ModoboaException, self).__init__(*args, **kwargs) diff --git a/modoboa/lib/form_utils.py b/modoboa/lib/form_utils.py index 74abb7a37..2b5bcdf95 100644 --- a/modoboa/lib/form_utils.py +++ b/modoboa/lib/form_utils.py @@ -19,7 +19,7 @@ from modoboa.lib.exceptions import BadRequest from modoboa.lib.web_utils import render_to_json_response -ABC = abc.ABCMeta(force_str('ABC'), (object,), {}) +ABC = abc.ABCMeta(force_str("ABC"), (object,), {}) class WizardStep(object): @@ -87,7 +87,7 @@ class WizardForm(ABC): result = {} for step in self.steps: for name, value in list(step.form.errors.items()): - if name == '__all__': + if name == "__all__": continue result[name] = value return result @@ -283,8 +283,8 @@ class TabForms(object): """ result = {} for f in self.forms: - for name, value in list(f['instance'].errors.items()): - if name == '__all__': + for name, value in list(f["instance"].errors.items()): + if name == "__all__": continue result[name] = value return result @@ -298,9 +298,9 @@ class TabForms(object): to_remove = [] for f in self.forms: if mandatory_only and \ - ('mandatory' not in f or not f["mandatory"]): + ("mandatory" not in f or not f["mandatory"]): continue - elif optional_only and ('mandatory' in f and f["mandatory"]): + elif optional_only and ("mandatory" in f and f["mandatory"]): continue if not self._before_is_valid(f): to_remove.append(f) @@ -349,7 +349,7 @@ class TabForms(object): self.save() return self.done() return render_to_json_response( - {'form_errors': self.errors}, status=400 + {"form_errors": self.errors}, status=400 ) context = { "tabs": self, diff --git a/modoboa/lib/imap_utf7.py b/modoboa/lib/imap_utf7.py index f1a2af3bd..050e92a35 100644 --- a/modoboa/lib/imap_utf7.py +++ b/modoboa/lib/imap_utf7.py @@ -61,13 +61,13 @@ PRINTABLE = set(range(0x20, 0x26)) | set(range(0x27, 0x7f)) def modified_utf7(s): - s_utf7 = s.encode('utf-7') - return s_utf7[1:-1].replace(b'/', b',') + s_utf7 = s.encode("utf-7") + return s_utf7[1:-1].replace(b"/", b",") def doB64(_in, r): if _in: - r.extend([b'&', modified_utf7(''.join(_in)), b'-']) + r.extend([b"&", modified_utf7("".join(_in)), b"-"]) del _in[:] @@ -78,32 +78,32 @@ def encoder(s): if ord(c) in PRINTABLE: doB64(_in, r) r.append(c.encode()) - elif c == '&': + elif c == "&": doB64(_in, r) - r.append(b'&-') + r.append(b"&-") else: _in.append(c) doB64(_in, r) - return (b''.join(r), len(s)) + return (b"".join(r), len(s)) # decoding def modified_unutf7(s): - s_utf7 = b'+' + s.replace(b',', b'/') + b'-' - return s_utf7.decode('utf-7') + s_utf7 = b"+" + s.replace(b",", b"/") + b"-" + return s_utf7.decode("utf-7") def decoder(s): r = [] decoded = bytearray() for c in s: - if c == ord('&') and not decoded: - decoded.append(ord('&')) - elif c == ord('-') and decoded: + if c == ord("&") and not decoded: + decoded.append(ord("&")) + elif c == ord("-") and decoded: if len(decoded) == 1: - r.append('&') + r.append("&") else: r.append(modified_unutf7(decoded[1:])) decoded = bytearray() @@ -113,22 +113,22 @@ def decoder(s): r.append(chr(c)) if decoded: r.append(modified_unutf7(decoded[1:])) - bin_str = ''.join(r) + bin_str = "".join(r) return (bin_str, len(s)) class StreamReader(codecs.StreamReader): - def decode(self, s, errors='strict'): + def decode(self, s, errors="strict"): return decoder(s) class StreamWriter(codecs.StreamWriter): - def decode(self, s, errors='strict'): + def decode(self, s, errors="strict"): return encoder(s) def imap4_utf_7(name): - if name == 'imap4-utf-7': + if name == "imap4-utf-7": return (encoder, decoder, StreamReader, StreamWriter) @@ -139,7 +139,7 @@ codecs.register(imap4_utf_7) def imapUTF7Encode(ust): "Returns imap utf-7 encoded version of string" - return ust.encode('imap4-utf-7') + return ust.encode("imap4-utf-7") def imapUTF7EncodeSequence(seq): @@ -149,7 +149,7 @@ def imapUTF7EncodeSequence(seq): def imapUTF7Decode(st): "Returns utf7 encoded version of imap utf-7 string" - return st.decode('imap4-utf-7') + return st.decode("imap4-utf-7") def imapUTF7DecodeSequence(seq): @@ -159,17 +159,17 @@ def imapUTF7DecodeSequence(seq): def utf8Decode(st): "Returns utf7 encoded version of imap utf-7 string" - return st.decode('utf-8') + return st.decode("utf-8") def utf7SequenceToUTF8(seq): "Returns utf7 encoded version of imap utf-7 strings in sequence" - return [itm.decode('imap4-utf-7').encode('utf-8') for itm in seq] + return [itm.decode("imap4-utf-7").encode("utf-8") for itm in seq] -__all__ = ['imapUTF7Encode', 'imapUTF7Decode', ] +__all__ = ["imapUTF7Encode", "imapUTF7Decode", ] -if __name__ == '__main__': +if __name__ == "__main__": # print u'bøx'.encode('imap4-utf-7') # print 'expected b&APg-x' @@ -177,29 +177,29 @@ if __name__ == '__main__': # print u'båx'.encode('imap4-utf-7') # print 'expected b&AOU-x' - print('#######') - print('bøx') + print("#######") + print("bøx") e = imapUTF7Encode(u'bøx') print(e) - print(imapUTF7Decode(e).encode('latin-1')) + print(imapUTF7Decode(e).encode("latin-1")) - print('#######') - print('båx') + print("#######") + print("båx") e = imapUTF7Encode(u'båx') print(e) - print(imapUTF7Decode(e).encode('latin-1')) + print(imapUTF7Decode(e).encode("latin-1")) - print('#######') - print('~/bågø') + print("#######") + print("~/bågø") e = imapUTF7Encode(u'~/bågø') print(e) - print(imapUTF7Decode(e).encode('latin-1')) + print(imapUTF7Decode(e).encode("latin-1")) - print('#######') - print('Ting & Såger') + print("#######") + print("Ting & Såger") e = imapUTF7Encode(u'Ting & Såger') print(e) - print(imapUTF7Decode(e).encode('latin-1')) + print(imapUTF7Decode(e).encode("latin-1")) # e = imapUTF7Decode('b&AOU-x') # print e.encode('latin-1') @@ -207,13 +207,13 @@ if __name__ == '__main__': # e = imapUTF7Decode('b&APg-x') # print e.encode('latin-1') - print('#######') - print('~/Følder/mailbåx & stuff + more') + print("#######") + print("~/Følder/mailbåx & stuff + more") n = u'~/Følder/mailbåx & stuff + more' e = imapUTF7Encode(n) print(e) - print(imapUTF7Decode(e).encode('latin-1')) + print(imapUTF7Decode(e).encode("latin-1")) - print('#######') - print('~peter/mail/&ZeVnLIqe-/&U,BTFw-') - print(imapUTF7Decode('~peter/mail/&ZeVnLIqe-/&U,BTFw-').encode('utf-8')) + print("#######") + print("~peter/mail/&ZeVnLIqe-/&U,BTFw-") + print(imapUTF7Decode("~peter/mail/&ZeVnLIqe-/&U,BTFw-").encode("utf-8")) diff --git a/modoboa/lib/ldap_utils.py b/modoboa/lib/ldap_utils.py index 57767b69f..d031bd41f 100644 --- a/modoboa/lib/ldap_utils.py +++ b/modoboa/lib/ldap_utils.py @@ -72,7 +72,7 @@ class LDAPAuthBackend(object): """Get a connection from the server.""" kwargs = {} if six.PY3: - kwargs['bytes_mode'] = False + kwargs["bytes_mode"] = False conn = ldap.initialize(self.server_uri, **kwargs) conn.set_option(ldap.OPT_X_TLS_DEMAND, True) conn.set_option(ldap.OPT_DEBUG_LEVEL, 255) @@ -121,7 +121,7 @@ class LDAPAuthBackend(object): user_dn = self._find_user_dn(user) if self.ldap_ad: newpassword = ( - ('"%s"' % newpassword).encode('utf-16').lstrip('\377\376') + ('"%s"' % newpassword).encode("utf-16").lstrip("\377\376") ) ldif = [(ldap.MOD_REPLACE, self.pwd_attr, diff --git a/modoboa/lib/singleton.py b/modoboa/lib/singleton.py index da4210794..f4444be7f 100644 --- a/modoboa/lib/singleton.py +++ b/modoboa/lib/singleton.py @@ -11,5 +11,5 @@ class _Singleton(type): return cls._instances[cls] -class Singleton(_Singleton('SingletonMeta', (object,), {})): +class Singleton(_Singleton("SingletonMeta", (object,), {})): pass diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index ef7a9da2d..e1abb842f 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -16,7 +16,7 @@ register = template.Library() @register.simple_tag -def join(items, sep=','): +def join(items, sep=","): res = "" for k, v in list(items.items()): if res != "": @@ -100,7 +100,7 @@ def extra_static_content(caller, st_type, user): ) -@register.filter(name='localize_header_name') +@register.filter(name="localize_header_name") def localize_header_name(headername): """ Localizes the header names """ names = { diff --git a/modoboa/lib/tests/__init__.py b/modoboa/lib/tests/__init__.py index ace3d977e..86b2e9ece 100644 --- a/modoboa/lib/tests/__init__.py +++ b/modoboa/lib/tests/__init__.py @@ -17,7 +17,7 @@ from modoboa.core import models as core_models from .. import sysutils try: - s = socket.create_connection(('127.0.0.1', 25)) + s = socket.create_connection(("127.0.0.1", 25)) s.close() NO_SMTP = False except socket.error: @@ -72,21 +72,21 @@ class ModoTestCase(ParametersMixin, TestCase): if params is None: params = {} response = getattr(self.client, method)( - url, params, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + url, params, HTTP_X_REQUESTED_WITH="XMLHttpRequest") self.assertEqual(response.status_code, status) return response.json() def ajax_post(self, *args, **kwargs): - return self.ajax_request('post', *args, **kwargs) + return self.ajax_request("post", *args, **kwargs) def ajax_put(self, *args, **kwargs): - return self.ajax_request('put', *args, **kwargs) + return self.ajax_request("put", *args, **kwargs) def ajax_delete(self, *args, **kwargs): - return self.ajax_request('delete', *args, **kwargs) + return self.ajax_request("delete", *args, **kwargs) def ajax_get(self, *args, **kwargs): - return self.ajax_request('get', *args, **kwargs) + return self.ajax_request("get", *args, **kwargs) class ModoAPITestCase(ParametersMixin, APITestCase): @@ -103,4 +103,4 @@ class ModoAPITestCase(ParametersMixin, APITestCase): def setUp(self): """Setup.""" super(ModoAPITestCase, self).setUp() - self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key) + self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token.key) diff --git a/modoboa/lib/tests/test_u2u_decode.py b/modoboa/lib/tests/test_u2u_decode.py index b06bf38c6..9c64cae46 100644 --- a/modoboa/lib/tests/test_u2u_decode.py +++ b/modoboa/lib/tests/test_u2u_decode.py @@ -49,12 +49,12 @@ class U2UTestCase(TestCase): ) mailsploit_sample = ( '"=?utf-8?b?cG90dXNAd2hpdGVob3VzZS5nb3Y=?==?utf-8?Q?=0A=00?="\n' - '<=?utf-8?b?cG90dXNAd2hpdGVob3VzZS5nb3Y=?==?utf-8?Q?=0A=00?=' - '@mailsploit.com>') + "<=?utf-8?b?cG90dXNAd2hpdGVob3VzZS5nb3Y=?==?utf-8?Q?=0A=00?=" + "@mailsploit.com>") expected_result = ( - 'potus@whitehouse.gov', - '=?utf-8?b?cG90dXNAd2hpdGVob3VzZS5nb3Y=?==?utf-8?Q??=' - '@mailsploit.com') + "potus@whitehouse.gov", + "=?utf-8?b?cG90dXNAd2hpdGVob3VzZS5nb3Y=?==?utf-8?Q??=" + "@mailsploit.com") self.assertEqual( u2u_decode.decode_address(mailsploit_sample), expected_result) diff --git a/modoboa/lib/web_utils.py b/modoboa/lib/web_utils.py index 2596c94de..8870e86ad 100644 --- a/modoboa/lib/web_utils.py +++ b/modoboa/lib/web_utils.py @@ -88,7 +88,7 @@ def render_to_json_response(context, **response_kwargs): :return: ``HttpResponse`` object """ data = json.dumps(context) - response_kwargs['content_type'] = 'application/json' + response_kwargs["content_type"] = "application/json" return HttpResponse(data, **response_kwargs) @@ -136,8 +136,8 @@ class NavigationParameters(object): def __init__(self, request, sessionkey): self.request = request self.sessionkey = sessionkey - self.parameters = [('pattern', '', True), - ('criteria', 'from_addr', False)] + self.parameters = [("pattern", "", True), + ("criteria", "from_addr", False)] def __getitem__(self, key): """Retrieve an item.""" diff --git a/modoboa/limits/tests/test_api.py b/modoboa/limits/tests/test_api.py index 4707c244b..0b2194897 100644 --- a/modoboa/limits/tests/test_api.py +++ b/modoboa/limits/tests/test_api.py @@ -41,7 +41,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): def test_domadmins_limit(self): """Check domain admins limit.""" self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.r_token.key) + HTTP_AUTHORIZATION="Token " + self.r_token.key) limit = self.reseller.userobjectlimit_set.get(name="domain_admins") url = reverse("api:account-list") @@ -82,7 +82,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): def test_domains_limit(self): """Check domains limit.""" self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.r_token.key) + HTTP_AUTHORIZATION="Token " + self.r_token.key) limit = self.reseller.userobjectlimit_set.get(name="domains") quota = self.reseller.userobjectlimit_set.get(name="quota") quota.max_value = 3 @@ -104,7 +104,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): response = self.client.post(url, data, format="json") self.assertEqual(response.status_code, 403) self.assertEqual( - response.content.decode('utf-8'), '"Domains: limit reached"' + response.content.decode("utf-8"), '"Domains: limit reached"' ) self.client.delete( @@ -120,7 +120,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): def test_domain_aliases_limit(self): """Check domain aliases limit.""" self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.r_token.key) + HTTP_AUTHORIZATION="Token " + self.r_token.key) domain = Domain.objects.get(name="test.com") domain.add_admin(self.reseller) limit = self.reseller.userobjectlimit_set.get(name="domain_aliases") @@ -142,7 +142,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): def test_mailboxes_limit(self): """Check mailboxes limit.""" self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) limit = self.user.userobjectlimit_set.get(name="mailboxes") url = reverse("api:account-list") @@ -173,7 +173,7 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): def test_aliases_limit(self): """Check mailbox aliases limit.""" self.client.credentials( - HTTP_AUTHORIZATION='Token ' + self.da_token.key) + HTTP_AUTHORIZATION="Token " + self.da_token.key) limit = self.user.userobjectlimit_set.get(name="mailbox_aliases") url = reverse("api:alias-list") diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index 39168a24b..f5387bcf3 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -30,7 +30,7 @@ class PermissionsTestCase(lib_tests.ModoTestCase): values = dict( username="reseller@test.com", first_name="Reseller", last_name="", password1="Toto1234", password2="Toto1234", role="Resellers", - is_active=True, email="reseller@test.com", stepid='step2' + is_active=True, email="reseller@test.com", stepid="step2" ) self.ajax_post(reverse("admin:account_add"), values) account = User.objects.get(username="reseller@test.com") @@ -60,19 +60,19 @@ class ResourceTestCase(lib_tests.ModoTestCase): populate_database() def _create_account( - self, username, role='SimpleUsers', status=200, **kwargs): + self, username, role="SimpleUsers", status=200, **kwargs): values = dict( username=username, first_name="Tester", last_name="Toto", password1="Toto1234", password2="Toto1234", role=role, quota_act=True, - is_active=True, email=username, stepid='step2', + is_active=True, email=username, stepid="step2", ) values.update(kwargs) return self.ajax_post( reverse("admin:account_add"), values, status ) - def _create_alias(self, email, rcpt='user@test.com', status=200): + def _create_alias(self, email, rcpt="user@test.com", status=200): values = dict( address=email, recipients=rcpt, enabled=True ) @@ -130,7 +130,7 @@ class DomainAdminTestCase(ResourceTestCase): def setUpTestData(cls): """Create test data.""" super(DomainAdminTestCase, cls).setUpTestData() - cls.user = User.objects.get(username='admin@test.com') + cls.user = User.objects.get(username="admin@test.com") cls.user.userobjectlimit_set.filter( name__in=["mailboxes", "mailbox_aliases"]).update(max_value=2) @@ -140,40 +140,40 @@ class DomainAdminTestCase(ResourceTestCase): self.client.force_login(self.user) def test_mailboxes_limit(self): - self._create_account('tester1@test.com') - self._check_limit('mailboxes', 1, 2) - self._create_account('tester2@test.com') - self._check_limit('mailboxes', 2, 2) - self._create_account('tester3@test.com', status=403) - self._check_limit('mailboxes', 2, 2) + self._create_account("tester1@test.com") + self._check_limit("mailboxes", 1, 2) + self._create_account("tester2@test.com") + self._check_limit("mailboxes", 2, 2) + self._create_account("tester3@test.com", status=403) + self._check_limit("mailboxes", 2, 2) self.ajax_post( - reverse('admin:account_delete', - args=[User.objects.get(username='tester2@test.com').id]), + reverse("admin:account_delete", + args=[User.objects.get(username="tester2@test.com").id]), {} ) - self._check_limit('mailboxes', 1, 2) + self._check_limit("mailboxes", 1, 2) def test_aliases_limit(self): - self._create_alias('alias1@test.com') - self._check_limit('mailbox_aliases', 1, 2) - self._create_alias('alias2@test.com') - self._check_limit('mailbox_aliases', 2, 2) - self._create_alias('alias3@test.com', status=403) - self._check_limit('mailbox_aliases', 2, 2) + self._create_alias("alias1@test.com") + self._check_limit("mailbox_aliases", 1, 2) + self._create_alias("alias2@test.com") + self._check_limit("mailbox_aliases", 2, 2) + self._create_alias("alias3@test.com", status=403) + self._check_limit("mailbox_aliases", 2, 2) # Set unlimited value self.user.userobjectlimit_set.filter(name="mailbox_aliases").update( max_value=-1) - self._create_alias('alias3@test.com') - self._check_limit('mailbox_aliases', 3, -1) + self._create_alias("alias3@test.com") + self._check_limit("mailbox_aliases", 3, -1) self.ajax_post( - reverse('admin:alias_delete') + '?selection=%d' - % Alias.objects.get(address='alias2@test.com').id, + reverse("admin:alias_delete") + "?selection=%d" + % Alias.objects.get(address="alias2@test.com").id, {} ) - self._check_limit('mailbox_aliases', 2, -1) + self._check_limit("mailbox_aliases", 2, -1) def test_aliases_limit_through_account_form(self): - user = User.objects.get(username='user@test.com') + user = User.objects.get(username="user@test.com") values = dict( username=user.username, role=user.role, is_active=user.is_active, email=user.email, quota_act=True, @@ -184,8 +184,8 @@ class DomainAdminTestCase(ResourceTestCase): reverse("admin:account_change", args=[user.id]), values ) - Alias.objects.get(address='alias1@test.com') - self._check_limit('mailbox_aliases', 2, 2) + Alias.objects.get(address="alias1@test.com") + self._check_limit("mailbox_aliases", 2, 2) class ResellerTestCase(ResourceTestCase): @@ -197,7 +197,7 @@ class ResellerTestCase(ResourceTestCase): cls.localconfig.parameters.set_value("deflt_user_quota_limit", 1000) cls.localconfig.save() cls.user = UserFactory( - username='reseller', groups=('Resellers',) + username="reseller", groups=("Resellers",) ) def setUp(self): @@ -209,32 +209,32 @@ class ResellerTestCase(ResourceTestCase): response = self.client.get(reverse("admin:domain_list")) self.assertContains(response, "Domains (0%)") self.assertContains(response, "Domain aliases (0%)") - self._create_domain('domain1.tld') - self._check_limit('domains', 1, 2) - self._create_domain('domain2.tld') - self._check_limit('domains', 2, 2) - self._create_domain('domain3.tld', 403) - self._check_limit('domains', 2, 2) + self._create_domain("domain1.tld") + self._check_limit("domains", 1, 2) + self._create_domain("domain2.tld") + self._check_limit("domains", 2, 2) + self._create_domain("domain3.tld", 403) + self._check_limit("domains", 2, 2) self.ajax_post( - reverse('admin:domain_delete', - args=[Domain.objects.get(name='domain2.tld').id]), + reverse("admin:domain_delete", + args=[Domain.objects.get(name="domain2.tld").id]), {} ) - self._check_limit('domains', 1, 2) + self._check_limit("domains", 1, 2) def test_domain_aliases_limit(self): - self._create_domain('pouet.com') - self._domain_alias_operation('add', 'pouet.com', 'domain-alias1.tld') - self._check_limit('domain_aliases', 1, 2) - self._domain_alias_operation('add', 'pouet.com', 'domain-alias2.tld') - self._check_limit('domain_aliases', 2, 2) + self._create_domain("pouet.com") + self._domain_alias_operation("add", "pouet.com", "domain-alias1.tld") + self._check_limit("domain_aliases", 1, 2) + self._domain_alias_operation("add", "pouet.com", "domain-alias2.tld") + self._check_limit("domain_aliases", 2, 2) self._domain_alias_operation( - 'add', 'pouet.com', 'domain-alias3.tld', 403 + "add", "pouet.com", "domain-alias3.tld", 403 ) - self._check_limit('domain_aliases', 2, 2) + self._check_limit("domain_aliases", 2, 2) self._domain_alias_operation( - 'delete', 'pouet.com', 'domain-alias2.tld') - self._check_limit('domain_aliases', 1, 2) + "delete", "pouet.com", "domain-alias2.tld") + self._check_limit("domain_aliases", 1, 2) def test_domain_admins_limit(self): response = self.client.get(reverse("admin:identity_list")) @@ -242,21 +242,21 @@ class ResellerTestCase(ResourceTestCase): self.assertContains(response, "Mailboxes (0%)") self.assertContains(response, "Mailbox aliases (0%)") - self._create_domain('domain.tld') - self._create_account('admin1@domain.tld', role='DomainAdmins') - self._check_limit('domain_admins', 1, 2) - self._create_account('admin2@domain.tld', role='DomainAdmins') - self._check_limit('domain_admins', 2, 2) + self._create_domain("domain.tld") + self._create_account("admin1@domain.tld", role="DomainAdmins") + self._check_limit("domain_admins", 1, 2) + self._create_account("admin2@domain.tld", role="DomainAdmins") + self._check_limit("domain_admins", 2, 2) resp = self._create_account( - 'admin3@domain.tld', - role='DomainAdmins', + "admin3@domain.tld", + role="DomainAdmins", status=400) self.assertEqual( - resp['form_errors']['role'][0], - 'Select a valid choice. DomainAdmins is not one of the available ' - 'choices.' + resp["form_errors"]["role"][0], + "Select a valid choice. DomainAdmins is not one of the available " + "choices." ) - self._check_limit('domain_admins', 2, 2) + self._check_limit("domain_admins", 2, 2) self.user.userobjectlimit_set.filter( name="mailboxes").update(max_value=3) @@ -272,17 +272,17 @@ class ResellerTestCase(ResourceTestCase): values, status=400 ) self.assertEqual( - resp['form_errors']['role'][0], - 'Select a valid choice. DomainAdmins is not one of the available ' - 'choices.' + resp["form_errors"]["role"][0], + "Select a valid choice. DomainAdmins is not one of the available " + "choices." ) - self._check_limit('domain_admins', 2, 2) + self._check_limit("domain_admins", 2, 2) def test_domain_admin_resource_are_empty(self): - self._create_domain('domain.tld') - self._create_account('admin1@domain.tld', role='DomainAdmins') - domadmin = User.objects.get(username='admin1@domain.tld') - for l in ['mailboxes', 'mailbox_aliases']: + self._create_domain("domain.tld") + self._create_account("admin1@domain.tld", role="DomainAdmins") + domadmin = User.objects.get(username="admin1@domain.tld") + for l in ["mailboxes", "mailbox_aliases"]: self.assertEqual( domadmin.userobjectlimit_set.get(name=l).max_value, 0 ) @@ -290,13 +290,13 @@ class ResellerTestCase(ResourceTestCase): def test_domain_admins_limit_from_domain_tpl(self): self.user.userobjectlimit_set.filter( name="domains").update(max_value=3) - self._create_domain('domain1.tld', withtpl=True) - self._create_domain('domain2.tld', withtpl=True) - self._check_limit('domain_admins', 2, 2) - self._check_limit('domains', 2, 3) - self._create_domain('domain3.tld', status=200, withtpl=True) - self._check_limit('domain_admins', 2, 2) - self._check_limit('domains', 3, 3) + self._create_domain("domain1.tld", withtpl=True) + self._create_domain("domain2.tld", withtpl=True) + self._check_limit("domain_admins", 2, 2) + self._check_limit("domains", 2, 3) + self._create_domain("domain3.tld", status=200, withtpl=True) + self._check_limit("domain_admins", 2, 2) + self._check_limit("domains", 3, 3) def test_quota(self): """Check quota resource.""" @@ -353,51 +353,51 @@ class ResellerTestCase(ResourceTestCase): def test_reseller_deletes_domain(self): """Check if all resources are restored after the deletion.""" - self._create_domain('domain.tld', withtpl=True) + self._create_domain("domain.tld", withtpl=True) dom = Domain.objects.get(name="domain.tld") self.ajax_post( reverse("admin:domain_delete", args=[dom.id]), {} ) - self._check_limit('domains', 0, 2) - self._check_limit('domain_admins', 1, 2) - self._check_limit('mailboxes', 0, 2) - self._check_limit('mailbox_aliases', 0, 2) + self._check_limit("domains", 0, 2) + self._check_limit("domain_admins", 1, 2) + self._check_limit("mailboxes", 0, 2) + self._check_limit("mailbox_aliases", 0, 2) def test_sadmin_removes_ownership(self): - self._create_domain('domain.tld', withtpl=True) + self._create_domain("domain.tld", withtpl=True) dom = Domain.objects.get(name="domain.tld") self.client.logout() - self.client.login(username='admin', password='password') + self.client.login(username="admin", password="password") self.ajax_get( "{0}?domid={1}&daid={2}".format( - reverse('admin:permission_remove'), + reverse("admin:permission_remove"), dom.id, self.user.id ), {} ) - self._check_limit('domains', 0, 2) - self._check_limit('domain_admins', 0, 2) - self._check_limit('mailboxes', 0, 2) - self._check_limit('mailbox_aliases', 0, 2) + self._check_limit("domains", 0, 2) + self._check_limit("domain_admins", 0, 2) + self._check_limit("mailboxes", 0, 2) + self._check_limit("mailbox_aliases", 0, 2) def test_allocate_from_pool(self): - self._create_domain('domain.tld') - self._create_account('admin1@domain.tld', role='DomainAdmins') - user = User.objects.get(username='admin1@domain.tld') + self._create_domain("domain.tld") + self._create_account("admin1@domain.tld", role="DomainAdmins") + user = User.objects.get(username="admin1@domain.tld") # Give 1 mailbox and 2 aliases to the admin -> should work values = { - 'username': user.username, 'role': user.role, 'quota_act': True, - 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2, - 'language': 'en' + "username": user.username, "role": user.role, "quota_act": True, + "is_active": user.is_active, "email": user.email, + "mailboxes_limit": 1, "mailbox_aliases_limit": 2, + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[user.id]), values ) - self._check_limit('mailboxes', 1, 1) - self._check_limit('mailbox_aliases', 0, 0) + self._check_limit("mailboxes", 1, 1) + self._check_limit("mailbox_aliases", 0, 0) # Delete the admin -> resources should go back to the # reseller's pool @@ -405,20 +405,20 @@ class ResellerTestCase(ResourceTestCase): reverse("admin:account_delete", args=[user.id]), {} ) - self._check_limit('mailboxes', 0, 2) - self._check_limit('mailbox_aliases', 0, 2) + self._check_limit("mailboxes", 0, 2) + self._check_limit("mailbox_aliases", 0, 2) def test_restore_resources(self): """Give resource to a domain admin and restore them.""" - self._create_domain('domain.tld') - dom = Domain.objects.get(name='domain.tld') - self._create_account('admin1@domain.tld', role='DomainAdmins') - user = User.objects.get(username='admin1@domain.tld') + self._create_domain("domain.tld") + dom = Domain.objects.get(name="domain.tld") + self._create_account("admin1@domain.tld", role="DomainAdmins") + user = User.objects.get(username="admin1@domain.tld") values = { - 'username': user.username, 'role': user.role, 'quota_act': True, - 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2, - 'language': 'en' + "username": user.username, "role": user.role, "quota_act": True, + "is_active": user.is_active, "email": user.email, + "mailboxes_limit": 1, "mailbox_aliases_limit": 2, + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[user.id]), @@ -426,71 +426,71 @@ class ResellerTestCase(ResourceTestCase): ) dom.add_admin(user) self.client.logout() - self.client.login(username='admin1@domain.tld', password='Toto1234') - self._create_account('user1@domain.tld') - self._create_alias('alias1@domain.tld', 'user1@domain.tld') - self._create_alias('alias2@domain.tld', 'user1@domain.tld') + self.client.login(username="admin1@domain.tld", password="Toto1234") + self._create_account("user1@domain.tld") + self._create_alias("alias1@domain.tld", "user1@domain.tld") + self._create_alias("alias2@domain.tld", "user1@domain.tld") self.client.logout() - self.client.login(username='reseller', password='toto') + self.client.login(username="reseller", password="toto") # Delete the admin -> resources should go back to the # reseller's pool self.ajax_post( reverse("admin:account_delete", args=[user.id]), {} ) - self._check_limit('mailboxes', 1, 2) - self._check_limit('mailbox_aliases', 2, 2) + self._check_limit("mailboxes", 1, 2) + self._check_limit("mailbox_aliases", 2, 2) def test_change_role(self): - self._create_domain('domain.tld') - self._create_account('admin1@domain.tld', role='DomainAdmins') - user = User.objects.get(username='admin1@domain.tld') + self._create_domain("domain.tld") + self._create_account("admin1@domain.tld", role="DomainAdmins") + user = User.objects.get(username="admin1@domain.tld") # Give 1 mailbox and 2 aliases to the admin -> should work values = { - 'username': user.username, 'role': user.role, 'quota_act': True, - 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 1, 'mailbox_aliases_limit': 2, - 'language': 'en' + "username": user.username, "role": user.role, "quota_act": True, + "is_active": user.is_active, "email": user.email, + "mailboxes_limit": 1, "mailbox_aliases_limit": 2, + "language": "en" } self.ajax_post( reverse("admin:account_change", args=[user.id]), values ) - self._check_limit('mailboxes', 1, 1) - self._check_limit('mailbox_aliases', 0, 0) + self._check_limit("mailboxes", 1, 1) + self._check_limit("mailbox_aliases", 0, 0) # Change admin role to SimpleUser -> resources should go back # to the reseller. values = { - 'username': user.username, 'role': 'SimpleUsers', - 'quota_act': True, - 'is_active': user.is_active, 'email': user.email, - 'language': 'en', + "username": user.username, "role": "SimpleUsers", + "quota_act": True, + "is_active": user.is_active, "email": user.email, + "language": "en", } self.ajax_post( reverse("admin:account_change", args=[user.id]), values ) - self._check_limit('mailboxes', 1, 2) - self._check_limit('mailbox_aliases', 0, 2) + self._check_limit("mailboxes", 1, 2) + self._check_limit("mailbox_aliases", 0, 2) def test_allocate_too_much(self): - self._create_domain('domain.tld') - self._create_account('admin1@domain.tld', role='DomainAdmins') - user = User.objects.get(username='admin1@domain.tld') + self._create_domain("domain.tld") + self._create_account("admin1@domain.tld", role="DomainAdmins") + user = User.objects.get(username="admin1@domain.tld") # Give 2 mailboxes and 3 aliases to the admin -> should fail. values = { - 'username': user.username, 'role': user.role, 'quota_act': True, - 'is_active': user.is_active, 'email': user.email, - 'mailboxes_limit': 2, 'mailbox_aliases_limit': 3, - 'language': 'en' + "username": user.username, "role": user.role, "quota_act": True, + "is_active": user.is_active, "email": user.email, + "mailboxes_limit": 2, "mailbox_aliases_limit": 3, + "language": "en" } resp = self.ajax_post( reverse("admin:account_change", args=[user.id]), values, 424 ) - self.assertEqual(resp, 'Not enough resources') - self._check_limit('mailboxes', 1, 2) - self._check_limit('mailbox_aliases', 0, 2) + self.assertEqual(resp, "Not enough resources") + self._check_limit("mailboxes", 1, 2) + self._check_limit("mailbox_aliases", 0, 2) diff --git a/modoboa/parameters/apps.py b/modoboa/parameters/apps.py index cbf060639..f6edd84c9 100644 --- a/modoboa/parameters/apps.py +++ b/modoboa/parameters/apps.py @@ -4,4 +4,4 @@ from django.apps import AppConfig class ParametersConfig(AppConfig): - name = 'parameters' + name = "parameters" diff --git a/modoboa/relaydomains/tests.py b/modoboa/relaydomains/tests.py index 4f8ddecb7..888094a73 100644 --- a/modoboa/relaydomains/tests.py +++ b/modoboa/relaydomains/tests.py @@ -53,12 +53,12 @@ class Operations(object): "default_mailbox_quota": domain.default_mailbox_quota } aliases = [alias.name for alias in domain.domainalias_set.all()] - if optype == 'add': + if optype == "add": aliases.append(name) else: aliases.remove(name) for cpt, alias in enumerate(aliases): - fname = 'aliases' if not cpt else 'aliases_%d' % cpt + fname = "aliases" if not cpt else "aliases_%d" % cpt values[fname] = alias return self.ajax_post( reverse("admin:domain_change", @@ -115,20 +115,20 @@ class RelayDomainsTestCase(ModoTestCase, Operations): FIXME: add a check for domain alias. """ - self._create_relay_domain('relaydomain1.tld') - transport = tr_models.Transport.objects.get(pattern='relaydomain1.tld') + self._create_relay_domain("relaydomain1.tld") + transport = tr_models.Transport.objects.get(pattern="relaydomain1.tld") self.assertEqual( - transport._settings["relay_target_host"], 'external.host.tld') + transport._settings["relay_target_host"], "external.host.tld") self.assertEqual( transport._settings["relay_verify_recipients"], False) - resp = self._create_relay_domain('test.com', 400) - self.assertEqual(resp['form_errors']['name'][0], - 'Domain with this Name already exists.') - resp = self._create_relay_domain('relaydomainalias.tld', 400) + resp = self._create_relay_domain("test.com", 400) + self.assertEqual(resp["form_errors"]["name"][0], + "Domain with this Name already exists.") + resp = self._create_relay_domain("relaydomainalias.tld", 400) self.assertEqual( - resp['form_errors']['name'][0], - 'A domain alias with this name already exists' + resp["form_errors"]["name"][0], + "A domain alias with this name already exists" ) def test_create_relaydomainalias(self): @@ -140,21 +140,21 @@ class RelayDomainsTestCase(ModoTestCase, Operations): FIXME: add a check for domain alias. """ self._relay_domain_alias_operation( - 'add', self.dom, 'relaydomainalias1.tld' + "add", self.dom, "relaydomainalias1.tld" ) resp = self._relay_domain_alias_operation( - 'add', self.dom, 'test.com', 400 + "add", self.dom, "test.com", 400 ) self.assertEqual( - resp['form_errors']['aliases_2'][0], - 'A domain with this name already exists' + resp["form_errors"]["aliases_2"][0], + "A domain with this name already exists" ) resp = self._relay_domain_alias_operation( - 'add', self.dom, self.dom.name, 400 + "add", self.dom, self.dom.name, 400 ) self.assertEqual( - resp['form_errors']['aliases_2'][0], - 'A domain with this name already exists' + resp["form_errors"]["aliases_2"][0], + "A domain with this name already exists" ) def test_edit_relaydomain(self): @@ -238,12 +238,12 @@ class RelayDomainsTestCase(ModoTestCase, Operations): "quota": 0, "default_mailbox_quota": 0 } self.ajax_post( - reverse('admin:domain_change', args=[self.dom.id]), + reverse("admin:domain_change", args=[self.dom.id]), values ) - admin_models.DomainAlias.objects.get(name='relaydomainalias.net') + admin_models.DomainAlias.objects.get(name="relaydomainalias.net") with self.assertRaises(admin_models.DomainAlias.DoesNotExist): - admin_models.DomainAlias.objects.get(name='relaydomainalias.tld') + admin_models.DomainAlias.objects.get(name="relaydomainalias.tld") def test_delete_relaydomain(self): """Test the removal of a relay domain.""" @@ -316,7 +316,7 @@ class LimitsTestCase(ModoTestCase, Operations): "deflt_user_{0}_limit".format(name), 2, app="limits") cls.localconfig.save() cls.user = UserFactory.create( - username='reseller', groups=('Resellers',) + username="reseller", groups=("Resellers",) ) def setUp(self): @@ -326,38 +326,38 @@ class LimitsTestCase(ModoTestCase, Operations): def test_relay_domains_limit(self): self._create_relay_domain( - 'relaydomain1.tld', quota=1, default_mailbox_quota=1) - self._check_limit('domains', 1, 2) + "relaydomain1.tld", quota=1, default_mailbox_quota=1) + self._check_limit("domains", 1, 2) self._create_relay_domain( - 'relaydomain2.tld', quota=1, default_mailbox_quota=1) - self._check_limit('domains', 2, 2) - self._create_relay_domain('relaydomain3.tld', 403) - self._check_limit('domains', 2, 2) - domid = admin_models.Domain.objects.get(name='relaydomain2.tld').id + "relaydomain2.tld", quota=1, default_mailbox_quota=1) + self._check_limit("domains", 2, 2) + self._create_relay_domain("relaydomain3.tld", 403) + self._check_limit("domains", 2, 2) + domid = admin_models.Domain.objects.get(name="relaydomain2.tld").id self.ajax_post( - reverse('admin:domain_delete', args=[domid]), {}) - self._check_limit('domains', 1, 2) + reverse("admin:domain_delete", args=[domid]), {}) + self._check_limit("domains", 1, 2) def test_relay_domain_aliases_limit(self): self._create_relay_domain( - 'relaydomain1.tld', quota=1, default_mailbox_quota=1) + "relaydomain1.tld", quota=1, default_mailbox_quota=1) domain = admin_models.Domain.objects.get(name="relaydomain1.tld") self._relay_domain_alias_operation( - 'add', domain, 'relay-domain-alias1.tld' + "add", domain, "relay-domain-alias1.tld" ) - self._check_limit('domain_aliases', 1, 2) + self._check_limit("domain_aliases", 1, 2) self._relay_domain_alias_operation( - 'add', domain, 'relay-domain-alias2.tld' + "add", domain, "relay-domain-alias2.tld" ) - self._check_limit('domain_aliases', 2, 2) + self._check_limit("domain_aliases", 2, 2) self._relay_domain_alias_operation( - 'add', domain, 'relay-domain-alias3.tld', 403 + "add", domain, "relay-domain-alias3.tld", 403 ) - self._check_limit('domain_aliases', 2, 2) + self._check_limit("domain_aliases", 2, 2) self._relay_domain_alias_operation( - 'delete', domain, 'relay-domain-alias2.tld' + "delete", domain, "relay-domain-alias2.tld" ) - self._check_limit('domain_aliases', 1, 2) + self._check_limit("domain_aliases", 1, 2) class MapFilesTestCase(MapFilesTestCaseMixin, TestCase): diff --git a/modoboa/test_settings.py b/modoboa/test_settings.py index 69738187b..781bc5705 100644 --- a/modoboa/test_settings.py +++ b/modoboa/test_settings.py @@ -7,46 +7,46 @@ import os # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases -DB = os.environ.get('DB', 'POSTGRESQL') +DB = os.environ.get("DB", "POSTGRESQL") -if DB == 'MYSQL': +if DB == "MYSQL": DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'modoboa', - 'USER': 'root', - 'PASSWORD': '', - 'HOST': 'localhost', - 'PORT': '', - 'ATOMIC_REQUESTS': True, + "default": { + "ENGINE": "django.db.backends.mysql", + "NAME": "modoboa", + "USER": "root", + "PASSWORD": "", + "HOST": "localhost", + "PORT": "", + "ATOMIC_REQUESTS": True, # MySQL's Strict Mode fixes many data integrity problems in MySQL, # such as data truncation upon insertion, by escalating warnings # into errors. It is strongly recommended you activate it. # MySQL >= 5.7 set STRICT_TRANS_TABLES by default # See: https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode - 'OPTIONS': { - 'init_command': 'SET sql_mode=\'STRICT_TRANS_TABLES\'', + "OPTIONS": { + "init_command": 'SET sql_mode=\'STRICT_TRANS_TABLES\'', }, }, } -elif DB == 'SQLITE': +elif DB == "SQLITE": DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'modoboa.db', - 'PORT': '', - 'ATOMIC_REQUESTS': True, + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": "modoboa.db", + "PORT": "", + "ATOMIC_REQUESTS": True, }, } else: DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': 'modoboa', - 'USER': 'postgres', - 'PASSWORD': '', - 'HOST': 'localhost', - 'PORT': '', - 'ATOMIC_REQUESTS': True, + "default": { + "ENGINE": "django.db.backends.postgresql", + "NAME": "modoboa", + "USER": "postgres", + "PASSWORD": "", + "HOST": "localhost", + "PORT": "", + "ATOMIC_REQUESTS": True, }, } diff --git a/modoboa/transport/apps.py b/modoboa/transport/apps.py index 7162f121b..f7d87dd17 100644 --- a/modoboa/transport/apps.py +++ b/modoboa/transport/apps.py @@ -4,7 +4,7 @@ from django.apps import AppConfig class TransportConfig(AppConfig): - name = 'modoboa.transport' + name = "modoboa.transport" def ready(self): from . import handlers diff --git a/modoboa/urls.py b/modoboa/urls.py index 92584b7ba..2effc0145 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -17,17 +17,17 @@ from modoboa.core import signals as core_signals from modoboa.core import views as core_views from modoboa.core.extensions import exts_pool -API_TITLE = 'Modoboa API' +API_TITLE = "Modoboa API" urlpatterns = [ - url(r'^jsi18n/$', JavaScriptCatalog.as_view(), name='javascript-catalog'), + url(r'^jsi18n/$', JavaScriptCatalog.as_view(), name="javascript-catalog"), url(r'^ckeditor/upload/', login_required(cku_views.upload), name="ckeditor_upload"), url(r'^ckeditor/browse/', login_required(cku_views.browse), name="ckeditor_browse"), - url('', include('modoboa.core.urls', namespace="core")), - url('^user/forward/', forward, name="user_forward"), - url('admin/', include('modoboa.admin.urls', namespace="admin")), + url("", include("modoboa.core.urls", namespace="core")), + url("^user/forward/", forward, name="user_forward"), + url("admin/", include("modoboa.admin.urls", namespace="admin")), # No namespace url(r'^accounts/password_reset/$', core_views.password_reset, name="password_reset"), diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index ca0df91f2..ba4356121 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -26,16 +26,16 @@ BASE_DIR = os.path.realpath(os.path.dirname(os.path.dirname(__file__))) # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '!8o(-dbbl3e+*bh7nx-^xysdt)1gso*%@4ze4-9_9o+i&t--u_' +SECRET_KEY = "!8o(-dbbl3e+*bh7nx-^xysdt)1gso*%@4ze4-9_9o+i&t--u_" # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = 'DEBUG' in os.environ +DEBUG = "DEBUG" in os.environ TEMPLATE_DEBUG = DEBUG ALLOWED_HOSTS = [ - '127.0.0.1', - 'localhost', + "127.0.0.1", + "localhost", ] SITE_ID = 1 @@ -47,57 +47,57 @@ X_FRAME_OPTIONS = "SAMEORIGIN" # Application definition INSTALLED_APPS = ( - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.sites', - 'django.contrib.staticfiles', - 'reversion', - 'ckeditor', - 'ckeditor_uploader', - 'rest_framework', - 'rest_framework.authtoken', + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.sites", + "django.contrib.staticfiles", + "reversion", + "ckeditor", + "ckeditor_uploader", + "rest_framework", + "rest_framework.authtoken", ) # A dedicated place to register Modoboa applications # Do not delete it. # Do not change the order. MODOBOA_APPS = ( - 'modoboa', - 'modoboa.core', - 'modoboa.lib', - 'modoboa.admin', - 'modoboa.transport', - 'modoboa.relaydomains', - 'modoboa.limits', - 'modoboa.parameters', + "modoboa", + "modoboa.core", + "modoboa.lib", + "modoboa.admin", + "modoboa.transport", + "modoboa.relaydomains", + "modoboa.limits", + "modoboa.parameters", # Modoboa extensions here. ) INSTALLED_APPS += MODOBOA_APPS -AUTH_USER_MODEL = 'core.User' +AUTH_USER_MODEL = "core.User" MIDDLEWARE = ( - 'x_forwarded_for.middleware.XForwardedForMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'modoboa.core.middleware.LocalConfigMiddleware', - 'modoboa.lib.middleware.AjaxLoginRedirect', - 'modoboa.lib.middleware.CommonExceptionCatcher', - 'modoboa.lib.middleware.RequestCatcherMiddleware', + "x_forwarded_for.middleware.XForwardedForMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.locale.LocaleMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "modoboa.core.middleware.LocalConfigMiddleware", + "modoboa.lib.middleware.AjaxLoginRedirect", + "modoboa.lib.middleware.CommonExceptionCatcher", + "modoboa.lib.middleware.RequestCatcherMiddleware", ) AUTHENTICATION_BACKENDS = ( # 'modoboa.lib.authbackends.LDAPBackend', # 'modoboa.lib.authbackends.SMTPBackend', - 'django.contrib.auth.backends.ModelBackend', + "django.contrib.auth.backends.ModelBackend", ) # SMTP authentication @@ -108,37 +108,37 @@ AUTHENTICATION_BACKENDS = ( TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.template.context_processors.i18n', - 'django.template.context_processors.media', - 'django.template.context_processors.static', - 'django.template.context_processors.tz', - 'django.contrib.messages.context_processors.messages', - 'modoboa.core.context_processors.top_notifications', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.template.context_processors.i18n", + "django.template.context_processors.media", + "django.template.context_processors.static", + "django.template.context_processors.tz", + "django.contrib.messages.context_processors.messages", + "modoboa.core.context_processors.top_notifications", ], - 'debug': TEMPLATE_DEBUG, + "debug": TEMPLATE_DEBUG, }, }, ] -ROOT_URLCONF = 'test_project.urls' +ROOT_URLCONF = "test_project.urls" -WSGI_APPLICATION = 'test_project.wsgi.application' +WSGI_APPLICATION = "test_project.wsgi.application" # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -149,21 +149,21 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ -STATIC_URL = '/sitestatic/' -STATIC_ROOT = os.path.join(BASE_DIR, 'sitestatic') +STATIC_URL = "/sitestatic/" +STATIC_ROOT = os.path.join(BASE_DIR, "sitestatic") STATICFILES_DIRS = ( - os.path.join(BASE_DIR, '..', 'modoboa', 'bower_components'), + os.path.join(BASE_DIR, "..", "modoboa", "bower_components"), ) -MEDIA_URL = '/media/' -MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = "/media/" +MEDIA_ROOT = os.path.join(BASE_DIR, "media") # Rest framework settings REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework.authentication.TokenAuthentication', - 'rest_framework.authentication.SessionAuthentication', + "DEFAULT_AUTHENTICATION_CLASSES": ( + "rest_framework.authentication.TokenAuthentication", + "rest_framework.authentication.SessionAuthentication", ), } @@ -172,31 +172,31 @@ REST_FRAMEWORK = { # DOVECOT_LOOKUP_PATH = ('/path/to/dovecot', ) -MODOBOA_API_URL = 'https://api.modoboa.org/1/' +MODOBOA_API_URL = "https://api.modoboa.org/1/" # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, { - 'NAME': 'modoboa.core.password_validation.ComplexityValidator', - 'OPTIONS': { - 'upper': 1, - 'lower': 1, - 'digits': 1, - 'specials': 0 + "NAME": "modoboa.core.password_validation.ComplexityValidator", + "OPTIONS": { + "upper": 1, + "lower": 1, + "digits": 1, + "specials": 0 } }, ] @@ -214,21 +214,21 @@ CKEDITOR_BROWSE_SHOW_DIRS = True CKEDITOR_ALLOW_NONIMAGE_FILES = False CKEDITOR_CONFIGS = { - 'default': { - 'allowedContent': True, - 'toolbar': 'Modoboa', - 'width': None, - 'toolbar_Modoboa': [ - ['Bold', 'Italic', 'Underline'], - ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'], - ['BidiLtr', 'BidiRtl', 'Language'], - ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent'], - ['Undo', 'Redo'], - ['Link', 'Unlink', 'Anchor', '-', 'Smiley'], - ['TextColor', 'BGColor', '-', 'Source'], - ['Font', 'FontSize'], - ['Image', ], - ['SpellChecker'] + "default": { + "allowedContent": True, + "toolbar": "Modoboa", + "width": None, + "toolbar_Modoboa": [ + ["Bold", "Italic", "Underline"], + ["JustifyLeft", "JustifyCenter", "JustifyRight", "JustifyBlock"], + ["BidiLtr", "BidiRtl", "Language"], + ["NumberedList", "BulletedList", "-", "Outdent", "Indent"], + ["Undo", "Redo"], + ["Link", "Unlink", "Anchor", "-", "Smiley"], + ["TextColor", "BGColor", "-", "Source"], + ["Font", "FontSize"], + ["Image", ], + ["SpellChecker"] ], }, } @@ -236,33 +236,33 @@ CKEDITOR_CONFIGS = { # Logging configuration LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - 'syslog': { - 'format': '%(name)s: %(levelname)s %(message)s' + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "syslog": { + "format": "%(name)s: %(levelname)s %(message)s" }, }, - 'handlers': { - 'syslog-auth': { - 'class': 'logging.handlers.SysLogHandler', - 'facility': SysLogHandler.LOG_AUTH, - 'formatter': 'syslog' + "handlers": { + "syslog-auth": { + "class": "logging.handlers.SysLogHandler", + "facility": SysLogHandler.LOG_AUTH, + "formatter": "syslog" }, - 'modoboa': { - 'class': 'modoboa.core.loggers.SQLHandler', + "modoboa": { + "class": "modoboa.core.loggers.SQLHandler", } }, - 'loggers': { - 'modoboa.auth': { - 'handlers': ['syslog-auth', 'modoboa'], - 'level': 'INFO', - 'propagate': False + "loggers": { + "modoboa.auth": { + "handlers": ["syslog-auth", "modoboa"], + "level": "INFO", + "propagate": False }, - 'modoboa.admin': { - 'handlers': ['modoboa'], - 'level': 'INFO', - 'propagate': False + "modoboa.admin": { + "handlers": ["modoboa"], + "level": "INFO", + "propagate": False } } } diff --git a/tests.py b/tests.py index 69a5e184f..07180185f 100644 --- a/tests.py +++ b/tests.py @@ -25,7 +25,7 @@ class DeployTest(unittest.TestCase): cmd = ( "modoboa-admin.py deploy --collectstatic " "--dburl %s --domain %s --admin-username admin %s" - % (dburl, 'localhost', self.projname) + % (dburl, "localhost", self.projname) ) code, output = exec_cmd(cmd, cwd=self.workdir) self.assertEqual(code, 0) From 24a7ca6a9eba8ac1314208e8941bc4e2c70cffc9 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 13:18:27 +0000 Subject: [PATCH 04/42] sort imports using isort pip install isort isort -y --- bin/modoboa-admin.py | 1 - doc/conf.py | 3 +- modoboa/__init__.py | 3 +- modoboa/admin/api.py | 7 ++-- modoboa/admin/app_settings.py | 5 ++- modoboa/admin/constants.py | 1 - modoboa/admin/forms/__init__.py | 12 +++---- modoboa/admin/forms/account.py | 11 ++---- modoboa/admin/forms/alias.py | 10 ++---- modoboa/admin/forms/domain.py | 16 +++------ modoboa/admin/handlers.py | 18 +++------- modoboa/admin/lib.py | 12 +++---- .../commands/handle_mailbox_operations.py | 7 ++-- modoboa/admin/management/commands/modo.py | 2 +- .../commands/subcommands/_export.py | 5 +-- .../commands/subcommands/_import.py | 3 +- .../commands/subcommands/_manage_dkim_keys.py | 1 - .../management/commands/subcommands/_mx.py | 3 +- .../commands/subcommands/_repair.py | 6 ++-- modoboa/admin/models/__init__.py | 4 +-- modoboa/admin/models/alias.py | 13 ++++--- modoboa/admin/models/base.py | 3 +- modoboa/admin/models/domain.py | 9 +++-- modoboa/admin/models/domain_alias.py | 11 +++--- modoboa/admin/models/mailbox.py | 5 ++- modoboa/admin/serializers.py | 21 ++++++------ modoboa/admin/templatetags/admin_tags.py | 3 +- modoboa/admin/tests/test_account.py | 11 +++--- modoboa/admin/tests/test_alias.py | 8 +++-- modoboa/admin/tests/test_api.py | 7 ++-- modoboa/admin/tests/test_domain.py | 3 +- modoboa/admin/tests/test_domain_alias.py | 3 +- modoboa/admin/tests/test_export.py | 4 +-- modoboa/admin/tests/test_import_.py | 3 +- .../admin/tests/test_mailbox_operations.py | 6 ++-- modoboa/admin/tests/test_mx.py | 7 ++-- modoboa/admin/tests/test_password_schemes.py | 1 - modoboa/admin/tests/test_repair.py | 7 ++-- modoboa/admin/tests/test_user.py | 1 - modoboa/admin/tests/utils.py | 2 +- modoboa/admin/urls.py | 10 +++--- modoboa/admin/urls_api.py | 1 - modoboa/admin/views/__init__.py | 3 +- modoboa/admin/views/alias.py | 16 ++++----- modoboa/admin/views/dns.py | 6 ++-- modoboa/admin/views/domain.py | 26 +++++++------- modoboa/admin/views/export.py | 7 ++-- modoboa/admin/views/identity.py | 26 ++++++-------- modoboa/admin/views/import_.py | 14 ++++---- modoboa/admin/views/user.py | 8 ++--- modoboa/core/app_settings.py | 9 ++--- modoboa/core/checks/settings_checks.py | 1 - modoboa/core/commands/__init__.py | 2 +- modoboa/core/commands/deploy.py | 20 ++++++----- modoboa/core/commands/help.py | 2 +- modoboa/core/forms.py | 8 ++--- modoboa/core/handlers.py | 17 ++++------ .../commands/clean_inactive_accounts.py | 1 - .../commands/communicate_with_public_api.py | 1 - .../commands/generate_postfix_maps.py | 7 ++-- .../management/commands/load_initial_data.py | 6 +--- .../management/commands/set_default_site.py | 3 +- modoboa/core/mocks.py | 1 - modoboa/core/models.py | 34 ++++++++----------- modoboa/core/password_hashers/__init__.py | 6 ++-- modoboa/core/password_hashers/advanced.py | 1 - modoboa/core/password_hashers/base.py | 4 +-- modoboa/core/templatetags/core_tags.py | 10 +++--- modoboa/core/tests/test_authentication.py | 11 +++--- modoboa/core/tests/test_core.py | 8 ++--- modoboa/core/tests/test_ldap.py | 9 ++--- modoboa/core/tests/test_views.py | 8 ++--- modoboa/core/utils.py | 1 - modoboa/core/views/__init__.py | 3 +- modoboa/core/views/admin.py | 7 ++-- modoboa/core/views/auth.py | 11 +++--- modoboa/core/views/base.py | 3 +- modoboa/core/views/dashboard.py | 5 ++- modoboa/core/views/user.py | 8 ++--- modoboa/lib/api_client.py | 2 +- modoboa/lib/authbackends.py | 2 +- modoboa/lib/cryptutils.py | 4 +-- modoboa/lib/email_utils.py | 7 ++-- modoboa/lib/form_utils.py | 3 +- modoboa/lib/ldap_utils.py | 4 +-- modoboa/lib/listing.py | 2 +- modoboa/lib/middleware.py | 4 +-- modoboa/lib/permissions.py | 3 +- modoboa/lib/singleton.py | 1 + modoboa/lib/sysutils.py | 2 +- modoboa/lib/templatetags/form_tags.py | 5 ++- modoboa/lib/templatetags/lib_tags.py | 2 +- modoboa/lib/tests/__init__.py | 1 - modoboa/lib/tests/test_email_utils.py | 3 +- modoboa/lib/u2u_decode.py | 2 +- modoboa/limits/constants.py | 1 - modoboa/limits/forms.py | 3 +- modoboa/limits/handlers.py | 18 +++------- modoboa/limits/models.py | 4 +-- modoboa/limits/tests/test_api.py | 4 +-- modoboa/limits/tests/test_domain_limits.py | 1 - modoboa/limits/tests/test_import.py | 7 ++-- modoboa/limits/tests/test_user_limits.py | 1 - modoboa/limits/urls_api.py | 1 - modoboa/limits/viewsets.py | 3 +- modoboa/parameters/forms.py | 3 +- modoboa/parameters/tools.py | 4 +-- modoboa/relaydomains/forms.py | 3 +- modoboa/relaydomains/handlers.py | 9 ++--- modoboa/relaydomains/lib.py | 3 +- modoboa/relaydomains/serializers.py | 3 +- modoboa/relaydomains/tests.py | 11 +++--- modoboa/relaydomains/urls_api.py | 1 - modoboa/relaydomains/viewsets.py | 3 +- modoboa/transport/apps.py | 1 - modoboa/transport/forms.py | 4 +-- modoboa/transport/handlers.py | 5 +-- modoboa/transport/models.py | 3 +- modoboa/urls.py | 9 +++-- modoboa/urls_api.py | 1 - setup.py | 3 +- test_project/test_project/settings.py | 3 +- 122 files changed, 280 insertions(+), 461 deletions(-) diff --git a/bin/modoboa-admin.py b/bin/modoboa-admin.py index a637e52c6..78de64d39 100644 --- a/bin/modoboa-admin.py +++ b/bin/modoboa-admin.py @@ -7,4 +7,3 @@ from modoboa.core.commands import handle_command_line if __name__ == "__main__": handle_command_line() - diff --git a/doc/conf.py b/doc/conf.py index dcc403c67..109ceb399 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -11,7 +11,8 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys, os +import os +import sys # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the diff --git a/modoboa/__init__.py b/modoboa/__init__.py index 5d2abec9b..ad361c484 100644 --- a/modoboa/__init__.py +++ b/modoboa/__init__.py @@ -4,8 +4,7 @@ from __future__ import unicode_literals -from pkg_resources import get_distribution, DistributionNotFound - +from pkg_resources import DistributionNotFound, get_distribution try: __version__ = get_distribution(__name__).version diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index 4afb9065a..30c0c33d7 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -3,19 +3,16 @@ from __future__ import unicode_literals from django import http - from django.contrib.contenttypes.models import ContentType from rest_framework import filters, status, viewsets from rest_framework.decorators import detail_route, list_route from rest_framework.exceptions import ParseError -from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions +from rest_framework.permissions import DjangoModelPermissions, IsAuthenticated from rest_framework.response import Response from modoboa.core import models as core_models - -from . import models -from . import serializers +from . import models, serializers class DomainViewSet(viewsets.ModelViewSet): diff --git a/modoboa/admin/app_settings.py b/modoboa/admin/app_settings.py index a72dd7fff..88c6e153e 100644 --- a/modoboa/admin/app_settings.py +++ b/modoboa/admin/app_settings.py @@ -6,13 +6,12 @@ import os from django import forms from django.conf import settings -from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.encoding import force_text +from django.utils.translation import ugettext as _, ugettext_lazy -from modoboa.lib.form_utils import YesNoField, SeparatorField +from modoboa.lib.form_utils import SeparatorField, YesNoField from modoboa.lib.sysutils import exec_cmd from modoboa.parameters import forms as param_forms - from . import constants diff --git a/modoboa/admin/constants.py b/modoboa/admin/constants.py index 372f1ef20..c009976fe 100644 --- a/modoboa/admin/constants.py +++ b/modoboa/admin/constants.py @@ -4,7 +4,6 @@ from __future__ import unicode_literals from django.utils.translation import ugettext_lazy as _ - DNSBL_PROVIDERS = [ "aspews.ext.sorbs.net", "b.barracudacentral.org", diff --git a/modoboa/admin/forms/__init__.py b/modoboa/admin/forms/__init__.py index 263ea5808..aa342d700 100644 --- a/modoboa/admin/forms/__init__.py +++ b/modoboa/admin/forms/__init__.py @@ -1,16 +1,16 @@ from __future__ import unicode_literals -from .domain import ( - DomainFormGeneral, DomainFormOptions, DomainForm, DomainWizard -) from .account import ( - AccountFormGeneral, AccountFormMail, AccountPermissionsForm, - AccountForm, AccountWizard + AccountForm, AccountFormGeneral, AccountFormMail, AccountPermissionsForm, + AccountWizard ) from .alias import AliasForm +from .domain import ( + DomainForm, DomainFormGeneral, DomainFormOptions, DomainWizard +) +from .export import ExportDataForm, ExportDomainsForm, ExportIdentitiesForm from .forward import ForwardForm from .import_ import ImportDataForm, ImportIdentitiesForm -from .export import ExportDataForm, ExportDomainsForm, ExportIdentitiesForm __all__ = [ "DomainFormGeneral", "DomainFormOptions", "DomainForm", diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index a2987fa8c..e98d30144 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -7,17 +7,15 @@ from functools import reduce from django import forms from django.conf import settings +from django.contrib.auth import password_validation from django.http import QueryDict from django.urls import reverse from django.utils.translation import ugettext as _, ugettext_lazy -from django.contrib.auth import password_validation - from modoboa.core import signals as core_signals from modoboa.core.models import User +from modoboa.lib import exceptions as lib_exceptions, fields as lib_fields from modoboa.lib.email_utils import split_mailbox -from modoboa.lib import exceptions as lib_exceptions -from modoboa.lib import fields as lib_fields from modoboa.lib.form_utils import ( DynamicForm, TabForms, WizardForm, WizardStep ) @@ -25,10 +23,7 @@ from modoboa.lib.permissions import get_account_roles from modoboa.lib.validators import validate_utf8_email from modoboa.lib.web_utils import render_to_json_response from modoboa.parameters import tools as param_tools - -from .. import lib -from .. import models -from .. import signals +from .. import lib, models, signals class AccountFormGeneral(forms.ModelForm): diff --git a/modoboa/admin/forms/alias.py b/modoboa/admin/forms/alias.py index 12b306442..866292b3e 100644 --- a/modoboa/admin/forms/alias.py +++ b/modoboa/admin/forms/alias.py @@ -9,14 +9,10 @@ from django.http import QueryDict from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.core import signals as core_signals -from modoboa.lib import exceptions as lib_exceptions +from modoboa.lib import exceptions as lib_exceptions, fields as lib_fields from modoboa.lib.email_utils import split_mailbox -from modoboa.lib import fields as lib_fields -from modoboa.lib.form_utils import ( - DynamicForm -) - -from ..models import Domain, Alias +from modoboa.lib.form_utils import DynamicForm +from ..models import Alias, Domain class AliasForm(forms.ModelForm, DynamicForm): diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index 7b2a0ce69..7ee2ad6c7 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -5,28 +5,22 @@ from __future__ import unicode_literals from functools import reduce from django import forms -from django.urls import reverse from django.http import QueryDict -from django.utils.translation import ugettext as _, ugettext_lazy +from django.urls import reverse from django.utils.encoding import force_text +from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.core import signals as core_signals from modoboa.core.models import User from modoboa.lib.exceptions import Conflict from modoboa.lib.fields import DomainNameField from modoboa.lib.form_utils import ( - YesNoField, WizardForm, WizardStep, DynamicForm, TabForms + DynamicForm, TabForms, WizardForm, WizardStep, YesNoField ) from modoboa.lib.web_utils import render_to_json_response from modoboa.parameters import tools as param_tools - -from .. import constants -from .. import lib -from .. import signals - -from ..models import ( - Domain, DomainAlias, Mailbox, Alias -) +from .. import constants, lib, signals +from ..models import Alias, Domain, DomainAlias, Mailbox class DomainFormGeneral(forms.ModelForm, DynamicForm): diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index bc673e85a..81ec67a3c 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -2,26 +2,18 @@ from __future__ import unicode_literals -from django.urls import reverse +from django.contrib.contenttypes.models import ContentType from django.db.models import signals from django.dispatch import receiver +from django.urls import reverse from django.utils.translation import ugettext as _ -from django.contrib.contenttypes.models import ContentType - -from modoboa.core import models as core_models -from modoboa.core import signals as core_signals +from modoboa.core import models as core_models, signals as core_signals +from modoboa.lib import exceptions, permissions, signals as lib_signals from modoboa.lib.cryptutils import encrypt from modoboa.lib.email_utils import split_mailbox -from modoboa.lib import exceptions -from modoboa.lib import permissions -from modoboa.lib import signals as lib_signals from modoboa.parameters import tools as param_tools - -from . import signals as admin_signals -from . import lib -from . import models -from . import postfix_maps +from . import lib, models, postfix_maps, signals as admin_signals @receiver(signals.post_save, sender=models.Domain) diff --git a/modoboa/admin/lib.py b/modoboa/admin/lib.py index f2541946d..1f9a52b9f 100644 --- a/modoboa/admin/lib.py +++ b/modoboa/admin/lib.py @@ -4,30 +4,28 @@ from __future__ import unicode_literals -from functools import wraps import ipaddress -from itertools import chain import logging import random import socket import string +from functools import wraps +from itertools import chain -from dns.name import IDNA_2008_UTS_46 import dns.resolver +from dns.name import IDNA_2008_UTS_46 from django.contrib.contenttypes.models import ContentType from django.db.models import Q from django.utils.encoding import smart_text from django.utils.translation import ugettext as _ -from modoboa.core.models import User from modoboa.core import signals as core_signals +from modoboa.core.models import User from modoboa.lib.exceptions import PermDeniedException from modoboa.parameters import tools as param_tools - -from .models import Domain, DomainAlias, Alias - from . import signals +from .models import Alias, Domain, DomainAlias def needs_mailbox(): diff --git a/modoboa/admin/management/commands/handle_mailbox_operations.py b/modoboa/admin/management/commands/handle_mailbox_operations.py index a5f86613d..e6a0b256b 100644 --- a/modoboa/admin/management/commands/handle_mailbox_operations.py +++ b/modoboa/admin/management/commands/handle_mailbox_operations.py @@ -1,6 +1,6 @@ """A management command to apply mailbox operations.""" -from __future__ import unicode_literals, print_function +from __future__ import print_function, unicode_literals import logging import os @@ -8,10 +8,9 @@ import shutil from django.core.management.base import BaseCommand -from modoboa.parameters import tools as param_tools -from modoboa.lib.sysutils import exec_cmd from modoboa.lib.exceptions import InternalError - +from modoboa.lib.sysutils import exec_cmd +from modoboa.parameters import tools as param_tools from ...app_settings import load_admin_settings from ...models import MailboxOperation diff --git a/modoboa/admin/management/commands/modo.py b/modoboa/admin/management/commands/modo.py index d395c4c19..1d95fa0bc 100644 --- a/modoboa/admin/management/commands/modo.py +++ b/modoboa/admin/management/commands/modo.py @@ -4,10 +4,10 @@ from __future__ import unicode_literals from subcommand.base import SubcommandCommand -from .subcommands._mx import CheckMXRecords from .subcommands._export import ExportCommand from .subcommands._import import ImportCommand from .subcommands._manage_dkim_keys import ManageDKIMKeys +from .subcommands._mx import CheckMXRecords from .subcommands._repair import Repair diff --git a/modoboa/admin/management/commands/subcommands/_export.py b/modoboa/admin/management/commands/subcommands/_export.py index ed53b8026..3b9fdb722 100644 --- a/modoboa/admin/management/commands/subcommands/_export.py +++ b/modoboa/admin/management/commands/subcommands/_export.py @@ -2,13 +2,14 @@ from __future__ import unicode_literals -from backports import csv import sys +from backports import csv + from django.core.management.base import BaseCommand -from modoboa.core.models import User from modoboa.core.extensions import exts_pool +from modoboa.core.models import User from .... import models diff --git a/modoboa/admin/management/commands/subcommands/_import.py b/modoboa/admin/management/commands/subcommands/_import.py index 80e3a6ad5..705720aa0 100644 --- a/modoboa/admin/management/commands/subcommands/_import.py +++ b/modoboa/admin/management/commands/subcommands/_import.py @@ -2,18 +2,17 @@ from __future__ import unicode_literals -from backports import csv import io import os import progressbar +from backports import csv from django.core.management.base import BaseCommand, CommandError from modoboa.core import models as core_models from modoboa.core.extensions import exts_pool from modoboa.lib.exceptions import Conflict - from .... import signals diff --git a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py index bae55519c..daa3f232d 100644 --- a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py +++ b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py @@ -9,7 +9,6 @@ from django.utils.encoding import smart_text from modoboa.lib import sysutils from modoboa.parameters import tools as param_tools - from .... import models diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index b7ce24fd1..dc1a26dab 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -18,8 +18,7 @@ from django.utils.encoding import smart_text from django.utils.functional import cached_property from django.utils.translation import ugettext as _ -from modoboa.admin import constants -from modoboa.admin import models +from modoboa.admin import constants, models from modoboa.parameters import tools as param_tools diff --git a/modoboa/admin/management/commands/subcommands/_repair.py b/modoboa/admin/management/commands/subcommands/_repair.py index 1406b683d..e27686cc4 100644 --- a/modoboa/admin/management/commands/subcommands/_repair.py +++ b/modoboa/admin/management/commands/subcommands/_repair.py @@ -6,11 +6,9 @@ from django.conf import settings from django.core.management.base import BaseCommand from django.utils.encoding import smart_str -from modoboa.lib.permissions import grant_access_to_object -from modoboa.lib.permissions import get_object_owner - -from modoboa.core.models import User from modoboa.admin import models +from modoboa.core.models import User +from modoboa.lib.permissions import get_object_owner, grant_access_to_object known_problems = [] diff --git a/modoboa/admin/models/__init__.py b/modoboa/admin/models/__init__.py index ead319150..4fcd82289 100644 --- a/modoboa/admin/models/__init__.py +++ b/modoboa/admin/models/__init__.py @@ -2,12 +2,12 @@ from __future__ import unicode_literals +from .alias import Alias, AliasRecipient from .base import AdminObject from .domain import Domain from .domain_alias import DomainAlias -from .mailbox import Mailbox, Quota, MailboxOperation, SenderAddress +from .mailbox import Mailbox, MailboxOperation, Quota, SenderAddress from .mxrecord import DNSBLResult, MXRecord -from .alias import Alias, AliasRecipient __all__ = [ "AdminObject", diff --git a/modoboa/admin/models/alias.py b/modoboa/admin/models/alias.py index b689eb841..48c1fde2b 100644 --- a/modoboa/admin/models/alias.py +++ b/modoboa/admin/models/alias.py @@ -5,25 +5,24 @@ from __future__ import unicode_literals import hashlib import random -from django.urls import reverse +from reversion import revisions as reversion + from django.db import models +from django.urls import reverse from django.utils.encoding import ( - python_2_unicode_compatible, smart_text, force_str, force_bytes + force_bytes, force_str, python_2_unicode_compatible, smart_text ) from django.utils.translation import ugettext as _, ugettext_lazy -from reversion import revisions as reversion - from modoboa.core import signals as core_signals from modoboa.lib.email_utils import split_mailbox from modoboa.lib.exceptions import ( - PermDeniedException, BadRequest, Conflict, NotFound + BadRequest, Conflict, NotFound, PermDeniedException ) - +from .. import signals from .base import AdminObject from .domain import Domain from .mailbox import Mailbox -from .. import signals @python_2_unicode_compatible diff --git a/modoboa/admin/models/base.py b/modoboa/admin/models/base.py index 9ab6fc6c8..1393945d0 100644 --- a/modoboa/admin/models/base.py +++ b/modoboa/admin/models/base.py @@ -2,11 +2,10 @@ from __future__ import unicode_literals +from django.contrib.contenttypes.fields import GenericRelation from django.db import models from django.utils import timezone -from django.contrib.contenttypes.fields import GenericRelation - from modoboa.core import models as core_models from modoboa.lib.permissions import ( grant_access_to_object, ungrant_access_to_object diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index ff2c72f27..74eda5bf0 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -4,23 +4,22 @@ from __future__ import unicode_literals import datetime +from reversion import revisions as reversion + from django.db import models from django.utils import timezone from django.utils.encoding import ( - python_2_unicode_compatible, smart_text, force_text + force_text, python_2_unicode_compatible, smart_text ) from django.utils.functional import cached_property from django.utils.translation import ugettext as _, ugettext_lazy -from reversion import revisions as reversion - from modoboa.core import signals as core_signals from modoboa.core.models import User from modoboa.lib.exceptions import BadRequest, Conflict from modoboa.parameters import tools as param_tools - -from .base import AdminObject from .. import constants +from .base import AdminObject @python_2_unicode_compatible diff --git a/modoboa/admin/models/domain_alias.py b/modoboa/admin/models/domain_alias.py index 508e3a91c..590241563 100644 --- a/modoboa/admin/models/domain_alias.py +++ b/modoboa/admin/models/domain_alias.py @@ -2,18 +2,15 @@ from __future__ import unicode_literals +from reversion import revisions as reversion + +from django.contrib.contenttypes.fields import GenericRelation from django.db import models from django.utils.encoding import python_2_unicode_compatible, smart_text from django.utils.translation import ugettext as _, ugettext_lazy -from django.contrib.contenttypes.fields import GenericRelation - -from reversion import revisions as reversion - -from modoboa.core import models as core_models -from modoboa.core import signals as core_signals +from modoboa.core import models as core_models, signals as core_signals from modoboa.lib.exceptions import BadRequest, Conflict - from .base import AdminObject from .domain import Domain diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index 278cc41c9..0b0624714 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -5,6 +5,8 @@ from __future__ import unicode_literals import os import pwd +from reversion import revisions as reversion + from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import Q @@ -12,14 +14,11 @@ from django.db.models.manager import Manager from django.utils.encoding import python_2_unicode_compatible, smart_text from django.utils.translation import ugettext as _, ugettext_lazy -from reversion import revisions as reversion - from modoboa.core.models import User from modoboa.lib import exceptions as lib_exceptions from modoboa.lib.email_utils import split_mailbox from modoboa.lib.sysutils import exec_cmd from modoboa.parameters import tools as param_tools - from .base import AdminObject from .domain import Domain diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 4d28233da..68558007b 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -3,25 +3,24 @@ from __future__ import unicode_literals from django.conf import settings +from django.contrib.auth import password_validation from django.core.exceptions import ValidationError from django.shortcuts import get_object_or_404 -from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.encoding import force_text - -from django.contrib.auth import password_validation +from django.utils.translation import ugettext as _, ugettext_lazy from rest_framework import serializers from modoboa.admin import models as admin_models -from modoboa.core import constants as core_constants -from modoboa.core import models as core_models -from modoboa.core import signals as core_signals -from modoboa.lib import exceptions as lib_exceptions -from modoboa.lib import permissions, email_utils, fields as lib_fields +from modoboa.core import ( + constants as core_constants, models as core_models, signals as core_signals +) +from modoboa.lib import ( + email_utils, exceptions as lib_exceptions, fields as lib_fields, + permissions +) from modoboa.parameters import tools as param_tools - -from . import lib -from . import models +from . import lib, models class DomainSerializer(serializers.ModelSerializer): diff --git a/modoboa/admin/templatetags/admin_tags.py b/modoboa/admin/templatetags/admin_tags.py index 7f0601230..83c96e7dd 100644 --- a/modoboa/admin/templatetags/admin_tags.py +++ b/modoboa/admin/templatetags/admin_tags.py @@ -5,15 +5,14 @@ from __future__ import unicode_literals from functools import reduce from django import template -from django.urls import reverse from django.template.loader import render_to_string +from django.urls import reverse from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.core import signals as core_signals from modoboa.lib.templatetags.lib_tags import render_link from modoboa.lib.web_utils import render_actions - from .. import signals register = template.Library() diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index 1428c3d47..d68f78302 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -4,18 +4,15 @@ from __future__ import unicode_literals from unittest import skipIf -from django.urls import reverse from django.test import override_settings +from django.urls import reverse from modoboa.core import factories as core_factories -from modoboa.core.tests import test_ldap from modoboa.core.models import User -from modoboa.lib.tests import ModoTestCase -from modoboa.lib.tests import NO_LDAP +from modoboa.core.tests import test_ldap +from modoboa.lib.tests import NO_LDAP, ModoTestCase from modoboa.limits import utils as limits_utils - -from .. import factories -from .. import models +from .. import factories, models class AuthenticationTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_alias.py b/modoboa/admin/tests/test_alias.py index 3df90621d..24dfdb727 100644 --- a/modoboa/admin/tests/test_alias.py +++ b/modoboa/admin/tests/test_alias.py @@ -2,16 +2,18 @@ from __future__ import unicode_literals -"""Admin test cases.""" - from django.urls import reverse from modoboa.core.models import User from modoboa.lib.tests import ModoTestCase - from .. import factories from ..models import Alias, AliasRecipient, Domain +"""Admin test cases.""" + + + + class AliasTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index 060ef940d..fdcfbdf61 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -16,13 +16,10 @@ from django.urls import reverse from rest_framework.authtoken.models import Token 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.core import factories as core_factories, models as core_models from modoboa.lib.tests import ModoAPITestCase - from . import utils -from .. import factories -from .. import models +from .. import factories, models class DomainAPITestCase(ModoAPITestCase): diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index f009a8609..3e3849e36 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -20,10 +20,9 @@ from modoboa.core import factories as core_factories from modoboa.core.models import User from modoboa.core.tests.test_views import SETTINGS_SAMPLE from modoboa.lib.tests import ModoTestCase - from . import utils from .. import factories -from ..models import Domain, Alias +from ..models import Alias, Domain class DomainTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_domain_alias.py b/modoboa/admin/tests/test_domain_alias.py index 4c11bb7d7..7ba2c5f51 100644 --- a/modoboa/admin/tests/test_domain_alias.py +++ b/modoboa/admin/tests/test_domain_alias.py @@ -5,9 +5,8 @@ from __future__ import unicode_literals from django.urls import reverse from modoboa.lib.tests import ModoTestCase - from .. import factories -from ..models import Domain, DomainAlias, Alias +from ..models import Alias, Domain, DomainAlias class DomainAliasTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_export.py b/modoboa/admin/tests/test_export.py index c48e3486d..d229e5881 100644 --- a/modoboa/admin/tests/test_export.py +++ b/modoboa/admin/tests/test_export.py @@ -8,9 +8,7 @@ from django.urls import reverse from django.utils.encoding import force_text from modoboa.lib.tests import ModoTestCase - -from .. import factories -from .. import models +from .. import factories, models class ExportTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_import_.py b/modoboa/admin/tests/test_import_.py index a11dcef8a..f5865703c 100644 --- a/modoboa/admin/tests/test_import_.py +++ b/modoboa/admin/tests/test_import_.py @@ -11,10 +11,9 @@ from django.urls import reverse from modoboa.core import factories as core_factories from modoboa.core.models import User from modoboa.lib.tests import ModoTestCase - from . import utils from .. import factories -from ..models import Domain, Alias, DomainAlias +from ..models import Alias, Domain, DomainAlias class ImportTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_mailbox_operations.py b/modoboa/admin/tests/test_mailbox_operations.py index 81c02de97..a6a8e7597 100644 --- a/modoboa/admin/tests/test_mailbox_operations.py +++ b/modoboa/admin/tests/test_mailbox_operations.py @@ -9,13 +9,11 @@ import tempfile import mock from django.core.management import call_command -from django.urls import reverse from django.test import override_settings +from django.urls import reverse from modoboa.lib.tests import ModoTestCase - -from .. import factories -from .. import models +from .. import factories, models @override_settings( diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 55969f857..10e1e828c 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -8,19 +8,16 @@ import dns.resolver from mock import patch from testfixtures import LogCapture -from django.core import mail -from django.core import management +from django.core import mail, management from django.test import override_settings from django.urls import reverse from django.utils.translation import ugettext as _ from modoboa.core import factories as core_factories from modoboa.lib.tests import ModoTestCase - from . import utils -from .. import factories +from .. import factories, models from ..lib import get_domain_mx_list -from .. import models class MXTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_password_schemes.py b/modoboa/admin/tests/test_password_schemes.py index 99392ccef..4c2449bbf 100644 --- a/modoboa/admin/tests/test_password_schemes.py +++ b/modoboa/admin/tests/test_password_schemes.py @@ -4,7 +4,6 @@ from django.urls import reverse from modoboa.core.models import User from modoboa.lib.tests import ModoTestCase - from .. import factories diff --git a/modoboa/admin/tests/test_repair.py b/modoboa/admin/tests/test_repair.py index 623892ce8..cef009468 100644 --- a/modoboa/admin/tests/test_repair.py +++ b/modoboa/admin/tests/test_repair.py @@ -4,12 +4,9 @@ from __future__ import unicode_literals from django.core import management -from modoboa.lib.permissions import get_object_owner -from modoboa.lib.permissions import ObjectAccess +from modoboa.lib.permissions import ObjectAccess, get_object_owner from modoboa.lib.tests import ModoTestCase - -from .. import factories -from .. import models +from .. import factories, models class RepairTestCase(ModoTestCase): diff --git a/modoboa/admin/tests/test_user.py b/modoboa/admin/tests/test_user.py index 1c55760ff..671026e02 100644 --- a/modoboa/admin/tests/test_user.py +++ b/modoboa/admin/tests/test_user.py @@ -6,7 +6,6 @@ from django.urls import reverse from modoboa.core.models import User from modoboa.lib.tests import ModoTestCase - from ..factories import populate_database from ..models import Alias diff --git a/modoboa/admin/tests/utils.py b/modoboa/admin/tests/utils.py index 8d5d64c26..bf1887465 100644 --- a/modoboa/admin/tests/utils.py +++ b/modoboa/admin/tests/utils.py @@ -8,7 +8,7 @@ import socket from dns.name import Name from dns.rdtypes.ANY.MX import MX -from dns.resolver import NoAnswer, NoNameservers, NXDOMAIN, Timeout +from dns.resolver import NXDOMAIN, NoAnswer, NoNameservers, Timeout _MX_RECORD_1 = MX("IN", "MX", 10, Name("mx.example.com".split("."))) _MX_RECORD_2 = MX("IN", "MX", 10, Name("mx2.example.com".split("."))) diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index 3a9e2c38f..0c3420de3 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -6,12 +6,10 @@ from __future__ import unicode_literals from django.conf.urls import url from . import views -from .views import import_ as import_views -from .views import alias as alias_views -from .views import domain as domain_views -from .views import export as export_views -from .views import identity as identity_views - +from .views import ( + alias as alias_views, domain as domain_views, export as export_views, + identity as identity_views, import_ as import_views +) urlpatterns = [ url(r'^$', domain_views.index, name="index"), diff --git a/modoboa/admin/urls_api.py b/modoboa/admin/urls_api.py index 92e41b86c..82a922fe1 100644 --- a/modoboa/admin/urls_api.py +++ b/modoboa/admin/urls_api.py @@ -6,7 +6,6 @@ from rest_framework import routers from . import api - router = routers.SimpleRouter() router.register(r"domains", api.DomainViewSet, base_name="domain") router.register( diff --git a/modoboa/admin/views/__init__.py b/modoboa/admin/views/__init__.py index 8c499c185..2a79ac999 100644 --- a/modoboa/admin/views/__init__.py +++ b/modoboa/admin/views/__init__.py @@ -3,10 +3,9 @@ from __future__ import unicode_literals from .alias import AliasDetailView -from .identity import AccountDetailView from .dns import DNSBLDomainDetailView, MXDomainDetailView from .domain import DomainDetailView - +from .identity import AccountDetailView __all__ = [ "AccountDetailView", diff --git a/modoboa/admin/views/alias.py b/modoboa/admin/views/alias.py index 5a4151df2..da961753e 100644 --- a/modoboa/admin/views/alias.py +++ b/modoboa/admin/views/alias.py @@ -2,23 +2,19 @@ from __future__ import unicode_literals -from django.urls import reverse +from reversion import revisions as reversion + +from django.contrib.auth import mixins as auth_mixins +from django.contrib.auth.decorators import login_required, permission_required from django.db import IntegrityError from django.shortcuts import render +from django.urls import reverse from django.utils.translation import ugettext as _, ungettext from django.views import generic -from django.contrib.auth import mixins as auth_mixins -from django.contrib.auth.decorators import ( - login_required, permission_required -) - -from reversion import revisions as reversion - from modoboa.core import signals as core_signals -from modoboa.lib.exceptions import PermDeniedException, Conflict +from modoboa.lib.exceptions import Conflict, PermDeniedException from modoboa.lib.web_utils import render_to_json_response - from ..forms import AliasForm from ..models import Alias diff --git a/modoboa/admin/views/dns.py b/modoboa/admin/views/dns.py index 591f3f3e5..db0b71420 100644 --- a/modoboa/admin/views/dns.py +++ b/modoboa/admin/views/dns.py @@ -2,11 +2,9 @@ from __future__ import unicode_literals -from django.views import generic - -from django.utils.translation import ugettext as _ - from django.contrib.auth import mixins as auth_mixins +from django.utils.translation import ugettext as _ +from django.views import generic from .. import models diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index e0b970d5a..ffa92f5df 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -4,31 +4,29 @@ from __future__ import unicode_literals from functools import reduce -from django.urls import reverse -from django.db.models import Sum -from django.http import HttpResponseRedirect -from django.shortcuts import render -from django.template.loader import render_to_string -from django.utils.translation import ugettext as _, ungettext -from django.views import generic -from django.views.decorators.csrf import ensure_csrf_cookie +from reversion import revisions as reversion from django.contrib.auth import mixins as auth_mixins from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) - -from reversion import revisions as reversion +from django.db.models import Sum +from django.http import HttpResponseRedirect +from django.shortcuts import render +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.translation import ugettext as _, ungettext +from django.views import generic +from django.views.decorators.csrf import ensure_csrf_cookie from modoboa.core import signals as core_signals -from modoboa.lib.web_utils import render_to_json_response from modoboa.lib.exceptions import PermDeniedException -from modoboa.lib.listing import get_sort_order, get_listing_page - +from modoboa.lib.listing import get_listing_page, get_sort_order +from modoboa.lib.web_utils import render_to_json_response +from .. import signals from ..forms import DomainForm, DomainWizard from ..lib import get_domains from ..models import Domain, Mailbox -from .. import signals @login_required diff --git a/modoboa/admin/views/export.py b/modoboa/admin/views/export.py index 8cbfa4af8..8c8019fa7 100644 --- a/modoboa/admin/views/export.py +++ b/modoboa/admin/views/export.py @@ -3,19 +3,18 @@ from __future__ import unicode_literals from backports import csv - from rfc6266 import build_header from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) -from django.urls import reverse from django.http import HttpResponse from django.shortcuts import render -from django.utils.translation import ugettext as _ +from django.urls import reverse from django.utils import six +from django.utils.translation import ugettext as _ -from ..forms import ExportIdentitiesForm, ExportDomainsForm +from ..forms import ExportDomainsForm, ExportIdentitiesForm from ..lib import get_domains, get_identities diff --git a/modoboa/admin/views/identity.py b/modoboa/admin/views/identity.py index 4f3ba61ab..9379c3777 100644 --- a/modoboa/admin/views/identity.py +++ b/modoboa/admin/views/identity.py @@ -2,32 +2,26 @@ from __future__ import unicode_literals +from reversion import revisions as reversion + +from django.contrib.auth import mixins as auth_mixins +from django.contrib.auth.decorators import ( + login_required, permission_required, user_passes_test +) from django.shortcuts import render from django.template.loader import render_to_string from django.utils.translation import ugettext as _, ungettext from django.views import generic from django.views.decorators.csrf import ensure_csrf_cookie -from django.contrib.auth import mixins as auth_mixins -from django.contrib.auth.decorators import ( - login_required, permission_required, user_passes_test -) - -from reversion import revisions as reversion - from modoboa.core.models import User -from modoboa.lib.exceptions import ( - PermDeniedException, BadRequest -) -from modoboa.lib.listing import ( - get_sort_order, get_listing_page -) +from modoboa.lib.exceptions import BadRequest, PermDeniedException +from modoboa.lib.listing import get_listing_page, get_sort_order from modoboa.lib.web_utils import render_to_json_response - +from .. import signals from ..forms import AccountForm, AccountWizard from ..lib import get_identities -from ..models import Mailbox, Domain -from .. import signals +from ..models import Domain, Mailbox @login_required diff --git a/modoboa/admin/views/import_.py b/modoboa/admin/views/import_.py index e05e858b1..7c6e383e3 100644 --- a/modoboa/admin/views/import_.py +++ b/modoboa/admin/views/import_.py @@ -2,25 +2,23 @@ from __future__ import unicode_literals -from backports import csv - import io +from backports import csv +from reversion import revisions as reversion + from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) -from django.urls import reverse from django.db import transaction from django.shortcuts import render +from django.urls import reverse from django.utils.encoding import smart_text from django.utils.translation import ugettext as _ -from reversion import revisions as reversion - -from modoboa.lib.exceptions import ModoboaException, Conflict - -from ..forms import ImportIdentitiesForm, ImportDataForm +from modoboa.lib.exceptions import Conflict, ModoboaException from .. import signals +from ..forms import ImportDataForm, ImportIdentitiesForm @reversion.create_revision() diff --git a/modoboa/admin/views/user.py b/modoboa/admin/views/user.py index 072f68890..630e2967f 100644 --- a/modoboa/admin/views/user.py +++ b/modoboa/admin/views/user.py @@ -2,15 +2,13 @@ from __future__ import unicode_literals +from reversion import revisions as reversion + +from django.contrib.auth.decorators import login_required from django.template.loader import render_to_string from django.utils.translation import ugettext as _ -from django.contrib.auth.decorators import login_required - -from reversion import revisions as reversion - from modoboa.lib.web_utils import render_to_json_response - from ..forms import ForwardForm from ..lib import needs_mailbox from ..models import Alias diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index 8be3c572a..fb0488028 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -4,18 +4,15 @@ from __future__ import unicode_literals from django import forms from django.conf import settings -from django.utils.translation import ugettext as _, ugettext_lazy - from django.contrib.auth import password_validation +from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.lib import fields as lib_fields from modoboa.lib.cryptutils import random_key from modoboa.lib.form_utils import ( - YesNoField, SeparatorField, HorizontalRadioSelect + HorizontalRadioSelect, SeparatorField, YesNoField ) -from modoboa.parameters import forms as param_forms -from modoboa.parameters import tools as param_tools - +from modoboa.parameters import forms as param_forms, tools as param_tools from . import constants diff --git a/modoboa/core/checks/settings_checks.py b/modoboa/core/checks/settings_checks.py index 797b96538..ebd09db14 100644 --- a/modoboa/core/checks/settings_checks.py +++ b/modoboa/core/checks/settings_checks.py @@ -6,7 +6,6 @@ from django.conf import settings from django.core.checks import Warning, register from django.utils.translation import ugettext as _ - W001 = Warning( _("You have USE_TZ set to False, this may result in issues during " "transitions between summer/winter time (ie the same local time occuring " diff --git a/modoboa/core/commands/__init__.py b/modoboa/core/commands/__init__.py index 6a25852a6..2c5a12529 100644 --- a/modoboa/core/commands/__init__.py +++ b/modoboa/core/commands/__init__.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals, print_function +from __future__ import print_function, unicode_literals import argparse import os diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index 959b9c12b..a09c840e6 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -2,7 +2,7 @@ """A shortcut to deploy a fresh modoboa instance.""" -from __future__ import unicode_literals, print_function +from __future__ import print_function, unicode_literals import codecs import getpass @@ -10,23 +10,25 @@ import os import shutil import subprocess import sys - from os.path import isfile +import dj_database_url + +import django +from django.core import management +from django.template import Context, Template +from django.utils.encoding import smart_str + +from modoboa.core.commands import Command +from modoboa.lib.api_client import ModoAPIClient + try: import pip except ImportError: sys.stderr.write("Error: pip is required to install extensions.\n") sys.exit(2) -import django -from django.core import management -from django.template import Context, Template -from django.utils.encoding import smart_str -import dj_database_url -from modoboa.core.commands import Command -from modoboa.lib.api_client import ModoAPIClient if sys.version_info < (3, 0, 0): input = raw_input diff --git a/modoboa/core/commands/help.py b/modoboa/core/commands/help.py index d7257bc03..9799f379d 100644 --- a/modoboa/core/commands/help.py +++ b/modoboa/core/commands/help.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals, print_function +from __future__ import print_function, unicode_literals import sys diff --git a/modoboa/core/forms.py b/modoboa/core/forms.py index 668eff33f..d2ce9c4a3 100644 --- a/modoboa/core/forms.py +++ b/modoboa/core/forms.py @@ -5,14 +5,12 @@ from __future__ import unicode_literals from django import forms +from django.contrib.auth import ( + forms as auth_forms, get_user_model, password_validation +) from django.db.models import Q from django.utils.translation import ugettext as _, ugettext_lazy -from django.contrib.auth import forms as auth_forms -from django.contrib.auth import get_user_model - -from django.contrib.auth import password_validation - from modoboa.core.models import User from modoboa.parameters import tools as param_tools diff --git a/modoboa/core/handlers.py b/modoboa/core/handlers.py index ea1084010..5d48ad3ea 100644 --- a/modoboa/core/handlers.py +++ b/modoboa/core/handlers.py @@ -4,24 +4,19 @@ from __future__ import unicode_literals import logging +from reversion import revisions as reversion +from reversion.models import Version + +from django.contrib.sites import models as sites_models from django.db.models import signals from django.dispatch import receiver from django.urls import reverse from django.utils.encoding import smart_text from django.utils.translation import ugettext as _ -from django.contrib.sites import models as sites_models - -from reversion import revisions as reversion -from reversion.models import Version - -from modoboa.lib import exceptions -from modoboa.lib import permissions +from modoboa.lib import exceptions, permissions from modoboa.lib.signals import get_request - -from . import models -from . import signals as core_signals -from . import utils +from . import models, signals as core_signals, utils @receiver(reversion.post_revision_commit) diff --git a/modoboa/core/management/commands/clean_inactive_accounts.py b/modoboa/core/management/commands/clean_inactive_accounts.py index 87f3dfab2..16fc826fe 100644 --- a/modoboa/core/management/commands/clean_inactive_accounts.py +++ b/modoboa/core/management/commands/clean_inactive_accounts.py @@ -9,7 +9,6 @@ from django.core.management.base import BaseCommand from django.utils import timezone from modoboa.parameters import tools as param_tools - from ... import models diff --git a/modoboa/core/management/commands/communicate_with_public_api.py b/modoboa/core/management/commands/communicate_with_public_api.py index 0aec393d1..59e0beb84 100644 --- a/modoboa/core/management/commands/communicate_with_public_api.py +++ b/modoboa/core/management/commands/communicate_with_public_api.py @@ -7,7 +7,6 @@ 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 - from ... import models diff --git a/modoboa/core/management/commands/generate_postfix_maps.py b/modoboa/core/management/commands/generate_postfix_maps.py index 2e0f7fc05..8749da6f2 100644 --- a/modoboa/core/management/commands/generate_postfix_maps.py +++ b/modoboa/core/management/commands/generate_postfix_maps.py @@ -6,16 +6,15 @@ import hashlib import os import sys +import dj_database_url + from django.conf import settings from django.core.management.base import BaseCommand from django.template import Context, Template from django.utils import timezone from django.utils.encoding import force_bytes -import dj_database_url - -from ... import signals -from ... import utils +from ... import signals, utils MAP_FILE_TEMPLATE = """# This file was generated on {{ date }} by running: # {{ commandline }} diff --git a/modoboa/core/management/commands/load_initial_data.py b/modoboa/core/management/commands/load_initial_data.py index 956fde635..dd515b2a9 100644 --- a/modoboa/core/management/commands/load_initial_data.py +++ b/modoboa/core/management/commands/load_initial_data.py @@ -14,11 +14,7 @@ from django.core.management.base import BaseCommand from modoboa.lib.cryptutils import random_key from modoboa.lib.permissions import add_permissions_to_group - -from ... import constants -from ... import extensions -from ... import models -from ... import signals +from ... import constants, extensions, models, signals class Command(BaseCommand): diff --git a/modoboa/core/management/commands/set_default_site.py b/modoboa/core/management/commands/set_default_site.py index d80268a10..83ab25b95 100644 --- a/modoboa/core/management/commands/set_default_site.py +++ b/modoboa/core/management/commands/set_default_site.py @@ -7,9 +7,8 @@ See `https://docs.djangoproject.com/en/dev/ref/contrib/sites/`_. from __future__ import unicode_literals -from django.core.management.base import BaseCommand, CommandError - from django.contrib.sites.models import Site +from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): diff --git a/modoboa/core/mocks.py b/modoboa/core/mocks.py index e593bfc3f..8b97f6b2f 100644 --- a/modoboa/core/mocks.py +++ b/modoboa/core/mocks.py @@ -4,7 +4,6 @@ from __future__ import unicode_literals import httmock - # Modoboa API mocks @httmock.urlmatch( diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 39c9e7d42..79c495572 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -2,34 +2,30 @@ from __future__ import unicode_literals -from email.header import Header import re - -from django.conf import settings -from django.db import models -from django.urls import reverse -from django.utils.encoding import ( - python_2_unicode_compatible, smart_bytes, smart_text, force_str -) -from django.utils.functional import cached_property -from django.utils.translation import ugettext as _, ugettext_lazy - -from django.contrib.auth.models import Group, AbstractUser -from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType +from email.header import Header import jsonfield from reversion import revisions as reversion +from django.conf import settings +from django.contrib.auth.models import AbstractUser, Group +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db import models +from django.urls import reverse +from django.utils.encoding import ( + force_str, python_2_unicode_compatible, smart_bytes, smart_text +) +from django.utils.functional import cached_property +from django.utils.translation import ugettext as _, ugettext_lazy + from modoboa.core.password_hashers import get_password_hasher from modoboa.lib.exceptions import ( - PermDeniedException, InternalError, BadRequest, Conflict + BadRequest, Conflict, InternalError, PermDeniedException ) from modoboa.parameters import tools as param_tools - -from . import constants -from . import signals - +from . import constants, signals try: from modoboa.lib.ldap_utils import LDAPAuthBackend diff --git a/modoboa/core/password_hashers/__init__.py b/modoboa/core/password_hashers/__init__.py index e47231f1f..0a06ea924 100644 --- a/modoboa/core/password_hashers/__init__.py +++ b/modoboa/core/password_hashers/__init__.py @@ -4,12 +4,12 @@ Password hashers for Modoboa. from __future__ import unicode_literals -from modoboa.core.password_hashers.base import ( - PLAINHasher, CRYPTHasher, MD5Hasher, SHA256Hasher -) from modoboa.core.password_hashers.advanced import ( BLFCRYPTHasher, MD5CRYPTHasher, SHA256CRYPTHasher, SHA512CRYPTHasher ) +from modoboa.core.password_hashers.base import ( + CRYPTHasher, MD5Hasher, PLAINHasher, SHA256Hasher +) def get_password_hasher(scheme): diff --git a/modoboa/core/password_hashers/advanced.py b/modoboa/core/password_hashers/advanced.py index 1ab654b26..96698eadd 100644 --- a/modoboa/core/password_hashers/advanced.py +++ b/modoboa/core/password_hashers/advanced.py @@ -9,7 +9,6 @@ from __future__ import unicode_literals from passlib.hash import bcrypt, md5_crypt, sha256_crypt, sha512_crypt from modoboa.parameters import tools as param_tools - from .base import PasswordHasher diff --git a/modoboa/core/password_hashers/base.py b/modoboa/core/password_hashers/base.py index 59f8d7a64..f065bc67a 100644 --- a/modoboa/core/password_hashers/base.py +++ b/modoboa/core/password_hashers/base.py @@ -9,11 +9,11 @@ from __future__ import unicode_literals import base64 import crypt import hashlib -from random import Random import string +from random import Random from django.utils.crypto import constant_time_compare -from django.utils.encoding import force_text, force_bytes +from django.utils.encoding import force_bytes, force_text class PasswordHasher(object): diff --git a/modoboa/core/templatetags/core_tags.py b/modoboa/core/templatetags/core_tags.py index ce6a3b2bc..3a5ce55ec 100644 --- a/modoboa/core/templatetags/core_tags.py +++ b/modoboa/core/templatetags/core_tags.py @@ -3,22 +3,22 @@ from __future__ import unicode_literals -from functools import reduce import os -import pkg_resources import re +from functools import reduce + +import pkg_resources from django import template from django.conf import settings -from django.urls import reverse +from django.contrib.sessions.models import Session from django.template.loader import render_to_string +from django.urls import reverse from django.utils import timezone from django.utils.encoding import smart_text from django.utils.safestring import mark_safe from django.utils.translation import get_language, ugettext as _ -from django.contrib.sessions.models import Session - from .. import signals register = template.Library() diff --git a/modoboa/core/tests/test_authentication.py b/modoboa/core/tests/test_authentication.py index 93581e3f7..99c32cf3d 100644 --- a/modoboa/core/tests/test_authentication.py +++ b/modoboa/core/tests/test_authentication.py @@ -5,19 +5,16 @@ from __future__ import unicode_literals import smtplib - from unittest import skipIf + from mock import patch from django.core import mail -from django.urls import reverse from django.test import override_settings +from django.urls import reverse -from modoboa.lib.tests import ModoTestCase -from modoboa.lib.tests import NO_SMTP - -from .. import factories -from .. import models +from modoboa.lib.tests import NO_SMTP, ModoTestCase +from .. import factories, models class AuthenticationTestCase(ModoTestCase): diff --git a/modoboa/core/tests/test_core.py b/modoboa/core/tests/test_core.py index 0e39f633d..28c4aed85 100644 --- a/modoboa/core/tests/test_core.py +++ b/modoboa/core/tests/test_core.py @@ -3,20 +3,16 @@ from __future__ import unicode_literals import httmock - from dateutil.relativedelta import relativedelta from six import StringIO from django.core import management -from django.urls import reverse from django.test import TestCase +from django.urls import reverse from django.utils import timezone from modoboa.lib.tests import ModoTestCase - -from .. import factories -from .. import mocks -from .. import models +from .. import factories, mocks, models class AuthenticationTestCase(ModoTestCase): diff --git a/modoboa/core/tests/test_ldap.py b/modoboa/core/tests/test_ldap.py index 5b2a19631..98c566c04 100644 --- a/modoboa/core/tests/test_ldap.py +++ b/modoboa/core/tests/test_ldap.py @@ -4,16 +4,13 @@ from __future__ import unicode_literals from unittest import skipIf -from django.urls import reverse from django.test import override_settings +from django.urls import reverse from django.utils.functional import cached_property from modoboa.lib import exceptions -from modoboa.lib.tests import ModoTestCase -from modoboa.lib.tests import NO_LDAP - -from .. import factories -from .. import models +from modoboa.lib.tests import NO_LDAP, ModoTestCase +from .. import factories, models @skipIf(NO_LDAP, "No ldap module installed") diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index dcb2047d8..d99560f50 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -8,12 +8,8 @@ from django import forms from django.urls import reverse from modoboa.lib.tests import ModoTestCase -from modoboa.parameters import forms as param_forms -from modoboa.parameters import tools as param_tools - -from .. import factories -from .. import models -from .. import signals +from modoboa.parameters import forms as param_forms, tools as param_tools +from .. import factories, models, signals SETTINGS_SAMPLE = { "core-check_new_versions": "True", diff --git a/modoboa/core/utils.py b/modoboa/core/utils.py index 4ef209dae..1ac62a320 100644 --- a/modoboa/core/utils.py +++ b/modoboa/core/utils.py @@ -8,7 +8,6 @@ from django.utils.translation import ugettext as _ from modoboa.core.extensions import exts_pool from modoboa.lib.api_client import ModoAPIClient - from . import models diff --git a/modoboa/core/views/__init__.py b/modoboa/core/views/__init__.py index f23a6b20a..db3341c3b 100644 --- a/modoboa/core/views/__init__.py +++ b/modoboa/core/views/__init__.py @@ -4,7 +4,8 @@ from __future__ import unicode_literals from .admin import ( check_top_notifications, information, logs, logs_page, parameters, - viewsettings) + viewsettings +) from .auth import dologin, dologout, password_reset from .base import RootDispatchView from .dashboard import DashboardView diff --git a/modoboa/core/views/admin.py b/modoboa/core/views/admin.py index 3be4ef1d7..09b1e1487 100644 --- a/modoboa/core/views/admin.py +++ b/modoboa/core/views/admin.py @@ -4,19 +4,16 @@ from __future__ import unicode_literals from functools import reduce -from django.contrib.auth.decorators import ( - login_required, user_passes_test -) +from django.contrib.auth.decorators import login_required, user_passes_test from django.shortcuts import render from django.template.loader import render_to_string from django.utils.translation import ugettext as _ from modoboa.core.models import Log from modoboa.core.utils import check_for_updates -from modoboa.lib.listing import get_sort_order, get_listing_page +from modoboa.lib.listing import get_listing_page, get_sort_order from modoboa.lib.web_utils import render_to_json_response from modoboa.parameters import tools as param_tools - from .. import signals diff --git a/modoboa/core/views/auth.py b/modoboa/core/views/auth.py index 336d0d5bf..856e0d412 100644 --- a/modoboa/core/views/auth.py +++ b/modoboa/core/views/auth.py @@ -5,20 +5,19 @@ from __future__ import unicode_literals import logging -from django.urls import reverse +from django.contrib.auth import ( + authenticate, login, logout, views as auth_views +) from django.http import HttpResponse, HttpResponseRedirect from django.template.loader import render_to_string +from django.urls import reverse from django.utils import translation from django.utils.translation import ugettext as _ from django.views.decorators.cache import never_cache -from django.contrib.auth import authenticate, login, logout -from django.contrib.auth import views as auth_views - from modoboa.core import forms - -from .base import find_nextlocation from .. import signals +from .base import find_nextlocation logger = logging.getLogger("modoboa.auth") diff --git a/modoboa/core/views/base.py b/modoboa/core/views/base.py index 7b6291bac..063cdf7cf 100644 --- a/modoboa/core/views/base.py +++ b/modoboa/core/views/base.py @@ -2,12 +2,11 @@ from __future__ import unicode_literals +from django.contrib.auth import mixins as auth_mixins from django.urls import reverse from django.utils.http import is_safe_url from django.views import generic -from django.contrib.auth import mixins as auth_mixins - from ..extensions import exts_pool diff --git a/modoboa/core/views/dashboard.py b/modoboa/core/views/dashboard.py index 9731096d4..f44f0e8c1 100644 --- a/modoboa/core/views/dashboard.py +++ b/modoboa/core/views/dashboard.py @@ -2,14 +2,13 @@ from __future__ import unicode_literals -from dateutil import parser import feedparser import requests +from dateutil import parser from requests.exceptions import RequestException -from django.views import generic - from django.contrib.auth import mixins as auth_mixins +from django.views import generic from .. import signals diff --git a/modoboa/core/views/user.py b/modoboa/core/views/user.py index cafe1aeb2..ee11e3d18 100644 --- a/modoboa/core/views/user.py +++ b/modoboa/core/views/user.py @@ -2,22 +2,20 @@ from __future__ import unicode_literals +from django.contrib.auth.decorators import login_required, user_passes_test from django.shortcuts import render from django.template.loader import render_to_string from django.utils import translation -from django.utils.translation import ugettext as _ from django.utils.encoding import force_text - -from django.contrib.auth.decorators import login_required, user_passes_test +from django.utils.translation import ugettext as _ from rest_framework.authtoken.models import Token from modoboa.lib.cryptutils import encrypt from modoboa.lib.web_utils import render_to_json_response from modoboa.parameters import tools as param_tools - -from ..forms import ProfileForm, APIAccessForm from .. import signals +from ..forms import APIAccessForm, ProfileForm @login_required diff --git a/modoboa/lib/api_client.py b/modoboa/lib/api_client.py index afdb80584..dbeed9982 100644 --- a/modoboa/lib/api_client.py +++ b/modoboa/lib/api_client.py @@ -3,8 +3,8 @@ from __future__ import unicode_literals import os -import pkg_resources +import pkg_resources import requests from requests.exceptions import RequestException diff --git a/modoboa/lib/authbackends.py b/modoboa/lib/authbackends.py index 0ff7fb645..db78d5d8f 100644 --- a/modoboa/lib/authbackends.py +++ b/modoboa/lib/authbackends.py @@ -6,7 +6,7 @@ import smtplib from django.conf import settings -from modoboa.core.models import populate_callback, User +from modoboa.core.models import User, populate_callback from modoboa.lib.email_utils import split_mailbox from modoboa.parameters import tools as param_tools diff --git a/modoboa/lib/cryptutils.py b/modoboa/lib/cryptutils.py index 25bc3ac9f..41815a38f 100644 --- a/modoboa/lib/cryptutils.py +++ b/modoboa/lib/cryptutils.py @@ -6,12 +6,12 @@ from __future__ import unicode_literals import base64 +from cryptography.fernet import Fernet + from django.conf import settings from django.utils.crypto import get_random_string from django.utils.encoding import smart_bytes, smart_text -from cryptography.fernet import Fernet - def random_key(length=16): """Generate a new key used to encrypt user passwords in session storage.""" diff --git a/modoboa/lib/email_utils.py b/modoboa/lib/email_utils.py index ae12a13c7..13df77ac2 100644 --- a/modoboa/lib/email_utils.py +++ b/modoboa/lib/email_utils.py @@ -3,12 +3,12 @@ from __future__ import unicode_literals import email -from email.header import Header -from email.mime.text import MIMEText -from email.utils import make_msgid, formataddr, formatdate, getaddresses import re import smtplib import time +from email.header import Header +from email.mime.text import MIMEText +from email.utils import formataddr, formatdate, getaddresses, make_msgid import chardet import lxml.html @@ -23,7 +23,6 @@ from django.utils.translation import ugettext as _ from modoboa.lib import u2u_decode from modoboa.lib.exceptions import InternalError - # used by Email() _RE_REMOVE_EXTRA_WHITESPACE = re.compile(r"\n\s*\n") _RE_CID = re.compile(r".*[ ]*cid=\"([^\"]*)\".*", re.I) diff --git a/modoboa/lib/form_utils.py b/modoboa/lib/form_utils.py index 2b5bcdf95..99c664a3c 100644 --- a/modoboa/lib/form_utils.py +++ b/modoboa/lib/form_utils.py @@ -5,8 +5,8 @@ from __future__ import unicode_literals import abc -from collections import OrderedDict import re +from collections import OrderedDict from django.forms import TypedChoiceField from django.forms.fields import Field @@ -18,7 +18,6 @@ from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.lib.exceptions import BadRequest from modoboa.lib.web_utils import render_to_json_response - ABC = abc.ABCMeta(force_str("ABC"), (object,), {}) diff --git a/modoboa/lib/ldap_utils.py b/modoboa/lib/ldap_utils.py index d031bd41f..d8540faca 100644 --- a/modoboa/lib/ldap_utils.py +++ b/modoboa/lib/ldap_utils.py @@ -38,9 +38,9 @@ from __future__ import unicode_literals import ldap from django.conf import settings -from django.utils.translation import ugettext as _ -from django.utils.encoding import force_bytes from django.utils import six +from django.utils.encoding import force_bytes +from django.utils.translation import ugettext as _ from modoboa.core.password_hashers import get_password_hasher from modoboa.lib.exceptions import InternalError diff --git a/modoboa/lib/listing.py b/modoboa/lib/listing.py index c77e7dcf1..b63e88913 100644 --- a/modoboa/lib/listing.py +++ b/modoboa/lib/listing.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator from modoboa.parameters import tools as param_tools diff --git a/modoboa/lib/middleware.py b/modoboa/lib/middleware.py index 684726d65..9e602dc82 100644 --- a/modoboa/lib/middleware.py +++ b/modoboa/lib/middleware.py @@ -5,11 +5,11 @@ from __future__ import unicode_literals from django.http import HttpResponseRedirect -from django.utils.encoding import smart_text from django.utils.deprecation import MiddlewareMixin +from django.utils.encoding import smart_text -from modoboa.lib.exceptions import ModoboaException from modoboa.lib import signals as lib_signals +from modoboa.lib.exceptions import ModoboaException from modoboa.lib.web_utils import ( _render_error, ajax_response, render_to_json_response ) diff --git a/modoboa/lib/permissions.py b/modoboa/lib/permissions.py index 73cc4439c..4a25ef20f 100644 --- a/modoboa/lib/permissions.py +++ b/modoboa/lib/permissions.py @@ -6,8 +6,7 @@ from __future__ import unicode_literals from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType -from modoboa.core import constants as core_constants -from modoboa.core import signals as core_signals +from modoboa.core import constants as core_constants, signals as core_signals from modoboa.core.models import ObjectAccess, User diff --git a/modoboa/lib/singleton.py b/modoboa/lib/singleton.py index f4444be7f..945fe682e 100644 --- a/modoboa/lib/singleton.py +++ b/modoboa/lib/singleton.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals + # works in Python 2 & 3 class _Singleton(type): _instances = {} diff --git a/modoboa/lib/sysutils.py b/modoboa/lib/sysutils.py index aff56e97a..d58bdcbf8 100644 --- a/modoboa/lib/sysutils.py +++ b/modoboa/lib/sysutils.py @@ -7,9 +7,9 @@ This module extra functions/shortcuts to communicate with the system from __future__ import unicode_literals -import subprocess import inspect import re +import subprocess def exec_cmd(cmd, sudo_user=None, pinput=None, capture_output=True, **kwargs): diff --git a/modoboa/lib/templatetags/form_tags.py b/modoboa/lib/templatetags/form_tags.py index 11db3bf90..77a2570e5 100644 --- a/modoboa/lib/templatetags/form_tags.py +++ b/modoboa/lib/templatetags/form_tags.py @@ -4,11 +4,10 @@ Form rendering tags. from __future__ import unicode_literals -from django import forms -from django import template +from django import forms, template +from django.template.loader import render_to_string from django.utils.encoding import smart_text from django.utils.safestring import mark_safe -from django.template.loader import render_to_string from modoboa.lib.form_utils import SeparatorField diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index e1abb842f..699e8ea5b 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals from datetime import datetime from django import template -from django.template import Template, Context +from django.template import Context, Template from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ diff --git a/modoboa/lib/tests/__init__.py b/modoboa/lib/tests/__init__.py index 86b2e9ece..7eb668515 100644 --- a/modoboa/lib/tests/__init__.py +++ b/modoboa/lib/tests/__init__.py @@ -13,7 +13,6 @@ from rest_framework.authtoken.models import Token from rest_framework.test import APITestCase from modoboa.core import models as core_models - from .. import sysutils try: diff --git a/modoboa/lib/tests/test_email_utils.py b/modoboa/lib/tests/test_email_utils.py index 274279469..943036366 100644 --- a/modoboa/lib/tests/test_email_utils.py +++ b/modoboa/lib/tests/test_email_utils.py @@ -10,7 +10,8 @@ from django.test import SimpleTestCase from django.utils.encoding import smart_bytes, smart_text from ..email_utils import ( - Email, prepare_addresses, split_address, split_local_part) + Email, prepare_addresses, split_address, split_local_part +) SAMPLES_DIR = os.path.realpath( os.path.join(os.path.dirname(__file__), "sample_messages")) diff --git a/modoboa/lib/u2u_decode.py b/modoboa/lib/u2u_decode.py index 3d8e97621..2adf1e3be 100644 --- a/modoboa/lib/u2u_decode.py +++ b/modoboa/lib/u2u_decode.py @@ -9,9 +9,9 @@ A stupid (and not accurate) answer to https://bugs.python.org/issue1079. from __future__ import unicode_literals +import re from email.header import decode_header, make_header from email.utils import parseaddr -import re from django.utils.encoding import smart_text diff --git a/modoboa/limits/constants.py b/modoboa/limits/constants.py index f12d5818f..e70f2a1e0 100644 --- a/modoboa/limits/constants.py +++ b/modoboa/limits/constants.py @@ -6,7 +6,6 @@ import collections from django.utils.translation import ugettext_lazy as _ - DEFAULT_USER_LIMITS = collections.OrderedDict(( ("domains", { "content_type": "admin.domain", "label": _("Domains"), diff --git a/modoboa/limits/forms.py b/modoboa/limits/forms.py index 3a013a6f2..149baa6d4 100644 --- a/modoboa/limits/forms.py +++ b/modoboa/limits/forms.py @@ -8,9 +8,8 @@ from django import forms from django.utils.translation import ugettext as _ from modoboa.lib.permissions import get_object_owner - -from .lib import allocate_resources_from_user from . import utils +from .lib import allocate_resources_from_user class ResourcePoolForm(forms.Form): diff --git a/modoboa/limits/handlers.py b/modoboa/limits/handlers.py index 8602f2bc6..ba080bcbd 100644 --- a/modoboa/limits/handlers.py +++ b/modoboa/limits/handlers.py @@ -2,25 +2,17 @@ from __future__ import unicode_literals +from django.contrib.contenttypes.models import ContentType from django.db.models import signals from django.dispatch import receiver from django.template.loader import render_to_string - -from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext as _ -from modoboa.admin import models as admin_models -from modoboa.admin import signals as admin_signals -from modoboa.core import models as core_models -from modoboa.core import signals as core_signals -from modoboa.lib import signals as lib_signals -from modoboa.lib import permissions +from modoboa.admin import models as admin_models, signals as admin_signals +from modoboa.core import models as core_models, signals as core_signals +from modoboa.lib import permissions, signals as lib_signals from modoboa.parameters import tools as param_tools - -from . import forms -from . import lib -from . import models -from . import utils +from . import forms, lib, models, utils @receiver(core_signals.can_create_object) diff --git a/modoboa/limits/models.py b/modoboa/limits/models.py index 114a933c6..04fc92081 100644 --- a/modoboa/limits/models.py +++ b/modoboa/limits/models.py @@ -11,9 +11,7 @@ from django.utils.functional import cached_property from django.utils.translation import ugettext as _ from modoboa.core import models as core_models - -from . import lib -from . import utils +from . import lib, utils class ObjectLimitMixin(object): diff --git a/modoboa/limits/tests/test_api.py b/modoboa/limits/tests/test_api.py index 0b2194897..efc4ddae9 100644 --- a/modoboa/limits/tests/test_api.py +++ b/modoboa/limits/tests/test_api.py @@ -13,9 +13,7 @@ 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 permissions -from modoboa.lib import tests as lib_tests - +from modoboa.lib import permissions, tests as lib_tests from .. import utils diff --git a/modoboa/limits/tests/test_domain_limits.py b/modoboa/limits/tests/test_domain_limits.py index 92f6c8749..381ec7d0b 100644 --- a/modoboa/limits/tests/test_domain_limits.py +++ b/modoboa/limits/tests/test_domain_limits.py @@ -10,7 +10,6 @@ from modoboa.admin.models import Domain from modoboa.core import factories as core_factories from modoboa.core.models import User from modoboa.lib import tests as lib_tests - from .. import utils diff --git a/modoboa/limits/tests/test_import.py b/modoboa/limits/tests/test_import.py index 1b61fd0c5..31c0b0bb0 100644 --- a/modoboa/limits/tests/test_import.py +++ b/modoboa/limits/tests/test_import.py @@ -5,12 +5,9 @@ from __future__ import unicode_literals from django.core.files.base import ContentFile from django.urls import reverse -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.admin import factories as admin_factories, models as admin_models +from modoboa.core import factories as core_factories, models as core_models from modoboa.lib.tests import ModoTestCase - from .. import utils diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index f5387bcf3..3200e9bda 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -10,7 +10,6 @@ from modoboa.admin.models import Alias, Domain from modoboa.core.factories import UserFactory from modoboa.core.models import User from modoboa.lib import tests as lib_tests - from .. import utils diff --git a/modoboa/limits/urls_api.py b/modoboa/limits/urls_api.py index dad167523..8ebfa0e5c 100644 --- a/modoboa/limits/urls_api.py +++ b/modoboa/limits/urls_api.py @@ -6,7 +6,6 @@ from rest_framework import routers from . import viewsets - router = routers.SimpleRouter() router.register( r"resources", viewsets.ResourcesViewSet, base_name="resources") diff --git a/modoboa/limits/viewsets.py b/modoboa/limits/viewsets.py index 2d792ca75..5f57f5401 100644 --- a/modoboa/limits/viewsets.py +++ b/modoboa/limits/viewsets.py @@ -5,10 +5,9 @@ from __future__ import unicode_literals from django.contrib.contenttypes.models import ContentType from rest_framework import mixins, viewsets -from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions +from rest_framework.permissions import DjangoModelPermissions, IsAuthenticated from modoboa.core import models as core_models - from . import serializers diff --git a/modoboa/parameters/forms.py b/modoboa/parameters/forms.py index d26996e13..5a0c72aa2 100644 --- a/modoboa/parameters/forms.py +++ b/modoboa/parameters/forms.py @@ -4,8 +4,7 @@ from __future__ import unicode_literals from django import forms -from modoboa.lib import db_utils -from modoboa.lib import form_utils +from modoboa.lib import db_utils, form_utils class GenericParametersForm(forms.Form): diff --git a/modoboa/parameters/tools.py b/modoboa/parameters/tools.py index 383b17442..81c4893c4 100644 --- a/modoboa/parameters/tools.py +++ b/modoboa/parameters/tools.py @@ -4,9 +4,7 @@ from __future__ import unicode_literals import copy -from modoboa.lib import exceptions -from modoboa.lib import form_utils -from modoboa.lib import signals +from modoboa.lib import exceptions, form_utils, signals from modoboa.lib.sysutils import guess_extension_name diff --git a/modoboa/relaydomains/forms.py b/modoboa/relaydomains/forms.py index 5aa128ff8..1b9ee412a 100644 --- a/modoboa/relaydomains/forms.py +++ b/modoboa/relaydomains/forms.py @@ -3,8 +3,7 @@ from __future__ import unicode_literals from modoboa.lib.form_utils import WizardStep -from modoboa.transport import forms as tr_forms -from modoboa.transport import models as tr_models +from modoboa.transport import forms as tr_forms, models as tr_models class RelayDomainWizardStep(WizardStep): diff --git a/modoboa/relaydomains/handlers.py b/modoboa/relaydomains/handlers.py index 75ab11b61..80aa81adb 100644 --- a/modoboa/relaydomains/handlers.py +++ b/modoboa/relaydomains/handlers.py @@ -6,16 +6,11 @@ from django.db.models import signals from django.dispatch import receiver from django.utils.translation import ugettext as _ -from modoboa.admin import models as admin_models -from modoboa.admin import signals as admin_signals +from modoboa.admin import models as admin_models, signals as admin_signals from modoboa.core import signals as core_signals from modoboa.lib.email_utils import split_mailbox from modoboa.transport import models as tr_models - -from . import forms -from . import lib -from . import models -from . import postfix_maps +from . import forms, lib, models, postfix_maps @receiver(admin_signals.use_external_recipients) diff --git a/modoboa/relaydomains/lib.py b/modoboa/relaydomains/lib.py index e812ffb27..f737f9453 100644 --- a/modoboa/relaydomains/lib.py +++ b/modoboa/relaydomains/lib.py @@ -6,8 +6,7 @@ from django.utils.translation import ugettext as _ from modoboa.admin import models as admin_models from modoboa.lib.exceptions import BadRequest -from modoboa.transport import backends as tr_backends -from modoboa.transport import models as tr_models +from modoboa.transport import backends as tr_backends, models as tr_models def import_relaydomain(user, row, formopts): diff --git a/modoboa/relaydomains/serializers.py b/modoboa/relaydomains/serializers.py index 9c86efff8..28ec22173 100644 --- a/modoboa/relaydomains/serializers.py +++ b/modoboa/relaydomains/serializers.py @@ -7,8 +7,7 @@ from django.utils.translation import ugettext as _ from rest_framework import serializers from modoboa.admin import models as admin_models -from modoboa.transport import backends as tr_backends -from modoboa.transport import models as tr_models +from modoboa.transport import backends as tr_backends, models as tr_models class TransportSerializer(serializers.ModelSerializer): diff --git a/modoboa/relaydomains/tests.py b/modoboa/relaydomains/tests.py index 888094a73..68e837fcc 100644 --- a/modoboa/relaydomains/tests.py +++ b/modoboa/relaydomains/tests.py @@ -5,18 +5,15 @@ from __future__ import unicode_literals import json from django.core.files.base import ContentFile -from django.urls import reverse from django.test import TestCase +from django.urls import reverse -from modoboa.admin import factories as admin_factories -from modoboa.admin import models as admin_models +from modoboa.admin import factories as admin_factories, models as admin_models from modoboa.core.factories import UserFactory -from modoboa.lib.tests import ModoAPITestCase, ModoTestCase from modoboa.lib.test_utils import MapFilesTestCaseMixin +from modoboa.lib.tests import ModoAPITestCase, ModoTestCase from modoboa.limits import utils as limits_utils -from modoboa.transport import factories as tr_factories -from modoboa.transport import models as tr_models - +from modoboa.transport import factories as tr_factories, models as tr_models from . import models diff --git a/modoboa/relaydomains/urls_api.py b/modoboa/relaydomains/urls_api.py index a7ae5cfae..d877c6f65 100644 --- a/modoboa/relaydomains/urls_api.py +++ b/modoboa/relaydomains/urls_api.py @@ -4,7 +4,6 @@ from rest_framework import routers from . import viewsets - router = routers.SimpleRouter() router.register( r"relaydomains", viewsets.RelayDomainViewSet, base_name="relaydomain") diff --git a/modoboa/relaydomains/viewsets.py b/modoboa/relaydomains/viewsets.py index 681f515bc..d7de1b82d 100644 --- a/modoboa/relaydomains/viewsets.py +++ b/modoboa/relaydomains/viewsets.py @@ -1,10 +1,9 @@ """RelayDomain viewsets.""" from rest_framework import viewsets -from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions +from rest_framework.permissions import DjangoModelPermissions, IsAuthenticated from modoboa.admin import models as admin_models - from . import serializers diff --git a/modoboa/transport/apps.py b/modoboa/transport/apps.py index f7d87dd17..dbdcce73b 100644 --- a/modoboa/transport/apps.py +++ b/modoboa/transport/apps.py @@ -8,4 +8,3 @@ class TransportConfig(AppConfig): def ready(self): from . import handlers - diff --git a/modoboa/transport/forms.py b/modoboa/transport/forms.py index df46b5a56..9d7ec1787 100644 --- a/modoboa/transport/forms.py +++ b/modoboa/transport/forms.py @@ -2,9 +2,7 @@ from django import forms -from . import backends -from . import models - +from . import backends, models TYPE_TO_FIELD_MAP = { "int": forms.IntegerField, diff --git a/modoboa/transport/handlers.py b/modoboa/transport/handlers.py index 1e69bf921..969ae9d8f 100644 --- a/modoboa/transport/handlers.py +++ b/modoboa/transport/handlers.py @@ -6,10 +6,7 @@ from django.db.models import signals from django.dispatch import receiver from modoboa.core import signals as core_signals - -from . import backends -from . import models -from . import postfix_maps +from . import backends, models, postfix_maps @receiver(core_signals.register_postfix_maps) diff --git a/modoboa/transport/models.py b/modoboa/transport/models.py index e8b011008..8f87fe7f5 100644 --- a/modoboa/transport/models.py +++ b/modoboa/transport/models.py @@ -2,13 +2,12 @@ from __future__ import unicode_literals +import jsonfield from reversion import revisions as reversion from django.db import models from django.utils.translation import ugettext_lazy as _ -import jsonfield - from . import backends diff --git a/modoboa/urls.py b/modoboa/urls.py index 2effc0145..bc0475af1 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -2,19 +2,18 @@ from __future__ import unicode_literals from functools import reduce +from ckeditor_uploader import views as cku_views + from django.conf import settings from django.conf.urls import include, url -from django.views.i18n import JavaScriptCatalog - from django.contrib.auth import views as auth_views from django.contrib.auth.decorators import login_required +from django.views.i18n import JavaScriptCatalog -from ckeditor_uploader import views as cku_views from rest_framework.documentation import include_docs_urls from modoboa.admin.views.user import forward -from modoboa.core import signals as core_signals -from modoboa.core import views as core_views +from modoboa.core import signals as core_signals, views as core_views from modoboa.core.extensions import exts_pool API_TITLE = "Modoboa API" diff --git a/modoboa/urls_api.py b/modoboa/urls_api.py index 43ce98a83..7a6ed785f 100644 --- a/modoboa/urls_api.py +++ b/modoboa/urls_api.py @@ -6,7 +6,6 @@ from django.conf.urls import include, url from modoboa.core.extensions import exts_pool - urlpatterns = [ url("", include("modoboa.admin.urls_api")), url("", include("modoboa.limits.urls_api")), diff --git a/setup.py b/setup.py index 5d4e2db31..43abc5c05 100644 --- a/setup.py +++ b/setup.py @@ -12,8 +12,9 @@ from __future__ import unicode_literals import io from os import path + from pip.req import parse_requirements -from setuptools import setup, find_packages +from setuptools import find_packages, setup def get_requirements(requirements_file): diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index ba4356121..85c35a3c2 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -12,12 +12,11 @@ https://docs.djangoproject.com/en/1.11/ref/settings/ from __future__ import unicode_literals -from logging.handlers import SysLogHandler import os +from logging.handlers import SysLogHandler from modoboa.test_settings import * # noqa - # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.realpath(os.path.dirname(os.path.dirname(__file__))) From eaec271e0254954b8048d71f734b71e1482c22ce Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 15:27:28 +0000 Subject: [PATCH 05/42] pep8 fixes - B007 Loop control variable not used within the loop body. If this is intended, start the name with an underscore. * modoboa/admin/lib.py * modoboa/admin/templatetags/admin_tags.py * modoboa/admin/tests/test_account.py * modoboa/admin/views/domain.py * modoboa/admin/views/identity.py * modoboa/core/views/dashboard.py * modoboa/limits/forms.py * modoboa/limits/handlers.py * modoboa/limits/tests/test_api.py * modoboa/limits/tests/test_domain_limits.py * modoboa/limits/tests/test_import.py * modoboa/limits/tests/test_user_limits.py * modoboa/limits/utils.py * modoboa/parameters/tools.py * modoboa/relaydomains/tests.py - C402 Unnecessary generator - rewrite as a dict comprehension. * modoboa/admin/models/domain.py * modoboa/admin/views/domain.py * modoboa/admin/views/identity.py * modoboa/limits/searializers.py - C407 Unnecessary list comprehension - can take a generator. * modoboa/core/password_validation.py * modoboa/parameters/tools.py * modoboa/transport/backends.py - C408 Unnecessary dict call - rewrite as a literal. * modoboa/admin/tests/test_account.py * modoboa/admin/tests/test_alias.py * modoboa/admin/tests/test_password_schemes.py * modoboa/admin/views/domain.py * modoboa/admin/views/identity.py * modoboa/core/extensions.py * modoboa/lib/middleware.py * modoboa/lib/templatetags/form_tags.py * modoboa/lib/templatetags/lib_tags.py * modoboa/lib/web_utils.py * modoboa/limits/handlers.py * modoboa/limits/tests/test_user_limits.py - E741 ambiguous variable name * modoboa/core/management/commands/cleanlogs.py * modoboa/limits/forms.py * modoboa/limits/tests/test_user_limits.py * modoboa/limits/utils.py * modoboa/relaydomains/tests.py - F401 imported but unused * doc/conf.py * modoboa/admin/views/domain.py * modoboa/core/app_settings.py * modoboa/core/management/commands/load_initial_data.py - F821 undefined name 'raw_input' * modoboa/core/commands/deploy.py - F841 local variable 'test' is assigned to but never used * modoboa/core/app_settings.py - N802 function name 'setUpTestData' should be lowercase xxx * modoboa/lib/email_utils.py - __ for name mangeling, _ for internal - N805 first argument of a method should be named 'self' * modoboa/lib/connections.py * modoboa/lib/singleton.py Ignore the following - A001 "copyright" is a python builtin and is being shadowed, consider renaming the variable * doc/conf.py - A003 is a python builtin, consider renaming the class attribute * modoboa/admin/factories.py * modoboa/admin/forms/domain.py * modoboa/admin/management/commands/handle_mailbox_operations.py * modoboa/admin/management/commands/modo.py * modoboa/admin/management/commands/subcommands/_repair.py * modoboa/admin/models/domain.py * modoboa/admin/models/mailbox.py * modoboa/core/commands/__init__.py * modoboa/core/commands/deploy.py * modoboa/core/commands/help.py * modoboa/core/management/commands/clean_inactive_accounts.py * modoboa/core/management/commands/cleanlogs.py * modoboa/core/management/commands/communicate_with_public_api.py * modoboa/core/management/commands/generate_postfix_maps.py * modoboa/core/management/commands/load_initial_data.py * modoboa/core/management/commands/set_default_site.py - F401 imported but unused * modoboa/admin/apps.py - used to load handlers * modoboa/core/password_hashers/__init__.py - dynamically loaded * modoboa/limits/apps.py - used to load handlers * modoboa/relaydomains/apps.py - used to load handlers * modoboa/transport/apps.py - used to load handlers - N802 function name should be lowercase xxx * modoboa/admin/tests/test_account.py * modoboa/admin/tests/test_alias.py * modoboa/admin/tests/test_domain_alias.py * modoboa/admin/tests/test_export.py * modoboa/admin/tests/test_mailbox_operations.py * modoboa/admin/tests/test_password_schemas.py * modoboa/admin/tests/test_repair.py * modoboa/core/tests/test_authentication.py * modoboa/core/tests/test_core.py * modoboa/core/tests/test_ldap.py * modoboa/core/tests/test_views.py * modoboa/lib/imap_utf7.py * modoboa/limits/tests/test_api.py * modoboa/limits/tests/test_domain_limits.py * modoboa/limits/tests/test_import.py * modoboa/limits/tests/test_user_limits.py * modoboa/relaydomains/tests.py other fixes: - use isinstance() instead of type() == Class --- doc/conf.py | 4 +- modoboa/admin/apps.py | 2 +- modoboa/admin/factories.py | 2 +- modoboa/admin/forms/domain.py | 2 +- modoboa/admin/lib.py | 2 +- .../commands/handle_mailbox_operations.py | 2 +- modoboa/admin/management/commands/modo.py | 2 +- .../commands/subcommands/_export.py | 2 +- .../commands/subcommands/_import.py | 2 +- .../management/commands/subcommands/_mx.py | 2 +- .../commands/subcommands/_repair.py | 2 +- modoboa/admin/models/domain.py | 8 +- modoboa/admin/models/mailbox.py | 4 +- modoboa/admin/templatetags/admin_tags.py | 2 +- modoboa/admin/tests/test_account.py | 68 +++++++-------- modoboa/admin/tests/test_alias.py | 84 ++++++++++--------- modoboa/admin/tests/test_api.py | 10 +-- modoboa/admin/tests/test_domain.py | 4 +- modoboa/admin/tests/test_domain_alias.py | 2 +- modoboa/admin/tests/test_export.py | 4 +- modoboa/admin/tests/test_import_.py | 2 +- .../admin/tests/test_mailbox_operations.py | 2 +- modoboa/admin/tests/test_mx.py | 4 +- modoboa/admin/tests/test_password_schemes.py | 14 ++-- modoboa/admin/tests/test_repair.py | 2 +- modoboa/admin/views/domain.py | 12 ++- modoboa/admin/views/identity.py | 13 +-- modoboa/core/app_settings.py | 3 +- modoboa/core/apps.py | 2 +- modoboa/core/checks/__init__.py | 2 +- modoboa/core/commands/__init__.py | 2 +- modoboa/core/commands/deploy.py | 7 +- modoboa/core/commands/help.py | 2 +- modoboa/core/extensions.py | 2 +- .../commands/clean_inactive_accounts.py | 2 +- modoboa/core/management/commands/cleanlogs.py | 8 +- .../commands/communicate_with_public_api.py | 2 +- .../commands/generate_postfix_maps.py | 2 +- .../management/commands/load_initial_data.py | 3 +- .../management/commands/set_default_site.py | 2 +- modoboa/core/password_hashers/__init__.py | 4 +- modoboa/core/password_validation.py | 8 +- modoboa/core/tests/test_authentication.py | 4 +- modoboa/core/tests/test_core.py | 6 +- modoboa/core/tests/test_ldap.py | 2 +- modoboa/core/tests/test_views.py | 2 +- modoboa/core/views/dashboard.py | 2 +- modoboa/lib/connections.py | 22 ++--- modoboa/lib/email_utils.py | 6 +- modoboa/lib/imap_utf7.py | 38 ++++----- modoboa/lib/middleware.py | 4 +- modoboa/lib/singleton.py | 10 +-- modoboa/lib/templatetags/form_tags.py | 13 +-- modoboa/lib/templatetags/lib_tags.py | 4 +- modoboa/lib/web_utils.py | 2 +- modoboa/limits/apps.py | 2 +- modoboa/limits/forms.py | 18 ++-- modoboa/limits/handlers.py | 4 +- modoboa/limits/serializers.py | 5 +- modoboa/limits/tests/test_api.py | 12 +-- modoboa/limits/tests/test_domain_limits.py | 4 +- modoboa/limits/tests/test_import.py | 10 +-- modoboa/limits/tests/test_user_limits.py | 57 ++++++------- modoboa/limits/utils.py | 12 +-- modoboa/parameters/forms.py | 4 +- modoboa/parameters/tests.py | 5 -- modoboa/parameters/tools.py | 10 ++- modoboa/relaydomains/apps.py | 4 +- modoboa/relaydomains/tests.py | 14 ++-- modoboa/transport/apps.py | 2 +- modoboa/transport/backends.py | 11 ++- 71 files changed, 301 insertions(+), 298 deletions(-) delete mode 100644 modoboa/parameters/tests.py diff --git a/doc/conf.py b/doc/conf.py index 109ceb399..1cf6ecc96 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -12,7 +12,7 @@ # serve to show the default. import os -import sys +# import sys # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the @@ -44,7 +44,7 @@ master_doc = "index" # General information about the project. project = u'Modoboa' -copyright = u'2018, Antoine Nguyen' +copyright = u'2018, Antoine Nguyen' # NOQA:A001 # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff --git a/modoboa/admin/apps.py b/modoboa/admin/apps.py index f799fa177..33fb2f4ea 100644 --- a/modoboa/admin/apps.py +++ b/modoboa/admin/apps.py @@ -17,4 +17,4 @@ class AdminConfig(AppConfig): def ready(self): load_admin_settings() - from . import handlers + from . import handlers # NOQA:F401 diff --git a/modoboa/admin/factories.py b/modoboa/admin/factories.py index 3f9b3f26c..5f4cea421 100644 --- a/modoboa/admin/factories.py +++ b/modoboa/admin/factories.py @@ -18,7 +18,7 @@ class DomainFactory(PermissionFactory): model = models.Domain django_get_or_create = ("name", ) - type = "domain" + type = "domain" # NOQA:A003 quota = 0 default_mailbox_quota = 10 enabled = True diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index 7ee2ad6c7..2590e4733 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -26,7 +26,7 @@ from ..models import Alias, Domain, DomainAlias, Mailbox class DomainFormGeneral(forms.ModelForm, DynamicForm): """A form to create/edit a domain.""" - type = forms.ChoiceField( + type = forms.ChoiceField( # NOQA:A003 label=ugettext_lazy("Type"), ) aliases = DomainNameField( diff --git a/modoboa/admin/lib.py b/modoboa/admin/lib.py index 1f9a52b9f..3b0dc8585 100644 --- a/modoboa/admin/lib.py +++ b/modoboa/admin/lib.py @@ -223,7 +223,7 @@ def domain_has_authorized_mx(name): valid_mxs = [ipaddress.ip_network(smart_text(v.strip())) for v in valid_mxs.split() if v.strip()] domain_mxs = get_domain_mx_list(name) - for mx_addr, mx_ip_addr in domain_mxs: # noqa:B007 + for _mx_addr, mx_ip_addr in domain_mxs: for subnet in valid_mxs: if mx_ip_addr in subnet: return True diff --git a/modoboa/admin/management/commands/handle_mailbox_operations.py b/modoboa/admin/management/commands/handle_mailbox_operations.py index e6a0b256b..016d6e909 100644 --- a/modoboa/admin/management/commands/handle_mailbox_operations.py +++ b/modoboa/admin/management/commands/handle_mailbox_operations.py @@ -24,7 +24,7 @@ class OperationError(Exception): class Command(BaseCommand): """Command definition""" - help = "Handles rename and delete operations on mailboxes" + help = "Handles rename and delete operations on mailboxes" # NOQA:A003 def __init__(self, *args, **kwargs): super(Command, self).__init__(*args, **kwargs) diff --git a/modoboa/admin/management/commands/modo.py b/modoboa/admin/management/commands/modo.py index 1d95fa0bc..9a00e5ba8 100644 --- a/modoboa/admin/management/commands/modo.py +++ b/modoboa/admin/management/commands/modo.py @@ -17,7 +17,7 @@ class Command(SubcommandCommand): $ python manage.py modo """ - help = "Modoboa top management command." + help = "Modoboa top management command." # NOQA:A003 subcommands = { "export": ExportCommand, diff --git a/modoboa/admin/management/commands/subcommands/_export.py b/modoboa/admin/management/commands/subcommands/_export.py index 3b9fdb722..334885f68 100644 --- a/modoboa/admin/management/commands/subcommands/_export.py +++ b/modoboa/admin/management/commands/subcommands/_export.py @@ -16,7 +16,7 @@ from .... import models class ExportCommand(BaseCommand): """Command class.""" - help = "Export domains or identities using CSV format" # noqa:A003 + help = "Export domains or identities using CSV format" # NOQA:A003 def add_arguments(self, parser): """Add arguments to command.""" diff --git a/modoboa/admin/management/commands/subcommands/_import.py b/modoboa/admin/management/commands/subcommands/_import.py index 705720aa0..5c24dc3c2 100644 --- a/modoboa/admin/management/commands/subcommands/_import.py +++ b/modoboa/admin/management/commands/subcommands/_import.py @@ -20,7 +20,7 @@ class ImportCommand(BaseCommand): """Command class.""" args = "csvfile" - help = "Import identities from a csv file" # noqa:A003 + help = "Import identities from a csv file" # NOQA:A003 def add_arguments(self, parser): """Add extra arguments to command.""" diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index dc1a26dab..8f0db645e 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -25,7 +25,7 @@ from modoboa.parameters import tools as param_tools class CheckMXRecords(BaseCommand): """Command class.""" - help = "Check defined domains." # noqa:A003 + help = "Check defined domains." # NOQA:A003 @cached_property def providers(self): diff --git a/modoboa/admin/management/commands/subcommands/_repair.py b/modoboa/admin/management/commands/subcommands/_repair.py index e27686cc4..04b0e7984 100644 --- a/modoboa/admin/management/commands/subcommands/_repair.py +++ b/modoboa/admin/management/commands/subcommands/_repair.py @@ -95,7 +95,7 @@ def sometimes_mailbox_have_no_alias(**options): class Repair(BaseCommand): """Command class.""" - help = "Check and fix known problems." + help = "Check and fix known problems." # NOQA:A003 def add_arguments(self, parser): """Add extra arguments to command.""" diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index 74eda5bf0..615e21d49 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -48,7 +48,7 @@ class Domain(AdminObject): help_text=ugettext_lazy("Check to activate this domain"), default=True ) - type = models.CharField(default="domain", max_length=20) + type = models.CharField(default="domain", max_length=20) # NOQA:A003 enable_dns_checks = models.BooleanField( ugettext_lazy("Enable DNS checks"), default=True, help_text=ugettext_lazy("Check to enable DNS checks for this domain") @@ -244,9 +244,9 @@ class Domain(AdminObject): def save(self, *args, **kwargs): """Store current data if domain is renamed.""" if self.oldname != self.name: - self.old_mail_homes = ( - dict((mb.id, mb.mail_home) for mb in self.mailbox_set.all()) - ) + self.old_mail_homes = { + mb.id: mb.mail_home for mb in self.mailbox_set.all() + } super(Domain, self).save(*args, **kwargs) def delete(self, fromuser, keepdir=False): diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index 0b0624714..26e45661b 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -41,7 +41,7 @@ class Quota(models.Model): """Keeps track of Mailbox current quota.""" username = models.EmailField(primary_key=True, max_length=254) - bytes = models.BigIntegerField(default=0) + bytes = models.BigIntegerField(default=0) # NOQA:A003 messages = models.IntegerField(default=0) objects = QuotaManager() @@ -374,7 +374,7 @@ class MailboxOperation(models.Model): mailbox = models.ForeignKey(Mailbox, blank=True, null=True, on_delete=models.CASCADE) - type = models.CharField( + type = models.CharField( # NOQA:A003 max_length=20, choices=(("rename", "rename"), ("delete", "delete")) ) argument = models.TextField() diff --git a/modoboa/admin/templatetags/admin_tags.py b/modoboa/admin/templatetags/admin_tags.py index 83c96e7dd..6cb87b0ef 100644 --- a/modoboa/admin/templatetags/admin_tags.py +++ b/modoboa/admin/templatetags/admin_tags.py @@ -156,7 +156,7 @@ def domain_actions(user, domain): responses = signals.extra_domain_actions.send( sender=None, user=user, domain=domain) - for receiver, response in responses: + for _receiver, response in responses: if response: actions += response diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index d68f78302..75569d181 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -19,7 +19,7 @@ class AuthenticationTestCase(ModoTestCase): """Check authentication.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(AuthenticationTestCase, cls).setUpTestData() cls.mb = factories.MailboxFactory( @@ -43,18 +43,18 @@ class AuthenticationTestCase(ModoTestCase): class AccountTestCase(ModoTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(AccountTestCase, cls).setUpTestData() factories.populate_database() def test_crud(self): - values = dict( - username="tester@test.com", first_name="Tester", last_name="Toto", - password1="Toto1234", password2="Toto1234", role="SimpleUsers", - quota_act=True, - is_active=True, email="tester@test.com", stepid="step2" - ) + values = { + "username": "tester@test.com", "first_name": "Tester", + "last_name": "Toto", "password1": "Toto1234", + "password2": "Toto1234", "role": "SimpleUsers", "quota_act": True, + "is_active": True, "email": "tester@test.com", "stepid": "step2" + } self.ajax_post(reverse("admin:account_add"), values) account = User.objects.get(username="tester@test.com") @@ -341,12 +341,12 @@ class AccountTestCase(ModoTestCase): def test_utf8_username(self): """Create an account with non-ASCII characters.""" - values = dict( - username="téster@test.com", first_name="Tester", last_name="Toto", - password1="Toto1234", password2="Toto1234", role="SimpleUsers", - quota_act=True, - is_active=True, email="téster@test.com", stepid="step2" - ) + values = { + "username": "téster@test.com", "first_name": "Tester", + "last_name": "Toto", "password1": "Toto1234", + "password2": "Toto1234", "role": "SimpleUsers", "quota_act": True, + "is_active": True, "email": "téster@test.com", "stepid": "step2" + } self.ajax_post(reverse("admin:account_add"), values) def _set_quota(self, email, value, expected_status=200): @@ -478,11 +478,11 @@ class LDAPAccountTestCase(test_ldap.LDAPTestCaseMixin, ModoTestCase): class PermissionsTestCase(ModoTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(PermissionsTestCase, cls).setUpTestData() parameters = {} - for name, tpl in limits_utils.get_user_limit_templates(): + for name, _definition in limits_utils.get_user_limit_templates(): parameters["deflt_user_{0}_limit".format(name)] = 2 cls.localconfig.parameters.set_values(parameters, app="limits") cls.localconfig.save() @@ -604,12 +604,12 @@ class PermissionsTestCase(ModoTestCase): for the associated domain, this domain admin must not be able to access the super admin. """ - values = dict( - username="superadmin2@test.com", first_name="Super", - last_name="Admin", password1="Toto1234", password2="Toto1234", - role="SuperAdmins", is_active=True, - email="superadmin2@test.com", stepid="step2" - ) + values = { + "username": "superadmin2@test.com", "first_name": "Super", + "last_name": "Admin", "password1": "Toto1234", + "password2": "Toto1234", "role": "SuperAdmins", "is_active": True, + "email": "superadmin2@test.com", "stepid": "step2" + } self.ajax_post( reverse("admin:account_add"), values @@ -624,22 +624,22 @@ class PermissionsTestCase(ModoTestCase): def test_domainadmin_dlist_local_domain_not_owned(self): """Check if a domain admin can use a local mailbox he can't access as a recipient in a distribution list""" - values = dict( - address="all@test.com", - recipients="user@test.com", - recipients_1="user@test2.com", - enabled=True - ) + values = { + "address": "all@test.com", + "recipients": "user@test.com", + "recipients_1": "user@test2.com", + "enabled": True + } self.ajax_post(reverse("admin:alias_add"), values) def test_domainadmin_master_user(self): """Check domain administrator is not allowed to access this feature.""" - values = dict( - username="user10@test.com", first_name="Test", - last_name="Test", password1="Toto1234", password2="Toto1234", - role="SimpleUsers", is_active=True, master_user=True, - email="user10@test.com", stepid="step2" - ) + values = { + "username": "user10@test.com", "first_name": "Test", + "last_name": "Test", "password1": "Toto1234", + "password2": "Toto1234", "role": "SimpleUsers", "is_active": True, + "master_user": True, "email": "user10@test.com", "stepid": "step2" + } self.ajax_post( reverse("admin:account_add"), values, status=400 diff --git a/modoboa/admin/tests/test_alias.py b/modoboa/admin/tests/test_alias.py index 24dfdb727..506de3da7 100644 --- a/modoboa/admin/tests/test_alias.py +++ b/modoboa/admin/tests/test_alias.py @@ -18,19 +18,19 @@ from ..models import Alias, AliasRecipient, Domain class AliasTestCase(ModoTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(AliasTestCase, cls).setUpTestData() factories.populate_database() def test_alias(self): user = User.objects.get(username="user@test.com") - values = dict( - username="user@test.com", role=user.role, - is_active=user.is_active, email="user@test.com", - aliases="toto@test.com", aliases_1="titi@test.com", - language="en" - ) + values = { + "username": "user@test.com", "role": user.role, + "is_active": user.is_active, "email": "user@test.com", + "aliases": "toto@test.com", "aliases_1": "titi@test.com", + "language": "en" + } self.ajax_post( reverse("admin:account_change", args=[user.id]), values @@ -68,11 +68,11 @@ class AliasTestCase(ModoTestCase): def test_upper_case_alias(self): """Try to create an upper case alias.""" user = User.objects.get(username="user@test.com") - values = dict( - username="user@test.com", role=user.role, - is_active=user.is_active, email="user@test.com", - aliases="Toto@test.com", language="en" - ) + values = { + "username": "user@test.com", "role": user.role, + "is_active": user.is_active, "email": "user@test.com", + "aliases": "Toto@test.com", "language": "en" + } self.ajax_post( reverse("admin:account_change", args=[user.id]), values @@ -98,11 +98,11 @@ class AliasTestCase(ModoTestCase): def test_append_alias_with_tag(self): """Try to create a alias with tag in recipient address""" user = User.objects.get(username="user@test.com") - values = dict( - username="user@test.com", role=user.role, - is_active=user.is_active, email="user@test.com", - language="en" - ) + values = { + "username": "user@test.com", "role": user.role, + "is_active": user.is_active, "email": "user@test.com", + "language": "en" + } self.ajax_post( reverse("admin:account_change", args=[user.id]), values @@ -122,11 +122,13 @@ class AliasTestCase(ModoTestCase): def test_utf8_alias(self): """Test alias with non-ASCII characters.""" - values = dict(address="testé@test.com", - recipients="user@test.com", - recipients_1="admin@test.com", - recipients_2="ext@titi.com", - enabled=True) + values = { + "address": "testé@test.com", + "recipients": "user@test.com", + "recipients_1": "admin@test.com", + "recipients_2": "ext@titi.com", + "enabled": True + } self.ajax_post( reverse("admin:alias_add"), values ) @@ -170,7 +172,7 @@ class AliasTestCase(ModoTestCase): Alias.DoesNotExist, Alias.objects.get, address="all@test.com") def test_forward(self): - values = dict(address="forward2@test.com", recipients="rcpt@dest.com") + values = {"address": "forward2@test.com", "recipients": "rcpt@dest.com"} self.ajax_post( reverse("admin:alias_add"), values ) @@ -193,7 +195,7 @@ class AliasTestCase(ModoTestCase): Alias.DoesNotExist, Alias.objects.get, address="forward2@test.com") def test_forward_and_local_copies(self): - values = dict(address="user@test.com", recipients="rcpt@dest.com") + values = {"address": "user@test.com", "recipients": "rcpt@dest.com"} self.ajax_post( reverse("admin:alias_add"), values ) @@ -244,21 +246,23 @@ class AliasTestCase(ModoTestCase): changed. """ - values = dict(address="list@test.com", - recipients="user@test.com", - recipients_1="admin@test.com", - enabled=True) + values = { + "address": "list@test.com", + "recipients": "user@test.com", + "recipients_1": "admin@test.com", + "enabled": True + } self.ajax_post( reverse("admin:alias_add"), values ) user = User.objects.get(username="user@test.com") - values = dict( - username=user.username, first_name="Tester", last_name="Toto", - password1="Toto1234", password2="Toto1234", role="SimpleUsers", - quota_act=True, is_active=True, email=user.email, - language="en" - ) + values = { + "username": user.username, "first_name": "Tester", + "last_name": "Toto", "password1": "Toto1234", + "password2": "Toto1234", "role": "SimpleUsers", "quota_act": True, + "is_active": True, "email": user.email, "language": "en" + } self.ajax_post(reverse("admin:account_change", args=[user.id]), values) self.assertEqual( @@ -279,12 +283,12 @@ class AliasTestCase(ModoTestCase): self.client.force_login(admin) user = User.objects.get(username="user@test.com") - values = dict( - username="user@test.com", role=user.role, - is_active=user.is_active, email="user@test.com", - aliases="toto@test.com", aliases_1="titi@test2.com", - language="en" - ) + values = { + "username": "user@test.com", "role": user.role, + "is_active": user.is_active, "email": "user@test.com", + "aliases": "toto@test.com", "aliases_1": "titi@test2.com", + "language": "en" + } response = self.ajax_post( reverse("admin:account_change", args=[user.id]), values, 400 diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index fdcfbdf61..a5205742a 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -26,7 +26,7 @@ class DomainAPITestCase(ModoAPITestCase): """Check API.""" @classmethod - def setUpTestData(cls): # noqa: N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(DomainAPITestCase, cls).setUpTestData() factories.populate_database() @@ -137,7 +137,7 @@ class DomainAliasAPITestCase(ModoAPITestCase): """Check DomainAlias API.""" @classmethod - def setUpTestData(cls): # noqa: N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(DomainAliasAPITestCase, cls).setUpTestData() factories.populate_database() @@ -231,7 +231,7 @@ class AccountAPITestCase(ModoAPITestCase): } @classmethod - def setUpTestData(cls): # noqa: N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(AccountAPITestCase, cls).setUpTestData() factories.populate_database() @@ -563,7 +563,7 @@ class AliasAPITestCase(ModoAPITestCase): } @classmethod - def setUpTestData(cls): # noqa: N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(AliasAPITestCase, cls).setUpTestData() cls.localconfig.parameters.set_value( @@ -686,7 +686,7 @@ class SenderAddressAPITestCase(ModoAPITestCase): """Check SenderAddress API.""" @classmethod - def setUpTestData(cls): # noqa: N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(SenderAddressAPITestCase, cls).setUpTestData() cls.localconfig.parameters.set_value( diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index 3e3849e36..c8abbf2c5 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -29,7 +29,7 @@ class DomainTestCase(ModoTestCase): """Test case for Domain.""" @classmethod - def setUpTestData(cls): # noqa: N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(DomainTestCase, cls).setUpTestData() factories.populate_database() @@ -361,7 +361,7 @@ class DKIMTestCase(ModoTestCase): """Test case for DKIM.""" @classmethod - def setUpTestData(cls): # noqa: N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(DKIMTestCase, cls).setUpTestData() factories.populate_database() diff --git a/modoboa/admin/tests/test_domain_alias.py b/modoboa/admin/tests/test_domain_alias.py index 7ba2c5f51..9171634d1 100644 --- a/modoboa/admin/tests/test_domain_alias.py +++ b/modoboa/admin/tests/test_domain_alias.py @@ -12,7 +12,7 @@ from ..models import Alias, Domain, DomainAlias class DomainAliasTestCase(ModoTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(DomainAliasTestCase, cls).setUpTestData() factories.populate_database() diff --git a/modoboa/admin/tests/test_export.py b/modoboa/admin/tests/test_export.py index d229e5881..fa0912086 100644 --- a/modoboa/admin/tests/test_export.py +++ b/modoboa/admin/tests/test_export.py @@ -15,7 +15,7 @@ class ExportTestCase(ModoTestCase): """Test case for export operations.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(ExportTestCase, cls).setUpTestData() factories.populate_database() @@ -38,7 +38,7 @@ class ExportTestCase(ModoTestCase): {"filename": "test.csv"} ) - def assertListEqual(self, list1, list2): + def assertListEqual(self, list1, list2): # NOQA:N802 list1 = force_text(list1).split("\r\n") list2 = force_text(list2).split("\r\n") self.assertEqual(len(list1), len(list2)) diff --git a/modoboa/admin/tests/test_import_.py b/modoboa/admin/tests/test_import_.py index f5865703c..49aeb8fbf 100644 --- a/modoboa/admin/tests/test_import_.py +++ b/modoboa/admin/tests/test_import_.py @@ -19,7 +19,7 @@ from ..models import Alias, Domain, DomainAlias class ImportTestCase(ModoTestCase): @classmethod - def setUpTestData(cls): # noqa:N802 + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(ImportTestCase, cls).setUpTestData() cls.localconfig.parameters.set_value( diff --git a/modoboa/admin/tests/test_mailbox_operations.py b/modoboa/admin/tests/test_mailbox_operations.py index a6a8e7597..3a602cb59 100644 --- a/modoboa/admin/tests/test_mailbox_operations.py +++ b/modoboa/admin/tests/test_mailbox_operations.py @@ -22,7 +22,7 @@ class MailboxOperationTestCase(ModoTestCase): """Test management command.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(MailboxOperationTestCase, cls).setUpTestData() factories.populate_database() diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 10e1e828c..d75c149be 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -24,7 +24,7 @@ class MXTestCase(ModoTestCase): """TestCase for DNSBL related features.""" @classmethod - def setUpTestData(cls): # noqa:N802 + def setUpTestData(cls): # NOQA:N802 """Create some data.""" super(MXTestCase, cls).setUpTestData() cls.domain = factories.DomainFactory(name="modoboa.org") @@ -138,7 +138,7 @@ class DNSBLTestCase(ModoTestCase): """TestCase for DNSBL related features.""" @classmethod - def setUpTestData(cls): # noqa:N802 + def setUpTestData(cls): # NOQA:N802 """Create some data.""" super(DNSBLTestCase, cls).setUpTestData() cls.domain = factories.DomainFactory(name="modoboa.org") diff --git a/modoboa/admin/tests/test_password_schemes.py b/modoboa/admin/tests/test_password_schemes.py index 4c2449bbf..646383fd7 100644 --- a/modoboa/admin/tests/test_password_schemes.py +++ b/modoboa/admin/tests/test_password_schemes.py @@ -10,18 +10,18 @@ from .. import factories class PasswordSchemesTestCase(ModoTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(PasswordSchemesTestCase, cls).setUpTestData() factories.populate_database() def _create_account(self): - values = dict( - username="tester@test.com", first_name="Tester", last_name="Toto", - password1="Toto1234", password2="Toto1234", role="SimpleUsers", - quota_act=True, - is_active=True, email="tester@test.com", stepid="step2" - ) + values = { + "username": "tester@test.com", "first_name": "Tester", + "last_name": "Toto", "password1": "Toto1234", + "password2": "Toto1234", "role": "SimpleUsers", "quota_act": True, + "is_active": True, "email": "tester@test.com", "stepid": "step2" + } self.ajax_post( reverse("admin:account_add"), values diff --git a/modoboa/admin/tests/test_repair.py b/modoboa/admin/tests/test_repair.py index cef009468..ac3845215 100644 --- a/modoboa/admin/tests/test_repair.py +++ b/modoboa/admin/tests/test_repair.py @@ -13,7 +13,7 @@ class RepairTestCase(ModoTestCase): """TestCase for repair command.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create some data.""" super(RepairTestCase, cls).setUpTestData() factories.populate_database() diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index ffa92f5df..8a9fb77c0 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -45,10 +45,10 @@ def _domains(request): if extra_filters: extra_filters = reduce( lambda a, b: a + b, [result[1] for result in extra_filters]) - filters = dict( - (flt, request.GET.get(flt, None)) + filters = { + flt: request.GET.get(flt, None) for flt in ["domfilter", "searchquery"] + extra_filters - ) + } request.session["domains_filters"] = filters domainlist = get_domains(request.user, **filters) if sort_order == "name": @@ -116,8 +116,6 @@ def domains_list(request): @login_required @permission_required("admin.add_domain") def list_quotas(request): - from modoboa.lib.db_utils import db_type - sort_order, sort_dir = get_sort_order(request.GET, "name") domains = Domain.objects.get_for_admin(request.user) domains = domains.exclude(quota=0) @@ -162,7 +160,7 @@ def editdomain(request, dom_id): if not request.user.can_access(domain): raise PermDeniedException - instances = dict(general=domain) + instances = {"general": domain} results = signals.get_domain_form_instances.send( sender="editdomain", user=request.user, domain=domain) for result in results: @@ -215,7 +213,7 @@ class DomainDetailView( "enable_mx_checks": parameters.get_value("enable_mx_checks"), "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks"), }) - for receiver, widgets in result: + for _receiver, widgets in result: for widget in widgets: context["templates"][widget["column"]].append( widget["template"]) diff --git a/modoboa/admin/views/identity.py b/modoboa/admin/views/identity.py index 9379c3777..df4429321 100644 --- a/modoboa/admin/views/identity.py +++ b/modoboa/admin/views/identity.py @@ -30,8 +30,10 @@ from ..models import Domain, Mailbox u.has_perm("admin.add_alias") ) def _identities(request): - filters = dict((fname, request.GET.get(fname, None)) - for fname in ["searchquery", "idtfilter", "grpfilter"]) + filters = { + fname: request.GET.get(fname, None) + for fname in ["searchquery", "idtfilter", "grpfilter"] + } request.session["identities_filters"] = filters idents_list = get_identities(request.user, **filters) sort_order, sort_dir = get_sort_order(request.GET, "identity", @@ -173,8 +175,9 @@ def editaccount(request, pk): raise PermDeniedException mb = account.mailbox if hasattr(account, "mailbox") else None - instances = dict( - general=account, profile=account, mail=mb, perms=account) + instances = { + "general": account, "profile": account, "mail": mb, "perms": account + } results = signals.get_account_form_instances.send( sender="editaccount", user=request.user, account=account) for result in results: @@ -232,7 +235,7 @@ class AccountDetailView( result = signals.extra_account_dashboard_widgets.send( self.__class__, user=self.request.user, account=self.object) context["templates"] = {"left": [], "right": []} - for receiver, widgets in result: + for _receiver, widgets in result: for widget in widgets: context["templates"][widget["column"]].append( widget["template"]) diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index fb0488028..d08a12610 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -8,7 +8,6 @@ from django.contrib.auth import password_validation from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.lib import fields as lib_fields -from modoboa.lib.cryptutils import random_key from modoboa.lib.form_utils import ( HorizontalRadioSelect, SeparatorField, YesNoField ) @@ -341,7 +340,7 @@ class GeneralParametersForm(param_forms.AdminParametersForm): def clean_ldap_user_dn_template(self): tpl = self.cleaned_data["ldap_user_dn_template"] try: - test = tpl % {"user": "toto"} + tpl % {"user": "toto"} except (KeyError, ValueError): raise forms.ValidationError(_("Invalid syntax")) return tpl diff --git a/modoboa/core/apps.py b/modoboa/core/apps.py index a11d1d5c3..eff453ddc 100644 --- a/modoboa/core/apps.py +++ b/modoboa/core/apps.py @@ -30,7 +30,7 @@ class CoreConfig(AppConfig): load_core_settings() # Import these to force registration of checks and signals - from . import checks # noqa:F401 + from . import checks # NOQA:F401 from . import handlers signals.post_migrate.connect(handlers.create_local_config, sender=self) diff --git a/modoboa/core/checks/__init__.py b/modoboa/core/checks/__init__.py index 95e25bed1..e41b8f04b 100644 --- a/modoboa/core/checks/__init__.py +++ b/modoboa/core/checks/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # Import these to force registration of checks -from . import settings_checks # noqa:F401 +from . import settings_checks # NOQA:F401 diff --git a/modoboa/core/commands/__init__.py b/modoboa/core/commands/__init__.py index 2c5a12529..a3bad62db 100644 --- a/modoboa/core/commands/__init__.py +++ b/modoboa/core/commands/__init__.py @@ -17,7 +17,7 @@ class Command(object): A valid administrative command must inherit from this class. """ - help = "No help available." + help = "No help available." # NOQA:A003 def __init__(self, commands, verbose=False): self._commands = commands diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index a09c840e6..e54d39dc3 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -18,6 +18,7 @@ import django from django.core import management from django.template import Context, Template from django.utils.encoding import smart_str +from django.utils.six.moves import input from modoboa.core.commands import Command from modoboa.lib.api_client import ModoAPIClient @@ -29,10 +30,6 @@ except ImportError: sys.exit(2) - -if sys.version_info < (3, 0, 0): - input = raw_input - DBCONN_TPL = """ '{{ conn_name }}': { 'ENGINE': '{{ ENGINE }}', @@ -53,7 +50,7 @@ class DeployCommand(Command): """The ``deploy`` command.""" - help = ( + help = ( # NOQA:A003 "Create a fresh django project (calling startproject)" " and apply Modoboa specific settings." ) diff --git a/modoboa/core/commands/help.py b/modoboa/core/commands/help.py index 9799f379d..2d8619589 100644 --- a/modoboa/core/commands/help.py +++ b/modoboa/core/commands/help.py @@ -9,7 +9,7 @@ from . import Command class HelpCommand(Command): - help = "Display the help message associated to a specific command" + help = "Display the help message associated to a specific command" # NOQA:A003 def __init__(self, *args, **kwargs): super(HelpCommand, self).__init__(*args, **kwargs) diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index 79323e1d1..6f7e43fd6 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -60,7 +60,7 @@ class ExtensionsPool(object): :param ext: a class inheriting from ``Extension`` :param show: list the extension or not """ - self.extensions[ext.name] = dict(cls=ext, show=show) + self.extensions[ext.name] = {"cls": ext, "show": show} def get_extension(self, name): """Retrieve the current instance of an extension.""" diff --git a/modoboa/core/management/commands/clean_inactive_accounts.py b/modoboa/core/management/commands/clean_inactive_accounts.py index 16fc826fe..c989ae949 100644 --- a/modoboa/core/management/commands/clean_inactive_accounts.py +++ b/modoboa/core/management/commands/clean_inactive_accounts.py @@ -15,7 +15,7 @@ from ... import models class Command(BaseCommand): """Management command to clean inactive accounts.""" - help = "Inactive accounts cleanup" + help = "Inactive accounts cleanup" # NOQA:A003 def add_arguments(self, parser): """Add extra arguments to command line.""" diff --git a/modoboa/core/management/commands/cleanlogs.py b/modoboa/core/management/commands/cleanlogs.py index 1513819c3..fa3632612 100644 --- a/modoboa/core/management/commands/cleanlogs.py +++ b/modoboa/core/management/commands/cleanlogs.py @@ -15,7 +15,7 @@ from modoboa.parameters import tools as param_tools class Command(BaseCommand): """Command class.""" - help = "Log table cleanup" + help = "Log table cleanup" # NOQA:A003 def add_arguments(self, parser): """Add extra arguments to command line.""" @@ -33,9 +33,9 @@ class Command(BaseCommand): def handle(self, *args, **options): if options["debug"]: - l = logging.getLogger("django.db.backends") - l.setLevel(logging.DEBUG) - l.addHandler(logging.StreamHandler()) + log = logging.getLogger("django.db.backends") + log.setLevel(logging.DEBUG) + log.addHandler(logging.StreamHandler()) self.verbose = options["verbose"] log_maximum_age = param_tools.get_global_parameter("log_maximum_age") diff --git a/modoboa/core/management/commands/communicate_with_public_api.py b/modoboa/core/management/commands/communicate_with_public_api.py index 59e0beb84..0cce51d0e 100644 --- a/modoboa/core/management/commands/communicate_with_public_api.py +++ b/modoboa/core/management/commands/communicate_with_public_api.py @@ -13,7 +13,7 @@ from ... import models class Command(BaseCommand): """Command class.""" - help = "Communicate with Modoboa public API." + help = "Communicate with Modoboa public API." # NOQA:A003 def handle(self, *args, **options): """Command entry point.""" diff --git a/modoboa/core/management/commands/generate_postfix_maps.py b/modoboa/core/management/commands/generate_postfix_maps.py index 8749da6f2..6071e928b 100644 --- a/modoboa/core/management/commands/generate_postfix_maps.py +++ b/modoboa/core/management/commands/generate_postfix_maps.py @@ -25,7 +25,7 @@ MAP_FILE_TEMPLATE = """# This file was generated on {{ date }} by running: class Command(BaseCommand): """Command class.""" - help = "Generate/update postfix map files." + help = "Generate/update postfix map files." # NOQA:A003 def add_arguments(self, parser): """Add extra arguments.""" diff --git a/modoboa/core/management/commands/load_initial_data.py b/modoboa/core/management/commands/load_initial_data.py index dd515b2a9..2f633d552 100644 --- a/modoboa/core/management/commands/load_initial_data.py +++ b/modoboa/core/management/commands/load_initial_data.py @@ -12,7 +12,6 @@ from functools import reduce from django.contrib.auth.models import Group from django.core.management.base import BaseCommand -from modoboa.lib.cryptutils import random_key from modoboa.lib.permissions import add_permissions_to_group from ... import constants, extensions, models, signals @@ -20,7 +19,7 @@ from ... import constants, extensions, models, signals class Command(BaseCommand): """Command definition.""" - help = "Load Modoboa initial data" + help = "Load Modoboa initial data" # NOQA:A003 def add_arguments(self, parser): """Add extra arguments to command.""" diff --git a/modoboa/core/management/commands/set_default_site.py b/modoboa/core/management/commands/set_default_site.py index 83ab25b95..982b3dae6 100644 --- a/modoboa/core/management/commands/set_default_site.py +++ b/modoboa/core/management/commands/set_default_site.py @@ -15,7 +15,7 @@ class Command(BaseCommand): """Management command to set the default site.""" - help = "Set default site (see django.contrib.sites)" + help = "Set default site (see django.contrib.sites)" # NOQA:A003 def add_arguments(self, parser): """Define command arguments.""" diff --git a/modoboa/core/password_hashers/__init__.py b/modoboa/core/password_hashers/__init__.py index 0a06ea924..31b90c437 100644 --- a/modoboa/core/password_hashers/__init__.py +++ b/modoboa/core/password_hashers/__init__.py @@ -4,10 +4,10 @@ Password hashers for Modoboa. from __future__ import unicode_literals -from modoboa.core.password_hashers.advanced import ( +from modoboa.core.password_hashers.advanced import ( # NOQA:F401 BLFCRYPTHasher, MD5CRYPTHasher, SHA256CRYPTHasher, SHA512CRYPTHasher ) -from modoboa.core.password_hashers.base import ( +from modoboa.core.password_hashers.base import ( # NOQA:F401 CRYPTHasher, MD5Hasher, PLAINHasher, SHA256Hasher ) diff --git a/modoboa/core/password_validation.py b/modoboa/core/password_validation.py index e69dac511..f9eb9d84f 100644 --- a/modoboa/core/password_validation.py +++ b/modoboa/core/password_validation.py @@ -19,7 +19,7 @@ class ComplexityValidator(object): special_characters = "~!@#$%^&*()_+{}\":;,'[]" condition = ( self.digits > 0 and - sum([1 for char in password if char.isdigit()]) < self.digits) + sum(1 for char in password if char.isdigit()) < self.digits) if condition: raise ValidationError( ungettext( @@ -29,7 +29,7 @@ class ComplexityValidator(object): ).format(self.digits)) condition = ( self.lower > 0 and - sum([1 for char in password if char.islower()]) < self.lower) + sum(1 for char in password if char.islower()) < self.lower) if condition: raise ValidationError( ungettext( @@ -40,7 +40,7 @@ class ComplexityValidator(object): .format(self.lower)) condition = ( self.upper > 0 and - sum([1 for char in password if char.isupper()]) < self.upper) + sum(1 for char in password if char.isupper()) < self.upper) if condition: raise ValidationError( ungettext( @@ -51,7 +51,7 @@ class ComplexityValidator(object): .format(self.upper)) condition = ( self.specials > 0 and - sum([1 for char in password if char in special_characters]) < + sum(1 for char in password if char in special_characters) < self.specials) if condition: raise ValidationError( diff --git a/modoboa/core/tests/test_authentication.py b/modoboa/core/tests/test_authentication.py index 99c32cf3d..ff23ed729 100644 --- a/modoboa/core/tests/test_authentication.py +++ b/modoboa/core/tests/test_authentication.py @@ -21,7 +21,7 @@ class AuthenticationTestCase(ModoTestCase): """Validate authentication scenarios.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(AuthenticationTestCase, cls).setUpTestData() cls.account = factories.UserFactory( @@ -67,7 +67,7 @@ class PasswordResetTestCase(ModoTestCase): """Test password reset service.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(PasswordResetTestCase, cls).setUpTestData() cls.account_ok = factories.UserFactory( diff --git a/modoboa/core/tests/test_core.py b/modoboa/core/tests/test_core.py index 28c4aed85..7fff6e4a9 100644 --- a/modoboa/core/tests/test_core.py +++ b/modoboa/core/tests/test_core.py @@ -20,7 +20,7 @@ class AuthenticationTestCase(ModoTestCase): """Validate authentication scenarios.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(AuthenticationTestCase, cls).setUpTestData() cls.account = factories.UserFactory( @@ -101,7 +101,7 @@ class ProfileTestCase(ModoTestCase): """Profile related tests.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(ProfileTestCase, cls).setUpTestData() cls.account = factories.UserFactory( @@ -160,7 +160,7 @@ class APIAccessFormTestCase(ModoTestCase): """Check form access.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(APIAccessFormTestCase, cls).setUpTestData() cls.account = factories.UserFactory( diff --git a/modoboa/core/tests/test_ldap.py b/modoboa/core/tests/test_ldap.py index 98c566c04..ba20dcd91 100644 --- a/modoboa/core/tests/test_ldap.py +++ b/modoboa/core/tests/test_ldap.py @@ -130,7 +130,7 @@ class ProfileTestCase(LDAPTestCaseMixin, ModoTestCase): """Profile related tests.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(ProfileTestCase, cls).setUpTestData() cls.account = factories.UserFactory( diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index d99560f50..33d8e7bb4 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -89,7 +89,7 @@ class DashboardTestCase(ModoTestCase): """Dashboard tests.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create some data.""" super(DashboardTestCase, cls).setUpTestData() cls.dadmin = factories.UserFactory( diff --git a/modoboa/core/views/dashboard.py b/modoboa/core/views/dashboard.py index f44f0e8c1..748e642af 100644 --- a/modoboa/core/views/dashboard.py +++ b/modoboa/core/views/dashboard.py @@ -72,7 +72,7 @@ class DashboardView(auth_mixins.AccessMixin, generic.TemplateView): # Extra widgets result = signals.extra_admin_dashboard_widgets.send( sender=self.__class__, user=self.request.user) - for receiver, widgets in result: + for _receiver, widgets in result: for widget in widgets: context["widgets"][widget["column"]].append( widget["template"]) diff --git a/modoboa/lib/connections.py b/modoboa/lib/connections.py index 09287c5e8..8925991d3 100644 --- a/modoboa/lib/connections.py +++ b/modoboa/lib/connections.py @@ -11,27 +11,27 @@ class ConnectionsManager(type): This class is specialized in connection management. """ - def __init__(cls, name, bases, ctx): - super(ConnectionsManager, cls).__init__(name, bases, ctx) - cls.instances = {} + def __init__(self, name, bases, ctx): + super(ConnectionsManager, self).__init__(name, bases, ctx) + self.instances = {} - def __call__(cls, **kwargs): + def __call__(self, **kwargs): key = None if "user" in kwargs: key = kwargs["user"] else: return None - if key not in cls.instances: - cls.instances[key] = None + if key not in self.instances: + self.instances[key] = None if "password" in kwargs: kwargs["password"] = decrypt(kwargs["password"]) - if cls.instances[key] is None: - cls.instances[key] = \ - super(ConnectionsManager, cls).__call__(**kwargs) + if self.instances[key] is None: + self.instances[key] = \ + super(ConnectionsManager, self).__call__(**kwargs) else: - cls.instances[key].refresh(key, kwargs["password"]) - return cls.instances[key] + self.instances[key].refresh(key, kwargs["password"]) + return self.instances[key] class ConnectionError(Exception): diff --git a/modoboa/lib/email_utils.py b/modoboa/lib/email_utils.py index 13df77ac2..f1be3a8e6 100644 --- a/modoboa/lib/email_utils.py +++ b/modoboa/lib/email_utils.py @@ -387,7 +387,7 @@ def set_email_headers(msg, subject, sender, rcpt): msg["Date"] = formatdate(time.time(), True) -def __sendmail(sender, rcpt, msgstring, server="localhost", port=25): +def _sendmail(sender, rcpt, msgstring, server="localhost", port=25): """Message sending Return a tuple (True, None) on success, (False, error message) @@ -426,7 +426,7 @@ def sendmail_simple( """ msg = MIMEText(content, _charset="utf-8") set_email_headers(msg, subject, sender, rcpt) - return __sendmail(sender, rcpt, msg.as_string(), **kwargs) + return _sendmail(sender, rcpt, msg.as_string(), **kwargs) def sendmail_fromfile(sender, rcpt, fname): @@ -452,4 +452,4 @@ To: %s content += fp.read() fp.close() - return __sendmail(sender, rcpt, content) + return _sendmail(sender, rcpt, content) diff --git a/modoboa/lib/imap_utf7.py b/modoboa/lib/imap_utf7.py index 050e92a35..0e305c803 100644 --- a/modoboa/lib/imap_utf7.py +++ b/modoboa/lib/imap_utf7.py @@ -65,7 +65,7 @@ def modified_utf7(s): return s_utf7[1:-1].replace(b"/", b",") -def doB64(_in, r): +def doB64(_in, r): # NOQA:N802 if _in: r.extend([b"&", modified_utf7("".join(_in)), b"-"]) del _in[:] @@ -137,32 +137,32 @@ codecs.register(imap4_utf_7) # testing methods -def imapUTF7Encode(ust): +def imapUTF7Encode(ust): # NOQA:N802 "Returns imap utf-7 encoded version of string" return ust.encode("imap4-utf-7") -def imapUTF7EncodeSequence(seq): +def imapUTF7EncodeSequence(seq): # NOQA:N802 "Returns imap utf-7 encoded version of strings in sequence" return [imapUTF7Encode(itm) for itm in seq] -def imapUTF7Decode(st): +def imapUTF7Decode(st): # NOQA:N802 "Returns utf7 encoded version of imap utf-7 string" return st.decode("imap4-utf-7") -def imapUTF7DecodeSequence(seq): +def imapUTF7DecodeSequence(seq): # NOQA:N802 "Returns utf7 encoded version of imap utf-7 strings in sequence" return [imapUTF7Decode(itm) for itm in seq] -def utf8Decode(st): +def utf8Decode(st): # NOQA:N802 "Returns utf7 encoded version of imap utf-7 string" return st.decode("utf-8") -def utf7SequenceToUTF8(seq): +def utf7SequenceToUTF8(seq): # NOQA:N802 "Returns utf7 encoded version of imap utf-7 strings in sequence" return [itm.decode("imap4-utf-7").encode("utf-8") for itm in seq] @@ -171,33 +171,33 @@ __all__ = ["imapUTF7Encode", "imapUTF7Decode", ] if __name__ == "__main__": - # print u'bøx'.encode('imap4-utf-7') + # print u'bøx'.encode('imap4-utf-7') # print 'expected b&APg-x' - # print u'båx'.encode('imap4-utf-7') + # print u'bÃ¥x'.encode('imap4-utf-7') # print 'expected b&AOU-x' print("#######") - print("bøx") - e = imapUTF7Encode(u'bøx') + print("bøx") + e = imapUTF7Encode(u'bøx') print(e) print(imapUTF7Decode(e).encode("latin-1")) print("#######") - print("båx") - e = imapUTF7Encode(u'båx') + print("bÃ¥x") + e = imapUTF7Encode(u'bÃ¥x') print(e) print(imapUTF7Decode(e).encode("latin-1")) print("#######") - print("~/bågø") - e = imapUTF7Encode(u'~/bågø') + print("~/bÃ¥gø") + e = imapUTF7Encode(u'~/bÃ¥gø') print(e) print(imapUTF7Decode(e).encode("latin-1")) print("#######") - print("Ting & Såger") - e = imapUTF7Encode(u'Ting & Såger') + print("Ting & SÃ¥ger") + e = imapUTF7Encode(u'Ting & SÃ¥ger') print(e) print(imapUTF7Decode(e).encode("latin-1")) @@ -208,8 +208,8 @@ if __name__ == "__main__": # print e.encode('latin-1') print("#######") - print("~/Følder/mailbåx & stuff + more") - n = u'~/Følder/mailbåx & stuff + more' + print("~/Følder/mailbÃ¥x & stuff + more") + n = u'~/Følder/mailbÃ¥x & stuff + more' e = imapUTF7Encode(n) print(e) print(imapUTF7Decode(e).encode("latin-1")) diff --git a/modoboa/lib/middleware.py b/modoboa/lib/middleware.py index 9e602dc82..ae86808dd 100644 --- a/modoboa/lib/middleware.py +++ b/modoboa/lib/middleware.py @@ -19,7 +19,7 @@ class AjaxLoginRedirect(MiddlewareMixin): def process_response(self, request, response): if request.is_ajax(): - if type(response) == HttpResponseRedirect: + if isinstance(response, HttpResponseRedirect): response.status_code = 278 return response @@ -41,7 +41,7 @@ class CommonExceptionCatcher(MiddlewareMixin): smart_text(exception), status=exception.http_code ) return _render_error( - request, user_context=dict(error=smart_text(exception)) + request, user_context={"error": smart_text(exception)} ) diff --git a/modoboa/lib/singleton.py b/modoboa/lib/singleton.py index 945fe682e..65c9a90aa 100644 --- a/modoboa/lib/singleton.py +++ b/modoboa/lib/singleton.py @@ -5,11 +5,11 @@ from __future__ import unicode_literals class _Singleton(type): _instances = {} - def __call__(cls, *args, **kwargs): - if cls not in cls._instances: - cls._instances[cls] = \ - super(_Singleton, cls).__call__(*args, **kwargs) - return cls._instances[cls] + def __call__(self, *args, **kwargs): + if self not in self._instances: + self._instances[self] = \ + super(_Singleton, self).__call__(*args, **kwargs) + return self._instances[self] class Singleton(_Singleton("SingletonMeta", (object,), {})): diff --git a/modoboa/lib/templatetags/form_tags.py b/modoboa/lib/templatetags/form_tags.py index 77a2570e5..4ad4c4b2c 100644 --- a/modoboa/lib/templatetags/form_tags.py +++ b/modoboa/lib/templatetags/form_tags.py @@ -18,7 +18,7 @@ register = template.Library() def render_form(form, tpl=None): """Render a form.""" if tpl is not None: - return render_to_string(tpl, dict(form=form)) + return render_to_string(tpl, {"form": form}) ret = "" for field in form: @@ -44,7 +44,7 @@ def render_field( """Render a field.""" from modoboa.core.templatetags.core_tags import visirule - if type(field.field) is SeparatorField: + if isinstance(field.field, SeparatorField): return "%s" % (visirule(field), smart_text(field.label)) configure_field_classes(field) context = { @@ -75,10 +75,11 @@ def render_fields_group(form, pattern): group += [bfield] cpt += 1 - return render_to_string("common/generic_fields_group.html", dict( - label=label, help_text=first.help_text, group=group, haserror=haserror, - pattern=pattern - )) + return render_to_string( + "common/generic_fields_group.html", + {"label": label, "help_text": first.help_text, "group": group, + "haserror": haserror, "pattern": pattern} + ) @register.simple_tag diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index 699e8ea5b..ebd09c163 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -36,7 +36,7 @@ def alert(msg, typ): {{ msg }} """) - return t.render(Context(dict(type=typ, msg=msg))) + return t.render(Context({"type": typ, "msg": msg})) @register.simple_tag @@ -51,7 +51,7 @@ class="{{ mdclass }}{% if link.class %} {{ link.class }}{% endif %}" > {% if link.img %}{% endif %} {{ link.label }}""") - return t.render(Context(dict(link=linkdef, mdclass=mdclass))) + return t.render(Context({"link": linkdef, "mdclass": mdclass})) @register.simple_tag diff --git a/modoboa/lib/web_utils.py b/modoboa/lib/web_utils.py index 8870e86ad..c5cf371e3 100644 --- a/modoboa/lib/web_utils.py +++ b/modoboa/lib/web_utils.py @@ -29,7 +29,7 @@ def render_actions(actions): t = template.Template("""{% load lib_tags %} {% for a in actions %}{% render_link a %}{% endfor %} """) - return t.render(template.Context(dict(actions=actions))) + return t.render(template.Context({"actions": actions})) def getctx(status, level=1, callback=None, **kwargs): diff --git a/modoboa/limits/apps.py b/modoboa/limits/apps.py index 4716d1f19..5b6628993 100644 --- a/modoboa/limits/apps.py +++ b/modoboa/limits/apps.py @@ -24,4 +24,4 @@ class LimitsConfig(AppConfig): def ready(self): load_limits_settings() - from . import handlers + from . import handlers # NOQA:F401 diff --git a/modoboa/limits/forms.py b/modoboa/limits/forms.py index 149baa6d4..df8e0b6c7 100644 --- a/modoboa/limits/forms.py +++ b/modoboa/limits/forms.py @@ -51,16 +51,16 @@ class ResourcePoolForm(forms.Form): def save(self): owner = get_object_owner(self.account) - for name, ltpl in utils.get_user_limit_templates(): + for name, _definition in utils.get_user_limit_templates(): fieldname = "{}_limit".format(name) if fieldname not in self.cleaned_data: continue - l = self.account.userobjectlimit_set.get(name=name) + limit = self.account.userobjectlimit_set.get(name=name) if not owner.is_superuser: allocate_resources_from_user( - l, owner, self.cleaned_data[fieldname]) - l.max_value = self.cleaned_data[fieldname] - l.save(update_fields=["max_value"]) + limit, owner, self.cleaned_data[fieldname]) + limit.max_value = self.cleaned_data[fieldname] + limit.save(update_fields=["max_value"]) class DomainLimitsForm(forms.Form): @@ -93,10 +93,10 @@ class DomainLimitsForm(forms.Form): def save(self, user, **kwargs): """Set limits.""" - for name, ltpl in utils.get_domain_limit_templates(): + for name, _definition in utils.get_domain_limit_templates(): fieldname = "{}_limit".format(name) if fieldname not in self.cleaned_data: continue - l = self.domain.domainobjectlimit_set.get(name=name) - l.max_value = self.cleaned_data[fieldname] - l.save() + limit = self.domain.domainobjectlimit_set.get(name=name) + limit.max_value = self.cleaned_data[fieldname] + limit.save() diff --git a/modoboa/limits/handlers.py b/modoboa/limits/handlers.py index ba080bcbd..36e9838b2 100644 --- a/modoboa/limits/handlers.py +++ b/modoboa/limits/handlers.py @@ -62,7 +62,7 @@ def create_domain_limits(sender, instance, **kwargs): if not kwargs.get("created"): return global_params = dict(param_tools.get_global_parameters("limits")) - for name, definition in utils.get_domain_limit_templates(): + for name, _definition in utils.get_domain_limit_templates(): max_value = global_params["deflt_domain_{0}_limit".format(name)] models.DomainObjectLimit.objects.create( domain=instance, name=name, max_value=max_value) @@ -267,7 +267,7 @@ def display_pool_usage(sender, user, location, currentpage, **kwargs): return [] return [ render_to_string("limits/poolusage.html", - dict(limits=limits)) + {"limits": limits}) ] diff --git a/modoboa/limits/serializers.py b/modoboa/limits/serializers.py index 8b447ad71..a8ebd9c93 100644 --- a/modoboa/limits/serializers.py +++ b/modoboa/limits/serializers.py @@ -19,9 +19,10 @@ class ResourcesSerializer(serializers.Serializer): def to_representation(self, instance): """Return limits.""" - return dict( + return [ (limit.name, limit.max_value) - for limit in instance.userobjectlimit_set.all()) + for limit in instance.userobjectlimit_set.all() + ] def update(self, instance, validated_data): """Update limits.""" diff --git a/modoboa/limits/tests/test_api.py b/modoboa/limits/tests/test_api.py index efc4ddae9..7c1e28d51 100644 --- a/modoboa/limits/tests/test_api.py +++ b/modoboa/limits/tests/test_api.py @@ -21,10 +21,10 @@ class APIAdminLimitsTestCase(lib_tests.ModoAPITestCase): """Check that limits are used also by the API.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(APIAdminLimitsTestCase, cls).setUpTestData() - for name, tpl in utils.get_user_limit_templates(): + for name, _definition in utils.get_user_limit_templates(): cls.localconfig.parameters.set_value( "deflt_user_{0}_limit".format(name), 2) cls.localconfig.save() @@ -199,12 +199,12 @@ class APIDomainLimitsTestCase(lib_tests.ModoAPITestCase): """Check that limits are used also by the API.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(APIDomainLimitsTestCase, cls).setUpTestData() cls.localconfig.parameters.set_value( "enable_domain_limits", True) - for name, tpl in utils.get_domain_limit_templates(): + for name, _definition in utils.get_domain_limit_templates(): cls.localconfig.parameters.set_value( "deflt_domain_{0}_limit".format(name), 2) cls.localconfig.save() @@ -264,10 +264,10 @@ class ResourcesAPITestCase(lib_tests.ModoAPITestCase): """Check resources API.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(ResourcesAPITestCase, cls).setUpTestData() - for name, tpl in utils.get_user_limit_templates(): + for name, _definition in utils.get_user_limit_templates(): cls.localconfig.parameters.set_value( "deflt_user_{0}_limit".format(name), 2) cls.localconfig.save() diff --git a/modoboa/limits/tests/test_domain_limits.py b/modoboa/limits/tests/test_domain_limits.py index 381ec7d0b..a83fb23ca 100644 --- a/modoboa/limits/tests/test_domain_limits.py +++ b/modoboa/limits/tests/test_domain_limits.py @@ -17,14 +17,14 @@ class DomainLimitsTestCase(lib_tests.ModoTestCase): """Per-domain limits tests.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(DomainLimitsTestCase, cls).setUpTestData() cls.localconfig.parameters.set_values({ "enable_admin_limits": False, "enable_domain_limits": True }) - for name, tpl in utils.get_domain_limit_templates(): + for name, _definition in utils.get_domain_limit_templates(): cls.localconfig.parameters.set_value( "deflt_domain_{0}_limit".format(name), 2) cls.localconfig.save() diff --git a/modoboa/limits/tests/test_import.py b/modoboa/limits/tests/test_import.py index 31c0b0bb0..f70516675 100644 --- a/modoboa/limits/tests/test_import.py +++ b/modoboa/limits/tests/test_import.py @@ -15,7 +15,7 @@ class LimitImportTestCase(ModoTestCase): """Base class to test limits.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(LimitImportTestCase, cls).setUpTestData() admin_factories.populate_database() @@ -132,10 +132,10 @@ alias; alias3@{domain}; True; user@{domain} class UserLimitImportTestCase(LimitImportTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" localconfig = core_models.LocalConfig.objects.first() - for name, tpl in utils.get_user_limit_templates(): + for name, _definition in utils.get_user_limit_templates(): localconfig.parameters.set_value( "deflt_user_{0}_limit".format(name), 2) localconfig.save() @@ -198,14 +198,14 @@ domain; domain3.com; 1000; 100; True class DomainLimitImportTestCase(LimitImportTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" 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(): + for name, _definition in utils.get_domain_limit_templates(): localconfig.parameters.set_value( "deflt_domain_{0}_limit".format(name), 2) localconfig.save() diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index 3200e9bda..c20df8258 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -16,7 +16,7 @@ from .. import utils class PermissionsTestCase(lib_tests.ModoTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(PermissionsTestCase, cls).setUpTestData() populate_database() @@ -26,11 +26,12 @@ class PermissionsTestCase(lib_tests.ModoTestCase): Expected result: no. """ - values = dict( - username="reseller@test.com", first_name="Reseller", last_name="", - password1="Toto1234", password2="Toto1234", role="Resellers", - is_active=True, email="reseller@test.com", stepid="step2" - ) + values = { + "username": "reseller@test.com", "first_name": "Reseller", + "last_name": "", "password1": "Toto1234", "password2": "Toto1234", + "role": "Resellers", "is_active": True, + "email": "reseller@test.com", "stepid": "step2" + } self.ajax_post(reverse("admin:account_add"), values) account = User.objects.get(username="reseller@test.com") self.client.logout() @@ -45,14 +46,14 @@ class PermissionsTestCase(lib_tests.ModoTestCase): class ResourceTestCase(lib_tests.ModoTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Custom setUpTestData method.""" super(ResourceTestCase, cls).setUpTestData() cls.localconfig.parameters.set_values({ "enable_admin_limits": True, "enable_domain_limits": False }) - for name, tpl in utils.get_user_limit_templates(): + for name, _definition in utils.get_user_limit_templates(): cls.localconfig.parameters.set_value( "deflt_user_{0}_limit".format(name), 2) cls.localconfig.save() @@ -60,21 +61,21 @@ class ResourceTestCase(lib_tests.ModoTestCase): def _create_account( self, username, role="SimpleUsers", status=200, **kwargs): - values = dict( - username=username, first_name="Tester", last_name="Toto", - password1="Toto1234", password2="Toto1234", role=role, - quota_act=True, - is_active=True, email=username, stepid="step2", - ) + values = { + "username": username, "first_name": "Tester", "last_name": "Toto", + "password1": "Toto1234", "password2": "Toto1234", "role": role, + "quota_act": True, "is_active": True, "email": username, + "stepid": "step2" + } values.update(kwargs) return self.ajax_post( reverse("admin:account_add"), values, status ) def _create_alias(self, email, rcpt="user@test.com", status=200): - values = dict( - address=email, recipients=rcpt, enabled=True - ) + values = { + "address": email, "recipients": rcpt, "enabled": True + } return self.ajax_post( reverse("admin:alias_add"), values, status ) @@ -118,15 +119,15 @@ class ResourceTestCase(lib_tests.ModoTestCase): ) def _check_limit(self, name, curvalue, maxvalue): - l = self.user.userobjectlimit_set.get(name=name) - self.assertEqual(l.current_value, curvalue) - self.assertEqual(l.max_value, maxvalue) + limit = self.user.userobjectlimit_set.get(name=name) + self.assertEqual(limit.current_value, curvalue) + self.assertEqual(limit.max_value, maxvalue) class DomainAdminTestCase(ResourceTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(DomainAdminTestCase, cls).setUpTestData() cls.user = User.objects.get(username="admin@test.com") @@ -173,12 +174,12 @@ class DomainAdminTestCase(ResourceTestCase): def test_aliases_limit_through_account_form(self): user = User.objects.get(username="user@test.com") - values = dict( - username=user.username, role=user.role, - is_active=user.is_active, email=user.email, quota_act=True, - aliases="alias1@test.com", aliases_1="alias2@test.com", - language="en" - ) + values = { + "username": user.username, "role": user.role, + "is_active": user.is_active, "email": user.email, "quota_act": True, + "aliases": "alias1@test.com", "aliases_1": "alias2@test.com", + "language": "en" + } self.ajax_post( reverse("admin:account_change", args=[user.id]), values @@ -190,7 +191,7 @@ class DomainAdminTestCase(ResourceTestCase): class ResellerTestCase(ResourceTestCase): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(ResellerTestCase, cls).setUpTestData() cls.localconfig.parameters.set_value("deflt_user_quota_limit", 1000) diff --git a/modoboa/limits/utils.py b/modoboa/limits/utils.py index 265a579ca..c98127909 100644 --- a/modoboa/limits/utils.py +++ b/modoboa/limits/utils.py @@ -21,10 +21,10 @@ def move_pool_resource(owner, user): When an account doesn't need a pool anymore, we move the associated resource to the pool of its owner. """ - for name, ltpl in get_user_limit_templates(): - l = user.userobjectlimit_set.get(name=name) - if l.max_value < 0: + for name, _definition in get_user_limit_templates(): + user_limit = user.userobjectlimit_set.get(name=name) + if user_limit.max_value < 0: continue - ol = owner.userobjectlimit_set.get(name=name) - ol.max_value += l.max_value - ol.save() + owner_limit = owner.userobjectlimit_set.get(name=name) + owner_limit.max_value += user_limit.max_value + owner_limit.save() diff --git a/modoboa/parameters/forms.py b/modoboa/parameters/forms.py index 5a0c72aa2..f2b638ebc 100644 --- a/modoboa/parameters/forms.py +++ b/modoboa/parameters/forms.py @@ -70,7 +70,7 @@ class AdminParametersForm(GenericParametersForm): """Save parameters to database.""" parameters = {} for name, value in list(self.cleaned_data.items()): - if type(self.fields[name]) is form_utils.SeparatorField: + if isinstance(self.fields[name], form_utils.SeparatorField): continue parameters[name] = value self.localconfig.parameters.set_values(parameters, app=self.app) @@ -101,7 +101,7 @@ class UserParametersForm(GenericParametersForm): """Save new values.""" parameters = {} for name, value in list(self.cleaned_data.items()): - if type(self.fields[name]) is form_utils.SeparatorField: + if isinstance(self.fields[name], form_utils.SeparatorField): continue parameters[name] = value self.user.parameters.set_values(parameters, app=self.app) diff --git a/modoboa/parameters/tests.py b/modoboa/parameters/tests.py deleted file mode 100644 index 36fcdafd1..000000000 --- a/modoboa/parameters/tests.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import unicode_literals - -from django.test import TestCase - -# Create your tests here. diff --git a/modoboa/parameters/tools.py b/modoboa/parameters/tools.py index 81c4893c4..a8271fa13 100644 --- a/modoboa/parameters/tools.py +++ b/modoboa/parameters/tools.py @@ -42,10 +42,10 @@ class Registry(object): def _load_default_values(self, level): """Load default values.""" - for app, data in list(self._registry[level].items()): + for _app, data in list(self._registry[level].items()): form = data["formclass"](load_values_from_db=False) for name, field in list(form.fields.items()): - if type(field) is form_utils.SeparatorField: + if isinstance(field, form_utils.SeparatorField): continue data["defaults"][name] = field.initial @@ -56,8 +56,10 @@ class Registry(object): if first_app in self._registry[level]: sorted_apps.append(first_app) sorted_apps += sorted( - [a for a in list(self._registry[level].keys()) - if a != first_app], + ( + a for a in self._registry[level] + if a != first_app + ), key=lambda a: self._registry[level][a]["label"] ) result = [] diff --git a/modoboa/relaydomains/apps.py b/modoboa/relaydomains/apps.py index 8a0236773..36264f568 100644 --- a/modoboa/relaydomains/apps.py +++ b/modoboa/relaydomains/apps.py @@ -13,5 +13,5 @@ class RelayDomainsConfig(AppConfig): verbose_name = "Modoboa relay domains" def ready(self): - from . import handlers - from . import transport + from . import handlers # NOQA:F401 + from . import transport # NOQA:F401 diff --git a/modoboa/relaydomains/tests.py b/modoboa/relaydomains/tests.py index 68e837fcc..c45fdadc1 100644 --- a/modoboa/relaydomains/tests.py +++ b/modoboa/relaydomains/tests.py @@ -64,15 +64,15 @@ class Operations(object): ) def _check_limit(self, name, curvalue, maxvalue): - l = self.user.userobjectlimit_set.get(name=name) - self.assertEqual(l.current_value, curvalue) - self.assertEqual(l.max_value, maxvalue) + limit = self.user.userobjectlimit_set.get(name=name) + self.assertEqual(limit.current_value, curvalue) + self.assertEqual(limit.max_value, maxvalue) class RelayDomainsTestCase(ModoTestCase, Operations): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(RelayDomainsTestCase, cls).setUpTestData() admin_factories.populate_database() @@ -305,10 +305,10 @@ class ImportTestCase(ModoTestCase): class LimitsTestCase(ModoTestCase, Operations): @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 """Create test data.""" super(LimitsTestCase, cls).setUpTestData() - for name, tpl in limits_utils.get_user_limit_templates(): + for name, _definition in limits_utils.get_user_limit_templates(): cls.localconfig.parameters.set_value( "deflt_user_{0}_limit".format(name), 2, app="limits") cls.localconfig.save() @@ -371,7 +371,7 @@ class DataMixin(object): """A mixin to provide test data.""" @classmethod - def setUpTestData(cls): + def setUpTestData(cls): # NOQA:N802 super(DataMixin, cls).setUpTestData() transport = tr_factories.TransportFactory( pattern="test.com", _settings={ diff --git a/modoboa/transport/apps.py b/modoboa/transport/apps.py index dbdcce73b..5a1797cfe 100644 --- a/modoboa/transport/apps.py +++ b/modoboa/transport/apps.py @@ -7,4 +7,4 @@ class TransportConfig(AppConfig): name = "modoboa.transport" def ready(self): - from . import handlers + from . import handlers # NOQA:F401 diff --git a/modoboa/transport/backends.py b/modoboa/transport/backends.py index 53e5e2789..b6923b16d 100644 --- a/modoboa/transport/backends.py +++ b/modoboa/transport/backends.py @@ -76,10 +76,13 @@ class TransportBackendManager(object): def get_backend_list(self): """Return known backend list.""" - return sorted([ - (key, key) - for key, backend in self.backends.items() - ], key=lambda i: i[1]) + return sorted( + ( + (key, key) + for key, backend in self.backends.items() + ), + key=lambda i: i[1] + ) def get_backend_settings(self, name): """Return backend settings.""" From 87e8a32063d825c0ffcc6cce30a9abb878d9f7cb Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 17:24:10 +0000 Subject: [PATCH 06/42] whitespace fixes --- doc/conf.py | 88 +++++++++---------- modoboa/admin/lib.py | 4 +- .../commands/subcommands/_repair.py | 5 +- modoboa/admin/models/domain_alias.py | 4 +- modoboa/admin/serializers.py | 4 +- modoboa/admin/tests/test_alias.py | 3 - modoboa/admin/tests/test_export.py | 8 +- modoboa/admin/tests/test_import_.py | 17 ++-- modoboa/admin/tests/test_mx.py | 12 +-- modoboa/admin/tests/utils.py | 3 +- modoboa/core/mocks.py | 1 + modoboa/core/password_hashers/base.py | 8 +- .../stupid_extension_1/modo_extension.py | 1 + modoboa/core/utils.py | 6 +- modoboa/lib/email_utils.py | 35 ++++---- modoboa/lib/templatetags/lib_tags.py | 6 +- modoboa/lib/tests/test_email_utils.py | 9 +- modoboa/lib/validators.py | 3 +- modoboa/limits/tests/test_import.py | 2 +- modoboa/parameters/tools.py | 1 + modoboa/test_settings.py | 3 +- test_project/test_project/settings.py | 8 +- 22 files changed, 125 insertions(+), 106 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 1cf6ecc96..1c1daa194 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -17,12 +17,12 @@ import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +# sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. @@ -37,14 +37,14 @@ templates_path = [".templates"] source_suffix = ".rst" # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. -project = u'Modoboa' -copyright = u'2018, Antoine Nguyen' # NOQA:A001 +project = "Modoboa" +copyright = "2018, Antoine Nguyen" # NOQA:A001 # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -57,37 +57,37 @@ release = "1.10.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None +# language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [".build"] # The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- @@ -104,26 +104,26 @@ else: # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -132,44 +132,44 @@ html_static_path = ["_static"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = "Modoboadoc" @@ -178,40 +178,40 @@ htmlhelp_basename = "Modoboadoc" # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' +# latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' +# latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ("index", "Modoboa.tex", u'Modoboa Documentation', - u'Antoine Nguyen', "manual"), + ("index", "Modoboa.tex", "Modoboa Documentation", + "Antoine Nguyen", "manual"), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Additional stuff for the LaTeX preamble. -#latex_preamble = '' +# latex_preamble = '' # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output -------------------------------------------- @@ -219,8 +219,8 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ("index", "modoboa", u'Modoboa Documentation', - [u'Antoine Nguyen'], 1) + ("index", "modoboa", "Modoboa Documentation", + ["Antoine Nguyen"], 1) ] intersphinx_mapping = { diff --git a/modoboa/admin/lib.py b/modoboa/admin/lib.py index 3b0dc8585..2b1819bed 100644 --- a/modoboa/admin/lib.py +++ b/modoboa/admin/lib.py @@ -185,8 +185,8 @@ def get_domain_mx_list(domain): logger.error(_("No working name servers found"), exc_info=e) except dns.resolver.Timeout as e: logger.warning( - _("DNS resolution timeout, unable to query %s at the moment") % domain, - exc_info=e) + _("DNS resolution timeout, unable to query %s at the moment") % + domain, exc_info=e) else: for dns_answer in dns_answers: try: diff --git a/modoboa/admin/management/commands/subcommands/_repair.py b/modoboa/admin/management/commands/subcommands/_repair.py index 04b0e7984..58fdc3aef 100644 --- a/modoboa/admin/management/commands/subcommands/_repair.py +++ b/modoboa/admin/management/commands/subcommands/_repair.py @@ -111,7 +111,10 @@ class Repair(BaseCommand): # Load known problems from extensions. for ext in settings.MODOBOA_APPS: try: - __import__(ext, locals(), globals(), [smart_str("known_problems")]) + __import__( + ext, locals(), globals(), + [smart_str("known_problems")] + ) except ImportError: pass for func in known_problems: diff --git a/modoboa/admin/models/domain_alias.py b/modoboa/admin/models/domain_alias.py index 590241563..b231b586e 100644 --- a/modoboa/admin/models/domain_alias.py +++ b/modoboa/admin/models/domain_alias.py @@ -62,7 +62,8 @@ class DomainAlias(AdminObject): def from_csv(self, user, row): """Create a domain alias from a CSV row - Expected format: ["domainalias", domain alias name, targeted domain, enabled] + Expected format: ["domainalias", domain alias name, targeted domain, + enabled] :param user: a ``User`` object :param row: a list containing the alias definition @@ -91,4 +92,5 @@ class DomainAlias(AdminObject): csvwriter.writerow(["domainalias", self.name, self.target.name, self.enabled]) + reversion.register(DomainAlias) diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 68558007b..5620bc63d 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -61,8 +61,8 @@ class DomainSerializer(serializers.ModelSerializer): domain = models.Domain(**validated_data) creator = self.context["request"].user core_signals.can_create_object.send( - sender=self.__class__, context=creator, - klass=models.Domain, instance=domain) + sender=self.__class__, context=creator, + klass=models.Domain, instance=domain) domain.save(creator=creator) return domain diff --git a/modoboa/admin/tests/test_alias.py b/modoboa/admin/tests/test_alias.py index 506de3da7..6372c490f 100644 --- a/modoboa/admin/tests/test_alias.py +++ b/modoboa/admin/tests/test_alias.py @@ -12,9 +12,6 @@ from ..models import Alias, AliasRecipient, Domain """Admin test cases.""" - - - class AliasTestCase(ModoTestCase): @classmethod diff --git a/modoboa/admin/tests/test_export.py b/modoboa/admin/tests/test_export.py index fa0912086..c4fdf2db0 100644 --- a/modoboa/admin/tests/test_export.py +++ b/modoboa/admin/tests/test_export.py @@ -65,7 +65,7 @@ class ExportTestCase(ModoTestCase): def test_export_identities(self): response = self.__export_identities() self.assertListEqual( - "account;admin@test.com;{PLAIN}toto;;;True;DomainAdmins;admin@test.com;10;test.com\r\naccount;admin@test2.com;{PLAIN}toto;;;True;DomainAdmins;admin@test2.com;10;test2.com\r\naccount;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com;10\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com;10\r\nalias;alias@test.com;True;user@test.com\r\nalias;forward@test.com;True;user@external.com\r\nalias;postmaster@test.com;True;test@truc.fr;toto@titi.com\r\n", + "account;admin@test.com;{PLAIN}toto;;;True;DomainAdmins;admin@test.com;10;test.com\r\naccount;admin@test2.com;{PLAIN}toto;;;True;DomainAdmins;admin@test2.com;10;test2.com\r\naccount;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com;10\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com;10\r\nalias;alias@test.com;True;user@test.com\r\nalias;forward@test.com;True;user@external.com\r\nalias;postmaster@test.com;True;test@truc.fr;toto@titi.com\r\n", # NOQA:E501 response.content.strip() ) @@ -79,7 +79,7 @@ class ExportTestCase(ModoTestCase): idtfilter="account", grpfilter="SimpleUsers" ) self.assertListEqual( - "account;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com;10\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com;10\r\naccount;toto@test.com;{PLAIN}toto;Léon;;True;SimpleUsers;toto@test.com;10", + "account;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com;10\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com;10\r\naccount;toto@test.com;{PLAIN}toto;Léon;;True;SimpleUsers;toto@test.com;10", # NOQA:E501 response.content.strip() ) @@ -103,7 +103,7 @@ class ExportTestCase(ModoTestCase): idtfilter="account", grpfilter="DomainAdmins" ) self.assertListEqual( - "account;admin@test.com;{PLAIN}toto;;;True;DomainAdmins;admin@test.com;10;test.com\r\naccount;admin@test2.com;{PLAIN}toto;;;True;DomainAdmins;admin@test2.com;10;test2.com", + "account;admin@test.com;{PLAIN}toto;;;True;DomainAdmins;admin@test.com;10;test.com\r\naccount;admin@test2.com;{PLAIN}toto;;;True;DomainAdmins;admin@test2.com;10;test2.com", # NOQA:E501 response.content.strip() ) @@ -111,5 +111,5 @@ class ExportTestCase(ModoTestCase): response = self.__export_identities(idtfilter="alias") self.assertEqual( response.content.decode().strip(), - "alias;alias@test.com;True;user@test.com\r\nalias;forward@test.com;True;user@external.com\r\nalias;postmaster@test.com;True;test@truc.fr;toto@titi.com" + "alias;alias@test.com;True;user@test.com\r\nalias;forward@test.com;True;user@external.com\r\nalias;postmaster@test.com;True;test@truc.fr;toto@titi.com" # NOQA:E501 ) diff --git a/modoboa/admin/tests/test_import_.py b/modoboa/admin/tests/test_import_.py index 49aeb8fbf..540fede38 100644 --- a/modoboa/admin/tests/test_import_.py +++ b/modoboa/admin/tests/test_import_.py @@ -134,7 +134,7 @@ alias; alias1@test.com; True; user1@test.com forward; alias2@test.com; True; user1+ext@test.com forward; fwd1@test.com; True; user@extdomain.com dlist; dlist@test.com; True; user1@test.com; user@extdomain.com -""", name="identities.csv") +""", name="identities.csv") # NOQA:E501 self.client.post( reverse("admin:identity_import"), {"sourcefile": f, "crypt_password": True} @@ -200,7 +200,7 @@ dlist; dlist@test.com; True; user1@test.com; user@extdomain.com """Try to import an account for nonlocal domain.""" f = ContentFile(b""" account; user1@nonlocal.com; toto; User; One; True; SimpleUsers; user1@nonlocal.com; 0 -""", name="identities.csv") +""", name="identities.csv") # NOQA:E501 self.client.post( reverse("admin:identity_import"), {"sourcefile": f, "crypt_password": True} @@ -211,7 +211,7 @@ account; user1@nonlocal.com; toto; User; One; True; SimpleUsers; user1@nonlocal. def test_import_invalid_quota(self): f = ContentFile(b""" account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com; ; test.com -""", name="identities.csv") +""", name="identities.csv") # NOQA:E501 resp = self.client.post( reverse("admin:identity_import"), {"sourcefile": f, "crypt_password": True} @@ -229,7 +229,9 @@ domain; domain2.com; 1000; 200; False reverse("admin:identity_import"), {"sourcefile": f, "crypt_password": True} ) - self.assertIn("You are not allowed to import domains", resp.content.decode()) + self.assertIn( + "You are not allowed to import domains", + resp.content.decode()) f = ContentFile(b""" domainalias; domalias1.com; test.com; True """, name="identities.csv") @@ -238,7 +240,8 @@ domainalias; domalias1.com; test.com; True {"sourcefile": f, "crypt_password": True} ) self.assertIn( - "You are not allowed to import domain aliases", resp.content.decode()) + "You are not allowed to import domain aliases", + resp.content.decode()) def test_import_quota_too_big(self): self.client.logout() @@ -270,7 +273,7 @@ account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com f = ContentFile(""" account; admin@test.com; toto; Admin; ; True; DomainAdmins; admin@test.com; 0; test.com account; truc@test.com; toto; René; Truc; True; DomainAdmins; truc@test.com; 0; test.com -""", name="identities.csv") +""", name="identities.csv") # NOQA:E501 self.client.post( reverse("admin:identity_import"), {"sourcefile": f, "crypt_password": True, @@ -291,7 +294,7 @@ account; truc@test.com; toto; René; Truc; True; DomainAdmins; truc@test.com; 0; ) f = ContentFile(b""" account; sa@test.com; toto; Super; Admin; True; SuperAdmins; superadmin@test.com; 50 -""", name="identities.csv") +""", name="identities.csv") # NOQA:E501 self.client.post( reverse("admin:identity_import"), {"sourcefile": f, "crypt_password": True, diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index d75c149be..276afd990 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -53,7 +53,7 @@ class MXTestCase(ModoTestCase): @patch("socket.getaddrinfo") @patch.object(dns.resolver.Resolver, "query") def test_management_command( - self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): + self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): """Check that command works fine.""" mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result @@ -81,7 +81,7 @@ class MXTestCase(ModoTestCase): @patch("socket.getaddrinfo") @patch.object(dns.resolver.Resolver, "query") def test_single_domain_update( - self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): + self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): """Update only one domain.""" mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result @@ -130,7 +130,7 @@ class MXTestCase(ModoTestCase): ("modoboa.admin", "WARNING", _("Invalid IP address format for %(domain)s; %(addr)s") % {"domain": "bad-response.example.com", "addr": "BAD"}), - ) + ) @override_settings(DNSBL_PROVIDERS=["zen.spamhaus.org"]) @@ -153,7 +153,7 @@ class DNSBLTestCase(ModoTestCase): @patch("socket.getaddrinfo") @patch.object(dns.resolver.Resolver, "query") def test_management_command( - self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): + self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): """Check that command works fine.""" mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result @@ -174,7 +174,7 @@ class DNSBLTestCase(ModoTestCase): @patch("socket.getaddrinfo") @patch.object(dns.resolver.Resolver, "query") def test_notifications( - self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): + self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): """Check notifications.""" mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result @@ -190,7 +190,7 @@ class DNSBLTestCase(ModoTestCase): @patch("socket.getaddrinfo") @patch.object(dns.resolver.Resolver, "query") def test_management_command_no_dnsbl( - self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): + self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): """Check that command works fine without dnsbl.""" mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result diff --git a/modoboa/admin/tests/utils.py b/modoboa/admin/tests/utils.py index bf1887465..797fc6dcb 100644 --- a/modoboa/admin/tests/utils.py +++ b/modoboa/admin/tests/utils.py @@ -13,7 +13,8 @@ from dns.resolver import NXDOMAIN, NoAnswer, NoNameservers, Timeout _MX_RECORD_1 = MX("IN", "MX", 10, Name("mx.example.com".split("."))) _MX_RECORD_2 = MX("IN", "MX", 10, Name("mx2.example.com".split("."))) _BAD_MX_RECORD = MX("IN", "MX", 10, Name("bad-response.example.com".split("."))) -_DNE_MX_RECORD = MX("IN", "MX", 10, Name("does-not-exist.example.com".split("."))) +_DNE_MX_RECORD = MX("IN", "MX", 10, Name( + "does-not-exist.example.com".split("."))) _MX_RECORDS = [_MX_RECORD_1] _IPV4_RECORD_1 = (socket.AF_INET, socket.SOCK_STREAM, 6, "", ("192.0.2.1", 25)) diff --git a/modoboa/core/mocks.py b/modoboa/core/mocks.py index 8b97f6b2f..fc474b357 100644 --- a/modoboa/core/mocks.py +++ b/modoboa/core/mocks.py @@ -6,6 +6,7 @@ import httmock # Modoboa API mocks + @httmock.urlmatch( netloc=r"api\.modoboa\.org$", path=r"^/1/instances/search/", method="post") def modo_api_instance_search(url, request): diff --git a/modoboa/core/password_hashers/base.py b/modoboa/core/password_hashers/base.py index f065bc67a..eb926adea 100644 --- a/modoboa/core/password_hashers/base.py +++ b/modoboa/core/password_hashers/base.py @@ -93,7 +93,13 @@ class CRYPTHasher(PasswordHasher): def _encrypt(self, clearvalue, salt=None): if salt is None: - salt = "".join(Random().sample(string.ascii_letters + string.digits, 2)) + salt = "".join( + Random().sample( + string.ascii_letters + + string.digits, + 2 + ) + ) return crypt.crypt(clearvalue, salt) diff --git a/modoboa/core/tests/stupid_extension_1/modo_extension.py b/modoboa/core/tests/stupid_extension_1/modo_extension.py index 4115447d0..171646e73 100644 --- a/modoboa/core/tests/stupid_extension_1/modo_extension.py +++ b/modoboa/core/tests/stupid_extension_1/modo_extension.py @@ -19,4 +19,5 @@ class StupidExtension1(extensions.ModoExtension): def load_initial_data(self): raise RuntimeError + extensions.exts_pool.register_extension(StupidExtension1) diff --git a/modoboa/core/utils.py b/modoboa/core/utils.py index 1ac62a320..280bcb366 100644 --- a/modoboa/core/utils.py +++ b/modoboa/core/utils.py @@ -42,9 +42,9 @@ def check_for_updates(request): continue extension["last_version"] = api_extension["version"] if ( - parse_version(api_extension["version"]) - > parse_version(extension["version"]) - ): + parse_version(api_extension["version"]) > + parse_version(extension["version"]) + ): extension["update"] = True extension["changelog_url"] = api_extension["url"] update_avail = True diff --git a/modoboa/lib/email_utils.py b/modoboa/lib/email_utils.py index f1be3a8e6..72d11c42e 100644 --- a/modoboa/lib/email_utils.py +++ b/modoboa/lib/email_utils.py @@ -179,7 +179,8 @@ class Email(object): if content_type == "text": self._parse_text(part, level=level) else: - # I'm a dumb mail parser and treat all non-text parts as attachments + # I'm a dumb mail parser and treat all non-text parts as + # attachments self._parse_inline_image(part, level=level) def _parse_inline_image(self, msg, level=0): @@ -225,13 +226,13 @@ class Email(object): html.rewrite_links(lambda x: None) cleaner = Cleaner( - scripts=True, - javascript=True, - links=True, - page_structure=True, - embedded=True, - frames=True, - add_nofollow=True) + scripts=True, + javascript=True, + links=True, + page_structure=True, + embedded=True, + frames=True, + add_nofollow=True) mail_text = lxml.html.tostring(cleaner.clean_html(html)) self.contents["html"] = smart_text(mail_text) @@ -289,18 +290,18 @@ def split_local_part(local_part, delimiter=None): # never split these special addresses pass elif ( - delimiter == "-" - and (local_part.startswith("owner-") - or local_part.endswith("-request")) + delimiter == "-" and + (local_part.startswith("owner-") or + local_part.endswith("-request")) ): # don't split owner-* or *-request if - is the delimiter, they are # special addresses used by mail lists. pass elif ( - delimiter - and delimiter in local_part - and local_part[0] != delimiter - and local_part[-1] != delimiter + delimiter and + delimiter in local_part and + local_part[0] != delimiter and + local_part[-1] != delimiter ): local_part, extension = local_part.split(delimiter, 1) @@ -341,8 +342,8 @@ def decode(value_bytes, encoding, append_to_error=""): except (TypeError, UnicodeDecodeError) as exc: six.raise_from( InternalError( - _("unable to determine encoding of string") - + append_to_error + _("unable to determine encoding of string") + + append_to_error ), exc ) diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index ebd09c163..c48ef2a3c 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -35,7 +35,7 @@ def alert(msg, typ): t = Template("""""") +""") # NOQA:E501 return t.render(Context({"type": typ, "msg": msg})) @@ -50,7 +50,7 @@ class="{{ mdclass }}{% if link.class %} {{ link.class }}{% endif %}" {% for attr, value in link.extra_attributes.items %} {{ attr }}="{{ value }}"{% endfor %} > {% if link.img %}{% endif %} -{{ link.label }}""") +{{ link.label }}""") # NOQA:E501 return t.render(Context({"link": linkdef, "mdclass": mdclass})) @@ -76,7 +76,7 @@ def render_tags(tags): {{ tag.label }} {% endfor %} -""") +""") # NOQA:E501 return t.render(Context({"tags": tags})) diff --git a/modoboa/lib/tests/test_email_utils.py b/modoboa/lib/tests/test_email_utils.py index 943036366..6b2c8bbc4 100644 --- a/modoboa/lib/tests/test_email_utils.py +++ b/modoboa/lib/tests/test_email_utils.py @@ -65,9 +65,10 @@ class EmailTests(SimpleTestCase): EmailTestImplementation("text_plain", links="0") ex_message = cm.exception.messages - self.assertEqual(ex_message, - "links == \"0\" is not valid, did you mean True or " - "False?") + self.assertEqual( + ex_message, + "links == \"0\" is not valid, did you mean True or False?" + ) def test_links_value_for_webmail(self): """modoboa-webmail sets links = 0 or 1 @@ -106,7 +107,7 @@ class EmailTests(SimpleTestCase): self._test_email("multipart", dformat="html", links=True) def test_email_multipart_without_links(self): - """display the text/html part of a multipart message with links removed""" + """display the text/html part of a multipart message without links""" self._test_email("multipart", dformat="html", links=False) diff --git a/modoboa/lib/validators.py b/modoboa/lib/validators.py index bd5e29918..69e64b914 100644 --- a/modoboa/lib/validators.py +++ b/modoboa/lib/validators.py @@ -49,7 +49,8 @@ class UTF8EmailValidator(EmailValidator): # dot-atom r"^[" + ascii_set + ul + r"]+(\.[" + ascii_set + ul + r"]+)*\Z" # quoted-string - r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)' + r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|' + r'\\[\001-\011\013\014\016-\177])*"\Z)' ) user_regex = re.compile(r"(" + user_regex_raw, re.IGNORECASE) diff --git a/modoboa/limits/tests/test_import.py b/modoboa/limits/tests/test_import.py index f70516675..184a1c878 100644 --- a/modoboa/limits/tests/test_import.py +++ b/modoboa/limits/tests/test_import.py @@ -68,7 +68,7 @@ domainalias; domalias2.com; {domain}; True self.assertTrue(limit.is_exceeded()) f = ContentFile("""account; admin3@{domain}; toto; User; One; True; DomainAdmins; admin3@{domain}; 5; {domain} -""".format(domain=self.domain), name="domain_admins.csv") +""".format(domain=self.domain), name="domain_admins.csv") # NOQA:E501 response = self.client.post( reverse("admin:identity_import"), { "sourcefile": f diff --git a/modoboa/parameters/tools.py b/modoboa/parameters/tools.py index a8271fa13..59b898b60 100644 --- a/modoboa/parameters/tools.py +++ b/modoboa/parameters/tools.py @@ -96,6 +96,7 @@ class Registry(object): raise NotDefined(app) return self._registry[level][app]["defaults"] + registry = Registry() diff --git a/modoboa/test_settings.py b/modoboa/test_settings.py index 781bc5705..3e61f31c2 100644 --- a/modoboa/test_settings.py +++ b/modoboa/test_settings.py @@ -23,7 +23,8 @@ if DB == "MYSQL": # such as data truncation upon insertion, by escalating warnings # into errors. It is strongly recommended you activate it. # MySQL >= 5.7 set STRICT_TRANS_TABLES by default - # See: https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode + # See: + # https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode "OPTIONS": { "init_command": 'SET sql_mode=\'STRICT_TRANS_TABLES\'', }, diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py index 85c35a3c2..9b5f0e166 100644 --- a/test_project/test_project/settings.py +++ b/test_project/test_project/settings.py @@ -178,16 +178,16 @@ MODOBOA_API_URL = "https://api.modoboa.org/1/" AUTH_PASSWORD_VALIDATORS = [ { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", # NOQA:E501 }, { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", # NOQA:E501 }, { - "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", # NOQA:E501 }, { - "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", # NOQA:E501 }, { "NAME": "modoboa.core.password_validation.ComplexityValidator", From 3159eca2966a65ea956664365a714b17dac9f4f6 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 17:42:43 +0000 Subject: [PATCH 07/42] import unicode_literals and remove it from empty __init__.py files --- doc/conf.py | 3 +++ modoboa/admin/management/__init__.py | 1 - modoboa/admin/management/commands/__init__.py | 1 - .../management/commands/subcommands/__init__.py | 1 - modoboa/admin/templatetags/__init__.py | 1 - modoboa/admin/tests/__init__.py | 1 - modoboa/core/checks/__init__.py | 2 ++ modoboa/core/management/__init__.py | 1 - modoboa/core/management/commands/__init__.py | 1 - modoboa/core/templatetags/__init__.py | 1 - modoboa/core/tests/__init__.py | 1 - modoboa/core/tests/stupid_extension_1/__init__.py | 1 - modoboa/core/tests/stupid_extension_2/__init__.py | 1 - modoboa/lib/__init__.py | 1 - modoboa/lib/imap_utf7.py | 14 +++++++------- modoboa/lib/templatetags/__init__.py | 1 - modoboa/limits/tests/__init__.py | 1 - modoboa/limits/views.py | 3 --- modoboa/parameters/__init__.py | 1 - modoboa/relaydomains/serializers.py | 2 ++ modoboa/relaydomains/transport.py | 2 ++ modoboa/relaydomains/urls_api.py | 2 ++ modoboa/relaydomains/viewsets.py | 2 ++ modoboa/transport/__init__.py | 2 ++ modoboa/transport/backends.py | 2 ++ modoboa/transport/constants.py | 1 + modoboa/transport/factories.py | 2 ++ modoboa/transport/forms.py | 2 ++ tests.py | 2 ++ 29 files changed, 31 insertions(+), 25 deletions(-) delete mode 100644 modoboa/limits/views.py diff --git a/doc/conf.py b/doc/conf.py index 1c1daa194..4f11df49a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -11,7 +11,10 @@ # All configuration values have a default; values that are commented out # serve to show the default. +from __future__ import unicode_literals + import os + # import sys # If extensions (or modules to document with autodoc) are in another directory, diff --git a/modoboa/admin/management/__init__.py b/modoboa/admin/management/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/admin/management/__init__.py +++ b/modoboa/admin/management/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/admin/management/commands/__init__.py b/modoboa/admin/management/commands/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/admin/management/commands/__init__.py +++ b/modoboa/admin/management/commands/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/admin/management/commands/subcommands/__init__.py b/modoboa/admin/management/commands/subcommands/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/admin/management/commands/subcommands/__init__.py +++ b/modoboa/admin/management/commands/subcommands/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/admin/templatetags/__init__.py b/modoboa/admin/templatetags/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/admin/templatetags/__init__.py +++ b/modoboa/admin/templatetags/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/admin/tests/__init__.py b/modoboa/admin/tests/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/admin/tests/__init__.py +++ b/modoboa/admin/tests/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/core/checks/__init__.py b/modoboa/core/checks/__init__.py index e41b8f04b..c043b6cf9 100644 --- a/modoboa/core/checks/__init__.py +++ b/modoboa/core/checks/__init__.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals + # Import these to force registration of checks from . import settings_checks # NOQA:F401 diff --git a/modoboa/core/management/__init__.py b/modoboa/core/management/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/core/management/__init__.py +++ b/modoboa/core/management/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/core/management/commands/__init__.py b/modoboa/core/management/commands/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/core/management/commands/__init__.py +++ b/modoboa/core/management/commands/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/core/templatetags/__init__.py b/modoboa/core/templatetags/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/core/templatetags/__init__.py +++ b/modoboa/core/templatetags/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/core/tests/__init__.py b/modoboa/core/tests/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/core/tests/__init__.py +++ b/modoboa/core/tests/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/core/tests/stupid_extension_1/__init__.py b/modoboa/core/tests/stupid_extension_1/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/core/tests/stupid_extension_1/__init__.py +++ b/modoboa/core/tests/stupid_extension_1/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/core/tests/stupid_extension_2/__init__.py b/modoboa/core/tests/stupid_extension_2/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/core/tests/stupid_extension_2/__init__.py +++ b/modoboa/core/tests/stupid_extension_2/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/lib/__init__.py b/modoboa/lib/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/lib/__init__.py +++ b/modoboa/lib/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/lib/imap_utf7.py b/modoboa/lib/imap_utf7.py index 0e305c803..34efc3778 100644 --- a/modoboa/lib/imap_utf7.py +++ b/modoboa/lib/imap_utf7.py @@ -171,33 +171,33 @@ __all__ = ["imapUTF7Encode", "imapUTF7Decode", ] if __name__ == "__main__": - # print u'bøx'.encode('imap4-utf-7') + # print 'bøx'.encode('imap4-utf-7') # print 'expected b&APg-x' - # print u'bÃ¥x'.encode('imap4-utf-7') + # print 'bÃ¥x'.encode('imap4-utf-7') # print 'expected b&AOU-x' print("#######") print("bøx") - e = imapUTF7Encode(u'bøx') + e = imapUTF7Encode("bøx") print(e) print(imapUTF7Decode(e).encode("latin-1")) print("#######") print("bÃ¥x") - e = imapUTF7Encode(u'bÃ¥x') + e = imapUTF7Encode("bÃ¥x") print(e) print(imapUTF7Decode(e).encode("latin-1")) print("#######") print("~/bÃ¥gø") - e = imapUTF7Encode(u'~/bÃ¥gø') + e = imapUTF7Encode("~/bÃ¥gø") print(e) print(imapUTF7Decode(e).encode("latin-1")) print("#######") print("Ting & SÃ¥ger") - e = imapUTF7Encode(u'Ting & SÃ¥ger') + e = imapUTF7Encode("Ting & SÃ¥ger") print(e) print(imapUTF7Decode(e).encode("latin-1")) @@ -209,7 +209,7 @@ if __name__ == "__main__": print("#######") print("~/Følder/mailbÃ¥x & stuff + more") - n = u'~/Følder/mailbÃ¥x & stuff + more' + n = "~/Følder/mailbÃ¥x & stuff + more" e = imapUTF7Encode(n) print(e) print(imapUTF7Decode(e).encode("latin-1")) diff --git a/modoboa/lib/templatetags/__init__.py b/modoboa/lib/templatetags/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/lib/templatetags/__init__.py +++ b/modoboa/lib/templatetags/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/limits/tests/__init__.py b/modoboa/limits/tests/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/limits/tests/__init__.py +++ b/modoboa/limits/tests/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/limits/views.py b/modoboa/limits/views.py deleted file mode 100644 index e17c22b7f..000000000 --- a/modoboa/limits/views.py +++ /dev/null @@ -1,3 +0,0 @@ -# coding: utf-8 - -from __future__ import unicode_literals diff --git a/modoboa/parameters/__init__.py b/modoboa/parameters/__init__.py index baffc4882..e69de29bb 100644 --- a/modoboa/parameters/__init__.py +++ b/modoboa/parameters/__init__.py @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/modoboa/relaydomains/serializers.py b/modoboa/relaydomains/serializers.py index 28ec22173..073100c0f 100644 --- a/modoboa/relaydomains/serializers.py +++ b/modoboa/relaydomains/serializers.py @@ -1,5 +1,7 @@ """RelayDomain serializers.""" +from __future__ import unicode_literals + import json from django.utils.translation import ugettext as _ diff --git a/modoboa/relaydomains/transport.py b/modoboa/relaydomains/transport.py index 8c1c77aeb..d6963ddd0 100644 --- a/modoboa/relaydomains/transport.py +++ b/modoboa/relaydomains/transport.py @@ -1,5 +1,7 @@ """Transport backend definition.""" +from __future__ import unicode_literals + from django.utils.translation import ugettext_lazy as _ from modoboa.transport import backends diff --git a/modoboa/relaydomains/urls_api.py b/modoboa/relaydomains/urls_api.py index d877c6f65..844915aa7 100644 --- a/modoboa/relaydomains/urls_api.py +++ b/modoboa/relaydomains/urls_api.py @@ -1,5 +1,7 @@ """Transport API urls.""" +from __future__ import unicode_literals + from rest_framework import routers from . import viewsets diff --git a/modoboa/relaydomains/viewsets.py b/modoboa/relaydomains/viewsets.py index d7de1b82d..215dcb575 100644 --- a/modoboa/relaydomains/viewsets.py +++ b/modoboa/relaydomains/viewsets.py @@ -1,5 +1,7 @@ """RelayDomain viewsets.""" +from __future__ import unicode_literals + from rest_framework import viewsets from rest_framework.permissions import DjangoModelPermissions, IsAuthenticated diff --git a/modoboa/transport/__init__.py b/modoboa/transport/__init__.py index ba19ffc3c..fd449f1e1 100644 --- a/modoboa/transport/__init__.py +++ b/modoboa/transport/__init__.py @@ -1 +1,3 @@ +from __future__ import unicode_literals + default_app_config = "modoboa.transport.apps.TransportConfig" diff --git a/modoboa/transport/backends.py b/modoboa/transport/backends.py index b6923b16d..c531e6ca1 100644 --- a/modoboa/transport/backends.py +++ b/modoboa/transport/backends.py @@ -1,5 +1,7 @@ """Transport backend.""" +from __future__ import unicode_literals + from django import forms from django.core import validators from django.utils.translation import ugettext_lazy as _ diff --git a/modoboa/transport/constants.py b/modoboa/transport/constants.py index 80c50d66b..61fbc1ac9 100644 --- a/modoboa/transport/constants.py +++ b/modoboa/transport/constants.py @@ -1,4 +1,5 @@ """Transport constants.""" +from __future__ import unicode_literals PERMISSIONS = { diff --git a/modoboa/transport/factories.py b/modoboa/transport/factories.py index 332bd400a..e2c4e001b 100644 --- a/modoboa/transport/factories.py +++ b/modoboa/transport/factories.py @@ -1,5 +1,7 @@ """Transport factories.""" +from __future__ import unicode_literals + import factory from . import models diff --git a/modoboa/transport/forms.py b/modoboa/transport/forms.py index 9d7ec1787..cf6cbe656 100644 --- a/modoboa/transport/forms.py +++ b/modoboa/transport/forms.py @@ -1,5 +1,7 @@ """Transport forms.""" +from __future__ import unicode_literals + from django import forms from . import backends, models diff --git a/tests.py b/tests.py index 07180185f..5177a3ec3 100644 --- a/tests.py +++ b/tests.py @@ -1,4 +1,6 @@ # coding: utf-8 +from __future__ import unicode_literals + import os import tempfile import unittest From f71414ddfae234b9b3823107343cc324ae238e1d Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 17:44:33 +0000 Subject: [PATCH 08/42] add missing utf8 header use `# -*- coding: utf-8 -*-` which is more widely supported by editors --- modoboa/admin/__init__.py | 2 ++ modoboa/admin/api.py | 2 ++ modoboa/admin/app_settings.py | 2 ++ modoboa/admin/apps.py | 2 ++ modoboa/admin/constants.py | 2 ++ modoboa/admin/factories.py | 2 ++ modoboa/admin/forms/__init__.py | 2 ++ modoboa/admin/forms/account.py | 2 ++ modoboa/admin/forms/alias.py | 2 ++ modoboa/admin/forms/domain.py | 2 ++ modoboa/admin/forms/export.py | 2 ++ modoboa/admin/forms/forward.py | 2 ++ modoboa/admin/forms/import_.py | 2 ++ modoboa/admin/handlers.py | 2 ++ modoboa/admin/management/commands/handle_mailbox_operations.py | 2 ++ modoboa/admin/management/commands/modo.py | 2 ++ modoboa/admin/management/commands/subcommands/_export.py | 2 ++ modoboa/admin/management/commands/subcommands/_import.py | 2 ++ .../admin/management/commands/subcommands/_manage_dkim_keys.py | 2 ++ modoboa/admin/management/commands/subcommands/_repair.py | 2 ++ modoboa/admin/models/__init__.py | 2 ++ modoboa/admin/models/alias.py | 2 ++ modoboa/admin/models/base.py | 2 ++ modoboa/admin/models/domain.py | 2 ++ modoboa/admin/models/domain_alias.py | 2 ++ modoboa/admin/models/mailbox.py | 2 ++ modoboa/admin/models/mxrecord.py | 2 ++ modoboa/admin/postfix_maps.py | 2 ++ modoboa/admin/serializers.py | 2 ++ modoboa/admin/signals.py | 2 ++ modoboa/admin/templatetags/admin_tags.py | 2 ++ modoboa/admin/tests/test_account.py | 2 +- modoboa/admin/tests/test_alias.py | 2 +- modoboa/admin/tests/test_domain_alias.py | 2 +- modoboa/admin/tests/test_export.py | 2 +- modoboa/admin/tests/test_mailbox_operations.py | 2 ++ modoboa/admin/tests/test_mapfiles.py | 2 ++ modoboa/admin/tests/test_password_schemes.py | 2 ++ modoboa/admin/tests/test_repair.py | 2 ++ modoboa/admin/tests/test_user.py | 2 ++ modoboa/admin/urls.py | 3 ++- modoboa/admin/urls_api.py | 2 ++ modoboa/admin/views/__init__.py | 2 ++ modoboa/admin/views/alias.py | 2 ++ modoboa/admin/views/dns.py | 2 ++ modoboa/admin/views/domain.py | 2 ++ modoboa/admin/views/export.py | 2 ++ modoboa/admin/views/identity.py | 2 ++ modoboa/admin/views/import_.py | 2 ++ modoboa/admin/views/user.py | 2 ++ modoboa/core/__init__.py | 2 ++ modoboa/core/app_settings.py | 2 +- modoboa/core/apps.py | 2 ++ modoboa/core/commands/__init__.py | 2 +- modoboa/core/commands/deploy.py | 2 +- modoboa/core/commands/help.py | 2 +- modoboa/core/constants.py | 2 +- modoboa/core/context_processors.py | 2 ++ modoboa/core/dev_settings.py | 2 ++ modoboa/core/extensions.py | 2 ++ modoboa/core/factories.py | 2 ++ modoboa/core/forms.py | 2 +- modoboa/core/handlers.py | 2 ++ modoboa/core/loggers.py | 2 ++ modoboa/core/management/commands/clean_inactive_accounts.py | 2 ++ modoboa/core/management/commands/cleanlogs.py | 2 +- .../core/management/commands/communicate_with_public_api.py | 2 ++ modoboa/core/management/commands/generate_postfix_maps.py | 3 +++ modoboa/core/management/commands/load_initial_data.py | 2 ++ modoboa/core/management/commands/set_default_site.py | 3 ++- modoboa/core/middleware.py | 2 ++ modoboa/core/mocks.py | 2 ++ modoboa/core/models.py | 2 ++ modoboa/core/password_hashers/__init__.py | 2 ++ modoboa/core/password_hashers/advanced.py | 2 ++ modoboa/core/password_hashers/base.py | 2 ++ modoboa/core/password_validation.py | 2 ++ modoboa/core/signals.py | 2 ++ modoboa/core/templatetags/core_tags.py | 3 ++- modoboa/core/tests/stupid_extension_1/modo_extension.py | 2 ++ modoboa/core/tests/stupid_extension_2/modo_extension.py | 2 ++ modoboa/core/tests/stupid_extension_2/urls.py | 2 ++ modoboa/core/tests/stupid_extension_2/views.py | 2 ++ modoboa/core/tests/test_authentication.py | 2 +- modoboa/core/tests/test_core.py | 2 ++ modoboa/core/tests/test_extensions.py | 2 ++ modoboa/core/tests/test_ldap.py | 2 ++ modoboa/core/tests/test_views.py | 2 ++ modoboa/core/urls.py | 2 ++ modoboa/core/utils.py | 2 ++ modoboa/core/views/__init__.py | 2 ++ modoboa/core/views/admin.py | 2 ++ modoboa/core/views/auth.py | 3 ++- modoboa/core/views/base.py | 2 ++ modoboa/core/views/dashboard.py | 2 ++ modoboa/core/views/user.py | 2 ++ modoboa/lib/api_client.py | 2 ++ modoboa/lib/authbackends.py | 2 ++ modoboa/lib/connections.py | 2 ++ modoboa/lib/db_utils.py | 2 +- modoboa/lib/exceptions.py | 3 ++- modoboa/lib/fields.py | 2 ++ modoboa/lib/form_utils.py | 2 +- modoboa/lib/ldap_utils.py | 2 +- modoboa/lib/listing.py | 2 ++ modoboa/lib/middleware.py | 2 +- modoboa/lib/paginator.py | 2 ++ modoboa/lib/permissions.py | 3 ++- modoboa/lib/signals.py | 2 ++ modoboa/lib/singleton.py | 2 ++ modoboa/lib/sysutils.py | 2 +- modoboa/lib/templatetags/form_tags.py | 2 ++ modoboa/lib/templatetags/lib_tags.py | 3 ++- modoboa/lib/test_utils.py | 2 ++ modoboa/lib/u2u_decode.py | 2 +- modoboa/lib/validators.py | 2 ++ modoboa/lib/web_utils.py | 2 +- modoboa/limits/__init__.py | 2 ++ modoboa/limits/app_settings.py | 2 ++ modoboa/limits/apps.py | 2 ++ modoboa/limits/constants.py | 2 ++ modoboa/limits/forms.py | 2 +- modoboa/limits/handlers.py | 2 ++ modoboa/limits/lib.py | 3 ++- modoboa/limits/models.py | 2 +- modoboa/limits/serializers.py | 2 ++ modoboa/limits/tests/test_api.py | 3 ++- modoboa/limits/tests/test_domain_limits.py | 3 ++- modoboa/limits/tests/test_import.py | 2 +- modoboa/limits/tests/test_user_limits.py | 3 ++- modoboa/limits/urls_api.py | 2 ++ modoboa/limits/utils.py | 2 ++ modoboa/limits/viewsets.py | 2 ++ modoboa/parameters/apps.py | 2 ++ modoboa/parameters/forms.py | 2 ++ modoboa/parameters/tools.py | 2 ++ modoboa/relaydomains/__init__.py | 2 ++ modoboa/relaydomains/apps.py | 2 ++ modoboa/relaydomains/forms.py | 2 ++ modoboa/relaydomains/handlers.py | 2 ++ modoboa/relaydomains/lib.py | 2 ++ modoboa/relaydomains/models.py | 2 ++ modoboa/relaydomains/postfix_maps.py | 2 ++ modoboa/relaydomains/serializers.py | 2 ++ modoboa/relaydomains/tests.py | 2 ++ modoboa/relaydomains/transport.py | 2 ++ modoboa/relaydomains/urls_api.py | 2 ++ modoboa/relaydomains/viewsets.py | 2 ++ modoboa/transport/__init__.py | 2 ++ modoboa/transport/apps.py | 2 ++ modoboa/transport/backends.py | 2 ++ modoboa/transport/constants.py | 3 +++ modoboa/transport/factories.py | 2 ++ modoboa/transport/forms.py | 2 ++ modoboa/transport/handlers.py | 2 ++ modoboa/transport/models.py | 2 ++ modoboa/transport/postfix_maps.py | 2 ++ modoboa/urls.py | 2 ++ modoboa/urls_api.py | 2 ++ 159 files changed, 298 insertions(+), 33 deletions(-) diff --git a/modoboa/admin/__init__.py b/modoboa/admin/__init__.py index 5882e6d25..80f7ae2d3 100644 --- a/modoboa/admin/__init__.py +++ b/modoboa/admin/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals default_app_config = "modoboa.admin.apps.AdminConfig" diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index 30c0c33d7..fed9bea69 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Admin API.""" from __future__ import unicode_literals diff --git a/modoboa/admin/app_settings.py b/modoboa/admin/app_settings.py index 88c6e153e..cd1afa3e7 100644 --- a/modoboa/admin/app_settings.py +++ b/modoboa/admin/app_settings.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Modoboa admin settings.""" from __future__ import unicode_literals diff --git a/modoboa/admin/apps.py b/modoboa/admin/apps.py index 33fb2f4ea..77ba62271 100644 --- a/modoboa/admin/apps.py +++ b/modoboa/admin/apps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """AppConfig for admin.""" from __future__ import unicode_literals diff --git a/modoboa/admin/constants.py b/modoboa/admin/constants.py index c009976fe..e6f1c4e40 100644 --- a/modoboa/admin/constants.py +++ b/modoboa/admin/constants.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Admin constants.""" from __future__ import unicode_literals diff --git a/modoboa/admin/factories.py b/modoboa/admin/factories.py index 5f4cea421..e0d5780c8 100644 --- a/modoboa/admin/factories.py +++ b/modoboa/admin/factories.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """ Fixtures factories. """ diff --git a/modoboa/admin/forms/__init__.py b/modoboa/admin/forms/__init__.py index aa342d700..bb1ded79a 100644 --- a/modoboa/admin/forms/__init__.py +++ b/modoboa/admin/forms/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from .account import ( diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index e98d30144..0fa0ab3c7 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Forms related to accounts management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/forms/alias.py b/modoboa/admin/forms/alias.py index 866292b3e..09ee606e4 100644 --- a/modoboa/admin/forms/alias.py +++ b/modoboa/admin/forms/alias.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Forms related to aliases management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index 2590e4733..5cc3f4a9d 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Forms related to domains management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/forms/export.py b/modoboa/admin/forms/export.py index 25e9402a3..1a295c599 100644 --- a/modoboa/admin/forms/export.py +++ b/modoboa/admin/forms/export.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from django import forms diff --git a/modoboa/admin/forms/forward.py b/modoboa/admin/forms/forward.py index ddccba0f4..b270fb32d 100644 --- a/modoboa/admin/forms/forward.py +++ b/modoboa/admin/forms/forward.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Forms related to forwards management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/forms/import_.py b/modoboa/admin/forms/import_.py index 790260919..db50913ff 100644 --- a/modoboa/admin/forms/import_.py +++ b/modoboa/admin/forms/import_.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Forms related to import operations.""" from __future__ import unicode_literals diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index 81ec67a3c..14b499eb8 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Django signal handlers for admin.""" from __future__ import unicode_literals diff --git a/modoboa/admin/management/commands/handle_mailbox_operations.py b/modoboa/admin/management/commands/handle_mailbox_operations.py index 016d6e909..15d8f6e11 100644 --- a/modoboa/admin/management/commands/handle_mailbox_operations.py +++ b/modoboa/admin/management/commands/handle_mailbox_operations.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """A management command to apply mailbox operations.""" from __future__ import print_function, unicode_literals diff --git a/modoboa/admin/management/commands/modo.py b/modoboa/admin/management/commands/modo.py index 9a00e5ba8..b4f3495f5 100644 --- a/modoboa/admin/management/commands/modo.py +++ b/modoboa/admin/management/commands/modo.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Modoboa main management command.""" from __future__ import unicode_literals diff --git a/modoboa/admin/management/commands/subcommands/_export.py b/modoboa/admin/management/commands/subcommands/_export.py index 334885f68..94beef93c 100644 --- a/modoboa/admin/management/commands/subcommands/_export.py +++ b/modoboa/admin/management/commands/subcommands/_export.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Django management command to export admin objects.""" from __future__ import unicode_literals diff --git a/modoboa/admin/management/commands/subcommands/_import.py b/modoboa/admin/management/commands/subcommands/_import.py index 5c24dc3c2..0c607b604 100644 --- a/modoboa/admin/management/commands/subcommands/_import.py +++ b/modoboa/admin/management/commands/subcommands/_import.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Django management command to import admin objects.""" from __future__ import unicode_literals diff --git a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py index daa3f232d..f1e707f5e 100644 --- a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py +++ b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Management command to create DKIM keys.""" from __future__ import print_function, unicode_literals diff --git a/modoboa/admin/management/commands/subcommands/_repair.py b/modoboa/admin/management/commands/subcommands/_repair.py index 58fdc3aef..26bfb42f4 100644 --- a/modoboa/admin/management/commands/subcommands/_repair.py +++ b/modoboa/admin/management/commands/subcommands/_repair.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Management command to check and fix known problems.""" from __future__ import print_function, unicode_literals diff --git a/modoboa/admin/models/__init__.py b/modoboa/admin/models/__init__.py index 4fcd82289..068fc45e9 100644 --- a/modoboa/admin/models/__init__.py +++ b/modoboa/admin/models/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Admin models.""" from __future__ import unicode_literals diff --git a/modoboa/admin/models/alias.py b/modoboa/admin/models/alias.py index 48c1fde2b..3056d6155 100644 --- a/modoboa/admin/models/alias.py +++ b/modoboa/admin/models/alias.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Models related to aliases management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/models/base.py b/modoboa/admin/models/base.py index 1393945d0..abe182180 100644 --- a/modoboa/admin/models/base.py +++ b/modoboa/admin/models/base.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Base admin models.""" from __future__ import unicode_literals diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index 615e21d49..98d286c47 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Models related to domains management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/models/domain_alias.py b/modoboa/admin/models/domain_alias.py index b231b586e..3fec21047 100644 --- a/modoboa/admin/models/domain_alias.py +++ b/modoboa/admin/models/domain_alias.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Models related to domain aliases management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index 26e45661b..610157536 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Models related to mailboxes management.""" from __future__ import unicode_literals diff --git a/modoboa/admin/models/mxrecord.py b/modoboa/admin/models/mxrecord.py index 4a4f71e5b..3d2cf9de8 100644 --- a/modoboa/admin/models/mxrecord.py +++ b/modoboa/admin/models/mxrecord.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """MX records storage.""" from __future__ import unicode_literals diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index 373500154..62b84748c 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Map file definitions for postfix.""" from __future__ import unicode_literals diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 5620bc63d..1be5b8830 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Admin serializers.""" from __future__ import unicode_literals diff --git a/modoboa/admin/signals.py b/modoboa/admin/signals.py index facb879b9..6bcc856c2 100644 --- a/modoboa/admin/signals.py +++ b/modoboa/admin/signals.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Modoboa admin signals.""" from __future__ import unicode_literals diff --git a/modoboa/admin/templatetags/admin_tags.py b/modoboa/admin/templatetags/admin_tags.py index 6cb87b0ef..038eddb21 100644 --- a/modoboa/admin/templatetags/admin_tags.py +++ b/modoboa/admin/templatetags/admin_tags.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Admin extension tags.""" from __future__ import unicode_literals diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index 75569d181..ead26e6a1 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import unicode_literals diff --git a/modoboa/admin/tests/test_alias.py b/modoboa/admin/tests/test_alias.py index 6372c490f..b79ed39b6 100644 --- a/modoboa/admin/tests/test_alias.py +++ b/modoboa/admin/tests/test_alias.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import unicode_literals diff --git a/modoboa/admin/tests/test_domain_alias.py b/modoboa/admin/tests/test_domain_alias.py index 9171634d1..d02e4ef96 100644 --- a/modoboa/admin/tests/test_domain_alias.py +++ b/modoboa/admin/tests/test_domain_alias.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import unicode_literals diff --git a/modoboa/admin/tests/test_export.py b/modoboa/admin/tests/test_export.py index c4fdf2db0..686d9afc0 100644 --- a/modoboa/admin/tests/test_export.py +++ b/modoboa/admin/tests/test_export.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Export related test cases.""" diff --git a/modoboa/admin/tests/test_mailbox_operations.py b/modoboa/admin/tests/test_mailbox_operations.py index 3a602cb59..d2ee501cc 100644 --- a/modoboa/admin/tests/test_mailbox_operations.py +++ b/modoboa/admin/tests/test_mailbox_operations.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Management command tests.""" from __future__ import unicode_literals diff --git a/modoboa/admin/tests/test_mapfiles.py b/modoboa/admin/tests/test_mapfiles.py index 1f0104681..1da822f04 100644 --- a/modoboa/admin/tests/test_mapfiles.py +++ b/modoboa/admin/tests/test_mapfiles.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Test map files generation.""" from __future__ import unicode_literals diff --git a/modoboa/admin/tests/test_password_schemes.py b/modoboa/admin/tests/test_password_schemes.py index 646383fd7..61b83b14a 100644 --- a/modoboa/admin/tests/test_password_schemes.py +++ b/modoboa/admin/tests/test_password_schemes.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from django.urls import reverse diff --git a/modoboa/admin/tests/test_repair.py b/modoboa/admin/tests/test_repair.py index ac3845215..1a45225b0 100644 --- a/modoboa/admin/tests/test_repair.py +++ b/modoboa/admin/tests/test_repair.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Repair command tests""" from __future__ import unicode_literals diff --git a/modoboa/admin/tests/test_user.py b/modoboa/admin/tests/test_user.py index 671026e02..3e2238355 100644 --- a/modoboa/admin/tests/test_user.py +++ b/modoboa/admin/tests/test_user.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """User related tests.""" from __future__ import unicode_literals diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index 0c3420de3..83b6570cb 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -1,4 +1,5 @@ -# pylint: disable=invalid-name, protected-access +# -*- coding: utf-8 -*- + """Admin urls.""" from __future__ import unicode_literals diff --git a/modoboa/admin/urls_api.py b/modoboa/admin/urls_api.py index 82a922fe1..63bad995f 100644 --- a/modoboa/admin/urls_api.py +++ b/modoboa/admin/urls_api.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Admin API urls.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/__init__.py b/modoboa/admin/views/__init__.py index 2a79ac999..501c59517 100644 --- a/modoboa/admin/views/__init__.py +++ b/modoboa/admin/views/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Shortcuts.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/alias.py b/modoboa/admin/views/alias.py index da961753e..9b3dfb1c6 100644 --- a/modoboa/admin/views/alias.py +++ b/modoboa/admin/views/alias.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Alias related views.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/dns.py b/modoboa/admin/views/dns.py index db0b71420..e202bb818 100644 --- a/modoboa/admin/views/dns.py +++ b/modoboa/admin/views/dns.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """DNSBL related views.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index 8a9fb77c0..a6e5fead6 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Domain related views.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/export.py b/modoboa/admin/views/export.py index 8c8019fa7..9773b3c6a 100644 --- a/modoboa/admin/views/export.py +++ b/modoboa/admin/views/export.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Export related views.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/identity.py b/modoboa/admin/views/identity.py index df4429321..ac352bc64 100644 --- a/modoboa/admin/views/identity.py +++ b/modoboa/admin/views/identity.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Identity related views.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/import_.py b/modoboa/admin/views/import_.py index 7c6e383e3..4544d47e2 100644 --- a/modoboa/admin/views/import_.py +++ b/modoboa/admin/views/import_.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Import related views.""" from __future__ import unicode_literals diff --git a/modoboa/admin/views/user.py b/modoboa/admin/views/user.py index 630e2967f..cb9e18d12 100644 --- a/modoboa/admin/views/user.py +++ b/modoboa/admin/views/user.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """SimpleUsers views.""" from __future__ import unicode_literals diff --git a/modoboa/core/__init__.py b/modoboa/core/__init__.py index c9be3cc2e..4efbc2ba0 100644 --- a/modoboa/core/__init__.py +++ b/modoboa/core/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """App config for core.""" from __future__ import unicode_literals diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index d08a12610..c0af12596 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import unicode_literals diff --git a/modoboa/core/apps.py b/modoboa/core/apps.py index eff453ddc..3e4fa2859 100644 --- a/modoboa/core/apps.py +++ b/modoboa/core/apps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Core config for admin.""" from __future__ import unicode_literals diff --git a/modoboa/core/commands/__init__.py b/modoboa/core/commands/__init__.py index a3bad62db..9a07357ce 100644 --- a/modoboa/core/commands/__init__.py +++ b/modoboa/core/commands/__init__.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import print_function, unicode_literals diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index e54d39dc3..791447d39 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """A shortcut to deploy a fresh modoboa instance.""" diff --git a/modoboa/core/commands/help.py b/modoboa/core/commands/help.py index 2d8619589..931264615 100644 --- a/modoboa/core/commands/help.py +++ b/modoboa/core/commands/help.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import print_function, unicode_literals diff --git a/modoboa/core/constants.py b/modoboa/core/constants.py index ae8587aa3..4d9edb8ad 100644 --- a/modoboa/core/constants.py +++ b/modoboa/core/constants.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Core application constants.""" diff --git a/modoboa/core/context_processors.py b/modoboa/core/context_processors.py index 72d4ba435..501b2cdc5 100644 --- a/modoboa/core/context_processors.py +++ b/modoboa/core/context_processors.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Custom context processors.""" from __future__ import unicode_literals diff --git a/modoboa/core/dev_settings.py b/modoboa/core/dev_settings.py index cbc4b1b54..e282ad7fe 100644 --- a/modoboa/core/dev_settings.py +++ b/modoboa/core/dev_settings.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + # Development settings from __future__ import unicode_literals diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index 6f7e43fd6..c0287745e 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Extension management.""" from __future__ import unicode_literals diff --git a/modoboa/core/factories.py b/modoboa/core/factories.py index 9624ab0d5..e0ad3315f 100644 --- a/modoboa/core/factories.py +++ b/modoboa/core/factories.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Factories for core application.""" from __future__ import unicode_literals diff --git a/modoboa/core/forms.py b/modoboa/core/forms.py index d2ce9c4a3..78e1f3e08 100644 --- a/modoboa/core/forms.py +++ b/modoboa/core/forms.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Core forms.""" diff --git a/modoboa/core/handlers.py b/modoboa/core/handlers.py index 5d48ad3ea..c964861a7 100644 --- a/modoboa/core/handlers.py +++ b/modoboa/core/handlers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Modoboa core signal handlers.""" from __future__ import unicode_literals diff --git a/modoboa/core/loggers.py b/modoboa/core/loggers.py index c6dd24a05..9090f5999 100644 --- a/modoboa/core/loggers.py +++ b/modoboa/core/loggers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals import logging diff --git a/modoboa/core/management/commands/clean_inactive_accounts.py b/modoboa/core/management/commands/clean_inactive_accounts.py index c989ae949..c67d21358 100644 --- a/modoboa/core/management/commands/clean_inactive_accounts.py +++ b/modoboa/core/management/commands/clean_inactive_accounts.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Inactive accounts cleanup tool.""" from __future__ import print_function, unicode_literals diff --git a/modoboa/core/management/commands/cleanlogs.py b/modoboa/core/management/commands/cleanlogs.py index fa3632612..723cdf9c0 100644 --- a/modoboa/core/management/commands/cleanlogs.py +++ b/modoboa/core/management/commands/cleanlogs.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import print_function, unicode_literals diff --git a/modoboa/core/management/commands/communicate_with_public_api.py b/modoboa/core/management/commands/communicate_with_public_api.py index 0cce51d0e..2fe2359c8 100644 --- a/modoboa/core/management/commands/communicate_with_public_api.py +++ b/modoboa/core/management/commands/communicate_with_public_api.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Management command to communicate with public API.""" from __future__ import unicode_literals diff --git a/modoboa/core/management/commands/generate_postfix_maps.py b/modoboa/core/management/commands/generate_postfix_maps.py index 6071e928b..dd4036481 100644 --- a/modoboa/core/management/commands/generate_postfix_maps.py +++ b/modoboa/core/management/commands/generate_postfix_maps.py @@ -1,4 +1,7 @@ +# -*- coding: utf-8 -*- + """Management command to generate/update postfix map files.""" + from __future__ import print_function, unicode_literals import copy diff --git a/modoboa/core/management/commands/load_initial_data.py b/modoboa/core/management/commands/load_initial_data.py index 2f633d552..d43f27bfc 100644 --- a/modoboa/core/management/commands/load_initial_data.py +++ b/modoboa/core/management/commands/load_initial_data.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """A management command to load Modoboa initial data: * Create a default super admin if none exists diff --git a/modoboa/core/management/commands/set_default_site.py b/modoboa/core/management/commands/set_default_site.py index 982b3dae6..8080420bc 100644 --- a/modoboa/core/management/commands/set_default_site.py +++ b/modoboa/core/management/commands/set_default_site.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """ A simple managemenent command to update the default site. diff --git a/modoboa/core/middleware.py b/modoboa/core/middleware.py index df8f6939a..65135942f 100644 --- a/modoboa/core/middleware.py +++ b/modoboa/core/middleware.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Core middlewares.""" from __future__ import unicode_literals diff --git a/modoboa/core/mocks.py b/modoboa/core/mocks.py index fc474b357..53044082b 100644 --- a/modoboa/core/mocks.py +++ b/modoboa/core/mocks.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Mocks used for testing.""" from __future__ import unicode_literals diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 79c495572..bf254989a 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Core models.""" from __future__ import unicode_literals diff --git a/modoboa/core/password_hashers/__init__.py b/modoboa/core/password_hashers/__init__.py index 31b90c437..0eb35c6fa 100644 --- a/modoboa/core/password_hashers/__init__.py +++ b/modoboa/core/password_hashers/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """ Password hashers for Modoboa. """ diff --git a/modoboa/core/password_hashers/advanced.py b/modoboa/core/password_hashers/advanced.py index 96698eadd..854cfb9ad 100644 --- a/modoboa/core/password_hashers/advanced.py +++ b/modoboa/core/password_hashers/advanced.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """ Advanced (ie. stronger) password hashers. diff --git a/modoboa/core/password_hashers/base.py b/modoboa/core/password_hashers/base.py index eb926adea..93b316919 100644 --- a/modoboa/core/password_hashers/base.py +++ b/modoboa/core/password_hashers/base.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """ Base password hashers. diff --git a/modoboa/core/password_validation.py b/modoboa/core/password_validation.py index f9eb9d84f..db3693ba1 100644 --- a/modoboa/core/password_validation.py +++ b/modoboa/core/password_validation.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Custom password validators.""" from __future__ import unicode_literals diff --git a/modoboa/core/signals.py b/modoboa/core/signals.py index 56b640ec9..708759fac 100644 --- a/modoboa/core/signals.py +++ b/modoboa/core/signals.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Modoboa core signals.""" from __future__ import unicode_literals diff --git a/modoboa/core/templatetags/core_tags.py b/modoboa/core/templatetags/core_tags.py index 3a5ce55ec..2b2a707dd 100644 --- a/modoboa/core/templatetags/core_tags.py +++ b/modoboa/core/templatetags/core_tags.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """Custom tags for Core application.""" from __future__ import unicode_literals diff --git a/modoboa/core/tests/stupid_extension_1/modo_extension.py b/modoboa/core/tests/stupid_extension_1/modo_extension.py index 171646e73..5fdf23318 100644 --- a/modoboa/core/tests/stupid_extension_1/modo_extension.py +++ b/modoboa/core/tests/stupid_extension_1/modo_extension.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """A stupid extension used for tests.""" from __future__ import unicode_literals diff --git a/modoboa/core/tests/stupid_extension_2/modo_extension.py b/modoboa/core/tests/stupid_extension_2/modo_extension.py index e2adace26..c7a58d1cc 100644 --- a/modoboa/core/tests/stupid_extension_2/modo_extension.py +++ b/modoboa/core/tests/stupid_extension_2/modo_extension.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """A stupid extension used for tests.""" from __future__ import unicode_literals diff --git a/modoboa/core/tests/stupid_extension_2/urls.py b/modoboa/core/tests/stupid_extension_2/urls.py index 43f39f251..0e3717f91 100644 --- a/modoboa/core/tests/stupid_extension_2/urls.py +++ b/modoboa/core/tests/stupid_extension_2/urls.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Custom urls.""" from __future__ import unicode_literals diff --git a/modoboa/core/tests/stupid_extension_2/views.py b/modoboa/core/tests/stupid_extension_2/views.py index 25d1b2268..c0a372402 100644 --- a/modoboa/core/tests/stupid_extension_2/views.py +++ b/modoboa/core/tests/stupid_extension_2/views.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from django import http diff --git a/modoboa/core/tests/test_authentication.py b/modoboa/core/tests/test_authentication.py index ff23ed729..7d99c4e3f 100644 --- a/modoboa/core/tests/test_authentication.py +++ b/modoboa/core/tests/test_authentication.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Tests for core application.""" diff --git a/modoboa/core/tests/test_core.py b/modoboa/core/tests/test_core.py index 7fff6e4a9..5d9a5a605 100644 --- a/modoboa/core/tests/test_core.py +++ b/modoboa/core/tests/test_core.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Tests for core application.""" from __future__ import unicode_literals diff --git a/modoboa/core/tests/test_extensions.py b/modoboa/core/tests/test_extensions.py index 2ceee2307..af420f526 100644 --- a/modoboa/core/tests/test_extensions.py +++ b/modoboa/core/tests/test_extensions.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Extensions management related test cases.""" from __future__ import unicode_literals diff --git a/modoboa/core/tests/test_ldap.py b/modoboa/core/tests/test_ldap.py index ba20dcd91..54c12a31a 100644 --- a/modoboa/core/tests/test_ldap.py +++ b/modoboa/core/tests/test_ldap.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Tests for core application.""" from __future__ import unicode_literals diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py index 33d8e7bb4..221445348 100644 --- a/modoboa/core/tests/test_views.py +++ b/modoboa/core/tests/test_views.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Core views test cases.""" from __future__ import unicode_literals diff --git a/modoboa/core/urls.py b/modoboa/core/urls.py index d3f34ba00..8b0fd2f95 100644 --- a/modoboa/core/urls.py +++ b/modoboa/core/urls.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Core urls.""" from __future__ import unicode_literals diff --git a/modoboa/core/utils.py b/modoboa/core/utils.py index 280bcb366..8d992880a 100644 --- a/modoboa/core/utils.py +++ b/modoboa/core/utils.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Utility functions.""" from __future__ import unicode_literals diff --git a/modoboa/core/views/__init__.py b/modoboa/core/views/__init__.py index db3341c3b..479f86c7f 100644 --- a/modoboa/core/views/__init__.py +++ b/modoboa/core/views/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Core views.""" from __future__ import unicode_literals diff --git a/modoboa/core/views/admin.py b/modoboa/core/views/admin.py index 09b1e1487..d1ec82099 100644 --- a/modoboa/core/views/admin.py +++ b/modoboa/core/views/admin.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Views available to super administrators only.""" from __future__ import unicode_literals diff --git a/modoboa/core/views/auth.py b/modoboa/core/views/auth.py index 856e0d412..8bcac9731 100644 --- a/modoboa/core/views/auth.py +++ b/modoboa/core/views/auth.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """Core authentication views.""" from __future__ import unicode_literals diff --git a/modoboa/core/views/base.py b/modoboa/core/views/base.py index 063cdf7cf..32ed7651e 100644 --- a/modoboa/core/views/base.py +++ b/modoboa/core/views/base.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Base core views.""" from __future__ import unicode_literals diff --git a/modoboa/core/views/dashboard.py b/modoboa/core/views/dashboard.py index 748e642af..669bc424d 100644 --- a/modoboa/core/views/dashboard.py +++ b/modoboa/core/views/dashboard.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Core dashboard views.""" from __future__ import unicode_literals diff --git a/modoboa/core/views/user.py b/modoboa/core/views/user.py index ee11e3d18..22dea631b 100644 --- a/modoboa/core/views/user.py +++ b/modoboa/core/views/user.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Simple user views.""" from __future__ import unicode_literals diff --git a/modoboa/lib/api_client.py b/modoboa/lib/api_client.py index dbeed9982..70cf45d87 100644 --- a/modoboa/lib/api_client.py +++ b/modoboa/lib/api_client.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """A client for Modoboa's public API.""" from __future__ import unicode_literals diff --git a/modoboa/lib/authbackends.py b/modoboa/lib/authbackends.py index db78d5d8f..adf41feb7 100644 --- a/modoboa/lib/authbackends.py +++ b/modoboa/lib/authbackends.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Custom authentication backends.""" from __future__ import unicode_literals diff --git a/modoboa/lib/connections.py b/modoboa/lib/connections.py index 8925991d3..5a194f674 100644 --- a/modoboa/lib/connections.py +++ b/modoboa/lib/connections.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from modoboa.lib.cryptutils import decrypt diff --git a/modoboa/lib/db_utils.py b/modoboa/lib/db_utils.py index 31f642e71..3336ed1ac 100644 --- a/modoboa/lib/db_utils.py +++ b/modoboa/lib/db_utils.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import unicode_literals diff --git a/modoboa/lib/exceptions.py b/modoboa/lib/exceptions.py index 3bfb5915f..9a672e8ca 100644 --- a/modoboa/lib/exceptions.py +++ b/modoboa/lib/exceptions.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """ :mod:`exceptions` --- Custom Modoboa exceptions ----------------------------------------------- diff --git a/modoboa/lib/fields.py b/modoboa/lib/fields.py index 4dcaf2998..52f53cd72 100644 --- a/modoboa/lib/fields.py +++ b/modoboa/lib/fields.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Custom form fields.""" from __future__ import unicode_literals diff --git a/modoboa/lib/form_utils.py b/modoboa/lib/form_utils.py index 99c664a3c..937e0e8d9 100644 --- a/modoboa/lib/form_utils.py +++ b/modoboa/lib/form_utils.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Form management utilities.""" diff --git a/modoboa/lib/ldap_utils.py b/modoboa/lib/ldap_utils.py index d8540faca..600b31517 100644 --- a/modoboa/lib/ldap_utils.py +++ b/modoboa/lib/ldap_utils.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """ A collection of LDAP based classes/functions. diff --git a/modoboa/lib/listing.py b/modoboa/lib/listing.py index b63e88913..8237719fe 100644 --- a/modoboa/lib/listing.py +++ b/modoboa/lib/listing.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator diff --git a/modoboa/lib/middleware.py b/modoboa/lib/middleware.py index ae86808dd..2273e6b1e 100644 --- a/modoboa/lib/middleware.py +++ b/modoboa/lib/middleware.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Custom middlewares.""" diff --git a/modoboa/lib/paginator.py b/modoboa/lib/paginator.py index 2c5658a54..9006ded56 100644 --- a/modoboa/lib/paginator.py +++ b/modoboa/lib/paginator.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """ Custom pagination tools. """ diff --git a/modoboa/lib/permissions.py b/modoboa/lib/permissions.py index 4a25ef20f..b1705bd77 100644 --- a/modoboa/lib/permissions.py +++ b/modoboa/lib/permissions.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """Object level permissions.""" from __future__ import unicode_literals diff --git a/modoboa/lib/signals.py b/modoboa/lib/signals.py index f203de7c3..46c4795b1 100644 --- a/modoboa/lib/signals.py +++ b/modoboa/lib/signals.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Custom signals.""" from __future__ import unicode_literals diff --git a/modoboa/lib/singleton.py b/modoboa/lib/singleton.py index 65c9a90aa..2033d7c6e 100644 --- a/modoboa/lib/singleton.py +++ b/modoboa/lib/singleton.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals diff --git a/modoboa/lib/sysutils.py b/modoboa/lib/sysutils.py index d58bdcbf8..3d21445bf 100644 --- a/modoboa/lib/sysutils.py +++ b/modoboa/lib/sysutils.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """ This module extra functions/shortcuts to communicate with the system diff --git a/modoboa/lib/templatetags/form_tags.py b/modoboa/lib/templatetags/form_tags.py index 4ad4c4b2c..796fce0be 100644 --- a/modoboa/lib/templatetags/form_tags.py +++ b/modoboa/lib/templatetags/form_tags.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """ Form rendering tags. """ diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index c48ef2a3c..41a086d31 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """Custom template tags.""" from __future__ import unicode_literals diff --git a/modoboa/lib/test_utils.py b/modoboa/lib/test_utils.py index 640c199f0..51b4be356 100644 --- a/modoboa/lib/test_utils.py +++ b/modoboa/lib/test_utils.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Tools for top level testing (ie. when ran by Travis).""" from __future__ import unicode_literals diff --git a/modoboa/lib/u2u_decode.py b/modoboa/lib/u2u_decode.py index 2adf1e3be..5d9367557 100644 --- a/modoboa/lib/u2u_decode.py +++ b/modoboa/lib/u2u_decode.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """ Unstructured rfc2047 header to unicode. diff --git a/modoboa/lib/validators.py b/modoboa/lib/validators.py index 69e64b914..80bd95ca2 100644 --- a/modoboa/lib/validators.py +++ b/modoboa/lib/validators.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Field validators.""" from __future__ import unicode_literals diff --git a/modoboa/lib/web_utils.py b/modoboa/lib/web_utils.py index c5cf371e3..8c70f8d51 100644 --- a/modoboa/lib/web_utils.py +++ b/modoboa/lib/web_utils.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """ This module contains extra functions/shortcuts used to render HTML. diff --git a/modoboa/limits/__init__.py b/modoboa/limits/__init__.py index 990d4c137..01758a791 100644 --- a/modoboa/limits/__init__.py +++ b/modoboa/limits/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals default_app_config = "modoboa.limits.apps.LimitsConfig" diff --git a/modoboa/limits/app_settings.py b/modoboa/limits/app_settings.py index 9a724e671..070a38f23 100644 --- a/modoboa/limits/app_settings.py +++ b/modoboa/limits/app_settings.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Custom settings.""" from __future__ import unicode_literals diff --git a/modoboa/limits/apps.py b/modoboa/limits/apps.py index 5b6628993..7f066caf0 100644 --- a/modoboa/limits/apps.py +++ b/modoboa/limits/apps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """App config for limits.""" from __future__ import unicode_literals diff --git a/modoboa/limits/constants.py b/modoboa/limits/constants.py index e70f2a1e0..570d961aa 100644 --- a/modoboa/limits/constants.py +++ b/modoboa/limits/constants.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Modoboa limits constants.""" from __future__ import unicode_literals diff --git a/modoboa/limits/forms.py b/modoboa/limits/forms.py index df8e0b6c7..7b91c377d 100644 --- a/modoboa/limits/forms.py +++ b/modoboa/limits/forms.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Custom forms.""" diff --git a/modoboa/limits/handlers.py b/modoboa/limits/handlers.py index 36e9838b2..57309b405 100644 --- a/modoboa/limits/handlers.py +++ b/modoboa/limits/handlers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Django signal handlers for limits.""" from __future__ import unicode_literals diff --git a/modoboa/limits/lib.py b/modoboa/limits/lib.py index 500cdf454..68dcb734a 100644 --- a/modoboa/limits/lib.py +++ b/modoboa/limits/lib.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """ :mod:`lib` --- public functions ------------------------------- diff --git a/modoboa/limits/models.py b/modoboa/limits/models.py index 04fc92081..ce62d9bfc 100644 --- a/modoboa/limits/models.py +++ b/modoboa/limits/models.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- """Models for the limits extensions.""" diff --git a/modoboa/limits/serializers.py b/modoboa/limits/serializers.py index a8ebd9c93..9fa0cbd00 100644 --- a/modoboa/limits/serializers.py +++ b/modoboa/limits/serializers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Limits serializers.""" from __future__ import unicode_literals diff --git a/modoboa/limits/tests/test_api.py b/modoboa/limits/tests/test_api.py index 7c1e28d51..890c05556 100644 --- a/modoboa/limits/tests/test_api.py +++ b/modoboa/limits/tests/test_api.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """Test cases for the limits extension.""" from __future__ import unicode_literals diff --git a/modoboa/limits/tests/test_domain_limits.py b/modoboa/limits/tests/test_domain_limits.py index a83fb23ca..9442cda99 100644 --- a/modoboa/limits/tests/test_domain_limits.py +++ b/modoboa/limits/tests/test_domain_limits.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """Test cases for the limits extension.""" from __future__ import unicode_literals diff --git a/modoboa/limits/tests/test_import.py b/modoboa/limits/tests/test_import.py index 184a1c878..109021f45 100644 --- a/modoboa/limits/tests/test_import.py +++ b/modoboa/limits/tests/test_import.py @@ -1,4 +1,4 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- from __future__ import unicode_literals diff --git a/modoboa/limits/tests/test_user_limits.py b/modoboa/limits/tests/test_user_limits.py index c20df8258..41bb40706 100644 --- a/modoboa/limits/tests/test_user_limits.py +++ b/modoboa/limits/tests/test_user_limits.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- + """Test cases for the limits extension.""" from __future__ import unicode_literals diff --git a/modoboa/limits/urls_api.py b/modoboa/limits/urls_api.py index 8ebfa0e5c..8295e069f 100644 --- a/modoboa/limits/urls_api.py +++ b/modoboa/limits/urls_api.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Limits API urls.""" from __future__ import unicode_literals diff --git a/modoboa/limits/utils.py b/modoboa/limits/utils.py index c98127909..ebbb11972 100644 --- a/modoboa/limits/utils.py +++ b/modoboa/limits/utils.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Modoboa limits utilities.""" from __future__ import unicode_literals diff --git a/modoboa/limits/viewsets.py b/modoboa/limits/viewsets.py index 5f57f5401..7cb8b3e55 100644 --- a/modoboa/limits/viewsets.py +++ b/modoboa/limits/viewsets.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Limits API.""" from __future__ import unicode_literals diff --git a/modoboa/parameters/apps.py b/modoboa/parameters/apps.py index f6edd84c9..f60d64f47 100644 --- a/modoboa/parameters/apps.py +++ b/modoboa/parameters/apps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from django.apps import AppConfig diff --git a/modoboa/parameters/forms.py b/modoboa/parameters/forms.py index f2b638ebc..19243c7b0 100644 --- a/modoboa/parameters/forms.py +++ b/modoboa/parameters/forms.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Parameters forms.""" from __future__ import unicode_literals diff --git a/modoboa/parameters/tools.py b/modoboa/parameters/tools.py index 59b898b60..5187ec0a5 100644 --- a/modoboa/parameters/tools.py +++ b/modoboa/parameters/tools.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Parameters management.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/__init__.py b/modoboa/relaydomains/__init__.py index c9afa7d7b..05dc26897 100644 --- a/modoboa/relaydomains/__init__.py +++ b/modoboa/relaydomains/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals default_app_config = "modoboa.relaydomains.apps.RelayDomainsConfig" diff --git a/modoboa/relaydomains/apps.py b/modoboa/relaydomains/apps.py index 36264f568..cfdb726b3 100644 --- a/modoboa/relaydomains/apps.py +++ b/modoboa/relaydomains/apps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """AppConfig for relaydomains.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/forms.py b/modoboa/relaydomains/forms.py index 1b9ee412a..87c728d62 100644 --- a/modoboa/relaydomains/forms.py +++ b/modoboa/relaydomains/forms.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Postfix relay domains extension forms.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/handlers.py b/modoboa/relaydomains/handlers.py index 80aa81adb..b06effa28 100644 --- a/modoboa/relaydomains/handlers.py +++ b/modoboa/relaydomains/handlers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Django signal handlers for relaydomains.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/lib.py b/modoboa/relaydomains/lib.py index f737f9453..bcebef70b 100644 --- a/modoboa/relaydomains/lib.py +++ b/modoboa/relaydomains/lib.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Internal library.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/models.py b/modoboa/relaydomains/models.py index 75e8fb312..5e3700c78 100644 --- a/modoboa/relaydomains/models.py +++ b/modoboa/relaydomains/models.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Relay domain related models.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/postfix_maps.py b/modoboa/relaydomains/postfix_maps.py index d0440337f..77c5904e0 100644 --- a/modoboa/relaydomains/postfix_maps.py +++ b/modoboa/relaydomains/postfix_maps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Map file definitions for postfix.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/serializers.py b/modoboa/relaydomains/serializers.py index 073100c0f..cd23b797e 100644 --- a/modoboa/relaydomains/serializers.py +++ b/modoboa/relaydomains/serializers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """RelayDomain serializers.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/tests.py b/modoboa/relaydomains/tests.py index c45fdadc1..ca828e5ce 100644 --- a/modoboa/relaydomains/tests.py +++ b/modoboa/relaydomains/tests.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """relaydomains unit tests.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/transport.py b/modoboa/relaydomains/transport.py index d6963ddd0..641b66897 100644 --- a/modoboa/relaydomains/transport.py +++ b/modoboa/relaydomains/transport.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Transport backend definition.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/urls_api.py b/modoboa/relaydomains/urls_api.py index 844915aa7..56b3562b1 100644 --- a/modoboa/relaydomains/urls_api.py +++ b/modoboa/relaydomains/urls_api.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Transport API urls.""" from __future__ import unicode_literals diff --git a/modoboa/relaydomains/viewsets.py b/modoboa/relaydomains/viewsets.py index 215dcb575..8f75e266b 100644 --- a/modoboa/relaydomains/viewsets.py +++ b/modoboa/relaydomains/viewsets.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """RelayDomain viewsets.""" from __future__ import unicode_literals diff --git a/modoboa/transport/__init__.py b/modoboa/transport/__init__.py index fd449f1e1..96b626725 100644 --- a/modoboa/transport/__init__.py +++ b/modoboa/transport/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals default_app_config = "modoboa.transport.apps.TransportConfig" diff --git a/modoboa/transport/apps.py b/modoboa/transport/apps.py index 5a1797cfe..7d27b0001 100644 --- a/modoboa/transport/apps.py +++ b/modoboa/transport/apps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from django.apps import AppConfig diff --git a/modoboa/transport/backends.py b/modoboa/transport/backends.py index c531e6ca1..dc2ae5500 100644 --- a/modoboa/transport/backends.py +++ b/modoboa/transport/backends.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Transport backend.""" from __future__ import unicode_literals diff --git a/modoboa/transport/constants.py b/modoboa/transport/constants.py index 61fbc1ac9..b1786c081 100644 --- a/modoboa/transport/constants.py +++ b/modoboa/transport/constants.py @@ -1,4 +1,7 @@ +# -*- coding: utf-8 -*- + """Transport constants.""" + from __future__ import unicode_literals PERMISSIONS = { diff --git a/modoboa/transport/factories.py b/modoboa/transport/factories.py index e2c4e001b..7e08e0b34 100644 --- a/modoboa/transport/factories.py +++ b/modoboa/transport/factories.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Transport factories.""" from __future__ import unicode_literals diff --git a/modoboa/transport/forms.py b/modoboa/transport/forms.py index cf6cbe656..9309e0413 100644 --- a/modoboa/transport/forms.py +++ b/modoboa/transport/forms.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Transport forms.""" from __future__ import unicode_literals diff --git a/modoboa/transport/handlers.py b/modoboa/transport/handlers.py index 969ae9d8f..427a420c2 100644 --- a/modoboa/transport/handlers.py +++ b/modoboa/transport/handlers.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Transport handlers.""" from __future__ import unicode_literals diff --git a/modoboa/transport/models.py b/modoboa/transport/models.py index 8f87fe7f5..b37991f85 100644 --- a/modoboa/transport/models.py +++ b/modoboa/transport/models.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Transport models.""" from __future__ import unicode_literals diff --git a/modoboa/transport/postfix_maps.py b/modoboa/transport/postfix_maps.py index be5aa51c9..a756fd57d 100644 --- a/modoboa/transport/postfix_maps.py +++ b/modoboa/transport/postfix_maps.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """Map file definitions for postfix.""" from __future__ import unicode_literals diff --git a/modoboa/urls.py b/modoboa/urls.py index bc0475af1..650816886 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import unicode_literals from functools import reduce diff --git a/modoboa/urls_api.py b/modoboa/urls_api.py index 7a6ed785f..ea1770cda 100644 --- a/modoboa/urls_api.py +++ b/modoboa/urls_api.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """External API urls.""" from __future__ import unicode_literals From 1adfba38d8e99a976f7f8938233c1c651e265f15 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 17:45:09 +0000 Subject: [PATCH 09/42] use /bin/sh instead of /bin/bash there's no guarantee that bash exists in /bin --- modoboa/admin/tests/dovecot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/admin/tests/dovecot b/modoboa/admin/tests/dovecot index dbb210754..66b2424a1 100755 --- a/modoboa/admin/tests/dovecot +++ b/modoboa/admin/tests/dovecot @@ -1,3 +1,3 @@ -#!/bin/bash +#!/bin/sh echo "2.12" From 8e2f29f409f6e52e466c31a57bac0e1063d0e926 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Sat, 3 Feb 2018 01:09:28 +0000 Subject: [PATCH 10/42] fix whitespace in setup.cfg --- setup.cfg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.cfg b/setup.cfg index 2d0868dfd..6f8d0cca9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,13 +7,13 @@ combine_as_imports = true combine_star = true default_section = THIRDPARTY indent = ' ' -known_django=django -known_drf=rest_framework +known_django = django +known_drf = rest_framework known_first_party = modoboa,test_project multi_line_output = 5 -no_lines_before=LOCALFOLDER +no_lines_before = LOCALFOLDER not_skip = __init__.py -sections=FUTURE,STDLIB,THIRDPARTY,DJANGO,DRF,FIRSTPARTY,LOCALFOLDER +sections = FUTURE,STDLIB,THIRDPARTY,DJANGO,DRF,FIRSTPARTY,LOCALFOLDER skip_glob = **/migrations/*.py use_parentheses = true From 8288412d3daad50e4358e4ae06b3ae1896d0a856 Mon Sep 17 00:00:00 2001 From: Jean Prunneaux Date: Mon, 12 Feb 2018 23:58:52 +0100 Subject: [PATCH 11/42] Add authentication log information in documentation --- doc/configuration.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/configuration.rst b/doc/configuration.rst index 628261179..f6b481589 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -254,6 +254,25 @@ This parameter is optional but you must ensure it is set to ``False`` The default configuration file provided by the ``modoboa-admin.py`` command is properly configured. +********************** +Logging authentication +********************** + +To trace login attempts to the web interface, Modoboa uses python +`SysLogHandler `_ +and so you can see in you syslog authentication log file +(`/var/log/auth.log` in most cases). + +Depending to your configuration, you may have to edit the :file:`settings.py` file +and add `'address': '/dev/log'` to the logging section:: + + 'syslog-auth': { + 'class': 'logging.handlers.SysLogHandler', + 'facility': SysLogHandler.LOG_AUTH, + 'address': '/dev/log', + 'formatter': 'syslog' + }, + *********************** External authentication *********************** From 499c353874ceca2446eaef01da2c97055e0b43d0 Mon Sep 17 00:00:00 2001 From: Jean Prunneaux Date: Wed, 21 Feb 2018 21:39:43 +0100 Subject: [PATCH 12/42] Fix english errors in documentation --- doc/configuration.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/configuration.rst b/doc/configuration.rst index f6b481589..996c52559 100644 --- a/doc/configuration.rst +++ b/doc/configuration.rst @@ -260,10 +260,10 @@ Logging authentication To trace login attempts to the web interface, Modoboa uses python `SysLogHandler `_ -and so you can see in you syslog authentication log file +so you can see them in your syslog authentication log file (`/var/log/auth.log` in most cases). -Depending to your configuration, you may have to edit the :file:`settings.py` file +Depending on your configuration, you may have to edit the :file:`settings.py` file and add `'address': '/dev/log'` to the logging section:: 'syslog-auth': { From 728b6050c2a04cf9fb8c81fdeb34b0080aefe6a4 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 24 Feb 2018 10:00:23 +0100 Subject: [PATCH 13/42] New signal triggered when DKIM keys are generated. --- .../management/commands/subcommands/_manage_dkim_keys.py | 4 ++++ modoboa/admin/signals.py | 1 + 2 files changed, 5 insertions(+) diff --git a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py index f1e707f5e..c7002c2c0 100644 --- a/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py +++ b/modoboa/admin/management/commands/subcommands/_manage_dkim_keys.py @@ -11,7 +11,9 @@ from django.utils.encoding import smart_text from modoboa.lib import sysutils from modoboa.parameters import tools as param_tools + from .... import models +from .... import signals class ManageDKIMKeys(BaseCommand): @@ -51,3 +53,5 @@ class ManageDKIMKeys(BaseCommand): enable_dkim=True, dkim_private_key_path="") for domain in qset: self.create_new_dkim_key(domain) + if qset.exists(): + signals.new_dkim_keys.send(sender=self.__class__, domains=qset) diff --git a/modoboa/admin/signals.py b/modoboa/admin/signals.py index 6bcc856c2..b085d7807 100644 --- a/modoboa/admin/signals.py +++ b/modoboa/admin/signals.py @@ -32,3 +32,4 @@ get_domain_form_instances = django.dispatch.Signal( # get_domain_tags = django.dispatch.Signal(providing_args=["domain"]) import_object = django.dispatch.Signal(providing_args=["objtype"]) use_external_recipients = django.dispatch.Signal(providing_args=["recipients"]) +new_dkim_keys = django.dispatch.Signal(providing_args=["domains"]) From 2c31895648bc4c8556ec08982ebbd50c48ee3a63 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 24 Feb 2018 14:16:19 +0100 Subject: [PATCH 14/42] Fixed syntax for subdomains. see #1403 --- modoboa/admin/models/domain.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index 98d286c47..d1ea9876e 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -206,8 +206,11 @@ class Domain(AdminObject): @property def bind_format_dkim_public_key(self): """Return DKIM public key using Bind format.""" - return "{}._domainkey 10800 IN TXT \"v=DKIM1; k=rsa; p={}\"".format( - self.dkim_key_selector, self.dkim_public_key) + parts = self.name.split(".") + subdomain = ( + "" if len(parts) == 2 else ".{}".format(".".join(parts[:-2]))) + return "{}._domainkey{} 10800 IN TXT \"v=DKIM1; k=rsa; p={}\"".format( + self.dkim_key_selector, subdomain, self.dkim_public_key) def add_admin(self, account): """Add a new administrator to this domain. From d954704ce92d575340ed1d163fa32fde12eac889 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 24 Feb 2018 14:27:10 +0100 Subject: [PATCH 15/42] Use absolute domain names instead of relative ones. see #1403 --- modoboa/admin/models/domain.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index d1ea9876e..d703a76b6 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -206,11 +206,8 @@ class Domain(AdminObject): @property def bind_format_dkim_public_key(self): """Return DKIM public key using Bind format.""" - parts = self.name.split(".") - subdomain = ( - "" if len(parts) == 2 else ".{}".format(".".join(parts[:-2]))) - return "{}._domainkey{} 10800 IN TXT \"v=DKIM1; k=rsa; p={}\"".format( - self.dkim_key_selector, subdomain, self.dkim_public_key) + return "{}._domainkey.{}. 10800 IN TXT \"v=DKIM1; k=rsa; p={}\"".format( + self.dkim_key_selector, self.name, self.dkim_public_key) def add_admin(self, account): """Add a new administrator to this domain. From b39ba2fc20db5fe1a5c9d007cd67256a9a5b8154 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 24 Feb 2018 14:45:39 +0100 Subject: [PATCH 16/42] Fixed error display in parameters form. see #1405 --- modoboa/static/js/global.js | 5 +++-- modoboa/static/js/twocols_nav.js | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/modoboa/static/js/global.js b/modoboa/static/js/global.js index a1c11a2a9..085b4c6b8 100644 --- a/modoboa/static/js/global.js +++ b/modoboa/static/js/global.js @@ -136,6 +136,7 @@ function display_form_errors(formid, data) { var $widget = $("#" + formid + " #" + fullid); var spanid = fullid + "-error"; var $span = $("#" + spanid); + var error = value.join(' '); if (!$widget.parents(".form-group").hasClass("has-error")) { $widget.parents(".form-group").addClass("has-error"); @@ -143,12 +144,12 @@ function display_form_errors(formid, data) { if (!$span.length) { $span = $("", { "class": "help-block", - "html": value[0], + "html": error, "id": spanid }); $widget.parents(".form-group").append($span); } else { - $span.html(value[0]); + $span.html(error); } }); } diff --git a/modoboa/static/js/twocols_nav.js b/modoboa/static/js/twocols_nav.js index 3401e0933..0903276b0 100644 --- a/modoboa/static/js/twocols_nav.js +++ b/modoboa/static/js/twocols_nav.js @@ -36,13 +36,15 @@ TwocolsNav.prototype = { success_cb: $.proxy(this.save_cb, this) }); }, this)); - $(document).on('submit', '#parameters_form', $.proxy(function(evt) { + var formId = 'parameters_form'; + $(document).on('submit', '#' + formId, $.proxy(function(evt) { simple_ajax_form_post(evt, { - formid: $(this).attr('id'), + formid: formId, modal: false, reload_on_success: false, success_cb: $.proxy(this.save_cb, this), error_cb: function(data) { + window.scrollTo(0, 0); $('a[data-app="' + data.prefix + '"]').tab('show'); } }); From 384ea598c44a84c110239f48d1e025fd82a84edf Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 1 Mar 2018 16:05:40 +0100 Subject: [PATCH 17/42] Load next page of the right type. see #1412 --- modoboa/admin/static/admin/js/admin.js | 18 ++++++++++++++++++ modoboa/admin/templates/admin/domains.html | 2 +- modoboa/admin/urls.py | 2 ++ modoboa/admin/views/domain.py | 13 +++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/modoboa/admin/static/admin/js/admin.js b/modoboa/admin/static/admin/js/admin.js index b198b9ab7..e5aeb2144 100644 --- a/modoboa/admin/static/admin/js/admin.js +++ b/modoboa/admin/static/admin/js/admin.js @@ -161,6 +161,24 @@ Domains.prototype = { $(document).trigger('domain_listing_refresh'); }, + /** + * Add a type to let the server know what kind of object we expect. + * + * @this Listing + */ + get_load_page_args: function() { + var args = Admin.prototype.get_load_page_args.call(this); + + if (this.navobj.getbaseurl() === "list") { + args.objtype = "domain"; + this.options.eor_message = gettext("No more domain to show"); + } else { + args.objtype = "quota"; + this.options.eor_message = gettext("No more quota to show"); + } + return args; + }, + /** * Navigation callback: default. * diff --git a/modoboa/admin/templates/admin/domains.html b/modoboa/admin/templates/admin/domains.html index 10f18baa6..5d354d6bd 100644 --- a/modoboa/admin/templates/admin/domains.html +++ b/modoboa/admin/templates/admin/domains.html @@ -15,7 +15,7 @@ diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index 83b6570cb..bb299ae19 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -31,6 +31,8 @@ urlpatterns = [ name="domain_change"), url(r'^domains/(?P\d+)/delete/$', domain_views.deldomain, name="domain_delete"), + url(r'^domains/page/$', domain_views.get_next_page, + name="domain_page"), ] urlpatterns += [ diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index a6e5fead6..824901cbd 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -108,6 +108,19 @@ 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 + u.has_perm("admin.add_domain") +) +def get_next_page(request): + """Return the next page of the domain or quota list.""" + if request.GET.get("objtype", "domain") == "domain": + return _domains(request) + return list_quotas(request) + + @login_required @permission_required("core.add_user") def domains_list(request): From 88468fa08f9f2957552ad57fe226f464707876d6 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 1 Mar 2018 17:16:27 +0100 Subject: [PATCH 18/42] Added unit test. --- modoboa/admin/tests/test_domain.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py index c8abbf2c5..dc5529698 100644 --- a/modoboa/admin/tests/test_domain.py +++ b/modoboa/admin/tests/test_domain.py @@ -356,6 +356,14 @@ class DomainTestCase(ModoTestCase): self.assertNotIn("Global statistics", content) self.assertIn("Per-domain statistics", content) + def test_page_loader(self): + """Test page loader view.""" + url = reverse("admin:domain_page") + response = self.ajax_get(url) + self.assertIn("handle_mailboxes", response) + response = self.ajax_get("{}?objtype=quota".format(url)) + self.assertIn("progress-bar", response["rows"]) + class DKIMTestCase(ModoTestCase): """Test case for DKIM.""" From 6503cef3daa19aeb891215014658bcc8316ff9e7 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Sat, 3 Mar 2018 14:38:16 +0000 Subject: [PATCH 19/42] #1417 psycopg2 binary package has been renamed to psycopg2-binary also bump the minimum version to 2.7.4 as this is when the psycopg2-binary became available. See #1417 and http://initd.org/psycopg/articles/2018/02/08/psycopg-274-released/ --- postgresql-requirements.txt | 2 +- test-requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/postgresql-requirements.txt b/postgresql-requirements.txt index 59041b90e..a50ac6574 100644 --- a/postgresql-requirements.txt +++ b/postgresql-requirements.txt @@ -1 +1 @@ -psycopg2>=2.5.4 +psycopg2-binary>=2.7.4 diff --git a/test-requirements.txt b/test-requirements.txt index fa89fafc7..45bb850f1 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -3,5 +3,5 @@ mock==2.0.0 httmock==1.2.5 testfixtures==4.7.0 tox -psycopg2>=2.5.4 +psycopg2-binary>=2.7.4 mysqlclient>=1.3.3 From b71eff661d65b93888cecb8f3a19aa89c79f6446 Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Sun, 4 Mar 2018 02:35:41 +0000 Subject: [PATCH 20/42] #1420 fix DKIM bind record TXT records longer than 255 characters need split into chunks fixes #1420 --- modoboa/admin/models/domain.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index d703a76b6..60ee94427 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -206,8 +206,21 @@ class Domain(AdminObject): @property def bind_format_dkim_public_key(self): """Return DKIM public key using Bind format.""" - return "{}._domainkey.{}. 10800 IN TXT \"v=DKIM1; k=rsa; p={}\"".format( - self.dkim_key_selector, self.name, self.dkim_public_key) + record = "v=DKIM1;k=rsa;p=%s" % self.dkim_public_key + # TXT records longer than 255 characters need split into chunks + # split record into 74 character chunks (+2 for indent, +2 for quotes(") + # == 78 characters) to make more readable in text editors. + split_record = [] + while record: + if len(record) > 74: + split_record.append(" \"%s\"" % record[:74]) + record = record[74:] + else: + split_record.append(" \"%s\"" % record) + break + record = "\n".join(split_record) + return "{}._domainkey.{}. 10800 IN TXT (\n{})".format( + self.dkim_key_selector, self.name, record) def add_admin(self, account): """Add a new administrator to this domain. From cfbdeb689748190d43670b26bb6c4981d33a7ed4 Mon Sep 17 00:00:00 2001 From: cptMikky Date: Tue, 6 Mar 2018 01:00:32 +0100 Subject: [PATCH 21/42] remove uwsgi warning Current Debian stable ships with uWSGI 2.0.14 while the current upstream version to the date is only 2.0.17. The original warning no longer applies, there's no need to scare off Debian or Ubuntu users. --- doc/manual_installation/webserver.rst | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/doc/manual_installation/webserver.rst b/doc/manual_installation/webserver.rst index a95fef147..8f528fb88 100644 --- a/doc/manual_installation/webserver.rst +++ b/doc/manual_installation/webserver.rst @@ -168,15 +168,8 @@ uwsgi: .. warning:: - Some distributions, including Debian and Ubuntu, ship an outdated - version of uWSGI that does not conform to the WSGI - specification. Versions prior to 1.2.6 do not call close on the - response object after handling a request. In those cases the - request_finished signal isn’t sent. This can result in idle - connections to database and memcache servers. - -Use uwsgi 1.2.6 or newer. If you do not, you *will* run into -problems. Modoboa will fail in obscure ways. + Use uwsgi 1.2.6 or newer. If you do not, you *will* run into + problems. Modoboa will fail in obscure ways. To use this setup, first `download and install uwsgi `_. From 91a8a0544be8eb40c1cc6c226c48a04c05774f63 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 7 Mar 2018 17:33:01 +0100 Subject: [PATCH 22/42] Fixed DKIM key display format. see #1420 --- modoboa/admin/templates/admin/_domain_dkim_key.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/templates/admin/_domain_dkim_key.html b/modoboa/admin/templates/admin/_domain_dkim_key.html index d867ac509..ae71983e3 100644 --- a/modoboa/admin/templates/admin/_domain_dkim_key.html +++ b/modoboa/admin/templates/admin/_domain_dkim_key.html @@ -1,6 +1,6 @@ {% load i18n %} -