Skip to content

Commit b86aa7c

Browse files
committed
fix(canadapost): normalize tracking event statuses
1 parent 8211f50 commit b86aa7c

3 files changed

Lines changed: 306 additions & 144 deletions

File tree

modules/connectors/canadapost/karrio/providers/canadapost/tracking.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@ def parse_tracking_response(
1212
settings: provider_utils.Settings,
1313
) -> typing.Tuple[typing.List[models.TrackingDetails], typing.List[models.Message]]:
1414
response = _response.deserialize()
15-
details = lib.find_element("tracking-detail", response)
15+
responses = lib.to_list(response)
16+
details: typing.List[lib.Element] = []
17+
for node in responses:
18+
tag = getattr(node, "tag", "")
19+
local_name = tag.split("}")[-1] if isinstance(tag, str) else ""
20+
# Canada Post may return <tracking-detail> as the response root.
21+
if local_name == "tracking-detail":
22+
details.append(node)
23+
continue
24+
details.extend(lib.find_element("tracking-detail", node))
1625
tracking_details: typing.List[models.TrackingDetails] = [
1726
_extract_tracking(node, settings)
1827
for node in details
@@ -33,13 +42,9 @@ def _extract_tracking(
3342
details.changed_expected_date or details.expected_delivery_date,
3443
"%Y-%m-%d",
3544
)
36-
status = next(
37-
(
38-
status.name
39-
for status in list(provider_units.TrackingStatus)
40-
if last_event.event_identifier in status.value
41-
),
42-
provider_units.TrackingStatus.in_transit.name,
45+
status = provider_units.map_tracking_status(
46+
last_event.event_identifier,
47+
last_event.event_description,
4348
)
4449

4550
return models.TrackingDetails(
@@ -62,21 +67,12 @@ def _extract_tracking(
6267
lib.fdate(event.event_date, "%Y-%m-%d"),
6368
lib.ftime(event.event_time, "%H:%M:%S"),
6469
),
65-
status=next(
66-
(
67-
s.name
68-
for s in list(provider_units.TrackingStatus)
69-
if event.event_identifier in s.value
70-
),
71-
None,
70+
status=provider_units.map_tracking_status(
71+
event.event_identifier,
72+
event.event_description,
7273
),
73-
reason=next(
74-
(
75-
r.name
76-
for r in list(provider_units.TrackingIncidentReason)
77-
if event.event_identifier in r.value
78-
),
79-
None,
74+
reason=provider_units.map_tracking_incident_reason(
75+
event.event_identifier,
8076
),
8177
)
8278
for event in events

0 commit comments

Comments
 (0)