From 32e7ee941e55202981a95ed0c05540188449ed15 Mon Sep 17 00:00:00 2001 From: Felix Blanke <info@fblanke.de> Date: Mon, 27 May 2024 07:54:03 +0200 Subject: [PATCH] Filter unnecessary fulfilled constraints --- AKModel/views/ak.py | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/AKModel/views/ak.py b/AKModel/views/ak.py index 0539898e..2c09ca08 100644 --- a/AKModel/views/ak.py +++ b/AKModel/views/ak.py @@ -1,5 +1,6 @@ import json from datetime import timedelta +from typing import List from django.contrib import messages from django.urls import reverse_lazy @@ -71,15 +72,24 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): for slot in context["slots"]: slot.slots_in_an_hour = SLOTS_IN_AN_HOUR - ak_availabilities = {slot.ak.pk: availability - for slot in context["slots"] - for availability in slot.ak.availabilities.all()} - room_availabilities = {room.pk: availability - for room in rooms - for availability in room.availabilities.all()} - person_availabilities = {person.pk: availability - for person in AKOwner.objects.filter(event=self.event) - for availability in person.availabilities.all()} + ak_availabilities = { + slot.ak.pk: Availability.union(slot.ak.availabilities.all()) + for slot in context["slots"] + } + room_availabilities = { + room.pk: Availability.union(room.availabilities.all()) + for room in rooms + } + person_availabilities = { + person.pk: Availability.union(person.availabilities.all()) + for person in AKOwner.objects.filter(event=self.event) + } + + def _test_add_constraint(slot: Availability, availabilities: List[Availability]) -> bool: + return ( + (not Availability.is_event_covered(self.event, availabilities)) + and any(availability.contains(slot) for availability in availabilities) + ) for block in self.event.time_slots(slots_in_an_hour=SLOTS_IN_AN_HOUR): current_block = [] @@ -92,16 +102,16 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): if self.event.reso_deadline is None or slot.end < self.event.reso_deadline: constraints.append("resolution") - for (ak, availability) in ak_availabilities.items(): - if availability.contains(slot): + for ak, availabilities in ak_availabilities.items(): + if _test_add_constraint(slot, availabilities): constraints.append(f"availability-ak-{ak}") - for (person, availability) in person_availabilities.items(): - if availability.contains(slot): + for person, availabilities in person_availabilities.items(): + if _test_add_constraint(slot, availabilities): constraints.append(f"availability-person-{person}") - for (room, availability) in room_availabilities.items(): - if availability.contains(slot): + for person, availabilities in room_availabilities.items(): + if _test_add_constraint(slot, availabilities): constraints.append(f"availability-room-{room}") current_block.append({ -- GitLab