Skip to content
Snippets Groups Projects
Commit b1de3d45 authored by Lorenzo Conti's avatar Lorenzo Conti
Browse files

Merge branch 'feature/block-info-json-export' into 'main'

Expand block info in JSON export

Closes #21 and #22

See merge request !15
parents 6ad0b9f9 444e2206
Branches
No related tags found
4 merge requests!262[WIP] compatibility with koma solver import/export,!261[WIP] compatibility with koma solver import/export,!260[WIP] import/export merge,!235Merge fork for interoperability of KoMa solver
...@@ -248,7 +248,7 @@ class JSONExportTest(TestCase): ...@@ -248,7 +248,7 @@ class JSONExportTest(TestCase):
) )
self.assertEqual( self.assertEqual(
self.export_dict["timeslots"]["info"].keys(), self.export_dict["timeslots"]["info"].keys(),
{"duration"}, {"duration", "blocknames"},
"timeslot info keys not as expected", "timeslot info keys not as expected",
) )
self._check_type( self._check_type(
...@@ -257,6 +257,21 @@ class JSONExportTest(TestCase): ...@@ -257,6 +257,21 @@ class JSONExportTest(TestCase):
"info/duration", "info/duration",
item=item, item=item,
) )
self._check_lst(
self.export_dict["timeslots"]["info"]["blocknames"],
"info/blocknames",
item=item,
contained_type=list,
)
for blockname in self.export_dict["timeslots"]["info"]["blocknames"]:
self.assertEqual(len(blockname), 2)
self._check_lst(
blockname,
"info/blocknames/entry",
item=item,
contained_type=str,
)
self._check_lst( self._check_lst(
self.export_dict["timeslots"]["blocks"], self.export_dict["timeslots"]["blocks"],
"blocks", "blocks",
...@@ -710,9 +725,11 @@ class JSONExportTest(TestCase): ...@@ -710,9 +725,11 @@ class JSONExportTest(TestCase):
self.set_up_event(event=event) self.set_up_event(event=event)
cat_avails = self._get_cat_availability() cat_avails = self._get_cat_availability()
for timeslot in chain.from_iterable( num_blocks = len(self.export_dict["timeslots"]["blocks"])
for block_idx, block in enumerate(
self.export_dict["timeslots"]["blocks"] self.export_dict["timeslots"]["blocks"]
): ):
for timeslot in block:
start, end = self._get_timeslot_start_end(timeslot) start, end = self._get_timeslot_start_end(timeslot)
timeslot_avail = Availability( timeslot_avail = Availability(
event=self.event, start=start, end=end event=self.event, start=start, end=end
...@@ -766,7 +783,8 @@ class JSONExportTest(TestCase): ...@@ -766,7 +783,8 @@ class JSONExportTest(TestCase):
f"availability-ak-{ak.id}" f"availability-ak-{ak.id}"
for ak in AK.objects.filter(event=event) for ak in AK.objects.filter(event=event)
if self._is_restricted_and_contained_slot( if self._is_restricted_and_contained_slot(
timeslot_avail, Availability.union(ak.availabilities.all()) timeslot_avail,
Availability.union(ak.availabilities.all()),
) )
} }
fulfilled_time_constraints |= { fulfilled_time_constraints |= {
...@@ -775,7 +793,52 @@ class JSONExportTest(TestCase): ...@@ -775,7 +793,52 @@ class JSONExportTest(TestCase):
if self._is_ak_fixed_in_slot(slot, timeslot_avail) if self._is_ak_fixed_in_slot(slot, timeslot_avail)
} }
fulfilled_time_constraints |= {
f"notblock{idx}"
for idx in range(num_blocks)
if idx != block_idx
}
self.assertEqual( self.assertEqual(
fulfilled_time_constraints, fulfilled_time_constraints,
set(timeslot["fulfilled_time_constraints"]), set(timeslot["fulfilled_time_constraints"]),
) )
def test_timeslots_info(self):
"""Test timeslots info dict"""
for event in Event.objects.all():
with self.subTest(event=event):
self.set_up_event(event=event)
self.assertAlmostEqual(
self.export_dict["timeslots"]["info"]["duration"],
float(self.event.export_slot),
)
block_names = []
for block in self.export_dict["timeslots"]["blocks"]:
if not block:
continue
block_start, _ = self._get_timeslot_start_end(block[0])
_, block_end = self._get_timeslot_start_end(block[-1])
start_day = block_start.strftime("%A, %d. %b")
if block_start.date() == block_end.date():
# same day
time_str = (
block_start.strftime("%H:%M")
+ ""
+ block_end.strftime("%H:%M")
)
else:
# different days
time_str = (
block_start.strftime("%a %H:%M")
+ ""
+ block_end.strftime("%a %H:%M")
)
block_names.append([start_day, time_str])
self.assertEqual(
block_names, self.export_dict["timeslots"]["info"]["blocknames"]
)
import json import json
from datetime import datetime
from typing import List from typing import List
from django.contrib import messages from django.contrib import messages
...@@ -109,11 +110,30 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): ...@@ -109,11 +110,30 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
for person in AKOwner.objects.filter(event=self.event) for person in AKOwner.objects.filter(event=self.event)
} }
blocks = self.event.discretize_timeslots() blocks = list(self.event.discretize_timeslots())
for block in blocks: block_names = []
for block_idx, block in enumerate(blocks):
current_block = [] current_block = []
if not block:
continue
block_start = block[0].avail.start.astimezone(self.event.timezone)
block_end = block[-1].avail.end.astimezone(self.event.timezone)
start_day = block_start.strftime("%A, %d. %b")
if block_start.date() == block_end.date():
# same day
time_str = block_start.strftime("%H:%M") + "" + block_end.strftime("%H:%M")
else:
# different days
time_str = block_start.strftime("%a %H:%M") + "" + block_end.strftime("%a %H:%M")
block_names.append([start_day, time_str])
block_timeconstraints = [f"notblock{idx}" for idx in range(len(blocks)) if idx != block_idx]
for timeslot in block: for timeslot in block:
time_constraints = [] time_constraints = []
# if reso_deadline is set and timeslot ends before it, # if reso_deadline is set and timeslot ends before it,
...@@ -145,6 +165,7 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): ...@@ -145,6 +165,7 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
]) ])
time_constraints.extend(timeslot.constraints) time_constraints.extend(timeslot.constraints)
time_constraints.extend(block_timeconstraints)
current_block.append({ current_block.append({
"id": str(timeslot.idx), "id": str(timeslot.idx),
...@@ -157,6 +178,8 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): ...@@ -157,6 +178,8 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
timeslots["blocks"].append(current_block) timeslots["blocks"].append(current_block)
timeslots["info"]["blocknames"] = block_names
context["timeslots"] = json.dumps(timeslots) context["timeslots"] = json.dumps(timeslots)
info_dict = { info_dict = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment