templatetags: get badges from night hours (#48919)
This commit is contained in:
parent
4570380949
commit
3e8fd2843d
|
@ -83,11 +83,26 @@ def get_open_close_from_specification(specification, valid_from, base_datetime):
|
||||||
if not isinstance(specification['dayOfWeek'], str):
|
if not isinstance(specification['dayOfWeek'], str):
|
||||||
raise ValueError()
|
raise ValueError()
|
||||||
day_number = EN_FULL_WEEKDAYS_LIST.index(specification['dayOfWeek'].split('/')[-1])
|
day_number = EN_FULL_WEEKDAYS_LIST.index(specification['dayOfWeek'].split('/')[-1])
|
||||||
opening_time = opening_time + datetime.timedelta(
|
start = opening_time + datetime.timedelta(
|
||||||
days=(7 + (day_number - opening_time.weekday())) % 7)
|
days=(7 + (day_number - opening_time.weekday())) % 7)
|
||||||
closing_time = closing_time + datetime.timedelta(
|
end = closing_time + datetime.timedelta(
|
||||||
days=(7 + (day_number - closing_time.weekday())) % 7)
|
days=(7 + (day_number - closing_time.weekday())) % 7)
|
||||||
return (opening_time, closing_time, day_number)
|
|
||||||
|
# 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):
|
||||||
|
@ -158,7 +173,9 @@ def get_slots_from_mdr_format(data, today):
|
||||||
mdr_weekdays_format = ['%s_am' % day for day in FR_WEEKDAYS] + ['%s_pm' % day for day in FR_WEEKDAYS]
|
mdr_weekdays_format = ['%s_am' % day for day in FR_WEEKDAYS] + ['%s_pm' % day for day in FR_WEEKDAYS]
|
||||||
if any([re.search('|'.join(mdr_weekdays_format), data_key) is not None for data_key in data.keys()]):
|
if any([re.search('|'.join(mdr_weekdays_format), data_key) is not None for data_key in data.keys()]):
|
||||||
known_format = True
|
known_format = True
|
||||||
|
today -= datetime.timedelta(days=1) # add yesterday night hours
|
||||||
for i in range(7):
|
for i in range(7):
|
||||||
|
tomorrow = today + datetime.timedelta(days=1)
|
||||||
for period in ('am', 'pm'):
|
for period in ('am', 'pm'):
|
||||||
hours = data.get('%s_%s' % (FR_WEEKDAYS[today.weekday()], period))
|
hours = data.get('%s_%s' % (FR_WEEKDAYS[today.weekday()], period))
|
||||||
if not hours:
|
if not hours:
|
||||||
|
@ -168,12 +185,19 @@ def get_slots_from_mdr_format(data, today):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
continue
|
continue
|
||||||
# add to slots the opening hours in chronological order beginning from today
|
# add to slots the opening hours in chronological order beginning from today
|
||||||
slots.append(TimeSlot(
|
start = datetime.datetime(today.year, today.month, today.day,
|
||||||
datetime.datetime(today.year, today.month, today.day, int(parts[0]), int(parts[1]), tzinfo=today.tzinfo),
|
int(parts[0]), int(parts[1]), tzinfo=today.tzinfo)
|
||||||
datetime.datetime(today.year, today.month, today.day, int(parts[2]), int(parts[3]), tzinfo=today.tzinfo)
|
end = datetime.datetime(today.year, today.month, today.day,
|
||||||
))
|
int(parts[2]), int(parts[3]), tzinfo=today.tzinfo)
|
||||||
|
|
||||||
today = today + datetime.timedelta(days=1)
|
# hours may belongs on next day
|
||||||
|
if end < start:
|
||||||
|
end = datetime.datetime(
|
||||||
|
tomorrow.year, tomorrow.month, tomorrow.day,
|
||||||
|
int(parts[2]), int(parts[3]), tzinfo=tomorrow.tzinfo)
|
||||||
|
slots.append(TimeSlot(start, end))
|
||||||
|
|
||||||
|
today = tomorrow
|
||||||
|
|
||||||
return (slots, known_format)
|
return (slots, known_format)
|
||||||
|
|
||||||
|
@ -241,10 +265,26 @@ def get_slots_from_mairie_format(data, base_datetime):
|
||||||
|
|
||||||
for days_list, time_table in parse_opening_hours_data(data):
|
for days_list, time_table in parse_opening_hours_data(data):
|
||||||
for weekday in days_list:
|
for weekday in days_list:
|
||||||
timeslot = TimeSlot(
|
start = openinghours_to_datetime(
|
||||||
openinghours_to_datetime(weekday, int(time_table['start_hour']), int(time_table['start_minute'])),
|
weekday, int(time_table['start_hour']), int(time_table['start_minute']))
|
||||||
openinghours_to_datetime(weekday, int(time_table['end_hour']), int(time_table['end_minute']))
|
end = openinghours_to_datetime(
|
||||||
)
|
weekday, int(time_table['end_hour']), int(time_table['end_minute']))
|
||||||
|
|
||||||
|
# hours may belongs on next day
|
||||||
|
if end < start:
|
||||||
|
day_number = EN_ABBREV_WEEKDAYS_LIST.index(weekday)
|
||||||
|
tomorrow = EN_ABBREV_WEEKDAYS_LIST[(day_number + 1) % 7]
|
||||||
|
end = openinghours_to_datetime(
|
||||||
|
tomorrow, int(time_table['end_hour']), int(time_table['end_minute']))
|
||||||
|
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.
|
||||||
|
# openinghours_to_datetime (return the next date and time after now())
|
||||||
|
# can't return a coherent start time.
|
||||||
|
# in this case we thrink the slot to the next day part.
|
||||||
|
start = openinghours_to_datetime(tomorrow, 0, 0)
|
||||||
|
|
||||||
|
timeslot = TimeSlot(start, end)
|
||||||
# add to slots the opening hours in chronological order beginning from today
|
# add to slots the opening hours in chronological order beginning from today
|
||||||
slots.append(timeslot)
|
slots.append(timeslot)
|
||||||
|
|
||||||
|
|
|
@ -174,7 +174,7 @@ def test_mairie_holiday():
|
||||||
('lundi_pm', '14h30-17h45', 'closed', 'Réouvre à 14h30'),
|
('lundi_pm', '14h30-17h45', 'closed', 'Réouvre à 14h30'),
|
||||||
('lundi_am', '08h30-11h45', 'closed', 'Ouvre à 8h30'),
|
('lundi_am', '08h30-11h45', 'closed', 'Ouvre à 8h30'),
|
||||||
('lundi_am', '00h00-00h45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
('lundi_am', '00h00-00h45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
||||||
('dimanche_pm', '20h30-00h45', 'closed', 'Réouvre dimanche à 20h30'), # wrong
|
('dimanche_pm', '20h30-00h45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
||||||
])
|
])
|
||||||
def test_mdr_format(day, hours, badge, text):
|
def test_mdr_format(day, hours, badge, text):
|
||||||
geojson = """
|
geojson = """
|
||||||
|
@ -195,7 +195,7 @@ def test_mdr_format(day, hours, badge, text):
|
||||||
('Mo 14:30-17:45', 'closed', 'Réouvre à 14h30'),
|
('Mo 14:30-17:45', 'closed', 'Réouvre à 14h30'),
|
||||||
('Mo 08:30-11:45', 'closed', 'Ouvre à 8h30'),
|
('Mo 08:30-11:45', 'closed', 'Ouvre à 8h30'),
|
||||||
('Mo 00:00-00:45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
('Mo 00:00-00:45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
||||||
('Su 20:30-00:45', 'closed', 'Réouvre dimanche à 20h30'), # wrong
|
('Su 20:30-00:45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
||||||
])
|
])
|
||||||
def test_mairie_format_openinghours(openinghour, badge, text):
|
def test_mairie_format_openinghours(openinghour, badge, text):
|
||||||
geojson = """
|
geojson = """
|
||||||
|
@ -216,7 +216,7 @@ def test_mairie_format_openinghours(openinghour, badge, text):
|
||||||
('Monday', '14:30', '17:45', 'closed', 'Réouvre à 14h30'),
|
('Monday', '14:30', '17:45', 'closed', 'Réouvre à 14h30'),
|
||||||
('Monday', '08:30', '11:45', 'closed', 'Ouvre à 8h30'),
|
('Monday', '08:30', '11:45', 'closed', 'Ouvre à 8h30'),
|
||||||
('Monday', '00:00', '00:45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
('Monday', '00:00', '00:45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
||||||
('Sunday', '20:30', '00:45', 'closed', 'Réouvre dimanche à 20h30'), # wrong
|
('Sunday', '20:30', '00:45', 'soon-to-be-closed', "Ouvert jusqu'à 0h45"),
|
||||||
])
|
])
|
||||||
def test_mairie_format_openinghoursspecification(day, opens, closes, badge, text):
|
def test_mairie_format_openinghoursspecification(day, opens, closes, badge, text):
|
||||||
geojson = """
|
geojson = """
|
||||||
|
|
Loading…
Reference in New Issue