From 7ef4bffa95f5058e1a6f0b45d1e9e781e146ecc8 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 15 Dec 2022 14:46:04 +0100 Subject: [PATCH] agendas: retain time period weekday_indexes attribute in exclusion computation (#72491) --- chrono/agendas/models.py | 9 ++++++--- tests/api/datetimes/test_meetings.py | 26 +++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 94bb0ea9..2522c481 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -607,8 +607,11 @@ class Agenda(models.Model): yield SharedTimePeriod.from_weektime_interval(time_period_interval, desks=desks) else: date = time_period_interval.begin.date + weekday_indexes = time_period_interval.begin.weekday_indexes for weektime_interval in IntervalSet.simple(*time_period_interval) - closed_hours_by_days: - yield SharedTimePeriod.from_weektime_interval(weektime_interval, desks=desks, date=date) + yield SharedTimePeriod.from_weektime_interval( + weektime_interval, desks=desks, date=date, weekday_indexes=weekday_indexes + ) @functional.cached_property def max_booking_datetime(self): @@ -1373,13 +1376,13 @@ class SharedTimePeriod: event_datetime = next_time @classmethod - def from_weektime_interval(cls, weektime_interval, desks=(), date=None): + def from_weektime_interval(cls, weektime_interval, desks=(), date=None, weekday_indexes=None): begin, end = weektime_interval assert begin.weekday == end.weekday return cls( weekday=begin.weekday, - weekday_indexes=begin.weekday_indexes or end.weekday_indexes, + weekday_indexes=begin.weekday_indexes or end.weekday_indexes or weekday_indexes, start_time=begin.time, end_time=end.time, date=begin.date or end.date or date, diff --git a/tests/api/datetimes/test_meetings.py b/tests/api/datetimes/test_meetings.py index 6cdf34db..1a91b044 100644 --- a/tests/api/datetimes/test_meetings.py +++ b/tests/api/datetimes/test_meetings.py @@ -2384,22 +2384,26 @@ def test_datetimes_api_meetings_virtual_agenda_weekday_indexes(app): weekday=0, weekday_indexes=[1, 2], start_time=datetime.time(11, 0), - end_time=datetime.time(12, 0), + end_time=datetime.time(12, 30), desk=desk, ) api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (virtual_agenda.slug, meeting_type.slug) resp = app.get(api_url) - assert len(resp.json['data']) == 8 + assert len(resp.json['data']) == 12 assert [x['datetime'] for x in resp.json['data']] == [ '2022-02-07 11:00:00', '2022-02-07 11:30:00', + '2022-02-07 12:00:00', '2022-02-14 11:00:00', '2022-02-14 11:30:00', + '2022-02-14 12:00:00', '2022-03-07 11:00:00', '2022-03-07 11:30:00', + '2022-03-07 12:00:00', '2022-03-14 11:00:00', '2022-03-14 11:30:00', + '2022-03-14 12:00:00', ] # add exclusion period on virtual agenda @@ -2419,7 +2423,23 @@ def test_datetimes_api_meetings_virtual_agenda_weekday_indexes(app): exclusion_period.end_time = datetime.time(11, 30) exclusion_period.save() resp = app.get(api_url) - assert len(resp.json['data']) == 4 + assert len(resp.json['data']) == 8 + assert [x['datetime'] for x in resp.json['data']] == [ + '2022-02-07 11:30:00', + '2022-02-07 12:00:00', + '2022-02-14 11:30:00', + '2022-02-14 12:00:00', + '2022-03-07 11:30:00', + '2022-03-07 12:00:00', + '2022-03-14 11:30:00', + '2022-03-14 12:00:00', + ] + + # add second exclusion period on virtual agenda + TimePeriod.objects.create( + weekday=0, start_time=datetime.time(12, 00), end_time=datetime.time(12, 30), agenda=virtual_agenda + ) + resp = app.get(api_url) assert [x['datetime'] for x in resp.json['data']] == [ '2022-02-07 11:30:00', '2022-02-14 11:30:00',