From 46b70f6d0533044bd03919927c39abe1a0bbe10c Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 15 Dec 2022 15:00:25 +0100 Subject: [PATCH] agendas: compare all WeekTime attributes by default (#72475) --- chrono/agendas/models.py | 10 +++++----- chrono/interval.py | 5 +++++ tests/test_agendas.py | 42 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 2522c481..228c86f0 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -1113,16 +1113,13 @@ class VirtualMember(models.Model): WEEKDAYS_LIST = sorted(WEEKDAYS.items(), key=lambda x: x[0]) -class WeekTime(collections.namedtuple('WeekTime', ['weekday', 'time'])): +class WeekTime(collections.namedtuple('WeekTime', ['weekday', 'weekday_indexes', 'date', 'time'])): """Representation of a time point in a weekday, ex.: Monday at 5 o'clock.""" def __new__(cls, weekday, weekday_indexes, date, time): if date: weekday = date.weekday() - self = super().__new__(cls, weekday, time) - self.weekday_indexes = weekday_indexes - self.date = date - return self + return super().__new__(cls, weekday, weekday_indexes, date, time) def __repr__(self): return '%s / %s' % ( @@ -1130,6 +1127,9 @@ class WeekTime(collections.namedtuple('WeekTime', ['weekday', 'time'])): date_format(self.time, 'TIME_FORMAT'), ) + def keep_only_weekday_and_time(self): + return WeekTime(weekday=self.weekday, time=self.time, date=None, weekday_indexes=None) + WEEK_CHOICES = [ (1, _('First of the month')), diff --git a/chrono/interval.py b/chrono/interval.py index 46c0cf88..3b5ca56a 100644 --- a/chrono/interval.py +++ b/chrono/interval.py @@ -64,6 +64,11 @@ class IntervalSet: @classmethod def simple(cls, begin, end=Ellipsis): begin, end = cls._begin_or_interval(begin, end) + + if hasattr(begin, 'keep_only_weekday_and_time'): + begin = begin.keep_only_weekday_and_time() + end = end.keep_only_weekday_and_time() + return cls.from_ordered([(begin, end)]) @classmethod diff --git a/tests/test_agendas.py b/tests/test_agendas.py index fee11abd..689f6ca4 100644 --- a/tests/test_agendas.py +++ b/tests/test_agendas.py @@ -1117,6 +1117,48 @@ def test_agenda_get_effective_time_periods(db): assert common_timeperiod.end_time == datetime.time(18, 0) +def test_agenda_get_effective_time_periods_with_date(db): + agenda = Agenda.objects.create(label='Test Agenda', kind='meetings') + MeetingType.objects.create(agenda=agenda, label='MT1') + desk = Desk.objects.create(label='Test Agenda Desk1', agenda=agenda) + TimePeriod.objects.create( + date=datetime.date(2022, 1, 1), + start_time=datetime.time(10, 0), + end_time=datetime.time(18, 0), + desk=desk, + ) + TimePeriod.objects.create( + date=datetime.date(2022, 1, 8), + start_time=datetime.time(10, 0), + end_time=datetime.time(18, 0), + desk=desk, + ) + + assert len(list(agenda.get_effective_time_periods())) == 2 + + +def test_agenda_get_effective_time_periods_with_weekday_indexes(db): + agenda = Agenda.objects.create(label='Test Agenda', kind='meetings') + MeetingType.objects.create(agenda=agenda, label='MT1') + desk = Desk.objects.create(label='Test Agenda Desk1', agenda=agenda) + TimePeriod.objects.create( + weekday=0, + weekday_indexes=[1], + start_time=datetime.time(10, 0), + end_time=datetime.time(18, 0), + desk=desk, + ) + TimePeriod.objects.create( + weekday=0, + weekday_indexes=[2], + start_time=datetime.time(10, 0), + end_time=datetime.time(18, 0), + desk=desk, + ) + + assert len(list(agenda.get_effective_time_periods())) == 2 + + def test_exception_read_only(): agenda = Agenda.objects.create(label='Agenda', kind='meetings') desk = Desk.objects.create(agenda=agenda, label='Desk')