@@ -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