From ff9a7e7b189da024ec1f157ee8ef554baa3b5469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?= <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de> Date: Wed, 12 May 2021 01:48:35 +0200 Subject: [PATCH] Implement violation check for multiple slots of the same AK at the same time --- AKScheduling/models.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/AKScheduling/models.py b/AKScheduling/models.py index 29624910..3104d90e 100644 --- a/AKScheduling/models.py +++ b/AKScheduling/models.py @@ -180,7 +180,7 @@ def akslot_changed_handler(sender, instance: AKSlot, **kwargs): print(f"Multiple slots in room {instance.room}: {new_violations}") # ... and compare to/update list of existing violations of this type - # belonging to the AK that was recently changed (important!) + # belonging to the slot that was recently changed (important!) existing_violations_to_check = list(instance.room.constraintviolation_set.filter(type=violation_type)) print(existing_violations_to_check) update_constraint_violations(new_violations, existing_violations_to_check) @@ -189,6 +189,32 @@ def akslot_changed_handler(sender, instance: AKSlot, **kwargs): update_cv_reso_deadline_for_slot(instance) + # == Check for two slots of the same AK at the same time (warning) == + + violation_type = ConstraintViolation.ViolationType.AK_SLOT_COLLISION + new_violations = [] + + # For all other slots of this ak... + for other_slot in instance.ak.akslot_set.filter(start__isnull=False): + if other_slot != instance: + # ... find overlapping slots... + if instance.overlaps(other_slot): + # ...and create a temporary violation if necessary... + c = ConstraintViolation( + type=violation_type, + level=ConstraintViolation.ViolationLevel.WARNING, + event=event, + ) + c.aks_tmp.add(instance.ak) + c.ak_slots_tmp.add(instance) + c.ak_slots_tmp.add(other_slot) + new_violations.append(c) + + # ... and compare to/update list of existing violations of this type + # belonging to the slot that was recently changed (important!) + existing_violations_to_check = list(instance.constraintviolation_set.filter(type=violation_type)) + update_constraint_violations(new_violations, existing_violations_to_check) + @receiver(post_save, sender=Room) def room_changed_handler(sender, **kwargs): -- GitLab