diff --git a/gnuviechadmin/gnuviechadmin/settings.py b/gnuviechadmin/gnuviechadmin/settings.py index 0d9ee46..2d8e3e5 100644 --- a/gnuviechadmin/gnuviechadmin/settings.py +++ b/gnuviechadmin/gnuviechadmin/settings.py @@ -24,10 +24,11 @@ SITE_NAME = basename(DJANGO_ROOT) # ######### END PATH CONFIGURATION +GVA_ENVIRONMENT = get_env_variable("GVA_ENVIRONMENT", default="prod") # ######### DEBUG CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#debug -DEBUG = False +DEBUG = (GVA_ENVIRONMENT == "local") # ######### END DEBUG CONFIGURATION @@ -351,8 +352,6 @@ GVA_LINK_PHPPGADMIN = get_env_variable( ) # ######### END CUSTOM APP CONFIGURATION -GVA_ENVIRONMENT = get_env_variable("GVA_ENVIRONMENT", default="prod") - # ######### STATIC FILE CONFIGURATION # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root STATIC_ROOT = "/srv/gva/static/" @@ -362,11 +361,19 @@ def show_debug_toolbar(request): return DEBUG and GVA_ENVIRONMENT == "local" -if GVA_ENVIRONMENT == "local": - # ######### DEBUG CONFIGURATION - # See: https://docs.djangoproject.com/en/dev/ref/settings/#debug - DEBUG = True +# ######### TOOLBAR CONFIGURATION +# See: http://django-debug-toolbar.readthedocs.org/en/latest/installation.html#explicit-setup # noqa +INSTALLED_APPS += ("debug_toolbar",) +MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware"] + +DEBUG_TOOLBAR_CONFIG = { + "SHOW_TOOLBAR_CALLBACK": "gnuviechadmin.settings.show_debug_toolbar" +} +# ######### END TOOLBAR CONFIGURATION + + +if GVA_ENVIRONMENT == "local": # See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug TEMPLATES[0]["OPTIONS"]["debug"] = DEBUG # ######### END DEBUG CONFIGURATION @@ -381,12 +388,6 @@ if GVA_ENVIRONMENT == "local": CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}} # ######### END CACHE CONFIGURATION - # ######### TOOLBAR CONFIGURATION - # See: http://django-debug-toolbar.readthedocs.org/en/latest/installation.html#explicit-setup # noqa - INSTALLED_APPS += ("debug_toolbar",) - - MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware"] - LOGGING["handlers"].update( { "console": { @@ -419,13 +420,6 @@ if GVA_ENVIRONMENT == "local": ] ) ) - - DEBUG_TOOLBAR_PATCH_SETTINGS = False - DEBUG_TOOLBAR_CONFIG = { - "SHOW_TOOLBAR_CALLBACK": "gnuviechadmin.settings.show_debug_toolbar" - } - - # ######### END TOOLBAR CONFIGURATION elif GVA_ENVIRONMENT == "test": ALLOWED_HOSTS = ["localhost"] PASSWORD_HASHERS = ("django.contrib.auth.hashers.MD5PasswordHasher",) diff --git a/gnuviechadmin/gnuviechadmin/urls.py b/gnuviechadmin/gnuviechadmin/urls.py index 2b6d0b1..506c09b 100644 --- a/gnuviechadmin/gnuviechadmin/urls.py +++ b/gnuviechadmin/gnuviechadmin/urls.py @@ -1,11 +1,11 @@ from __future__ import absolute_import +import debug_toolbar from django.conf.urls import include, url -from django.conf import settings - from django.contrib import admin from django.contrib.flatpages import views from django.contrib.staticfiles.urls import staticfiles_urlpatterns +from django.urls import path admin.autodiscover() @@ -28,9 +28,7 @@ urlpatterns = [ # Uncomment the next line to serve media files in dev. # urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -if settings.DEBUG: # pragma: no cover - import debug_toolbar - - urlpatterns = [ - url(r'^__debug__/', include(debug_toolbar.urls)), - ] + staticfiles_urlpatterns() + urlpatterns +urlpatterns += staticfiles_urlpatterns() +urlpatterns += [ + path('__debug__/', include(debug_toolbar.urls)), +] diff --git a/gnuviechadmin/managemails/models.py b/gnuviechadmin/managemails/models.py index 5d30164..6eef059 100644 --- a/gnuviechadmin/managemails/models.py +++ b/gnuviechadmin/managemails/models.py @@ -7,24 +7,20 @@ from __future__ import unicode_literals from django.db import models from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext as _ - -from passlib.hash import sha512_crypt from model_utils.models import TimeStampedModel +from passlib.hash import sha512_crypt from domains.models import MailDomain +from fileservertasks.tasks import create_file_mailbox, delete_file_mailbox from osusers.models import User as OsUser -from fileservertasks.tasks import ( - create_file_mailbox, - delete_file_mailbox, -) - class ActivateAbleMixin(models.Model): """ Mixin for model classes that can be active or inactive. """ + active = models.BooleanField(default=True) class Meta: @@ -51,10 +47,8 @@ class MailboxManager(models.Manager): mailboxformat = "{0}p{1:02d}" mailboxname = mailboxformat.format(osuser.username, count) - for box in self.values('username').filter(osuser=osuser).order_by( - 'username' - ): - if box['username'] == mailboxname: + for box in self.values("username").filter(osuser=osuser).order_by("username"): + if box["username"] == mailboxname: count += 1 mailboxname = mailboxformat.format(osuser.username, count) else: @@ -69,9 +63,10 @@ class MailboxManager(models.Manager): """ return self.filter( - models.Q(mailaddressmailbox__isnull=True) | - models.Q(mailaddressmailbox__mailaddress=mailaddress), - active=True, osuser=osuser, + models.Q(mailaddressmailbox__isnull=True) + | models.Q(mailaddressmailbox__mailaddress=mailaddress), + active=True, + osuser=osuser, ) def unused(self, osuser): @@ -82,7 +77,8 @@ class MailboxManager(models.Manager): """ return self.filter( mailaddressmailbox__isnull=True, - active=True, osuser=osuser, + active=True, + osuser=osuser, ) def create_mailbox(self, osuser, password=None, commit=True): @@ -97,7 +93,8 @@ class MailboxManager(models.Manager): """ mailbox = self.create( - osuser=osuser, username=self.get_next_mailbox_name(osuser)) + osuser=osuser, username=self.get_next_mailbox_name(osuser) + ) if password is not None: mailbox.set_password(password) return mailbox @@ -109,6 +106,7 @@ class Mailbox(ActivateAbleMixin, TimeStampedModel): This is the model class for a mailbox. """ + osuser = models.ForeignKey(OsUser, on_delete=models.CASCADE) username = models.CharField(max_length=128, unique=True) password = models.CharField(max_length=255) @@ -116,9 +114,9 @@ class Mailbox(ActivateAbleMixin, TimeStampedModel): objects = MailboxManager() class Meta: - ordering = ['osuser', 'username'] - verbose_name = _('Mailbox') - verbose_name_plural = _('Mailboxes') + ordering = ["osuser", "username"] + verbose_name = _("Mailbox") + verbose_name_plural = _("Mailboxes") def set_password(self, password): """ @@ -127,7 +125,7 @@ class Mailbox(ActivateAbleMixin, TimeStampedModel): :param str password: the clear text password """ - self.password = sha512_crypt.encrypt(password) + self.password = sha512_crypt.hash(password) def save(self, *args, **kwargs): # TODO: refactor to use signals @@ -144,11 +142,9 @@ class Mailbox(ActivateAbleMixin, TimeStampedModel): Get a list of mail addresses assigned to this mailbox. """ - addrs = [ - mbadr.mailaddress for mbadr in - self.mailaddressmailbox_set.all() - ] + addrs = [mbadr.mailaddress for mbadr in self.mailaddressmailbox_set.all()] return addrs + mailaddresses = property(get_mailaddresses) def __str__(self): @@ -161,15 +157,17 @@ class MailAddress(ActivateAbleMixin, TimeStampedModel, models.Model): This is the model class for a mail address. """ - localpart = models.CharField(_('local part'), max_length=128) + + localpart = models.CharField(_("local part"), max_length=128) domain = models.ForeignKey( - MailDomain, verbose_name=_('domain'), on_delete=models.CASCADE) + MailDomain, verbose_name=_("domain"), on_delete=models.CASCADE + ) class Meta: - ordering = ['domain', 'localpart'] - unique_together = ('localpart', 'domain') - verbose_name = _('Mail address') - verbose_name_plural = _('Mail addresses') + ordering = ["domain", "localpart"] + unique_together = ("localpart", "domain") + verbose_name = _("Mail address") + verbose_name_plural = _("Mail addresses") def __str__(self): return "{0}@{1}".format(self.localpart, self.domain) @@ -220,8 +218,7 @@ class MailAddress(ActivateAbleMixin, TimeStampedModel, models.Model): if MailAddressMailbox.objects.filter(mailaddress=self).exists(): mabox = MailAddressMailbox.objects.get(mailaddress=self) mabox.delete() - forwards = MailAddressForward.objects.filter( - mailaddress=self).all() + forwards = MailAddressForward.objects.filter(mailaddress=self).all() for item in forwards: if item.target not in addresses: item.delete() @@ -250,14 +247,19 @@ class MailAddressMailbox(TimeStampedModel, models.Model): This is the model class to assign a mail address to a mailbox. """ + mailaddress = models.OneToOneField( - MailAddress, verbose_name=_('mailaddress'), primary_key=True, - on_delete=models.CASCADE) + MailAddress, + verbose_name=_("mailaddress"), + primary_key=True, + on_delete=models.CASCADE, + ) mailbox = models.ForeignKey( - Mailbox, verbose_name=_('mailbox'), on_delete=models.CASCADE) + Mailbox, verbose_name=_("mailbox"), on_delete=models.CASCADE + ) class Meta: - unique_together = ('mailaddress', 'mailbox') + unique_together = ("mailaddress", "mailbox") def __str__(self): return self.mailbox.username @@ -268,8 +270,9 @@ class MailAddressForward(TimeStampedModel, models.Model): This is a model class to map mail addresses to forwarding addresses. """ + mailaddress = models.ForeignKey(MailAddress, on_delete=models.CASCADE) target = models.EmailField(max_length=254) class Meta: - unique_together = ('mailaddress', 'target') + unique_together = ("mailaddress", "target") diff --git a/gnuviechadmin/osusers/models.py b/gnuviechadmin/osusers/models.py index 14d36ff..7772d97 100644 --- a/gnuviechadmin/osusers/models.py +++ b/gnuviechadmin/osusers/models.py @@ -3,22 +3,19 @@ This module defines the database models of operating system users. """ import base64 -from datetime import date import logging import os +from datetime import date -from django.db import models, transaction from django.conf import settings from django.core.exceptions import ValidationError +from django.db import models, transaction from django.dispatch import Signal from django.utils import timezone from django.utils.translation import ugettext as _ - from model_utils.models import TimeStampedModel - from passlib.hash import sha512_crypt -from passlib.utils import generate_password - +from passlib.pwd import genword _LOGGER = logging.getLogger(__name__) @@ -150,7 +147,7 @@ class UserManager(models.Manager): If username is None the result of :py:meth:`get_next_username` is used. If password is None a new password will be generated using passlib's - :py:func:`generate_password`. + :py:func:`genword`. :param customer: Django User instance this user is associated to :param str username: the username or None @@ -166,7 +163,7 @@ class UserManager(models.Manager): if username is None: username = self.get_next_username() if password is None: - password = generate_password() + password = genword(entropy=128) homedir = os.path.join(settings.OSUSER_HOME_BASEPATH, username) group = Group.objects.create(groupname=username, gid=gid) user = self.create( diff --git a/gnuviechadmin/templates/base.html b/gnuviechadmin/templates/base.html index b6c10fb..8040f63 100644 --- a/gnuviechadmin/templates/base.html +++ b/gnuviechadmin/templates/base.html @@ -1,4 +1,4 @@ -{% load staticfiles i18n account %} +{% load static i18n account %} diff --git a/gnuviechadmin/webtasks/tasks.py b/gnuviechadmin/webtasks/tasks.py index 4abd4af..2fd1dcc 100644 --- a/gnuviechadmin/webtasks/tasks.py +++ b/gnuviechadmin/webtasks/tasks.py @@ -1,5 +1,5 @@ """ -This module defines Celery_ tasks to manage website configurations. +This module defines Celery tasks to manage website configurations. """ from __future__ import absolute_import