agendas: keep stable time on dst change for date time periods (#72508)

This commit is contained in:
Valentin Deniaud 2022-12-15 17:52:39 +01:00
parent 46b70f6d05
commit 6ef8117a05
2 changed files with 39 additions and 11 deletions

View File

@ -1319,13 +1319,14 @@ class SharedTimePeriod:
meeting_duration = datetime.timedelta(minutes=meeting_duration)
duration = datetime.timedelta(minutes=base_duration)
real_min_datetime = (
min_datetime + datetime.timedelta(days=self.weekday - min_datetime.weekday())
if not self.date
else min_datetime
)
if real_min_datetime < min_datetime:
real_min_datetime += datetime.timedelta(days=7)
if not self.date:
real_min_datetime = min_datetime + datetime.timedelta(days=self.weekday - min_datetime.weekday())
if real_min_datetime < min_datetime:
real_min_datetime += datetime.timedelta(days=7)
else:
real_min_datetime = make_aware(
datetime.datetime(day=self.date.day, month=self.date.month, year=self.date.year)
)
# make sure datetime in local timezone, it's ABSOLUTELY necessary
# to have stable event ids in the API.
@ -1335,10 +1336,7 @@ class SharedTimePeriod:
event_datetime = make_aware(make_naive(real_min_datetime)).replace(
hour=self.start_time.hour, minute=self.start_time.minute, second=0, microsecond=0
)
if self.date:
event_datetime = event_datetime.replace(
day=self.date.day, month=self.date.month, year=self.date.year
)
# don't start before min_datetime
event_datetime = max(event_datetime, min_datetime)

View File

@ -2542,3 +2542,33 @@ def test_datetimes_api_meetings_virtual_agenda_date_time_period(app):
assert [x['datetime'] for x in resp.json['data']] == [
'2022-10-24 13:00:00',
]
@pytest.mark.freeze_time('2023-03-01 01:00')
def test_datetimes_api_meetings_agenda_date_time_period_dst_change(app):
agenda = Agenda.objects.create(
label='Foo bar', kind='meetings', minimal_booking_delay=0, maximal_booking_delay=60
)
meeting_type = MeetingType.objects.create(agenda=agenda, label='Plop', duration=30)
desk = Desk.objects.create(agenda=agenda, label='desk')
# DST change happens on 26/03
TimePeriod.objects.create(
date=datetime.date(2023, 3, 21),
start_time=datetime.time(10, 0),
end_time=datetime.time(10, 30),
desk=desk,
)
TimePeriod.objects.create(
date=datetime.date(2023, 3, 28),
start_time=datetime.time(10, 0),
end_time=datetime.time(10, 30),
desk=desk,
)
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (agenda.slug, meeting_type.slug)
resp = app.get(api_url)
assert [x['datetime'] for x in resp.json['data']] == [
'2023-03-21 10:00:00',
'2023-03-28 10:00:00',
]