agendas: keep stable time on dst change for date time periods (#72508)
This commit is contained in:
parent
46b70f6d05
commit
6ef8117a05
|
@ -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)
|
||||
|
||||
|
|
|
@ -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',
|
||||
]
|
||||
|
|
Loading…
Reference in New Issue