misc: compute time slots using tz-aware datetimes (#42146)

This commit is contained in:
Frédéric Péters 2020-04-27 18:25:08 +02:00
parent cf030d8e4d
commit 4fac2c3cd1
1 changed files with 7 additions and 6 deletions

View File

@ -437,34 +437,35 @@ class TimePeriod(models.Model):
def get_time_slots(self, min_datetime, max_datetime, meeting_type):
meeting_duration = datetime.timedelta(minutes=meeting_type.duration)
duration = datetime.timedelta(minutes=self.desk.agenda.get_base_meeting_duration())
min_datetime = make_naive(min_datetime)
max_datetime = make_naive(max_datetime)
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)
event_datetime = real_min_datetime.replace(
# make sure datetime is aligned on timezone
event_datetime = make_aware(make_naive(real_min_datetime)).replace(
hour=self.start_time.hour, minute=self.start_time.minute, second=0, microsecond=0
)
while event_datetime < max_datetime:
end_time = event_datetime + meeting_duration
next_time = event_datetime + duration
if end_time.time() > self.end_time or event_datetime.date() != next_time.date():
# switch to naive time for day/week changes
event_datetime = make_naive(event_datetime)
# back to morning
event_datetime = event_datetime.replace(
hour=self.start_time.hour, minute=self.start_time.minute
)
# but next week
event_datetime += datetime.timedelta(days=7)
# and re-align to timezone afterwards
event_datetime = make_aware(event_datetime)
next_time = event_datetime + duration
if event_datetime > max_datetime:
break
yield TimeSlot(
start_datetime=make_aware(event_datetime), meeting_type=meeting_type, desk=self.desk
)
yield TimeSlot(start_datetime=event_datetime, meeting_type=meeting_type, desk=self.desk)
event_datetime = next_time