From 78586b934322fe020eb3ebf5211738d5d269c04a Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 7 Sep 2020 14:52:37 +0200 Subject: [PATCH] Don't trigger signals when we add an object through a permission check --- apps/logs/signals.py | 4 ++-- apps/member/signals.py | 2 +- apps/note/signals.py | 20 ++++++++++---------- apps/permission/models.py | 4 ++-- apps/permission/signals.py | 5 +++-- apps/treasury/signals.py | 13 +++++++------ 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/apps/logs/signals.py b/apps/logs/signals.py index f313cc5b..b0b4d2c2 100644 --- a/apps/logs/signals.py +++ b/apps/logs/signals.py @@ -50,7 +50,7 @@ def save_object(sender, instance, **kwargs): in order to store each modification made """ # noinspection PyProtectedMember - if instance._meta.label_lower in EXCLUDED or hasattr(instance, "_no_log"): + if instance._meta.label_lower in EXCLUDED or hasattr(instance, "_no_signal"): return # noinspection PyProtectedMember @@ -117,7 +117,7 @@ def delete_object(sender, instance, **kwargs): Each time a model is deleted, an entry in the table `Changelog` is added in the database """ # noinspection PyProtectedMember - if instance._meta.label_lower in EXCLUDED or hasattr(instance, "_no_log"): + if instance._meta.label_lower in EXCLUDED or hasattr(instance, "_no_signal"): return # Si un utilisateur est connecté, on récupère l'utilisateur courant ainsi que son adresse IP diff --git a/apps/member/signals.py b/apps/member/signals.py index 43659b01..d590f446 100644 --- a/apps/member/signals.py +++ b/apps/member/signals.py @@ -6,7 +6,7 @@ def save_user_profile(instance, created, raw, **_kwargs): """ Hook to create and save a profile when an user is updated if it is not registered with the signup form """ - if not raw and created and instance.is_active: + if not raw and created and instance.is_active and not hasattr(instance, "_no_signal"): from .models import Profile Profile.objects.get_or_create(user=instance) if instance.is_superuser: diff --git a/apps/note/signals.py b/apps/note/signals.py index 51ed92d8..c1545ec2 100644 --- a/apps/note/signals.py +++ b/apps/note/signals.py @@ -6,7 +6,8 @@ def save_user_note(instance, raw, **_kwargs): """ Hook to create and save a note when an user is updated """ - if not raw and (instance.is_superuser or instance.profile.registration_valid): + if not raw and (instance.is_superuser or instance.profile.registration_valid)\ + and not hasattr(instance, "_no_signal"): # Create note only when the registration is validated from note.models import NoteUser NoteUser.objects.get_or_create(user=instance) @@ -17,18 +18,17 @@ def save_club_note(instance, raw, **_kwargs): """ Hook to create and save a note when a club is updated """ - if raw: - # When provisionning data, do not try to autocreate - return - - from .models import NoteClub - NoteClub.objects.get_or_create(club=instance) - instance.note.save() + # When provisionning data, do not try to autocreate + if not raw and not hasattr(instance, "_no_signal"): + from .models import NoteClub + NoteClub.objects.get_or_create(club=instance) + instance.note.save() def delete_transaction(instance, **_kwargs): """ Whenever we want to delete a transaction (caution with this), we ensure the transaction is invalid first. """ - instance.valid = False - instance.save() + if not hasattr(instance, "_no_signal"): + instance.valid = False + instance.save() diff --git a/apps/permission/models.py b/apps/permission/models.py index 3d395a75..ae77e1a0 100644 --- a/apps/permission/models.py +++ b/apps/permission/models.py @@ -57,8 +57,8 @@ class InstancedPermission: # Force insertion, no data verification, no trigger obj._force_save = True - # We don't want log anything - obj._no_log = True + # We don't want to trigger any signal (log, ...) + obj.no_signal = True Model.save(obj, force_insert=True) ret = self.model.model_class().objects.filter(self.query & Q(pk=0)).exists() # Delete testing object diff --git a/apps/permission/signals.py b/apps/permission/signals.py index 112247eb..e738545a 100644 --- a/apps/permission/signals.py +++ b/apps/permission/signals.py @@ -28,7 +28,7 @@ def pre_save_object(sender, instance, **kwargs): if instance._meta.label_lower in EXCLUDED: return - if hasattr(instance, "_force_save"): + if hasattr(instance, "_force_save") or hasattr(instance, "_no_signal"): return user = get_current_authenticated_user() @@ -82,7 +82,8 @@ def pre_delete_object(instance, **kwargs): if instance._meta.label_lower in EXCLUDED: return - if hasattr(instance, "_force_delete") or hasattr(instance, "pk") and instance.pk == 0: + if hasattr(instance, "_force_delete") or hasattr(instance, "pk") and instance.pk == 0 \ + or hasattr(instance, "_no_signal"): # Don't check permissions on force-deleted objects return diff --git a/apps/treasury/signals.py b/apps/treasury/signals.py index b7038ab6..f08540d1 100644 --- a/apps/treasury/signals.py +++ b/apps/treasury/signals.py @@ -9,9 +9,10 @@ def save_special_transaction(instance, created, **kwargs): When a special transaction is created, we create its linked proxy """ - if instance.is_credit(): - if created and RemittanceType.objects.filter(note=instance.source).exists(): - SpecialTransactionProxy.objects.create(transaction=instance, remittance=None).save() - else: - if created and RemittanceType.objects.filter(note=instance.destination).exists(): - SpecialTransactionProxy.objects.create(transaction=instance, remittance=None).save() + if not hasattr(instance, "_no_signal"): + if instance.is_credit(): + if created and RemittanceType.objects.filter(note=instance.source).exists(): + SpecialTransactionProxy.objects.create(transaction=instance, remittance=None).save() + else: + if created and RemittanceType.objects.filter(note=instance.destination).exists(): + SpecialTransactionProxy.objects.create(transaction=instance, remittance=None).save()