templatetags: simplify start/end date computation on openinghoursspecification (#48919)

This commit is contained in:
Nicolas Roche 2020-12-05 21:09:59 +01:00
parent 926248ebf9
commit d6507267c1
1 changed files with 7 additions and 37 deletions

View File

@ -120,36 +120,6 @@ def get_slot(day_number, time_table, base_datetime):
return TimeSlot(start, end)
def get_open_close_from_specification(specification, valid_from, base_datetime):
'''Parse geojson 'openinghoursspecification' fields data
'''
opening_time = datetime.datetime.combine(base_datetime, dateutil_parse(specification['opens']).time())
closing_time = datetime.datetime.combine(base_datetime, dateutil_parse(specification['closes']).time())
if not isinstance(specification['dayOfWeek'], str):
raise ValueError()
day_number = EN_FULL_WEEKDAYS_LIST.index(specification['dayOfWeek'].split('/')[-1])
start = opening_time + datetime.timedelta(
days=(7 + (day_number - opening_time.weekday())) % 7)
end = closing_time + datetime.timedelta(
days=(7 + (day_number - closing_time.weekday())) % 7)
# hours may belongs on next day
if end < start:
day_number += 1
end = closing_time + datetime.timedelta(
days=(7 + (day_number - closing_time.weekday())) % 7)
if end < start:
# end time may be find this week whereas start time is picked on next week,
# this occure if we are now past 24:00, on next day.
# Above + (day_number - opening_time.weekday())) % 7 computation,
# which acts as openinghours_to_datetime (return the next date and time after now())
# can't return a coherent start time.
# in this case we compute start date relative to end date
opening_time = datetime.datetime.combine(end, dateutil_parse(specification['opens']).time())
start = opening_time - datetime.timedelta(days=1)
return (start, end, day_number)
def get_time_table_from_specification(specification):
"""Parse an openinghoursspecification data block
"""
@ -157,7 +127,6 @@ def get_time_table_from_specification(specification):
raise ValueError
day_of_week = specification.get('dayOfWeek')
day_number = EN_FULL_WEEKDAYS_LIST.index(day_of_week.split('/')[-1])
weekday = EN_ABBREV_WEEKDAYS_LIST[day_number]
start_hour, start_minute = specification['opens'].split(':')
end_hour, end_minute = specification['closes'].split(':')
time_table = {
@ -166,7 +135,7 @@ def get_time_table_from_specification(specification):
'end_hour': end_hour,
'end_minute': end_minute,
}
return (weekday, time_table)
return (day_number, time_table)
def get_period_from_data(time_table):
@ -284,13 +253,13 @@ def get_slots_from_mairie_format(data, base_datetime):
continue
if specification.get('opens') and specification.get('closes'):
# case when opening periods are defined
if base_datetime >= valid_from and base_datetime < valid_through:
if valid_from <= base_datetime < valid_through:
try:
(opening_time, closing_time, day_number) = get_open_close_from_specification(
specification, valid_from, base_datetime)
day_number, time_table = get_time_table_from_specification(specification)
except ValueError:
continue
slots.append(TimeSlot(opening_time, closing_time))
timeslot = get_slot(day_number, time_table, base_datetime)
slots.append(timeslot)
else:
# case when exclusions are defined
exclusion_slots.append(TimeSlot(valid_from, valid_through))
@ -374,7 +343,8 @@ def get_mairie_opening_hours(mairie_data):
if 'opens' in specification and 'closes' in specification:
# parse specification only for the current period relative to utcnow()
if valid_from < base_datetime < valid_through:
weekday, time_table = get_time_table_from_specification(specification)
day_number, time_table = get_time_table_from_specification(specification)
weekday = EN_ABBREV_WEEKDAYS_LIST[day_number]
update_opening_hours(weekday, time_table)
if not (any([x['am'] for x in opening_hours_dict.values()]) or