Skip to content

Commit a370893

Browse files
committed
Fixes and unit tests
1 parent fc368be commit a370893

3 files changed

Lines changed: 186 additions & 12 deletions

File tree

application/common/dos.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -270,18 +270,21 @@ def db_big_rows_to_spec_open_times(db_rows: Iterable[dict]) -> list[SpecifiedOpe
270270
note: The rows must to be for the same service.
271271
"""
272272
specified_opening_times = []
273-
date_sorted_rows = sorted(db_rows, key=lambda row: (row["date"], row["starttime"]))
274-
for date, db_rows in groupby(date_sorted_rows, lambda row: row["date"]):
273+
specified_op_times_ids = []
274+
db_rows_refined = []
275+
for row in list(db_rows):
276+
if row["ssot_id"] is not None and row["ssot_id"] not in specified_op_times_ids:
277+
specified_op_times_ids.append(row["ssot_id"])
278+
db_rows_refined.append(row)
279+
date_sorted_rows = sorted(db_rows_refined, key=lambda row: (row["date"], row["date_starttime"]))
280+
for date, db_rows_refined in groupby(date_sorted_rows, lambda row: row["date"]):
275281
is_open = True
276282
open_periods = []
277-
specified_op_times_ids = []
278-
for row in list(db_rows):
279-
if row["ssot_id"] is not None and row["ssot_id"] not in specified_op_times_ids:
280-
specified_op_times_ids.append = row["ssot_id"]
281-
if row["isclosed"] is True:
282-
is_open = False
283-
else:
284-
open_periods.append(OpenPeriod(row["starttime"], row["endtime"]))
283+
for row in list(db_rows_refined):
284+
if row["isclosed"] is True:
285+
is_open = False
286+
else:
287+
open_periods.append(OpenPeriod(row["date_starttime"], row["date_endtime"]))
285288
specified_opening_times.append(SpecifiedOpeningTime(open_periods, date, is_open))
286289

287290
return specified_opening_times
@@ -311,7 +314,7 @@ def db_big_rows_to_std_open_times(db_rows: Iterable[dict]) -> StandardOpeningTim
311314
std_op_times_ids = []
312315
for row in db_rows:
313316
if row["sdot_id"] is not None and row["sdot_id"] not in std_op_times_ids:
314-
std_op_times_ids.append = row["sdot_id"]
317+
std_op_times_ids.append(row["sdot_id"])
315318
weekday = row["name"].lower()
316319
start = row["day_starttime"]
317320
end = row["day_endtime"]

application/common/tests/test_dos.py

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from application.common.dos import (
66
DoSService,
7+
db_big_rows_to_spec_open_times,
8+
db_big_rows_to_std_open_times,
79
db_rows_to_spec_open_times,
810
db_rows_to_std_open_times,
911
get_dos_locations,
@@ -584,6 +586,91 @@ def test_db_rows_to_spec_open_times() -> None:
584586
assert spec_open_times == expected_spec_open_times
585587

586588

589+
def test_db_big_rows_to_spec_open_times() -> None:
590+
db_rows = [
591+
{
592+
"serviceid": 1,
593+
"date": date(2019, 5, 6),
594+
"date_starttime": time(8, 0, 0),
595+
"date_endtime": time(20, 0, 0),
596+
"isclosed": False,
597+
"ssot_id": 123,
598+
},
599+
{
600+
"serviceid": 1,
601+
"date": date(2019, 5, 6),
602+
"date_starttime": time(21, 0, 0),
603+
"date_endtime": time(22, 0, 0),
604+
"isclosed": False,
605+
"ssot_id": 324,
606+
},
607+
{
608+
"serviceid": 1,
609+
"date": date(2019, 5, 27),
610+
"date_starttime": time(8, 0, 0),
611+
"date_endtime": time(20, 0, 0),
612+
"isclosed": False,
613+
"ssot_id": 768,
614+
},
615+
{
616+
"serviceid": 1,
617+
"date": date(2019, 8, 26),
618+
"date_starttime": time(8, 0, 0),
619+
"date_endtime": time(20, 0, 0),
620+
"isclosed": False,
621+
"ssot_id": 987,
622+
},
623+
{
624+
"serviceid": 1,
625+
"date": date(2019, 9, 20),
626+
"date_starttime": None,
627+
"date_endtime": None,
628+
"isclosed": True,
629+
"ssot_id": 567,
630+
},
631+
{
632+
"serviceid": 1,
633+
"date": date(2020, 5, 6),
634+
"date_starttime": time(6, 0, 0),
635+
"date_endtime": time(7, 0, 0),
636+
"isclosed": False,
637+
"ssot_id": 876,
638+
},
639+
{
640+
"serviceid": 1,
641+
"date": date(2020, 5, 6),
642+
"date_starttime": time(6, 0, 0),
643+
"date_endtime": time(7, 0, 0),
644+
"isclosed": False,
645+
"ssot_id": 876,
646+
},
647+
{
648+
"serviceid": 1,
649+
"date": None,
650+
"date_starttime": None,
651+
"date_endtime": None,
652+
"isclosed": None,
653+
"ssot_id": None,
654+
},
655+
]
656+
657+
spec_open_times = db_big_rows_to_spec_open_times(db_rows)
658+
659+
expected_spec_open_times = [
660+
SpecifiedOpeningTime(
661+
[OpenPeriod.from_string_times("08:00", "20:00"), OpenPeriod.from_string_times("21:00", "22:00")],
662+
date(2019, 5, 6),
663+
True,
664+
),
665+
SpecifiedOpeningTime([OpenPeriod.from_string_times("08:00", "20:00")], date(2019, 5, 27), True),
666+
SpecifiedOpeningTime([OpenPeriod.from_string_times("08:00", "20:00")], date(2019, 8, 26), True),
667+
SpecifiedOpeningTime([], date(2019, 9, 20), False),
668+
SpecifiedOpeningTime([OpenPeriod.from_string_times("06:00", "07:00")], date(2020, 5, 6), True),
669+
]
670+
671+
assert spec_open_times == expected_spec_open_times
672+
673+
587674
def test_db_rows_to_std_open_time() -> None:
588675
db_rows = [
589676
{"serviceid": 1, "dayid": 0, "name": "Monday", "starttime": time(8, 0, 0), "endtime": time(17, 0, 0)},
@@ -611,6 +698,90 @@ def test_db_rows_to_std_open_time() -> None:
611698
assert actual_std_open_times == expected_std_open_times
612699

613700

701+
def test_db_big_rows_to_std_open_time() -> None:
702+
db_rows = [
703+
{
704+
"serviceid": 1,
705+
"dayid": 0,
706+
"name": "Monday",
707+
"day_starttime": time(8, 0, 0),
708+
"day_endtime": time(17, 0, 0),
709+
"sdot_id": 230,
710+
},
711+
{
712+
"serviceid": 1,
713+
"dayid": 6,
714+
"name": "Sunday",
715+
"day_starttime": time(13, 0, 0),
716+
"day_endtime": time(15, 30, 0),
717+
"sdot_id": 231,
718+
},
719+
{
720+
"serviceid": 1,
721+
"dayid": 1,
722+
"name": "Tuesday",
723+
"day_starttime": time(13, 0, 0),
724+
"day_endtime": time(18, 0, 0),
725+
"sdot_id": 233,
726+
},
727+
{
728+
"serviceid": 1,
729+
"dayid": 4,
730+
"name": "Friday",
731+
"day_starttime": time(13, 0, 0),
732+
"day_endtime": time(15, 30, 0),
733+
"sdot_id": 232,
734+
},
735+
{
736+
"serviceid": 1,
737+
"dayid": 6,
738+
"name": "Wednesday",
739+
"day_starttime": time(7, 0, 0),
740+
"day_endtime": time(15, 30, 0),
741+
"sdot_id": 234,
742+
},
743+
{
744+
"serviceid": 1,
745+
"dayid": 1,
746+
"name": "Tuesday",
747+
"day_starttime": time(8, 0, 0),
748+
"day_endtime": time(12, 0, 0),
749+
"sdot_id": 287,
750+
},
751+
{
752+
"serviceid": 1,
753+
"dayid": 4,
754+
"name": "Thursday",
755+
"day_starttime": time(11, 0, 0),
756+
"day_endtime": time(13, 30, 0),
757+
"sdot_id": 238,
758+
},
759+
{
760+
"serviceid": 1,
761+
"dayid": 4,
762+
"name": "Thursday",
763+
"day_starttime": time(11, 0, 0),
764+
"day_endtime": time(13, 30, 0),
765+
"sdot_id": 238,
766+
},
767+
]
768+
769+
expected_std_open_times = StandardOpeningTimes()
770+
expected_std_open_times.monday = [OpenPeriod.from_string_times("08:00", "17:00")]
771+
expected_std_open_times.tuesday = [
772+
OpenPeriod.from_string_times("08:00", "12:00"),
773+
OpenPeriod.from_string_times("13:00", "18:00"),
774+
]
775+
expected_std_open_times.wednesday = [OpenPeriod.from_string_times("07:00", "15:30")]
776+
expected_std_open_times.thursday = [OpenPeriod.from_string_times("11:00", "13:30")]
777+
expected_std_open_times.friday = [OpenPeriod.from_string_times("13:00", "15:30")]
778+
expected_std_open_times.sunday = [OpenPeriod.from_string_times("13:00", "15:30")]
779+
780+
actual_std_open_times = db_big_rows_to_std_open_times(db_rows)
781+
782+
assert actual_std_open_times == expected_std_open_times
783+
784+
614785
def get_db_item(odscode: str = "FA9321", name: str = "fake name", id: int = 9999, typeid: int = 13) -> dict: # noqa: A002
615786
return {
616787
"id": id,

application/service_sync/data_processing/get_data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def get_dos_service_and_history_one_query(service_id: int) -> tuple[DoSService,
8686
"publicphone, publicname, st.name service_type_name, easting, northing, latitude, longitude, "
8787
'sdo.id as "sdo_id", sdo.dayid, otd.name, sdot.id as "sdot_id", sdot.starttime as "day_starttime", '
8888
'sdot.endtime as "day_endtime", ssod.id as "ssod_id", ssod.date, ssot.id as "ssot_id", '
89-
"ssot.starttime, ssot.endtime, ssot.isclosed "
89+
'ssot.starttime as "date_starttime", ssot.endtime as "date_endtime", ssot.isclosed '
9090
"FROM services s "
9191
"INNER JOIN servicetypes st ON s.typeid = st.id INNER JOIN servicestatuses ss on s.statusid = ss.id "
9292
"LEFT JOIN servicedayopenings sdo ON s.id = sdo.serviceid "

0 commit comments

Comments
 (0)