Skip to content
Snippets Groups Projects

Refactor main

Merged Felix Blanke requested to merge refactor-main into main
1 unresolved thread
1 file
+ 8
4
Compare changes
  • Side-by-side
  • Inline
+ 21
6
@@ -9,7 +9,7 @@ from django.views.generic import ListView, DetailView
@@ -9,7 +9,7 @@ from django.views.generic import ListView, DetailView
from AKModel.availability.models import Availability
from AKModel.availability.models import Availability
from AKModel.metaviews.admin import AdminViewMixin, FilterByEventSlugMixin, EventSlugMixin, IntermediateAdminView, \
from AKModel.metaviews.admin import AdminViewMixin, FilterByEventSlugMixin, EventSlugMixin, IntermediateAdminView, \
IntermediateAdminActionView
IntermediateAdminActionView
from AKModel.models import AKRequirement, AKSlot, Event, AKOrgaMessage, AK, Room, AKOwner
from AKModel.models import AKRequirement, AKSlot, DefaultSlot, Event, AKOrgaMessage, AK, Room, AKOwner, merge_blocks
class AKRequirementOverview(AdminViewMixin, FilterByEventSlugMixin, ListView):
class AKRequirementOverview(AdminViewMixin, FilterByEventSlugMixin, ListView):
@@ -52,12 +52,15 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
@@ -52,12 +52,15 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
def _test_slot_contained(self, slot: Availability, availabilities: List[Availability]) -> bool:
def _test_slot_contained(self, slot: Availability, availabilities: List[Availability]) -> bool:
 
"""Test if slot is contained in any member of availabilities."""
return any(availability.contains(slot) for availability in availabilities)
return any(availability.contains(slot) for availability in availabilities)
def _test_event_covered(self, availabilities: List[Availability]) -> bool:
def _test_event_not_covered(self, availabilities: List[Availability]) -> bool:
 
"""Test if event is not covered by availabilities."""
return not Availability.is_event_covered(self.event, availabilities)
return not Availability.is_event_covered(self.event, availabilities)
def _test_fixed_ak(self, ak_id, slot: Availability, ak_fixed: dict) -> bool:
def _test_ak_fixed_in_slot(self, ak_id, slot: Availability, ak_fixed: dict) -> bool:
 
"""Test if AK defined by `ak_id` is fixed to happen during slot."""
if not ak_id in ak_fixed:
if not ak_id in ak_fixed:
return False
return False
@@ -65,8 +68,9 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
@@ -65,8 +68,9 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
return fixed_slot.overlaps(slot, strict=True)
return fixed_slot.overlaps(slot, strict=True)
def _test_add_constraint(self, slot: Availability, availabilities: List[Availability]) -> bool:
def _test_add_constraint(self, slot: Availability, availabilities: List[Availability]) -> bool:
 
"""Test if object is not available for whole event and may happen during slot."""
return (
return (
self._test_event_covered(availabilities)
self._test_event_not_covered(availabilities)
and self._test_slot_contained(slot, availabilities)
and self._test_slot_contained(slot, availabilities)
)
)
@@ -110,27 +114,38 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
@@ -110,27 +114,38 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
if (values := AKSlot.objects.select_related().filter(ak__pk=ak_id, fixed=True)).exists()
if (values := AKSlot.objects.select_related().filter(ak__pk=ak_id, fixed=True)).exists()
}
}
for block in self.event.merge_blocks(self.event.default_time_slots(slots_in_an_hour=SLOTS_IN_AN_HOUR)):
if DefaultSlot.objects.filter(event=self.event).exists():
 
# discretize default slots if they exists
 
blocks = merge_blocks(self.event.default_time_slots(slots_in_an_hour=SLOTS_IN_AN_HOUR))
 
else:
 
blocks = self.event.uniform_time_slots(slots_in_an_hour=SLOTS_IN_AN_HOUR)
 
 
for block in blocks:
current_block = []
current_block = []
for timeslot in block:
for timeslot in block:
time_constraints = []
time_constraints = []
 
# if reso_deadline is set and timeslot ends before it,
 
# add fulfilled time constraint 'resolution'
if self.event.reso_deadline is None or timeslot.avail.end < self.event.reso_deadline:
if self.event.reso_deadline is None or timeslot.avail.end < self.event.reso_deadline:
time_constraints.append("resolution")
time_constraints.append("resolution")
 
# add fulfilled time constraints for all AKs that cannot happen during full event
time_constraints.extend([
time_constraints.extend([
f"availability-ak-{ak_id}"
f"availability-ak-{ak_id}"
for ak_id, availabilities in ak_availabilities.items()
for ak_id, availabilities in ak_availabilities.items()
if (
if (
self._test_add_constraint(timeslot.avail, availabilities)
self._test_add_constraint(timeslot.avail, availabilities)
or self._test_fixed_ak(ak_id, timeslot.avail, ak_fixed)
or self._test_ak_fixed_in_slot(ak_id, timeslot.avail, ak_fixed)
)
)
])
])
 
# add fulfilled time constraints for all persons that are not available for full event
time_constraints.extend([
time_constraints.extend([
f"availability-person-{person_id}"
f"availability-person-{person_id}"
for person_id, availabilities in person_availabilities.items()
for person_id, availabilities in person_availabilities.items()
if self._test_add_constraint(timeslot.avail, availabilities)
if self._test_add_constraint(timeslot.avail, availabilities)
])
])
 
# add fulfilled time constraints for all rooms that are not available for full event
time_constraints.extend([
time_constraints.extend([
f"availability-room-{room_id}"
f"availability-room-{room_id}"
for room_id, availabilities in room_availabilities.items()
for room_id, availabilities in room_availabilities.items()
Loading