From fa2cabdbfee36c5d1b2a00571a08af7d3096a1a0 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 11 Apr 2016 14:17:02 +0200 Subject: [PATCH] Move signal handlers and load them at the right time. --- modoboa/admin/api.py | 8 ++++- modoboa/core/apps.py | 2 ++ modoboa/core/handlers.py | 65 ++++++++++++++++++++++++++++++++++++++++ modoboa/core/models.py | 61 ++----------------------------------- 4 files changed, 76 insertions(+), 60 deletions(-) create mode 100644 modoboa/core/handlers.py diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index c64b5d616..f521b9590 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -90,7 +90,13 @@ class AccountViewSet(viewsets.ModelViewSet): @list_route() def exists(self, request): - """Check if account exists.""" + """Check if account exists. + + Requires a valid email address as argument. Example: + + GET /exists/?email=user@test.com + + """ email = request.GET.get("email") if not email: raise ParseError("email not provided") diff --git a/modoboa/core/apps.py b/modoboa/core/apps.py index 70d611fb5..67ba209d7 100644 --- a/modoboa/core/apps.py +++ b/modoboa/core/apps.py @@ -66,3 +66,5 @@ class CoreConfig(AppConfig): def ready(self): load_core_settings() + + from . import handlers diff --git a/modoboa/core/handlers.py b/modoboa/core/handlers.py new file mode 100644 index 000000000..e5d6fb6ce --- /dev/null +++ b/modoboa/core/handlers.py @@ -0,0 +1,65 @@ +"""Modoboa core signal handlers.""" + +import logging + +from django.db.models.signals import post_delete +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +import reversion + + +@receiver(reversion.post_revision_commit) +def post_revision_commit(sender, **kwargs): + """Custom post-revision hook. + + We want to track all creations and modifications of admin. objects + (alias, mailbox, user, domain, domain alias, etc.) so we use + django-reversion for that. + + """ + from modoboa.lib.signals import get_request + + current_user = get_request().user.username + logger = logging.getLogger("modoboa.admin") + for version in kwargs["versions"]: + if version.object is None: + continue + prev_revisions = reversion.get_for_object(version.object) + if prev_revisions.count() == 1: + action = _("added") + level = "info" + else: + action = _("modified") + level = "warning" + message = _("%(object)s '%(name)s' %(action)s by user %(user)s") % { + "object": unicode(version.content_type).capitalize(), + "name": version.object_repr, "action": action, + "user": current_user + } + getattr(logger, level)(message) + + +@receiver(post_delete) +def log_object_removal(sender, instance, **kwargs): + """Custom post-delete hook. + + We want to know who was responsible for an object deletion. + """ + from reversion.models import Version + from modoboa.lib.signals import get_request + + if not reversion.is_registered(sender): + return + del_list = reversion.get_deleted(sender) + try: + version = del_list.get(object_id=instance.id) + except Version.DoesNotExist: + return + logger = logging.getLogger("modoboa.admin") + msg = _("%(object)s '%(name)s' %(action)s by user %(user)s") % { + "object": unicode(version.content_type).capitalize(), + "name": version.object_repr, "action": _("deleted"), + "user": get_request().user.username + } + logger.critical(msg) diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 82621b172..1ce6c3da9 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -1,6 +1,5 @@ """Core models.""" -import logging import re from django.contrib.auth.hashers import make_password, is_password_usable @@ -10,8 +9,6 @@ from django.contrib.auth.models import ( from django.contrib.contenttypes import generic from django.contrib.contenttypes.models import ContentType from django.db import models -from django.db.models.signals import post_delete -from django.dispatch import receiver from django.utils import timezone from django.utils.encoding import python_2_unicode_compatible, smart_text from django.utils.translation import ugettext as _, ugettext_lazy @@ -486,63 +483,9 @@ class ObjectAccess(models.Model): class Log(models.Model): + """Simple log in database.""" + date_created = models.DateTimeField(auto_now_add=True) message = models.CharField(max_length=255) level = models.CharField(max_length=15) logger = models.CharField(max_length=30) - - -@receiver(reversion.post_revision_commit) -def post_revision_commit(sender, **kwargs): - """Custom post-revision hook. - - We want to track all creations and modifications of admin. objects - (alias, mailbox, user, domain, domain alias, etc.) so we use - django-reversion for that. - - """ - from modoboa.lib.signals import get_request - - current_user = get_request().user.username - logger = logging.getLogger("modoboa.admin") - for version in kwargs["versions"]: - if version.object is None: - continue - prev_revisions = reversion.get_for_object(version.object) - if prev_revisions.count() == 1: - action = _("added") - level = "info" - else: - action = _("modified") - level = "warning" - message = _("%(object)s '%(name)s' %(action)s by user %(user)s") % { - "object": unicode(version.content_type).capitalize(), - "name": version.object_repr, "action": action, - "user": current_user - } - getattr(logger, level)(message) - - -@receiver(post_delete) -def log_object_removal(sender, instance, **kwargs): - """Custom post-delete hook. - - We want to know who was responsible for an object deletion. - """ - from reversion.models import Version - from modoboa.lib.signals import get_request - - if not reversion.is_registered(sender): - return - del_list = reversion.get_deleted(sender) - try: - version = del_list.get(object_id=instance.id) - except Version.DoesNotExist: - return - logger = logging.getLogger("modoboa.admin") - msg = _("%(object)s '%(name)s' %(action)s by user %(user)s") % { - "object": unicode(version.content_type).capitalize(), - "name": version.object_repr, "action": _("deleted"), - "user": get_request().user.username - } - logger.critical(msg)