Skip to content
Snippets Groups Projects
Commit 20ab6461 authored by Felix Blanke's avatar Felix Blanke
Browse files

Handle fixed AKs

parent 32e7ee94
No related branches found
No related tags found
6 merge requests!262[WIP] compatibility with koma solver import/export,!261[WIP] compatibility with koma solver import/export,!260[WIP] import/export merge,!259Add view to clear schedule,!237Draft: add tests on json export,!235Merge fork for interoperability of KoMa solver
...@@ -698,7 +698,7 @@ class AKSlot(models.Model): ...@@ -698,7 +698,7 @@ class AKSlot(models.Model):
# check if ak resp. owner is available for the whole event # check if ak resp. owner is available for the whole event
# -> no time constraint needs to be introduced # -> no time constraint needs to be introduced
if Availability.is_event_covered(self.event, self.ak.availabilities.all()): if not self.fixed and Availability.is_event_covered(self.event, self.ak.availabilities.all()):
ak_time_constraints = [] ak_time_constraints = []
else: else:
ak_time_constraints = [f"availability-ak-{self.ak.pk}"] ak_time_constraints = [f"availability-ak-{self.ak.pk}"]
......
...@@ -85,11 +85,27 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): ...@@ -85,11 +85,27 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
for person in AKOwner.objects.filter(event=self.event) for person in AKOwner.objects.filter(event=self.event)
} }
ak_fixed = {
ak: values.get()
for ak in ak_availabilities.keys()
if (values := AKSlot.objects.select_related().filter(ak__pk=ak, fixed=True)).exists()
}
def _test_slot_contained(slot: Availability, availabilities: List[Availability]) -> bool:
return any(availability.contains(slot) for availability in availabilities)
def _test_event_covered(slot: Availability, availabilities: List[Availability]) -> bool:
return not Availability.is_event_covered(self.event, availabilities)
def _test_fixed_ak(ak, slot) -> bool:
if not ak in ak_fixed:
return False
fixed_slot = Availability(self.event, start=ak_fixed[ak].start, end=ak_fixed[ak].end)
return fixed_slot.overlaps(slot, strict=True)
def _test_add_constraint(slot: Availability, availabilities: List[Availability]) -> bool: def _test_add_constraint(slot: Availability, availabilities: List[Availability]) -> bool:
return ( return _test_event_covered(slot, availabilities) and _test_slot_contained(slot, availabilities)
(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): for block in self.event.time_slots(slots_in_an_hour=SLOTS_IN_AN_HOUR):
current_block = [] current_block = []
...@@ -103,7 +119,7 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): ...@@ -103,7 +119,7 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
constraints.append("resolution") constraints.append("resolution")
for ak, availabilities in ak_availabilities.items(): for ak, availabilities in ak_availabilities.items():
if _test_add_constraint(slot, availabilities): if _test_add_constraint(slot, availabilities) or _test_fixed_ak(ak, slot):
constraints.append(f"availability-ak-{ak}") constraints.append(f"availability-ak-{ak}")
for person, availabilities in person_availabilities.items(): for person, availabilities in person_availabilities.items():
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment