templatetags: simplify start/end date computation on openinghoursspecification (#48919)
This commit is contained in:
parent
926248ebf9
commit
d6507267c1
|
@ -120,36 +120,6 @@ def get_slot(day_number, time_table, base_datetime):
|
||||||
return TimeSlot(start, end)
|
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):
|
def get_time_table_from_specification(specification):
|
||||||
"""Parse an openinghoursspecification data block
|
"""Parse an openinghoursspecification data block
|
||||||
"""
|
"""
|
||||||
|
@ -157,7 +127,6 @@ def get_time_table_from_specification(specification):
|
||||||
raise ValueError
|
raise ValueError
|
||||||
day_of_week = specification.get('dayOfWeek')
|
day_of_week = specification.get('dayOfWeek')
|
||||||
day_number = EN_FULL_WEEKDAYS_LIST.index(day_of_week.split('/')[-1])
|
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(':')
|
start_hour, start_minute = specification['opens'].split(':')
|
||||||
end_hour, end_minute = specification['closes'].split(':')
|
end_hour, end_minute = specification['closes'].split(':')
|
||||||
time_table = {
|
time_table = {
|
||||||
|
@ -166,7 +135,7 @@ def get_time_table_from_specification(specification):
|
||||||
'end_hour': end_hour,
|
'end_hour': end_hour,
|
||||||
'end_minute': end_minute,
|
'end_minute': end_minute,
|
||||||
}
|
}
|
||||||
return (weekday, time_table)
|
return (day_number, time_table)
|
||||||
|
|
||||||
|
|
||||||
def get_period_from_data(time_table):
|
def get_period_from_data(time_table):
|
||||||
|
@ -284,13 +253,13 @@ def get_slots_from_mairie_format(data, base_datetime):
|
||||||
continue
|
continue
|
||||||
if specification.get('opens') and specification.get('closes'):
|
if specification.get('opens') and specification.get('closes'):
|
||||||
# case when opening periods are defined
|
# case when opening periods are defined
|
||||||
if base_datetime >= valid_from and base_datetime < valid_through:
|
if valid_from <= base_datetime < valid_through:
|
||||||
try:
|
try:
|
||||||
(opening_time, closing_time, day_number) = get_open_close_from_specification(
|
day_number, time_table = get_time_table_from_specification(specification)
|
||||||
specification, valid_from, base_datetime)
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
continue
|
continue
|
||||||
slots.append(TimeSlot(opening_time, closing_time))
|
timeslot = get_slot(day_number, time_table, base_datetime)
|
||||||
|
slots.append(timeslot)
|
||||||
else:
|
else:
|
||||||
# case when exclusions are defined
|
# case when exclusions are defined
|
||||||
exclusion_slots.append(TimeSlot(valid_from, valid_through))
|
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:
|
if 'opens' in specification and 'closes' in specification:
|
||||||
# parse specification only for the current period relative to utcnow()
|
# parse specification only for the current period relative to utcnow()
|
||||||
if valid_from < base_datetime < valid_through:
|
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)
|
update_opening_hours(weekday, time_table)
|
||||||
|
|
||||||
if not (any([x['am'] for x in opening_hours_dict.values()]) or
|
if not (any([x['am'] for x in opening_hours_dict.values()]) or
|
||||||
|
|
Loading…
Reference in New Issue