From 1eb7f9357236fec6031d274df85f4e5adb5a0b4f Mon Sep 17 00:00:00 2001 From: Andrew Fyfe Date: Fri, 2 Feb 2018 13:09:30 +0000 Subject: [PATCH 01/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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