templatetags: move independant code on top of module (#48919)

This commit is contained in:
Nicolas Roche 2020-12-05 20:51:09 +01:00
parent 33e59ba5ee
commit 926248ebf9
1 changed files with 46 additions and 41 deletions

View File

@ -75,6 +75,51 @@ class TimeSlot(object):
return '<TimeSlot start=%s - end=%s>' % (self.start.strftime('%c'), self.end.strftime('%c'))
def openinghours_to_datetime(day_number, hour, minute, base_datetime):
"""
return the next date and time after base_datetime
"""
day_number = day_number % 7 # ease operations using this parameter
#get next weekday
days = (7 + day_number - base_datetime.weekday()) % 7
datetime_obj = base_datetime + datetime.timedelta(days=days)
if is_naive(datetime_obj):
datetime_obj = make_aware(datetime_obj)
# set time
try:
time = datetime.time(hour=hour, minute=minute)
except ValueError:
return None
datetime_obj = datetime.datetime.combine(datetime_obj, time)
return datetime_obj
def get_slot(day_number, time_table, base_datetime):
start_hour = int(time_table['start_hour'])
start_minute = int(time_table['start_minute'])
end_hour = int(time_table['end_hour'])
end_minute = int(time_table['end_minute'])
start = openinghours_to_datetime(day_number, start_hour, start_minute, base_datetime)
# hours may belongs on next day
end_day_number = day_number
if end_hour < start_hour or end_hour == start_hour and end_minute < start_minute:
end_day_number += 1
end = openinghours_to_datetime(end_day_number, end_hour, end_minute, base_datetime)
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.
# Compute start time from yesterday
yesterday = base_datetime - datetime.timedelta(days=1)
start = openinghours_to_datetime(day_number, start_hour, start_minute, yesterday)
return TimeSlot(start, end)
def get_open_close_from_specification(specification, valid_from, base_datetime):
'''Parse geojson 'openinghoursspecification' fields data
'''
@ -124,27 +169,6 @@ def get_time_table_from_specification(specification):
return (weekday, time_table)
def openinghours_to_datetime(day_number, hour, minute, base_datetime):
"""
return the next date and time after base_datetime
"""
day_number = day_number % 7 # ease operations using this parameter
# set next weekday
days = (7 + day_number - base_datetime.weekday()) % 7
datetime_obj = base_datetime + datetime.timedelta(days=days)
if is_naive(datetime_obj):
datetime_obj = make_aware(datetime_obj)
# set time
try:
time = datetime.time(hour=hour, minute=minute)
except ValueError:
return None
datetime_obj = datetime.datetime.combine(datetime_obj, time)
return datetime_obj
def get_period_from_data(time_table):
"""Return am or pm and all_day_hours from opening_time and closing_time
"""
@ -274,27 +298,8 @@ def get_slots_from_mairie_format(data, base_datetime):
for days_list, time_table in parse_opening_hours_data(data):
for weekday in days_list:
day_number = EN_ABBREV_WEEKDAYS_LIST.index(weekday)
timeslot = get_slot(day_number, time_table, base_datetime)
start_hour = int(time_table['start_hour'])
start_minute = int(time_table['start_minute'])
end_hour = int(time_table['end_hour'])
end_minute = int(time_table['end_minute'])
start = openinghours_to_datetime(day_number, start_hour, start_minute, base_datetime)
# hours may belongs on next day
end_day_number = day_number
if end_hour < start_hour or end_hour == start_hour and end_minute < start_minute:
end_day_number += 1
end = openinghours_to_datetime(end_day_number, end_hour, end_minute, base_datetime)
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.
# Compute start time from yesterday
yesterday = base_datetime - datetime.timedelta(days=1)
start = openinghours_to_datetime(day_number, start_hour, start_minute, yesterday)
timeslot = TimeSlot(start, end)
# add to slots the opening hours in chronological order beginning from today
slots.append(timeslot)