From a3ccf65bfa0881229812ba3292aebff88ed30db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?= <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de> Date: Sat, 21 May 2022 11:29:32 +0200 Subject: [PATCH] Update/delete constraint violations when corresponding slot is deleted This fixes #131 --- AKScheduling/models.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/AKScheduling/models.py b/AKScheduling/models.py index bfdb1e16..cabf78e1 100644 --- a/AKScheduling/models.py +++ b/AKScheduling/models.py @@ -1,4 +1,4 @@ -from django.db.models.signals import post_save, m2m_changed +from django.db.models.signals import post_save, m2m_changed, pre_delete from django.dispatch import receiver from django.utils.translation import gettext_lazy as _ @@ -551,6 +551,19 @@ def akslot_changed_handler(sender, instance: AKSlot, **kwargs): update_constraint_violations(new_violations, existing_violations_to_check) +@receiver(pre_delete, sender=AKSlot) +def akslot_deleted_handler(sender, instance: AKSlot, **kwargs): + # Manually clean up or remove constraint violations that belong to this slot since there is no cascade deletion + # for many2many relationships. Explicitly listening for AK deletion signals is not necessary since they will + # transitively trigger this signal and we always set both AK and AKSlot references in a constraint violation + print(f"{instance} deleted") + + for cv in instance.constraintviolation_set.all(): + # Make sure not delete CVs that e.g., show three parallel slots in a single room + if cv.ak_slots.count() <= 2: + cv.delete() + + @receiver(post_save, sender=Room) def room_changed_handler(sender, instance: Room, **kwargs): # Changes might affect: Room size -- GitLab