agendas: compare all WeekTime attributes by default (#72475)

This commit is contained in:
Valentin Deniaud 2022-12-15 15:00:25 +01:00
parent 7ef4bffa95
commit 46b70f6d05
3 changed files with 52 additions and 5 deletions

View File

@ -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')),

View File

@ -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

View File

@ -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')