From 9309eaf1990c8032bfde69667514e7f466121267 Mon Sep 17 00:00:00 2001 From: panxl6 Date: Thu, 16 Jan 2025 14:34:22 +0800 Subject: [PATCH] feat: supporting 2025-01 version. --- LICENSE | 21 + Makefile | 17 + README.md | 272 ++++++++- app.py | 73 +++ poetry.lock | 529 ++++++++++++++++++ pyproject.toml | 54 ++ setup.cfg | 8 + tracking/__init__.py | 14 + tracking/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 424 bytes tracking/__pycache__/auth.cpython-312.pyc | Bin 0 -> 7634 bytes tracking/__pycache__/client.cpython-312.pyc | Bin 0 -> 983 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 4632 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 4816 bytes tracking/__pycache__/request.cpython-312.pyc | Bin 0 -> 7284 bytes tracking/__pycache__/response.cpython-312.pyc | Bin 0 -> 3977 bytes tracking/api/__init__.py | 14 + .../api/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 382 bytes .../api/__pycache__/courier.cpython-312.pyc | Bin 0 -> 3847 bytes .../estimated_delivery_date.cpython-312.pyc | Bin 0 -> 4022 bytes .../api/__pycache__/tracking.cpython-312.pyc | Bin 0 -> 15240 bytes tracking/api/courier.py | 79 +++ tracking/api/estimated_delivery_date.py | 68 +++ tracking/api/tracking.py | 240 ++++++++ tracking/auth.py | 134 +++++ tracking/client.py | 21 + tracking/configuration.py | 112 ++++ tracking/exceptions.py | 123 ++++ tracking/models/__init__.py | 370 ++++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14191 bytes .../additional_fields_v1.cpython-312.pyc | Bin 0 -> 943 bytes ...e_create_tracking_response.cpython-312.pyc | Bin 0 -> 2573 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2607 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2583 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2664 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2615 bytes ...ted_delivery_date_tracking.cpython-312.pyc | Bin 0 -> 2459 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2607 bytes ...s_create_tracking_response.cpython-312.pyc | Bin 0 -> 2303 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2337 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2313 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2394 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2345 bytes .../carbon_emissions_tracking.cpython-312.pyc | Bin 0 -> 2189 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2337 bytes .../__pycache__/checkpoint.cpython-312.pyc | Bin 0 -> 2990 bytes .../coordinate_checkpoint.cpython-312.pyc | Bin 0 -> 2157 bytes .../__pycache__/courier.cpython-312.pyc | Bin 0 -> 2437 bytes ...e_create_tracking_response.cpython-312.pyc | Bin 0 -> 2494 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2528 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2504 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2585 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2536 bytes ...ted_delivery_date_tracking.cpython-312.pyc | Bin 0 -> 2380 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2528 bytes .../courier_response_v1.cpython-312.pyc | Bin 0 -> 2325 bytes .../create_tracking_request.cpython-312.pyc | Bin 0 -> 4335 bytes .../create_tracking_response.cpython-312.pyc | Bin 0 -> 8011 bytes ...e_create_tracking_response.cpython-312.pyc | Bin 0 -> 2473 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2507 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2483 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2564 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2515 bytes ...ted_delivery_date_tracking.cpython-312.pyc | Bin 0 -> 2359 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2507 bytes ...rs_create_tracking_request.cpython-312.pyc | Bin 0 -> 2346 bytes ...s_create_tracking_response.cpython-312.pyc | Bin 0 -> 2354 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2388 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2364 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2445 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2396 bytes .../customers_tracking.cpython-312.pyc | Bin 0 -> 2240 bytes ...ate_tracking_by_id_request.cpython-312.pyc | Bin 0 -> 2380 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2388 bytes .../data_courier_response_v1.cpython-312.pyc | Bin 0 -> 2243 bytes ...g_response_get_multiple_v1.cpython-312.pyc | Bin 0 -> 2527 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 8187 bytes ...ated_delivery_date_request.cpython-312.pyc | Bin 0 -> 2489 bytes ...ted_delivery_date_response.cpython-312.pyc | Bin 0 -> 2497 bytes ...on_address_predict_request.cpython-312.pyc | Bin 0 -> 2375 bytes ...n_address_predict_response.cpython-312.pyc | Bin 0 -> 2383 bytes .../detect_courier_request.cpython-312.pyc | Bin 0 -> 2796 bytes .../detect_courier_response.cpython-312.pyc | Bin 0 -> 2242 bytes ...ated_delivery_date_request.cpython-312.pyc | Bin 0 -> 3239 bytes ...ted_delivery_date_response.cpython-312.pyc | Bin 0 -> 3531 bytes ...ated_delivery_date_request.cpython-312.pyc | Bin 0 -> 2725 bytes ...ted_delivery_date_response.cpython-312.pyc | Bin 0 -> 2778 bytes ...ted_pickup_predict_request.cpython-312.pyc | Bin 0 -> 2567 bytes ...ed_pickup_predict_response.cpython-312.pyc | Bin 0 -> 2620 bytes .../events_checkpoint.cpython-312.pyc | Bin 0 -> 2239 bytes ...y_create_tracking_response.cpython-312.pyc | Bin 0 -> 2469 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2503 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2479 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2560 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2511 bytes ...stimated_delivery_tracking.cpython-312.pyc | Bin 0 -> 2355 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2503 bytes ...e_create_tracking_response.cpython-312.pyc | Bin 0 -> 2397 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2431 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2407 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2488 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2439 bytes .../first_mile_tracking.cpython-312.pyc | Bin 0 -> 2283 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2431 bytes .../get_all_couriers_response.cpython-312.pyc | Bin 0 -> 2251 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 8073 bytes .../get_trackings_response.cpython-312.pyc | Bin 0 -> 2313 bytes ...get_user_couriers_response.cpython-312.pyc | Bin 0 -> 2259 bytes ...le_create_tracking_request.cpython-312.pyc | Bin 0 -> 2232 bytes ...e_create_tracking_response.cpython-312.pyc | Bin 0 -> 2426 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2460 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2436 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2517 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2468 bytes .../last_mile_tracking.cpython-312.pyc | Bin 0 -> 2312 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2460 bytes ...y_create_tracking_response.cpython-312.pyc | Bin 0 -> 2477 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2511 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2487 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2568 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2519 bytes ...stimated_delivery_tracking.cpython-312.pyc | Bin 0 -> 2363 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2511 bytes ...ng_completed_by_id_request.cpython-312.pyc | Bin 0 -> 2213 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 8463 bytes .../__pycache__/meta_v1.cpython-312.pyc | Bin 0 -> 2090 bytes ...ated_delivery_date_request.cpython-312.pyc | Bin 0 -> 2507 bytes ...ted_delivery_date_response.cpython-312.pyc | Bin 0 -> 2515 bytes ...ted_pickup_predict_request.cpython-312.pyc | Bin 0 -> 2393 bytes ...ed_pickup_predict_response.cpython-312.pyc | Bin 0 -> 2401 bytes ...ated_delivery_date_request.cpython-312.pyc | Bin 0 -> 2449 bytes ...ted_delivery_date_response.cpython-312.pyc | Bin 0 -> 2457 bytes ...in_address_predict_request.cpython-312.pyc | Bin 0 -> 2335 bytes ...n_address_predict_response.cpython-312.pyc | Bin 0 -> 2343 bytes .../__pycache__/pagination.cpython-312.pyc | Bin 0 -> 2148 bytes ...g_response_get_multiple_v1.cpython-312.pyc | Bin 0 -> 2418 bytes ...ion_get_trackings_response.cpython-312.pyc | Bin 0 -> 2311 bytes .../predict_batch_request.cpython-312.pyc | Bin 0 -> 2260 bytes .../predict_batch_response.cpython-312.pyc | Bin 0 -> 2271 bytes .../predict_request.cpython-312.pyc | Bin 0 -> 2949 bytes .../predict_response.cpython-312.pyc | Bin 0 -> 3238 bytes .../reason_events_checkpoint.cpython-312.pyc | Bin 0 -> 2128 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 8224 bytes ...t_create_tracking_response.cpython-312.pyc | Bin 0 -> 2295 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2329 bytes ...et_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2305 bytes ...g_completed_by_id_response.cpython-312.pyc | Bin 0 -> 2386 bytes ...ck_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2337 bytes .../shipment_weight_tracking.cpython-312.pyc | Bin 0 -> 2181 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 2329 bytes .../__pycache__/slug_group_v1.cpython-312.pyc | Bin 0 -> 1183 bytes .../models/__pycache__/tag_v1.cpython-312.pyc | Bin 0 -> 824 bytes .../__pycache__/tracking.cpython-312.pyc | Bin 0 -> 7462 bytes ...g_response_get_multiple_v1.cpython-312.pyc | Bin 0 -> 2448 bytes .../tracking_response_v1.cpython-312.pyc | Bin 0 -> 2298 bytes ...ate_tracking_by_id_request.cpython-312.pyc | Bin 0 -> 3901 bytes ...te_tracking_by_id_response.cpython-312.pyc | Bin 0 -> 8187 bytes ...ated_delivery_date_request.cpython-312.pyc | Bin 0 -> 2279 bytes ...ted_delivery_date_response.cpython-312.pyc | Bin 0 -> 2287 bytes .../weight_predict_request.cpython-312.pyc | Bin 0 -> 2165 bytes .../weight_predict_response.cpython-312.pyc | Bin 0 -> 2173 bytes tracking/models/additional_fields_v1.py | 23 + ..._delivery_date_create_tracking_response.py | 39 ++ ...ery_date_delete_tracking_by_id_response.py | 39 ++ ...livery_date_get_tracking_by_id_response.py | 39 ++ ..._mark_tracking_completed_by_id_response.py | 39 ++ ...ry_date_retrack_tracking_by_id_response.py | 39 ++ ...ership_estimated_delivery_date_tracking.py | 39 ++ ...ery_date_update_tracking_by_id_response.py | 39 ++ ...rbon_emissions_create_tracking_response.py | 37 ++ ...missions_delete_tracking_by_id_response.py | 37 ++ ...n_emissions_get_tracking_by_id_response.py | 37 ++ ..._mark_tracking_completed_by_id_response.py | 37 ++ ...issions_retrack_tracking_by_id_response.py | 37 ++ tracking/models/carbon_emissions_tracking.py | 37 ++ ...missions_update_tracking_by_id_response.py | 37 ++ tracking/models/checkpoint.py | 56 ++ tracking/models/coordinate_checkpoint.py | 37 ++ tracking/models/courier.py | 45 ++ ..._delivery_date_create_tracking_response.py | 38 ++ ...ery_date_delete_tracking_by_id_response.py | 38 ++ ...livery_date_get_tracking_by_id_response.py | 38 ++ ..._mark_tracking_completed_by_id_response.py | 38 ++ ...ry_date_retrack_tracking_by_id_response.py | 38 ++ ...ourier_estimated_delivery_date_tracking.py | 38 ++ ...ery_date_update_tracking_by_id_response.py | 38 ++ tracking/models/courier_response_v1.py | 40 ++ tracking/models/create_tracking_request.py | 78 +++ tracking/models/create_tracking_response.py | 147 +++++ ..._delivery_date_create_tracking_response.py | 39 ++ ...ery_date_delete_tracking_by_id_response.py | 39 ++ ...livery_date_get_tracking_by_id_response.py | 39 ++ ..._mark_tracking_completed_by_id_response.py | 39 ++ ...ry_date_retrack_tracking_by_id_response.py | 39 ++ ...custom_estimated_delivery_date_tracking.py | 39 ++ ...ery_date_update_tracking_by_id_response.py | 39 ++ .../customers_create_tracking_request.py | 40 ++ .../customers_create_tracking_response.py | 40 ++ ...ustomers_delete_tracking_by_id_response.py | 40 ++ .../customers_get_tracking_by_id_response.py | 40 ++ ..._mark_tracking_completed_by_id_response.py | 40 ++ ...stomers_retrack_tracking_by_id_response.py | 40 ++ tracking/models/customers_tracking.py | 40 ++ ...customers_update_tracking_by_id_request.py | 40 ++ ...ustomers_update_tracking_by_id_response.py | 40 ++ tracking/models/data_courier_response_v1.py | 39 ++ .../data_tracking_response_get_multiple_v1.py | 42 ++ .../models/delete_tracking_by_id_response.py | 153 +++++ ...address_estimated_delivery_date_request.py | 40 ++ ...ddress_estimated_delivery_date_response.py | 40 ++ .../destination_address_predict_request.py | 40 ++ .../destination_address_predict_response.py | 40 ++ tracking/models/detect_courier_request.py | 49 ++ tracking/models/detect_courier_response.py | 39 ++ .../models/estimated_delivery_date_request.py | 56 ++ .../estimated_delivery_date_response.py | 61 ++ ..._pickup_estimated_delivery_date_request.py | 45 ++ ...pickup_estimated_delivery_date_response.py | 46 ++ .../estimated_pickup_predict_request.py | 43 ++ .../estimated_pickup_predict_response.py | 44 ++ tracking/models/events_checkpoint.py | 39 ++ ...mated_delivery_create_tracking_response.py | 40 ++ ...delivery_delete_tracking_by_id_response.py | 40 ++ ...ed_delivery_get_tracking_by_id_response.py | 40 ++ ..._mark_tracking_completed_by_id_response.py | 40 ++ ...elivery_retrack_tracking_by_id_response.py | 40 ++ .../first_estimated_delivery_tracking.py | 40 ++ ...delivery_update_tracking_by_id_response.py | 40 ++ .../first_mile_create_tracking_response.py | 40 ++ ...rst_mile_delete_tracking_by_id_response.py | 40 ++ .../first_mile_get_tracking_by_id_response.py | 40 ++ ..._mark_tracking_completed_by_id_response.py | 40 ++ ...st_mile_retrack_tracking_by_id_response.py | 40 ++ tracking/models/first_mile_tracking.py | 40 ++ ...rst_mile_update_tracking_by_id_response.py | 40 ++ tracking/models/get_all_couriers_response.py | 39 ++ .../models/get_tracking_by_id_response.py | 147 +++++ tracking/models/get_trackings_response.py | 40 ++ tracking/models/get_user_couriers_response.py | 39 ++ .../last_mile_create_tracking_request.py | 37 ++ .../last_mile_create_tracking_response.py | 41 ++ ...ast_mile_delete_tracking_by_id_response.py | 41 ++ .../last_mile_get_tracking_by_id_response.py | 41 ++ ..._mark_tracking_completed_by_id_response.py | 41 ++ ...st_mile_retrack_tracking_by_id_response.py | 41 ++ tracking/models/last_mile_tracking.py | 41 ++ ...ast_mile_update_tracking_by_id_response.py | 41 ++ ...mated_delivery_create_tracking_response.py | 40 ++ ...delivery_delete_tracking_by_id_response.py | 40 ++ ...ed_delivery_get_tracking_by_id_response.py | 40 ++ ..._mark_tracking_completed_by_id_response.py | 40 ++ ...elivery_retrack_tracking_by_id_response.py | 40 ++ .../latest_estimated_delivery_tracking.py | 40 ++ ...delivery_update_tracking_by_id_response.py | 40 ++ .../mark_tracking_completed_by_id_request.py | 36 ++ .../mark_tracking_completed_by_id_response.py | 157 ++++++ tracking/models/meta_v1.py | 38 ++ ..._pickup_estimated_delivery_date_request.py | 37 ++ ...pickup_estimated_delivery_date_response.py | 37 ++ ...g_time_estimated_pickup_predict_request.py | 37 ++ ..._time_estimated_pickup_predict_response.py | 37 ++ ...address_estimated_delivery_date_request.py | 40 ++ ...ddress_estimated_delivery_date_response.py | 40 ++ .../models/origin_address_predict_request.py | 40 ++ .../models/origin_address_predict_response.py | 40 ++ tracking/models/pagination.py | 38 ++ ..._data_tracking_response_get_multiple_v1.py | 38 ++ .../pagination_get_trackings_response.py | 38 ++ tracking/models/predict_batch_request.py | 38 ++ tracking/models/predict_batch_response.py | 38 ++ tracking/models/predict_request.py | 48 ++ tracking/models/predict_response.py | 53 ++ tracking/models/reason_events_checkpoint.py | 36 ++ .../models/retrack_tracking_by_id_response.py | 153 +++++ ...hipment_weight_create_tracking_response.py | 37 ++ ...t_weight_delete_tracking_by_id_response.py | 37 ++ ...ment_weight_get_tracking_by_id_response.py | 37 ++ ..._mark_tracking_completed_by_id_response.py | 37 ++ ..._weight_retrack_tracking_by_id_response.py | 37 ++ tracking/models/shipment_weight_tracking.py | 37 ++ ...t_weight_update_tracking_by_id_response.py | 37 ++ tracking/models/slug_group_v1.py | 28 + tracking/models/tag_v1.py | 25 + tracking/models/tracking.py | 133 +++++ .../tracking_response_get_multiple_v1.py | 40 ++ tracking/models/tracking_response_v1.py | 40 ++ .../models/update_tracking_by_id_request.py | 73 +++ .../models/update_tracking_by_id_response.py | 153 +++++ .../weight_estimated_delivery_date_request.py | 37 ++ ...weight_estimated_delivery_date_response.py | 37 ++ tracking/models/weight_predict_request.py | 37 ++ tracking/models/weight_predict_response.py | 37 ++ tracking/request.py | 140 +++++ tracking/response.py | 96 ++++ 293 files changed, 8404 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 app.py create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 setup.cfg create mode 100644 tracking/__init__.py create mode 100644 tracking/__pycache__/__init__.cpython-312.pyc create mode 100644 tracking/__pycache__/auth.cpython-312.pyc create mode 100644 tracking/__pycache__/client.cpython-312.pyc create mode 100644 tracking/__pycache__/configuration.cpython-312.pyc create mode 100644 tracking/__pycache__/exceptions.cpython-312.pyc create mode 100644 tracking/__pycache__/request.cpython-312.pyc create mode 100644 tracking/__pycache__/response.cpython-312.pyc create mode 100644 tracking/api/__init__.py create mode 100644 tracking/api/__pycache__/__init__.cpython-312.pyc create mode 100644 tracking/api/__pycache__/courier.cpython-312.pyc create mode 100644 tracking/api/__pycache__/estimated_delivery_date.cpython-312.pyc create mode 100644 tracking/api/__pycache__/tracking.cpython-312.pyc create mode 100644 tracking/api/courier.py create mode 100644 tracking/api/estimated_delivery_date.py create mode 100644 tracking/api/tracking.py create mode 100644 tracking/auth.py create mode 100644 tracking/client.py create mode 100644 tracking/configuration.py create mode 100644 tracking/exceptions.py create mode 100644 tracking/models/__init__.py create mode 100644 tracking/models/__pycache__/__init__.cpython-312.pyc create mode 100644 tracking/models/__pycache__/additional_fields_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/aftership_estimated_delivery_date_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/aftership_estimated_delivery_date_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/aftership_estimated_delivery_date_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/aftership_estimated_delivery_date_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/aftership_estimated_delivery_date_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/aftership_estimated_delivery_date_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/carbon_emissions_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/carbon_emissions_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/carbon_emissions_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/carbon_emissions_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/carbon_emissions_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/carbon_emissions_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/carbon_emissions_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/checkpoint.cpython-312.pyc create mode 100644 tracking/models/__pycache__/coordinate_checkpoint.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_estimated_delivery_date_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_estimated_delivery_date_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_estimated_delivery_date_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_estimated_delivery_date_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_estimated_delivery_date_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_estimated_delivery_date_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/courier_response_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/create_tracking_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/custom_estimated_delivery_date_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/custom_estimated_delivery_date_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/custom_estimated_delivery_date_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/custom_estimated_delivery_date_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/custom_estimated_delivery_date_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/custom_estimated_delivery_date_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/custom_estimated_delivery_date_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_create_tracking_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_update_tracking_by_id_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/customers_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/data_courier_response_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/data_tracking_response_get_multiple_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/destination_address_estimated_delivery_date_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/destination_address_estimated_delivery_date_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/destination_address_predict_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/destination_address_predict_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/detect_courier_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/detect_courier_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/estimated_delivery_date_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/estimated_delivery_date_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/estimated_pickup_estimated_delivery_date_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/estimated_pickup_estimated_delivery_date_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/estimated_pickup_predict_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/estimated_pickup_predict_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/events_checkpoint.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_estimated_delivery_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_estimated_delivery_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_estimated_delivery_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_estimated_delivery_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_estimated_delivery_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_estimated_delivery_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_estimated_delivery_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_mile_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_mile_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_mile_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_mile_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_mile_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_mile_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/first_mile_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/get_all_couriers_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/get_trackings_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/get_user_couriers_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_create_tracking_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/last_mile_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/latest_estimated_delivery_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/latest_estimated_delivery_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/latest_estimated_delivery_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/latest_estimated_delivery_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/latest_estimated_delivery_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/latest_estimated_delivery_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/latest_estimated_delivery_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/mark_tracking_completed_by_id_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/meta_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/order_processing_time_estimated_pickup_estimated_delivery_date_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/order_processing_time_estimated_pickup_estimated_delivery_date_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/order_processing_time_estimated_pickup_predict_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/order_processing_time_estimated_pickup_predict_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/origin_address_estimated_delivery_date_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/origin_address_estimated_delivery_date_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/origin_address_predict_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/origin_address_predict_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/pagination.cpython-312.pyc create mode 100644 tracking/models/__pycache__/pagination_data_tracking_response_get_multiple_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/pagination_get_trackings_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/predict_batch_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/predict_batch_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/predict_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/predict_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/reason_events_checkpoint.cpython-312.pyc create mode 100644 tracking/models/__pycache__/retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/shipment_weight_create_tracking_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/shipment_weight_delete_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/shipment_weight_get_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/shipment_weight_mark_tracking_completed_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/shipment_weight_retrack_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/shipment_weight_tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/shipment_weight_update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/slug_group_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/tag_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/tracking.cpython-312.pyc create mode 100644 tracking/models/__pycache__/tracking_response_get_multiple_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/tracking_response_v1.cpython-312.pyc create mode 100644 tracking/models/__pycache__/update_tracking_by_id_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/update_tracking_by_id_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/weight_estimated_delivery_date_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/weight_estimated_delivery_date_response.cpython-312.pyc create mode 100644 tracking/models/__pycache__/weight_predict_request.cpython-312.pyc create mode 100644 tracking/models/__pycache__/weight_predict_response.cpython-312.pyc create mode 100644 tracking/models/additional_fields_v1.py create mode 100644 tracking/models/aftership_estimated_delivery_date_create_tracking_response.py create mode 100644 tracking/models/aftership_estimated_delivery_date_delete_tracking_by_id_response.py create mode 100644 tracking/models/aftership_estimated_delivery_date_get_tracking_by_id_response.py create mode 100644 tracking/models/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/aftership_estimated_delivery_date_retrack_tracking_by_id_response.py create mode 100644 tracking/models/aftership_estimated_delivery_date_tracking.py create mode 100644 tracking/models/aftership_estimated_delivery_date_update_tracking_by_id_response.py create mode 100644 tracking/models/carbon_emissions_create_tracking_response.py create mode 100644 tracking/models/carbon_emissions_delete_tracking_by_id_response.py create mode 100644 tracking/models/carbon_emissions_get_tracking_by_id_response.py create mode 100644 tracking/models/carbon_emissions_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/carbon_emissions_retrack_tracking_by_id_response.py create mode 100644 tracking/models/carbon_emissions_tracking.py create mode 100644 tracking/models/carbon_emissions_update_tracking_by_id_response.py create mode 100644 tracking/models/checkpoint.py create mode 100644 tracking/models/coordinate_checkpoint.py create mode 100644 tracking/models/courier.py create mode 100644 tracking/models/courier_estimated_delivery_date_create_tracking_response.py create mode 100644 tracking/models/courier_estimated_delivery_date_delete_tracking_by_id_response.py create mode 100644 tracking/models/courier_estimated_delivery_date_get_tracking_by_id_response.py create mode 100644 tracking/models/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/courier_estimated_delivery_date_retrack_tracking_by_id_response.py create mode 100644 tracking/models/courier_estimated_delivery_date_tracking.py create mode 100644 tracking/models/courier_estimated_delivery_date_update_tracking_by_id_response.py create mode 100644 tracking/models/courier_response_v1.py create mode 100644 tracking/models/create_tracking_request.py create mode 100644 tracking/models/create_tracking_response.py create mode 100644 tracking/models/custom_estimated_delivery_date_create_tracking_response.py create mode 100644 tracking/models/custom_estimated_delivery_date_delete_tracking_by_id_response.py create mode 100644 tracking/models/custom_estimated_delivery_date_get_tracking_by_id_response.py create mode 100644 tracking/models/custom_estimated_delivery_date_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/custom_estimated_delivery_date_retrack_tracking_by_id_response.py create mode 100644 tracking/models/custom_estimated_delivery_date_tracking.py create mode 100644 tracking/models/custom_estimated_delivery_date_update_tracking_by_id_response.py create mode 100644 tracking/models/customers_create_tracking_request.py create mode 100644 tracking/models/customers_create_tracking_response.py create mode 100644 tracking/models/customers_delete_tracking_by_id_response.py create mode 100644 tracking/models/customers_get_tracking_by_id_response.py create mode 100644 tracking/models/customers_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/customers_retrack_tracking_by_id_response.py create mode 100644 tracking/models/customers_tracking.py create mode 100644 tracking/models/customers_update_tracking_by_id_request.py create mode 100644 tracking/models/customers_update_tracking_by_id_response.py create mode 100644 tracking/models/data_courier_response_v1.py create mode 100644 tracking/models/data_tracking_response_get_multiple_v1.py create mode 100644 tracking/models/delete_tracking_by_id_response.py create mode 100644 tracking/models/destination_address_estimated_delivery_date_request.py create mode 100644 tracking/models/destination_address_estimated_delivery_date_response.py create mode 100644 tracking/models/destination_address_predict_request.py create mode 100644 tracking/models/destination_address_predict_response.py create mode 100644 tracking/models/detect_courier_request.py create mode 100644 tracking/models/detect_courier_response.py create mode 100644 tracking/models/estimated_delivery_date_request.py create mode 100644 tracking/models/estimated_delivery_date_response.py create mode 100644 tracking/models/estimated_pickup_estimated_delivery_date_request.py create mode 100644 tracking/models/estimated_pickup_estimated_delivery_date_response.py create mode 100644 tracking/models/estimated_pickup_predict_request.py create mode 100644 tracking/models/estimated_pickup_predict_response.py create mode 100644 tracking/models/events_checkpoint.py create mode 100644 tracking/models/first_estimated_delivery_create_tracking_response.py create mode 100644 tracking/models/first_estimated_delivery_delete_tracking_by_id_response.py create mode 100644 tracking/models/first_estimated_delivery_get_tracking_by_id_response.py create mode 100644 tracking/models/first_estimated_delivery_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/first_estimated_delivery_retrack_tracking_by_id_response.py create mode 100644 tracking/models/first_estimated_delivery_tracking.py create mode 100644 tracking/models/first_estimated_delivery_update_tracking_by_id_response.py create mode 100644 tracking/models/first_mile_create_tracking_response.py create mode 100644 tracking/models/first_mile_delete_tracking_by_id_response.py create mode 100644 tracking/models/first_mile_get_tracking_by_id_response.py create mode 100644 tracking/models/first_mile_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/first_mile_retrack_tracking_by_id_response.py create mode 100644 tracking/models/first_mile_tracking.py create mode 100644 tracking/models/first_mile_update_tracking_by_id_response.py create mode 100644 tracking/models/get_all_couriers_response.py create mode 100644 tracking/models/get_tracking_by_id_response.py create mode 100644 tracking/models/get_trackings_response.py create mode 100644 tracking/models/get_user_couriers_response.py create mode 100644 tracking/models/last_mile_create_tracking_request.py create mode 100644 tracking/models/last_mile_create_tracking_response.py create mode 100644 tracking/models/last_mile_delete_tracking_by_id_response.py create mode 100644 tracking/models/last_mile_get_tracking_by_id_response.py create mode 100644 tracking/models/last_mile_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/last_mile_retrack_tracking_by_id_response.py create mode 100644 tracking/models/last_mile_tracking.py create mode 100644 tracking/models/last_mile_update_tracking_by_id_response.py create mode 100644 tracking/models/latest_estimated_delivery_create_tracking_response.py create mode 100644 tracking/models/latest_estimated_delivery_delete_tracking_by_id_response.py create mode 100644 tracking/models/latest_estimated_delivery_get_tracking_by_id_response.py create mode 100644 tracking/models/latest_estimated_delivery_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/latest_estimated_delivery_retrack_tracking_by_id_response.py create mode 100644 tracking/models/latest_estimated_delivery_tracking.py create mode 100644 tracking/models/latest_estimated_delivery_update_tracking_by_id_response.py create mode 100644 tracking/models/mark_tracking_completed_by_id_request.py create mode 100644 tracking/models/mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/meta_v1.py create mode 100644 tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_request.py create mode 100644 tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_response.py create mode 100644 tracking/models/order_processing_time_estimated_pickup_predict_request.py create mode 100644 tracking/models/order_processing_time_estimated_pickup_predict_response.py create mode 100644 tracking/models/origin_address_estimated_delivery_date_request.py create mode 100644 tracking/models/origin_address_estimated_delivery_date_response.py create mode 100644 tracking/models/origin_address_predict_request.py create mode 100644 tracking/models/origin_address_predict_response.py create mode 100644 tracking/models/pagination.py create mode 100644 tracking/models/pagination_data_tracking_response_get_multiple_v1.py create mode 100644 tracking/models/pagination_get_trackings_response.py create mode 100644 tracking/models/predict_batch_request.py create mode 100644 tracking/models/predict_batch_response.py create mode 100644 tracking/models/predict_request.py create mode 100644 tracking/models/predict_response.py create mode 100644 tracking/models/reason_events_checkpoint.py create mode 100644 tracking/models/retrack_tracking_by_id_response.py create mode 100644 tracking/models/shipment_weight_create_tracking_response.py create mode 100644 tracking/models/shipment_weight_delete_tracking_by_id_response.py create mode 100644 tracking/models/shipment_weight_get_tracking_by_id_response.py create mode 100644 tracking/models/shipment_weight_mark_tracking_completed_by_id_response.py create mode 100644 tracking/models/shipment_weight_retrack_tracking_by_id_response.py create mode 100644 tracking/models/shipment_weight_tracking.py create mode 100644 tracking/models/shipment_weight_update_tracking_by_id_response.py create mode 100644 tracking/models/slug_group_v1.py create mode 100644 tracking/models/tag_v1.py create mode 100644 tracking/models/tracking.py create mode 100644 tracking/models/tracking_response_get_multiple_v1.py create mode 100644 tracking/models/tracking_response_v1.py create mode 100644 tracking/models/update_tracking_by_id_request.py create mode 100644 tracking/models/update_tracking_by_id_response.py create mode 100644 tracking/models/weight_estimated_delivery_date_request.py create mode 100644 tracking/models/weight_estimated_delivery_date_response.py create mode 100644 tracking/models/weight_predict_request.py create mode 100644 tracking/models/weight_predict_response.py create mode 100644 tracking/request.py create mode 100644 tracking/response.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..39025bd --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 AfterShip + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a867ce1 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +.PHONY: build + +install: + poetry install + +test: + poetry run pytest tests/ -v + +record: + poetry run pytest tests/ --vcr-record=new_episodes + +format: + poetry run ruff check --fix + poetry run ruff format + +build: + poetry build diff --git a/README.md b/README.md index 8baed55..68799b0 100644 --- a/README.md +++ b/README.md @@ -1 +1,271 @@ -# tracking-sdk-python \ No newline at end of file +# AfterShip Tracking API library for Python + +This library allows you to quickly and easily use the AfterShip Tracking API via Python. + +For updates to this library, see our [GitHub release page](https://github.com/AfterShip/tracking-sdk-python/releases). + +If you need support using AfterShip products, please contact support@aftership.com. + +## Table of Contents + +- [AfterShip Tracking API library for Python](#aftership-tracking-api-library-for-python) + - [Table of Contents](#table-of-contents) + - [Before you begin](#before-you-begin) + - [API and SDK Version](#api-and-sdk-version) + - [Quick Start](#quick-start) + - [Installation](#installation) + - [Constructor](#constructor) + - [Example](#example) + - [Rate Limiter](#rate-limiter) + - [Error Handling](#error-handling) + - [Error List](#error-list) + - [Endpoints](#endpoints) + - [/trackings](#trackings) + - [/couriers](#couriers) + - [/estimated-delivery-date](#estimated-delivery-date) + - [Help](#help) + - [License](#license) + + +## Before you begin + +Before you begin to integrate: + +- [Create an AfterShip account](https://admin.aftership.com/). +- [Create an API key](https://organization.automizely.com/api-keys). +- [Install Python](https://www.python.org/downloads/) version 3.8 or later. + +### API and SDK Version + +Each SDK version is designed to work with a specific API version. Please refer to the table below to identify the supported API versions for each SDK version, ensuring you select the appropriate SDK version for the API version you intend to use. + +| SDK Version | Supported API Version | Branch | +| ----------- | --------------------- | ------------------------------------------------------------- | +| 5.x.x | 2025-01 | https://github.com/AfterShip/tracking-sdk-python/tree/2025-01 | +| 4.x.x | 2024-10 | https://github.com/AfterShip/tracking-sdk-python/tree/2024-10 | +| 3.x.x | 2024-07 | https://github.com/AfterShip/tracking-sdk-python/tree/2024-07 | +| 2.x.x | 2024-04 | https://github.com/AfterShip/tracking-sdk-python/tree/2024-04 | +| <=1.x.x | Legacy API | https://github.com/AfterShip/aftership-sdk-python | + +## Quick Start + +### Installation +```bash +pip install aftership-tracking-sdk +``` + + +## Constructor + +Create AfterShip instance with options + +| Name | Type | Required | Description | +| ---------- | ------ | -------- | --------------------------------------------------------------------------------------------------------------------------------- | +| api_key | string | ✔ | Your AfterShip API key | +| auth_type | enum | | Default value: `auth.ApiKey`
AES authentication: `auth.Aes`
RSA authentication: `auth.Rsa` | +| api_secret | string | | Required if the authentication type is `auth.Aes` or `auth.Rsa` | +| domain | string | | AfterShip API domain. Default value: https://api.aftership.com | +| user_agent | string | | User-defined user-agent string, please follow [RFC9110](https://www.rfc-editor.org/rfc/rfc9110#field.user-agent) format standard. | +| proxy | string | | HTTP proxy URL to use for requests.
Default value: `null`
Example: `http://192.168.0.100:8888` | +| max_retry | number | | Number of retries for each request. Default value: 2. Min is 0, Max is 10. | +| timeout | number | | Timeout for each request in milliseconds. | + +### Example + +```python +import tracking +from tracking import exceptions +from tracking import auth + +try: + sdk = tracking.Client( + tracking.Configuration( + api_key="YOUR_API_KEY", + authentication_type=auth.ApiKey, + ) + ) + result = sdk.tracking.get_tracking_by_id("") + print(result) +except exceptions.InvalidOptionError: + pass +except exceptions.InvalidApiKeyError: + pass +except exceptions.RateLimitExceedError: + pass +``` + +## Rate Limiter + +See the [Rate Limit](https://www.aftership.com/docs/tracking/2024-10/quickstart/api-quick-start) to understand the AfterShip rate limit policy. + +## Error Handling + +The SDK will return an error object when there is any error during the request, with the following specification: + +| Name | Type | Description | +| --------------- | ------ | ------------------------------ | +| message | string | Detail message of the error | +| code | enum | Error code enum for API Error. | +| meta_code | number | API response meta code. | +| status_code | number | HTTP status code. | +| response_body | string | API response body. | +| response_header | object | API response header. | + + +### Error List + +| code | meta_code | status_code | message | +| --------------------------------- | --------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| INVALID_REQUEST | 400 | 400 | The request was invalid or cannot be otherwise served. | +| INVALID_JSON | 4001 | 400 | Invalid JSON data. | +| TRACKING_ALREADY_EXIST | 4003 | 400 | Tracking already exists. | +| TRACKING_DOES_NOT_EXIST | 4004 | 404 | Tracking does not exist. | +| TRACKING_NUMBER_INVALID | 4005 | 400 | The value of tracking_number is invalid. | +| TRACKING_REQUIRED | 4006 | 400 | tracking object is required. | +| TRACKING_NUMBER_REQUIRED | 4007 | 400 | tracking_number is required. | +| VALUE_INVALID | 4008 | 400 | The value of [field_name] is invalid. | +| VALUE_REQUIRED | 4009 | 400 | [field_name] is required. | +| SLUG_INVALID | 4010 | 400 | The value of slug is invalid. | +| MISSING_OR_INVALID_REQUIRED_FIELD | 4011 | 400 | Missing or invalid value of the required fields for this courier. Besides tracking_number, also required: [field_name] | +| BAD_COURIER | 4012 | 400 | The error message will be one of the following:
1. Unable to import shipment as the carrier is not on your approved list for carrier auto-detection. Add the carrier here: https://admin.aftership.com/settings/couriers
2. Unable to import shipment as we don’t recognize the carrier from this tracking number.
3. Unable to import shipment as the tracking number has an invalid format.
4. Unable to import shipment as this carrier is no longer supported.
5. Unable to import shipment as the tracking number does not belong to a carrier in that group. | +| INACTIVE_RETRACK_NOT_ALLOWED | 4013 | 400 | Retrack is not allowed. You can only retrack an inactive tracking. | +| NOTIFICATION_REUQIRED | 4014 | 400 | notification object is required. | +| ID_INVALID | 4015 | 400 | The value of id is invalid. | +| RETRACK_ONCE_ALLOWED | 4016 | 400 | Retrack is not allowed. You can only retrack each shipment once. | +| TRACKING_NUMBER_FORMAT_INVALID | 4017 | 400 | The format of tracking_number is invalid. | +| API_KEY_INVALID | 401 | 401 | The API key is invalid. | +| REQUEST_NOT_ALLOWED | 403 | 403 | The request is understood, but it has been refused or access is not allowed. | +| NOT_FOUND | 404 | 404 | The URI requested is invalid or the resource requested does not exist. | +| TOO_MANY_REQUEST | 429 | 429 | You have exceeded the API call rate limit. The default limit is 10 requests per second. | +| INTERNAL_ERROR | 500 502 503 504 | 500 502 503 504 | Something went wrong on AfterShip's end. | + +## Endpoints + +The AfterShip instance has the following properties which are exactly the same as the API endpoints: + +- courier - Get a list of our supported couriers. +- tracking - Create trackings, update trackings, and get tracking results. +- estimated-delivery-date - Get estimated delivery date for your order. + + +### /trackings + +**POST** /trackings + +```python +import tracking +from tracking import ( + auth, + exceptions +) + +try: + sdk = tracking.Client( + tracking.Configuration( + api_key="YOUR_API_KEY", + api_secret="YOUR_API_SECRET", + authentication_type=auth.Aes, + ) + ) + data = tracking.CreateTrackingRequest() + data.tracking_number = "" + data.slug = "" + result = sdk.tracking.create_tracking(data) + print(result) +except exceptions.InvalidOptionError: + pass +``` + +**DELETE** /trackings/:id + +```python +sdk.tracking.delete_tracking_by_id("") +``` + +**GET** /trackings + +```python +result = sdk.tracking.get_trackings(keyword="1234") +print(result) +``` + +**GET** /trackings/:id + +```python +result = sdk.tracking.get_tracking_by_id("") +print(result) +``` + +**PUT** /trackings/:id + +```python +data = tracking.UpdateTrackingByIdRequest() +data.note = "test" +result = sdk.tracking.update_tracking_by_id("", data) +print(result) +``` + +**POST** /trackings/:id/retrack + +```python +result = sdk.tracking.retrack_tracking_by_id("") +print(result) +``` + +**POST** /trackings/:id/mark-as-completed + +```python +data = tracking.MarkTrackingCompletedByIdRequest() +data.reason = "DELIVERED" +result = sdk.tracking.mark_tracking_completed_by_id("", data) +print(result) +``` + +### /couriers +**GET** /couriers + +```python +result = sdk.courier.get_user_couriers() +print(result) +``` + +**GET** /couriers/all + +```python +result = sdk.courier.get_all_couriers() +print(result) +``` + +**POST** /couriers/detect + +```python +data = tracking.DetectCourierRequest() +data.tracking_number = "" +result = sdk.courier.detect_courier(data) +print(result) +``` + +### /estimated-delivery-date + +**POST** /estimated-delivery-date/predict-batch + +```python +req = tracking.PredictBatchRequest() +date = tracking.EstimatedDeliveryDateRequest() +date.slug = '' +req.estimated_delivery_dates = [date] +result = sdk.estimated_delivery_date.predict_batch(req) +print(result) +``` + +## Help + +If you get stuck, we're here to help: + +- [Issue Tracker](https://github.com/AfterShip/tracking-sdk-python/issues) for questions, feature requests, bug reports and general discussion related to this package. Try searching before you create a new issue. +- Contact AfterShip official support via support@aftership.com + +## License +Copyright (c) 2025 AfterShip + +Licensed under the MIT license. \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..f10afea --- /dev/null +++ b/app.py @@ -0,0 +1,73 @@ +# coding=utf8 + +import tracking +from tracking import exceptions +from tracking import auth + +try: + sdk = tracking.Client( + tracking.Configuration( + api_key="asat_870416d3ea2742dba0eb68e23ddfcbe9", + authentication_type=auth.ApiKey, + ) + ) + # result = sdk.tracking.get_tracking_by_id("b93c3984c3404910ad565385a5c40a1b") + # print(result) + # result = sdk.tracking.get_trackings() + # print(result) + + # data = tracking.CreateTrackingRequest() + # data.tracking_number = "" + # data.slug = "" + # result = sdk.tracking.create_tracking(data) + # print(result) + + # res = sdk.tracking.delete_tracking_by_id("b93c3984c3404910ad565385a5c40a1b") + # print(res) + # + # result = sdk.tracking.get_trackings(keyword="test") + # print(result) + + # result = sdk.tracking.get_tracking_by_id("b8ebdc47d885458690cf8347fe56731a") + # print(result) + + # data = tracking.UpdateTrackingByIdRequest() + # data.note = "test" + # result = sdk.tracking.update_tracking_by_id("b8ebdc47d885458690cf8347fe56731a", data) + # print(result) + + # result = sdk.tracking.retrack_tracking_by_id("b8ebdc47d885458690cf8347fe56731a") + # print(result) + + # data = tracking.MarkTrackingCompletedByIdRequest() + # data.reason = "DELIVERED" + # result = sdk.tracking.mark_tracking_completed_by_id("b8ebdc47d885458690cf8347fe56731a", data) + # print(result) + + # result = sdk.courier.get_user_couriers() + # print(result) + + # result = sdk.courier.get_all_couriers() + # print(result) + + # data = tracking.DetectCourierRequest() + # data.tracking_number = "1ZFW80170320376216" + # result = sdk.courier.detect_courier(data) + # print(result) + + req = tracking.PredictBatchRequest() + date = tracking.EstimatedDeliveryDateRequest() + date.slug = "ups" + date.origin_address = "USA" + date.destination_address = "USA" + + req.estimated_delivery_dates = [date] + result = sdk.estimated_delivery_date.predict_batch(req) + + print(result) +except exceptions.InvalidOptionError: + pass +except exceptions.InvalidApiKeyError: + pass +except exceptions.RateLimitExceedError: + pass diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..53bc2a5 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,529 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "certifi" +version = "2024.7.4" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pycryptodome" +version = "3.20.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] + +[[package]] +name = "pydantic" +version = "2.8.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.20.1" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pytest" +version = "8.3.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "retrying" +version = "1.3.4" +description = "Retrying" +optional = false +python-versions = "*" +files = [ + {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, + {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, +] + +[package.dependencies] +six = ">=1.7.0" + +[[package]] +name = "ruff" +version = "0.4.10" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, + {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, + {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, + {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, + {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, + {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "socksio" +version = "1.0.0" +description = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5." +optional = false +python-versions = ">=3.6" +files = [ + {file = "socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3"}, + {file = "socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.8" +content-hash = "f4dc3863a79f37180dffdb48dfb2dba5a54de46477a55b21b3346051dfc9188a" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..88a60f9 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,54 @@ +[tool.poetry] +name = "tracking-sdk" +version = "5.0.0" +description = "The official AfterShip Tracking Python API library" +authors = ["AfterShip "] +license = "MIT" +readme = "README.md" +keywords = ["aftership", "tracking", "track", "fedex", "ups", "usps", "dhl", "shipping", "fulfillment", "couriers", "carriers", "logistics"] + +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Topic :: Software Development", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", +] + +packages = [ + { include = "tracking" }, + { include = "*.md" }, + { include = "LICENSE" }, +] + +[tool.poetry.dependencies] +python = "^3.8" +pycryptodome = ">= 3.9.0" +pydantic = ">=2" +httpx = ">=0.27.0" +retrying = "^1.3.4" +typing_extensions = ">=4.7.1" +urllib3 = "^2.2.2" +socksio = "^1.0.0" + +[tool.poetry.group.dev.dependencies] +ruff = "^0.4.8" +pytest = "^8.2.2" +flake8 = ">=4.0.0" + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" + +[tool.ruff] +target-version = "py311" +line-length = 100 + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +docstring-code-format = true +docstring-code-line-length = 60 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..5972212 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,8 @@ +[flake8] +max-line-length=99 + +[bdist_wheel] +universal = 0 + +[metadata] +license_file = LICENSE \ No newline at end of file diff --git a/tracking/__init__.py b/tracking/__init__.py new file mode 100644 index 0000000..10ab4de --- /dev/null +++ b/tracking/__init__.py @@ -0,0 +1,14 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +# flake8: noqa + +from .auth import ApiKey, Aes, Rsa +from .client import Client +from .configuration import Configuration +from . import exceptions +from .models import * + +__version__ = "5.0.0" diff --git a/tracking/__pycache__/__init__.cpython-312.pyc b/tracking/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38ee85b5cfc09fb835dddfbef557f990f4ee05f3 GIT binary patch literal 424 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 VvhLfATK$=wqUn<_D6G{L{vVb=^v?hQ literal 0 HcmV?d00001 diff --git a/tracking/__pycache__/client.cpython-312.pyc b/tracking/__pycache__/client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ef6b39022cbdaffef27a755807549815fb3ae59 GIT binary patch literal 983 zcmZuv&1=*^6ragvlXO2+u+kM3DwftLZEDe*AJ|qzp}QBoX7JBGm z58iw5(xavSgh#=Pr3exV9<+zvsw)URIWO5&4}Fl|{N8(+_nUcdKGy3MB<-f#?{Wp9 zZ{Unf9g@LQNwyG0U2G$Ysp4T@u@#JHiK<@7S8X-tWv}dOw&v@$?i;p&k%As0s%^@h zyRtTzJ(lXGk!eew%K~u(ArogtD-v!PINlL10`;XZ=(yd4I}kTZS@jur+G}pmeHgh} zWhqR!%Q*1Hqgc4UBN$y~p8JyVbXhtw(}vn3D-X$FN|G(akc}y_63z=jLN&< zj!MCK4XBhu6u=mL$SA=tYF-;fQ?!Gdrp_V2p;l&yVbiz)uHG)%#>c>$V57znI_w;w zvUR4CsWJ099OPm+-Q?uS6YF`*cx=7$<{~GsmRYh|pZ#JuFSgP8~K>-#g!zWUji8pwT!pOIi{pbbCA8p*d>Xh0uxp{(RYZa$fO9{CswEqH(b^iPbt#hLGO(1xcHPfIv1 jVT_M!s5aiev7sNLONZ$CSG2f?7Jq97ZsDH@Ft76mnKrK+lU^KOtT?NiSgdrWMs-Eu9T zIrpB=d*+^V?)=^3aS|Ba;_dnGyoCGr~urA`^tStrOn<#8kEr_bgLE z=WCoqgOp~U%BrH2;Zi|bvqrMwC1F{kXB1AOBZ2~J2PQMOxRl73N#n9C$DjUy;98xh2X{Mx*Bi73db&YEICci^4LiK%_2`{BW zSuPVE6O=_&%7#IG&%BTkWKNaju#{7?IW^ojaH=<)T~-&QOjwn<#G;s)4=1EdQk>5L zBSb%xUDjGy@PP#f*rY6_S@4V%lWay1c=-@m-3Naq3}B5EZSJ+tUhNP3*?lj5?{dK# zyiLDq+J9$dW98208=v1xY@U75)LpQ57hU_-F7JW}Ngyyra|PL52jnghNSxwH+{9CH z+Cgf6yqBj1vtVffPTpL_EPz?{HEVUvR>ka9%u&UhfR!a&yeWBrcduLGHr}&N;`U`z zuu1cb?hOZ*rwEBHhzgTPaSA{wqjF+KVQz7wL9tip*Y54BohRwP(o{rHoAPqk>s zVbm&~T09PK`nZaE^`Ta4$jxdt8#L(Brp6ZWCIy*Qse4~gz*Wt~x6-QHz*V@PmWPTr z4}C1qx2X5<#N60M15Yp$>qcFK8gSG_D4^mA*TwIj$QRn0T{}!!{EjEZ9mXx}|+ZM+ljhjG6BPz8Br{F!_qrI`72EJe^s~d2B!H4&- z<^XFA^we8}I`53ic$`;!l`j-V(!XQ|E4RL(ph+_);Cn=~r3FQS8_`NvJ!gZ9%Fs%a z!G*U=i3VYkvA5)*;^vC$6K-!_r8~|&MjBxHy6Gg{abUPduYowR4Y3CTzxrm zb!+5mVfb3XfBlWc)chN&L`)ulD1YbN#<_y)$ivf{>Z8>Mt1mkHpHthN9~nyewhs0c z{XrD#Myc*SMjzhVcJ<`@pN%{nDV+ZGKN5wRPhZY(TQl5?=pPEn`R(Yup{2Zwfjs|A zdMXtLE)@I|sBuzv1fcH7@W$}H^V_cW&8|nG2cdlLc1M4$e1AUn?8eg@h5oUEe;nl} zba{ZrM(*`)yAIb1^?`%uo}SBx3jPSnjOsD~Y2t3vTT9R$tqf@Y(7iKUT3}iDj%Cvl zpGzU`X4yaHxKxE=V_9BGu&j(dNDd*uk4Cu<0lxaLiLSVO7Vs)1BfvJM{1w1D`N8D0 z*h{VCM5uUXuz2!Rv8T5PIKbm40r_Enhoz<1^1){3{k9Sf`1eOckCg}Mk_B*Rjcp%p z&fdRLvf<25+K+A~?*Fdjz?qW-IyX<>?^oOuaoY`*U)HQ{WZ!HKp?2Z%4Q z+YH$5MXJp*N|pWBUB`A6^vc+)G%I|Q!Pkzyam{0VXNNGw>(WPSu2O}igrHXqMaFb` zn})Inr`SI9_{hVEVU+a1{bWB^j{mTH9@a3s6wI>{O;OaYn^4YwlfZw-i7j&CJ2JOL b=DznFU32bQ&D8$?dZQFIO8rRmhpzH}OC1aV literal 0 HcmV?d00001 diff --git a/tracking/__pycache__/exceptions.cpython-312.pyc b/tracking/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a8fc73249b3a785d8c92165eb4d01e0bc0e60c7 GIT binary patch literal 4816 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 literal 0 HcmV?d00001 diff --git a/tracking/__pycache__/response.cpython-312.pyc b/tracking/__pycache__/response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4227321a7d826319a89f190867c2cee521cc78e GIT binary patch literal 3977 zcmbVPOKcn06@5bvKf@W4qD4uREK7?13}sQ2Kk+X?Xpu@;OJqZdPR&IIjAm?;5xT@}=yXq-=s@|fv$`!e)ujs4tMZPK&g{r^kuLg<%2FYHTlYKHT`(;56 zNbDU?F<3^DOLkXAXn9-TWF$8*qc%b=Faj{MHbO06{J_jn-`2ncfSI=uY5@}j<~a3j4NMm>CvAjUz=VJ~MSWWX za|oC-HbO06x`8=IeOm()2IdVLp%ySbz`RL)Ti;{=KX3cg0yIT!TLZdid(;B-N7S}8 zpd+?Nt^Wm;dhd9C#}p@|K6z4#$WxbDss9&jaatOX*-D;{XlsaZ%CAbyWk)}N5PcY; zV_Qsg@b4rj8+BkdRbJDut57S~Yf%pS(~4487V46mu5DJaP^hif>ep%}ii77%QeOVq zrmSjhAXKQ8HnppDrTl>`wV}XbU3sr8NwSsW&(^iY`ex0d{h693E49)_J372tuP>Ks zTh^#*8}+Z2tFn~aY*&eTu+J_`TC!_mu2T+sX(b$dVN?Y!1ElytVCV6&(?O3a&xnVT?k6J~D0%uT!o4MUj(5yyx)4r2Z^cAkLJ zAm)iUj=8F=mBcl8)7Y)Z+NM%lW5}Xdj~g`HROs;+AZ{Vef)T0^^o2)rQD7V0vqqs> zIc&4`C^lwikUc`PR*)T`kzUNF;-!|Y?Tjdsjk<6|l*twnJJS=ZrADJ%yMmopWDPr2 zO;Jd@IFQM%rt{h4l9;#0#pdsPXF?vyDM()!UW za!poBT3w0PH?_v57N0*cmxwpEU?0}vno?R@hhlL>RvY!2D$h2yZ~zKhU6J>#9D@?C zlUn35xq%Km!%fea?iu@h;V$>v?AM-S2f;&McgMb5xX<0o>fL7_2G8w#&mHiAU+px5 zF+CW2$j|JvGmjw~VK1%p-13nfXD;8UgDfA1wo&ETA8u(6&>fA47XI*RzY?sbQl3 zy|Ye?n`Af5?9VB6G!Xx}#bDf+eR|DCslcG#b@*O+VQy7Lmc z#zgsSc?R|eW~Gu=!YnyFnANr#GG@&y!c&!1wRA;}x)ri%&7*>ORV!(ms(FbhX9323 zx*5gy>e3btcHFCS2{wND3DkJX%zofFGZGD8wxZT+3i)ngzjbKaM^zyUWF8Y}LcXqH zPdi`5!5^>WvMHJL)V`~|7vwF|Y9DH$kiC%2z0*F@*e8nBy0p0=iz4Pkac!fds$hCW zu~w=A70e_^AAc7R`$cmA1?K8!wEw_Rfpj9d^mRAkG@Dwf&9wfp9(m?noN$RIOiWZ z7dX)w4AE8pHS}X`{PUQ0rLy2B#D&(frU)=Vsa^y63L#zy{q};!i7xsEit*2PbX8C#Pm-yE33G# zgQs%o6)~GzeTm2xmd~g2qBR^2bu#klw+oqkI)x)0$cpVSerTbP?&JpAZig0DmI`lm z*jJV_D=VbMT&J2yL&e2RdMSnZ^U0LBkSpXf={z3HWRnZ4nTu(NGCMHaPcALx-hrli zU@n=(%tCTClgmOx;cc^5AG{Gdl`zfAWf#)$V%mvAFV1E$mtRh3kTS$(cNM_%P(u8>XPuGL&lTux>$nX`dFh5QMCo#mRQke~eRtH7JLzNv6a!H-7s z#Qgy&t)5Z%_s^g=qLgj9SPkT{vZo5o8<*{Y`#a=cikIq{+|d{ETUg>ino_ zM0GxD8sv?>Y9IOSxH-d-~hsJ%7#%b7W92uB#-?ZRj8e)6t?z`XCeFFi=z Oujq5hC&V{*!+!wL5R0?` literal 0 HcmV?d00001 diff --git a/tracking/api/__init__.py b/tracking/api/__init__.py new file mode 100644 index 0000000..44ab4c4 --- /dev/null +++ b/tracking/api/__init__.py @@ -0,0 +1,14 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +__all__ = [ + "CourierApi", + "EstimatedDeliveryDateApi", + "TrackingApi", +] + +from .courier import CourierApi +from .estimated_delivery_date import EstimatedDeliveryDateApi +from .tracking import TrackingApi diff --git a/tracking/api/__pycache__/__init__.cpython-312.pyc b/tracking/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15469501629221a005e83ab55e837d8c055001e6 GIT binary patch literal 382 zcmXw!u};G<5Qfi5+Eh(5ml4JYQ5PgOKthBS7Fe=aQEde)PGUI@A{!%bz|PiZ;SD0e z!o-HCSUTaP$qo1azs~pBe)s(;m^$PyNr(Wx+Ax&Wo6XXgS4e=u8;XD;Y6+BCk%d}s z3p;Znr}K^&W#ed!pdJO|z;32jMWr}Xmy$Po*QMrJtQifN;Eznzp$YB8yHoKh<#}Sl zw|N8vNVRtxv3KGaxe46HB_tMtkj7o@z}>lK&IUB0J)2Mi@79}%?(wR{tYKq1Y;W;> z$yAA-#6re74q2J%LgJF9M+wWBiglrIQE6Fed~&)x# o&a#45f?X)z@Y`>cbJKoogwXHI@vLX}Zw6@p1I|C;KzU~N58D}Nw*UYD literal 0 HcmV?d00001 diff --git a/tracking/api/__pycache__/courier.cpython-312.pyc b/tracking/api/__pycache__/courier.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fb3f55508641dbd5687ab5d6ca5fb93b9849cf5 GIT binary patch literal 3847 zcmeHKO>7fK6rTODV+V&N1j0WI1=2Wx4JlN?R8^w{a;cz#(1S0Vjdz@EvVY9X0*;K- z1Bdj|(i0qdXY5T*p;~Zysyz~t(F8KHw~*OI3J;ZdpX%m@RLuP;1{aEQ zn7QIwo*U*zUDx9VCuUI!Gv_U0n?*I;HcmLH@i8x;7NM8O)qpS_ZtvhS-*XuW`zHt= zwe3WiT_Op82k@^jLOTVpd4ANl#%znYJk+ikwq=3=x^Ga!VYS%WxNU`K3dVO3K~>2_ zRoRrP3Q;`U6qpO$; zyAxZ%yoFtD8XLZaEyuTs117Vu-;Bbe*W&o-Gzn0a5*|>uCMOn%E(^a+@LPWj4Vnc+RDMjFOBE#mCJVY`7-I9^J4+IDaJ_jUp2!+DX&@3@bLfOy|9yF~QFIF%MeBYxS*8;{p2PX<` zyTm;44Gmo*)T%dN>a^$CO~z^S^5xIRJeQLjyn=zoHA1;nw`!353=bNm`I3RhM)7pu znl>roKtzdquh<+fj&Zy==CcG_Cgh~W8zR(+OE7QNW1N-nISW)Mo|>cqnF1$B-3V;H zVV7fXT;9OG!DnG}IEzkGaow`XF(H^@%r3Q^nmQ&9ZR)&XGcxtYWe2a%TD4hx-Lh?L zTFjWXN$iP;0h~dx9mj=(55?eO|#}Cyx26ZqaXcp#DEK`B4Fkh#h zqen-d4OK?$I^8Vz**Kr*Rv6H}h(ig3$T9)<_>f*+D2wXH$~WwiZ@A@g!sfZ>mzg<# ze1^D$8r-90FW`Q_%fqL^Kfl3eJ-6*QRGrl4lHUk7znbhD3smV<(GDO%XTI&6h%t%?Q% zQM;n5Hw8pg_2j4q!Km{y6%(qDB{ij}0x3MXuMlcgpf^;)W~&ZD1yYSaVDnbWy;gw? z$hS0k+9{TlkoTqGT`LXy+YouJG{8|usC*!W%EYeAUClpwuZG77Lt)2GE9)RtB`C=vnC;dN_YP^USbFwf)q@V zk_S3M3Oxc;2QYd??!&u;wvn;70~xPKC&UtMXdHbTGyo5SPqg6`ZFuS9Rjsm|t3=Sa zP}~f+vhErV(eAQ4c-KY+I9eX3nf-(ZPY`fy$%t<$=#u@aS5X zVCGQ&(dT)f))kc99xI-TsI8fbkRE%U2P%;Y-e4jQYm`bu-Ny=?Z{){Y`CSRl)MwE_)8E6Eb{xf z7>arn#o}e|lQ`C&Qc>cdN+2dQ))YyS)(c1~{E80!j&{FLGm^ZHpm_nzk-xL&CF$(# LUH>4_N6Y;Sgn8}H literal 0 HcmV?d00001 diff --git a/tracking/api/__pycache__/estimated_delivery_date.cpython-312.pyc b/tracking/api/__pycache__/estimated_delivery_date.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b793be94e25d4ad7c4ffc97e970e0d5447f45e0c GIT binary patch literal 4022 zcmeHKJ!~Au72dtu+dEREHp)@9q(tIGB4gc|w`Y=4L=b@zT9je|i7lA4VPBEuaCeS3 zry)TDauxz2AV?9UVax;uT=~uZ+=+q=CuLwS zuy5bYym>S4dvD&G{qyMPumaDkbbC!7Rg}NUM*fsC=AaGCUByux)m2*ZTX0pc&?~%SNF=TvR7$UyrI^RH{2Rd`b+K+Z=^NijkZQrrJ(#war8TiQzj!1 zi|IP8qg}OD`G;)0Su4b)cYGT7@z8?r2LcP?)YQ0ijS|PU33T@j4cECzl#K+?k5PQbP+Nz2Z{hgQA<*r4B4-g_vQF+v(m?+6Ux4Xx~+c z(o!9zRdCc+k!VhVl!#8s?ZQbIb&90Y)*S7Q_At}X8UmRT$P7Ota|C4cXJkgYE~AhUyxg39s!SR!USz+_?*Y) zhKbRY1+*IZj!S9?AaDSJLwin@Ba|vna055{f{HE*+PO(EuM=>=O>~t4v<$5*vxuyK z5u}YHS3I-I)C<*PaIokk`1{Xq6}71gzK0lD;oLO`My*VN57Ejs>~ga5Lbc~NJJjx^ zu7?1_t1d|`kr;pvY6Bd%rkjFcdxQFG&6(F`E;e49ZuaB7k;i*O#(OjK{_+Dg9wE1E zH*$#O2R?aFh>H<(V{J8Xx-h8Scx!1H($X;H)aL^GHi54Bm~SxG49vBrtpW=Cbep2im&g9baE^f1B!X)aS!>a;I@*?fmXFg0(v zW{CafBH z7W%5>YGx8I!=`u#$gh?Cvx@P$x?Ox~oY~f%7$@&de5ie5OnzED`?%WJtu`KA*r_)5 zsz2Rcd}368xAmK?dlP%c__p@+*qPst-97z>(>uo&@6Ud`ynAf%(Yrvl^(V%eJp(;9 z>bpk${*U&InVrha0j#CO$Ma*lDvMc;>^Clx7qxFQc|VgcrTG*xRy*<`*9Sh_TLguI zA=5KuWPaL2Z}|kRyfCO&P_VjApdhs&^}vzOD*@;M1@Z)%GbZ{4zD2#rLl?hB3rCm{ zgk3k-B#t?2qJGQy0-Tq`oBC%A%Fk5dO7_odCi04|#-$By01K*lF%h zx0={0uRMbk_*`u}bZEY$|&=Da~hb;?gdgMxe#Iin!u$zsPEz1dP%VP46fysY1CW~|mpRDrioFwwLpCb1P za1WGZjRX}YukQ(w=p}~UQU0P$KP`>z7fzIB_jTpe_`P4<7dzv#yC*N~mt|i?d1>;q zA>a;*ihewmyO42nFau5QOwK);*qOY%JN^?nWlm11%PDiolz)NhxpWh9{hE<@Io3rt zgga7d2NV`1u7q6&!;R2p^5-Tt@@tft+;MnnY+`5M#P~aXp)8>>`6H7elvq0@n-b*& zfiEgQPQks*rlC*%Eb&)?>=#v4Js45ck-sYE{;r(*Tq~)C0|m(E&^h;S{gOI&ulpYb IK8dm~0fNU}T>t<8 literal 0 HcmV?d00001 diff --git a/tracking/api/__pycache__/tracking.cpython-312.pyc b/tracking/api/__pycache__/tracking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0584acf589806426d4bd842b83d61a66fa4b4ccd GIT binary patch literal 15240 zcmeG@TWlOhaz<*s1bMj+f9Q~l&xb=`8@a>zaQ7iY{!sq>Y225A{47BOat20XB*@48$x?zt{1K$8 z=drWYS|i8jAUdl3F$0h0C@Wp!)Zsoy`pz@BS zNJ>PL^7tFoB9&-9T8ZUj5qytn@k%0}5cRm0thD9ZDye*`(w=XxbmTiKo%zm6SH7#V zDZi<*IlsA*&ZjF|@>>LaLhG*dn6Ey_*%sg2FNYUrHW zyC$hd8{jY2E+|*2+qeB3H9b5{9a{q(+y^Hw%WTnupD-#_M65Ui9U`841cdv|-B+oJ zq zzp0duC{jMEMDj5jSE4jQleDcA-3eeyjHXI)CH`jowmT@_4loJYK|7-o?NX8-w%rCS z`1m6>!H85~#OBZuX&BKS7_kLL#AtUZs&oWedqVJZ0_B+i=z@~9~dr@$8LGT8! zb%D8jon+Lsm|l!JD=o?-l%4SR;8Q3-Y9p($mB?z`baz9NR^p})f7`9`o|VWoPu>L@ zr%<9F#=Lz593F>A*HQr>x4IH6*|i&2UO$CAI>5^ULT;^mmcBBC82=lLz5( z(zUeL()e9Tc(|vfY*HQpvO9?TII>M-;w?|^w4yE%Zq_tnl+6p(>%JlTb2}3vO z4VV(tNs%&BEvZG2a!z{X++t296XRsw(iM$niN&cxOyeQch~7a?%rYe^ER_kXMvRg- zB^XyWxXE*5N(B%`=4O~h=U@`FBwLyp_)33E^fIZ+W*I(CWPKy4q@-%JA3Nqa*K&cjv}j?J!zPda(%YkhMZ)mxytPf67zGxcNL9Q$gEKr>?*)-UoVVPCS92_2jnN@3M+0gw7 z4uV?oUvkx&o!-Fc%ewbY5Muk zGJSV5BWszFkB`fMvKj@+49 z>z@4RRVZ#IKTkiuo<4XteRwT>_|Ad#^vQbao2X4K7>*f09Q4nWOJlDEU-I}g5;Yc$eq%9 z`b<4_h8+R~O~QxjO$gubp%N56C91^A(bf1$d{X*Zq8L?S+#6s+t|nFzE72v1M}C^Z z+BM%m0R-;TIQD-L{ps$ww3=K^2w`^377q@8g=vutm=)FlcG_n$fN{DPz4ME z6}$ohUL5$fIU?L%9>6e4=6rsuf~_WNg(6rcU_&+9d0DL%&RP0=rgwv>3vdDpcvb@gX90|?CI|(bZdDh?*Q3CIK9>sB)C4&O1H%|3MPQQ`@TXX& z#l@`PbK{$@+r7vY`BQt^rcg7)2_Sb9n)5VYI!(`W9uzRLcJK$M11cWyTWN zx(Y!=7Qo?Zq5*7zX%9m0HRs5*W22+>+}y>z{Tn?!IM2oo=<~dK>fv&LOo66Qd71Q5 zJsSdgmQfvS+TId-OvnjYmlYMvXBaXtF&;K*oXPWQ5!{1N{4ZMCg3JWw`GqjF6Ed(I z5>b>xL74#zg0SUK8YY%0E=G}uA)S;3bU`OI!(h*XqghpT zgY=rAc+aZ3Lu*M5Lwk<03NDmFLm?TZi@;x@Uq4Uh8NCi`AByt4sw*l0hEjRn(mh5g zTVaG=&=qj7xL8+J355o(azI13;4ftGjVP$i-fN*e@R9*>6JZCAmth+Cz)`lLYdd|NLfinf0T12XnX(MR zV3xy3ow3-WKxu}~e|C|{sxvDqbO~Nnsj16wq`~Gcg^J`f1`#0^1ZUPnS#`u>xjb+l zPRY;-FgQ*ydLnBZ$A~A~i*gkd~kJk^P!p*Uhjs*pQ zme{$enQYvSRgJ3SA+^IG;UQ&Htvn>V(-~R-Q-#|xC>gprOgK*HU7;O@kK;S_z`?%J zae4-92XSWr!Pwlx{g(gB!i6_vL>$bnD2+ znNO0x-}Cmqx0l{o{`vCz`+o7)Ydr_<9J-mTcVG5ht$O#lTl?;m*1FGqoP+|MEeL<~ z-c1j$rHAhvTThSHQ=|WNzfJ1765$w6eXD)^>G-=_p(qCZCExq{Z-5a&-)I@GX?}~r z-x&B^@qph2p4dvn^}C?f((m#^xvt-pSdD+J-_^DfT}dc02|lEVu+3=W{W53n8>3`+XejIJTL(Mh z2d#J={40MZ(^O`FPf&^X2S6o$4P75s6~Y{gFv4|IgT7_JOKj!3IoB8vtA72)8#z3# zgd->JHVTgBZ#1}2v?8n8L#HdpTfw!#h7;<7&(RmyhYAm4h zb>3>bxn?ySSGdy#J_J|aLdO(-6&mLIH>gv}TEA80{T8qCRvQnCq;nNcJhei7{+fZy zbGR;{nhKXbHG+K@eo*8Z&kc~*%G3!(c#B3Dq3xV z6Uy*K;3Un zl(ai8N5)IQ5YwP^h@opWI5xoB1R;V52@W_sJOp(RHgZLyGMMufd6B|BFaz2^1q&4< z5W|ZwZXwvuPzoVnRiz9NQeKp+AY>r5A>_+9eDbG&=EouayCKRF87$v?P2F+d)mjC~ zdi=Hej)`*4Nq^)1bU|ZZR{RtN2oAS8#X&|;a2lahJ_lF--kIo(>GvbHEqKt$PAQm1 z0qi6Q?D~_LhP$hx3FZZ6ui%;K^!Eo?pM(0=6f#dSa*bvsCIOU052u%C5J*Jv(vybIJUpmZu=U~*NfIn$8cbrri4Y9Yz}^R3P? zk30O;9VZK#F)wRcZNPGD9w*TRxSjc@xEK|7kT%ZIV<(P|$U`Sbw&_K!RkVa23To!LYU@u(y{Q_2zDnO)4^_Y z&1yU4&DHJLLyrsj9(-?CA{>@Dy)5ytQ=Vta2m z?=#5!lQyWK;>vr+a6^s=j1oP;8qV5hJyZmuyTA>uN23}PnPHYYgKxVgrA zW_AXPMmz>%6|Ps}gkv@Z!!3MyCs+Y3BQacqk^FC=fFR7-h{!>?AI*rsOYgT2yzE;~ zKYuqpxRxILY!~@;-+O)U|6qOB@Mk-p{q?T*cD?`7`p%&*6S2b`52V z`J49f(fHqOg~EQm0-2zV@DgYz@F5@jaDEu-J>mJ}iXx z>%to5?Rbh$9Hk)R*KH#ma=6yts`I(_n``sRz6 zrFXPBOYg+p%*0w|qW;QkJu|VMdG(v5=?$%?hwr9Oucc3a^y+$gvYwiJI1>o7ZbT+f z87fW6?CTTpAg%jbCgLUJTu`xGb+rQALC_n*@$-W+IgFB#Bf@n9cM5GE_rUp<3gk)n z_j?xpbu>W=;yi)_oMby8`EFt!o^L|H*)Y`jh7`P~+;NSw-pRq+8*=w2YD@^9y~jBZH<0mY zL&Jt|d$I{Bvfswc2>y$}pTf*Y2r~o!Mc{vLW+dg4L2WQA;tl~r5TY~&Ee1hvx1PuU@)C-CF zO*#5QcQdEfGN(S-TF;zX&s=)M;XeU4)01o66CXhu@Wdn1fG=ft!@oHc@S3MkusaF` z_+JQ1!+KYt@Iy=1+@7{VK{1Mj0_(>0K=+5C-{Y89XdAIUEaFhuF}P%7sBWFy=p$GY zIRL0LneaMiu!eR96K2?JSQGmCFR=zUz!DSN@dngBkc6fb?k3A%7Zzyf@wdP?c~knQ z`2H^vTkl18Bu4KgrM(C12Ty;b)DOP6_T0q1Hf&5uPxaq#huVXfl-%Y39u>7rV(g1; z&%DcjGj->cPxl|MKYM&_+lhM#XvRT9_uHZ74#KuRF=%( DetectCourierResponse: + """ + Return a list of matched couriers based on tracking number format and or a list of couriers. + :param detect_courier_request: + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = "/tracking/2025-01/couriers/detect" + + body = detect_courier_request + if not isinstance(body, dict): + body = detect_courier_request.model_dump(exclude_none=True) + body = json.dumps(body) + + result = self._request("POST", url=url, body=body, **kwargs) + return DetectCourierResponse().from_dict(result) + + @validate_params + def get_all_couriers(self, **kwargs) -> GetAllCouriersResponse: + """ + Return a list of all couriers. + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = "/tracking/2025-01/couriers/all" + + result = self._request("GET", url=url, **kwargs) + return GetAllCouriersResponse().from_dict(result) + + @validate_params + def get_user_couriers(self, **kwargs) -> GetUserCouriersResponse: + """ + Return a list of . + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = "/tracking/2025-01/couriers" + + result = self._request("GET", url=url, **kwargs) + return GetUserCouriersResponse().from_dict(result) diff --git a/tracking/api/estimated_delivery_date.py b/tracking/api/estimated_delivery_date.py new file mode 100644 index 0000000..a82da7e --- /dev/null +++ b/tracking/api/estimated_delivery_date.py @@ -0,0 +1,68 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +import json +from typing import Union + + +from tracking.models import ( + PredictRequest, + PredictResponse, + PredictBatchRequest, + PredictBatchResponse, +) +from tracking.request import ApiClient, validate_params + + +class EstimatedDeliveryDateApi(ApiClient): + """EstimatedDeliveryDateApi api implements""" + + @validate_params + def predict(self, predict_request: Union[PredictRequest, dict], **kwargs) -> PredictResponse: + """ + > The estimated delivery date is provided by AfterShip, based on its AI-predictive model. You can display the EDD on the product page, cart, and order checkout page. It indicates when a customer will receive the order.You can use to activate this feature. + :param predict_request: + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = "/tracking/2025-01/estimated-delivery-date/predict" + + body = predict_request + if not isinstance(body, dict): + body = predict_request.model_dump(exclude_none=True) + body = json.dumps(body) + + result = self._request("POST", url=url, body=body, **kwargs) + return PredictResponse().from_dict(result) + + @validate_params + def predict_batch( + self, predict_batch_request: Union[PredictBatchRequest, dict], **kwargs + ) -> PredictBatchResponse: + """ + > The estimated delivery date is provided by AfterShip, based on its AI-predictive model. You can display the EDD on the product page, cart, and order checkout page. It indicates when a customer will receive the order.You can use to activate this feature.Supported functionalities require:1. One `EstimatedDeliveryDate` object for one prediction result.2. Maximum 5 `EstimatedDeliveryDate` objects are allowed.3. API call will fail if any of the requests `EstimatedDeliveryDate` objects do not meet the specification requirement. + :param predict_batch_request: + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = "/tracking/2025-01/estimated-delivery-date/predict-batch" + + body = predict_batch_request + if not isinstance(body, dict): + body = predict_batch_request.model_dump(exclude_none=True) + body = json.dumps(body) + + result = self._request("POST", url=url, body=body, **kwargs) + return PredictBatchResponse().from_dict(result) diff --git a/tracking/api/tracking.py b/tracking/api/tracking.py new file mode 100644 index 0000000..ff887db --- /dev/null +++ b/tracking/api/tracking.py @@ -0,0 +1,240 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +import json +from typing import Union, Annotated + +from pydantic import Field + +from tracking.models import ( + CreateTrackingRequest, + CreateTrackingResponse, + DeleteTrackingByIdResponse, + GetTrackingByIdResponse, + GetTrackingsResponse, + MarkTrackingCompletedByIdRequest, + MarkTrackingCompletedByIdResponse, + RetrackTrackingByIdResponse, + UpdateTrackingByIdRequest, + UpdateTrackingByIdResponse, +) +from tracking.request import ApiClient, validate_params + + +class TrackingApi(ApiClient): + """TrackingApi api implements""" + + @validate_params + def create_tracking( + self, create_tracking_request: Union[CreateTrackingRequest, dict], **kwargs + ) -> CreateTrackingResponse: + """ + Create a tracking.
+ :param create_tracking_request: + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = "/tracking/2025-01/trackings" + + body = create_tracking_request + if not isinstance(body, dict): + body = create_tracking_request.model_dump(exclude_none=True) + body = json.dumps(body) + + result = self._request("POST", url=url, body=body, **kwargs) + return CreateTrackingResponse().from_dict(result) + + @validate_params + def delete_tracking_by_id( + self, tracking_id: Annotated[str, Field(min_length=1)], **kwargs + ) -> DeleteTrackingByIdResponse: + """ + Delete a tracking. + :param tracking_id: str. tracking ID. + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = f"/tracking/2025-01/trackings/{tracking_id}" + + result = self._request("DELETE", url=url, **kwargs) + return DeleteTrackingByIdResponse().from_dict(result) + + @validate_params + def get_tracking_by_id( + self, tracking_id: Annotated[str, Field(min_length=1)], **kwargs + ) -> GetTrackingByIdResponse: + """ + Get tracking results of a single tracking. + :param tracking_id: str. tracking ID. + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + query params: + **fields**: str. List of fields to include in the response. Use comma for multiple values. Fields to include: `tracking_postal_code`, `tracking_ship_date`, `tracking_account_number`, `tracking_key`, `tracking_origin_country_region`, `tracking_destination_country_region`, `tracking_state`, `title`, `order_id`, `tag`, `checkpoints` + **lang**: str. Translate checkpoint messages from the carrier’s provided language to the target language. Supported target languages include:
    - English (en)
    - French (fr)
    - French Canadian (fr-CA)
    - Arabic (ar)
    - Bulgarian (bg)
    - Catalan (ca)
    - Croatian (hr)
    - Czech (cs)
    - Danish (da)
    - Dutch (nl)
    - Estonian (et)
    - Filipino (tl)
    - Finnish (fi)
    - German (de)
    - Greek (el)
    - Hebrew (he)
    - Hindi (hi)
    - Hungarian (hu)
    - Indonesian (id)
    - Italian (it)
    - Japanese (ja)
    - Korean (ko)
    - Latvian (lv)
    - Lithuanian (lt)
    - Malay (ms)
    - Polish (pl)
    - Portuguese (pt)
    - Romanian (ro)
    - Russian (ru)
    - Serbian (sr)
    - Slovak (sk)
    - Slovenian (sl)
    - Spanish (es)
    - Swedish (sv)
    - Thai (th)
    - Turkish (tr)
    - Ukrainian (uk)
    - Vietnamese (vi)
    - Simplified Chinese (zh-Hans)
    - Traditional Chinese (zh-Hant)
    - Norwegian (nb)
+ """ + url = f"/tracking/2025-01/trackings/{tracking_id}" + params_keys = { + "fields", + "lang", + } + params = {key: kwargs.pop(key) for key in params_keys if key in kwargs} + + result = self._request("GET", url=url, params=params, **kwargs) + return GetTrackingByIdResponse().from_dict(result) + + @validate_params + def get_trackings(self, **kwargs) -> GetTrackingsResponse: + """ + Get tracking results of multiple trackings.
+ :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + query params: + **cursor**: str. A string representing the cursor value for the current page of results. + **limit**: int. Number of trackings each page contain. (Default: 100, Max: 200) + **keyword**: str. Search the content of the tracking record fields: `tracking_number`, `title`, `order_id`, `customers[x].name`, `custom_fields`, `customers[x].email`, `customers[x].phone_number` + **tracking_numbers**: str. Tracking number of shipments. Use comma to separate multiple values (Example: RA123456789US,LE123456789US). Supports up to 50 tracking numbers. + **slug**: str. Unique courier code Use comma for multiple values. (Example: dhl,ups,usps) + **transit_time**: int. Total delivery time in days.- When the shipment is delivered: Transit time = Delivered date - Picked up date- When the shipment is not delivered: Transit time = Current date - Picked up dateValue as `null` for the shipment without pickup date. + **origin**: str. Origin country/region of trackings. Use ISO Alpha-3 (three letters). Use comma for multiple values. (Example: USA,HKG) + **destination**: str. Destination country/region of trackings. Use ISO Alpha-3 (three letters). Use comma for multiple values. (Example: USA,HKG) + **tag**: str. Current status of tracking. Values include `Pending`, `InfoReceived`, `InTransit`, `OutForDelivery`, `AttemptFail`, `Delivered`, `AvailableForPickup`, `Exception`, `Expired` (See tag definition) + **created_at_min**: str. Start date and time of trackings created. AfterShip only stores data of 120 days. Please make sure the value of the parameter is properly escaped in + **created_at_max**: str. End date and time of trackings created. Please make sure the value of the parameter is properly escaped in + **updated_at_min**: str. Start date and time of trackings updated. Please make sure the value of the parameter is properly escaped in + **updated_at_max**: str. End date and time of trackings updated. Please make sure the value of the parameter is properly escaped in + **fields**: str. List of fields to include in the response. Use comma for multiple values. Available options: `title`, `order_id`, `tag`, `checkpoints`. Example: `title,order_id` + **return_to_sender**: str. Select return to sender, the value should be `true` or `false`, with optional comma separated. + **courier_destination_country_region**: str. Destination country/region of trackings returned by courier. Use ISO Alpha-3 (three letters). Use comma for multiple values. (Example: USA,HKG) + **shipment_tags**: str. Tags you added to your shipments to help categorize and filter them easily. Use a comma to separate multiple values (Example: a,b) + **order_id**: str. A globally-unique identifier for the order. Use comma for multiple values.(Example: 6845a095a27a4caeb27487806f058add,4845a095a27a4caeb27487806f058abc) + """ + url = "/tracking/2025-01/trackings" + params_keys = { + "cursor", + "limit", + "keyword", + "tracking_numbers", + "slug", + "transit_time", + "origin", + "destination", + "tag", + "created_at_min", + "created_at_max", + "updated_at_min", + "updated_at_max", + "fields", + "return_to_sender", + "courier_destination_country_region", + "shipment_tags", + "order_id", + } + params = {key: kwargs.pop(key) for key in params_keys if key in kwargs} + + result = self._request("GET", url=url, params=params, **kwargs) + return GetTrackingsResponse().from_dict( + { + "pagination": result.get("pagination"), + "trackings": result.get("trackings"), + } + ) + + @validate_params + def mark_tracking_completed_by_id( + self, + tracking_id: Annotated[str, Field(min_length=1)], + mark_tracking_completed_by_id_request: Union[MarkTrackingCompletedByIdRequest, dict], + **kwargs, + ) -> MarkTrackingCompletedByIdResponse: + """ + Mark a tracking as completed. The tracking won't auto update until retrack it. + :param tracking_id: str. tracking id. + :param mark_tracking_completed_by_id_request: + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = f"/tracking/2025-01/trackings/{tracking_id}/mark-as-completed" + + body = mark_tracking_completed_by_id_request + if not isinstance(body, dict): + body = mark_tracking_completed_by_id_request.model_dump(exclude_none=True) + body = json.dumps(body) + + result = self._request("POST", url=url, body=body, **kwargs) + return MarkTrackingCompletedByIdResponse().from_dict(result) + + @validate_params + def retrack_tracking_by_id( + self, tracking_id: Annotated[str, Field(min_length=1)], **kwargs + ) -> RetrackTrackingByIdResponse: + """ + Retrack an expired tracking. Max 3 times per tracking. + :param tracking_id: str. tracking id. + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = f"/tracking/2025-01/trackings/{tracking_id}/retrack" + + result = self._request("POST", url=url, **kwargs) + return RetrackTrackingByIdResponse().from_dict(result) + + @validate_params + def update_tracking_by_id( + self, + tracking_id: Annotated[str, Field(min_length=1)], + update_tracking_by_id_request: Union[UpdateTrackingByIdRequest, dict], + **kwargs, + ) -> UpdateTrackingByIdResponse: + """ + Update a tracking. + :param tracking_id: str. tracking ID. + :param update_tracking_by_id_request: + :param kwargs: + request options: + **headers** (dict): support custom headers. + **verify** bool|str|SSLContext: SSL certificates (a.k.a CA bundle) used to + verify the identity of requested hosts. Either `True` (default CA bundle), + a path to an SSL certificate file, an `ssl.SSLContext`, or `False` + (which will disable verification). + """ + url = f"/tracking/2025-01/trackings/{tracking_id}" + + body = update_tracking_by_id_request + if not isinstance(body, dict): + body = update_tracking_by_id_request.model_dump(exclude_none=True) + body = json.dumps(body) + + result = self._request("PUT", url=url, body=body, **kwargs) + return UpdateTrackingByIdResponse().from_dict(result) diff --git a/tracking/auth.py b/tracking/auth.py new file mode 100644 index 0000000..ab206aa --- /dev/null +++ b/tracking/auth.py @@ -0,0 +1,134 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +import base64 +import hashlib +import urllib.parse +import hmac +from typing import Dict +from datetime import datetime +from urllib3.util import url + +from Crypto.PublicKey import RSA +from Crypto.Signature import PKCS1_PSS +from Crypto.Hash import SHA256 + +ApiKey = "API_KEY" +Aes = "AES" +Rsa = "RSA" + + +class Authenticator: + def __init__(self, api_key: str, api_secret: str, auth_type: str): + self._api_key: str = api_key + self._api_secret: str = api_secret + self._kind: str = auth_type + + def sign(self, method: str, uri: str, headers: dict, body: str) -> Dict: + """ + The SignString is generated by Method, Uri, Headers, Body from a HTTP(s) request. + + :param method: str - request method. + :param uri: str - request URI. + :param headers: dict - request headers. + :param body: str - request body. + """ + headers["as-api-key"] = self._api_key + + if self._kind == ApiKey: + return headers + + if self._kind != ApiKey: + headers["date"] = datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT") + concat_header = self.canonical_header(headers) + concat_rs = self.canonical_resource(uri) + request_date = headers.get("date") + sign_str = self.sign_str(method, body, request_date, concat_header, concat_rs) + + if self._kind == Aes: + headers["as-signature-hmac-sha256"] = self.hmac_signature( + sign_str, self._api_secret + ) + + if self._kind == Rsa: + headers["as-signature-rsa-sha256"] = self.rsa_encrypt(sign_str, self._api_secret) + + return headers + + @classmethod + def sign_str( + cls, method: str, body: str, date: str, concat_header: str, concat_resource: str + ) -> str: + content_md5 = "" + content_type = "" + + if body is not None and body != "": + content_type = "application/json" + content_md5 = cls.md5_encode(body) + + return "\n".join([method, content_md5, content_type, date, concat_header, concat_resource]) + + @classmethod + def canonical_header(cls, headers: Dict) -> str: + """ + :param headers: dict. + + To generate the canonicalized_headers: + + 1. Extract all request headers with the as- prefix key. Kindly note that the headers with the as- prefix + are not limited to as-api-key, but also include other as- prefixed key such as as-store-id. + 2. Convert all the request header key to lowercase (except the header values case), + and sort the headers in ASCII code order. + 3. Remove leading spaces and trailing spaces from the header key and value. + 4. Concatenate each of the header key and value with :, to form a header pair + header_pair = header_key + ":" + header_value + 5. Concatenate all header pairs with the new line character (ASCII code 10). + """ + if headers is None or len(headers) == 0: + return "" + + result = {k.lower(): v.lstrip() for k, v in headers.items() if k.lower().startswith("as-")} + result = dict(sorted(result.items())) + + return "\n".join([f"{k}:{v}" for k, v in result.items()]) + + @classmethod + def canonical_resource(cls, raw_url: str) -> str: + """ + :param raw_url: str - raw request url. + Example : https://api.aftership.com/tracking/2024-10/trackings?key2=value2&key1=value1 + + :return canonical_url: str - canonical request url. + Example :/tracking/2024-10/trackings?key1=value1&key2=value2 + """ + u = url.parse_url(raw_url) + resource = u.path + + if u.query is not None and u.query != "": + query_dict = urllib.parse.parse_qs(u.query) + query_dict = {key: value[0] for key, value in query_dict.items()} + resource += "?" + urllib.parse.urlencode(query_dict) + + return resource + + @staticmethod + def md5_encode(source: str) -> str: + return hashlib.md5(source.encode("utf-8")).hexdigest().upper() + + @staticmethod + def rsa_encrypt(sign_str: str, api_secret: str) -> str: + private_key = RSA.importKey(api_secret.encode("utf-8")) + cipher = PKCS1_PSS.new(private_key) + h = SHA256.new() + h.update(sign_str.encode("utf-8")) + signature = cipher.sign(h) + return base64.b64encode(signature).decode("utf-8") + + @staticmethod + def hmac_signature(sign_str: str, api_secret: str) -> str: + signature = hmac.new( + bytes(api_secret, "utf-8"), msg=bytes(sign_str, "utf-8"), digestmod=hashlib.sha256 + ).digest() + return base64.b64encode(signature).decode("utf-8") diff --git a/tracking/client.py b/tracking/client.py new file mode 100644 index 0000000..1928fc1 --- /dev/null +++ b/tracking/client.py @@ -0,0 +1,21 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +__all__ = ["Client"] + +from typing import Optional + +from .configuration import Configuration +from .api import TrackingApi, CourierApi, EstimatedDeliveryDateApi + + +class Client: + def __init__(self, configuration: Optional[Configuration] = None) -> None: + if configuration is None: + configuration = Configuration() + + self.tracking = TrackingApi(configuration) + self.courier = CourierApi(configuration) + self.estimated_delivery_date = EstimatedDeliveryDateApi(configuration) diff --git a/tracking/configuration.py b/tracking/configuration.py new file mode 100644 index 0000000..df67dd5 --- /dev/null +++ b/tracking/configuration.py @@ -0,0 +1,112 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +import os + +from typing import Optional + +from tracking.auth import ApiKey, Rsa, Aes +from tracking.exceptions import InvalidApiKeyError, InvalidOptionError, ErrorCodeEnum + +_sdkPrefix = "AFTERSHIP_TRACKING_SDK_" + + +def _get_val_from_env_if_need(value, key_suffix, default=None): + if value is None: + key = f"{_sdkPrefix}{key_suffix}" + return os.environ.get(key, default) + return value + + +class Configuration: + """This class contains various settings of the API client. + + :param domain: str - Base url. + :param authentication_type: str - decide your authentication type. + :param api_key: str - AS API key(s). + :param api_secret: str - AS api secret. + :param max_retry: int - retry limit. + :param user_agent: user-agent string for AS. + :param timeout: int - milliseconds timeout. + :param proxy: str - proxy url string. + """ + + def __init__( + self, + domain: Optional[str] = None, + authentication_type: Optional[str] = None, + max_retry: Optional[int] = None, + user_agent: Optional[str] = None, + api_key: Optional[str] = None, + api_secret: Optional[str] = None, + proxy: Optional[str] = None, + timeout: Optional[int] = None, + ) -> None: + self.domain = str( + _get_val_from_env_if_need( + domain, key_suffix="DOMAIN", default="https://api.aftership.com" + ) + ) + + self.authentication_type = str( + _get_val_from_env_if_need( + authentication_type, key_suffix="AUTHENTICATION_TYPE", default=ApiKey + ) + ) + + self.max_retry = int( + _get_val_from_env_if_need(max_retry, key_suffix="MAX_RETRY", default=2) + ) + + self.user_agent = ( + str(_get_val_from_env_if_need(user_agent, key_suffix="USER_AGENT", default="")) or None + ) + + self.api_key = ( + str(_get_val_from_env_if_need(api_key, key_suffix="API_KEY", default="")) or None + ) + + self.api_secret = ( + str(_get_val_from_env_if_need(api_secret, key_suffix="API_SECRET", default="")) or None + ) + + self.proxy = str(_get_val_from_env_if_need(proxy, key_suffix="PROXY", default="")) or None + + self.timeout = int(_get_val_from_env_if_need(timeout, key_suffix="TIMEOUT", default=10000)) + + self._validate() + + def _validate(self): + if self.domain is None or len(self.domain) == 0: + raise InvalidOptionError( + code=ErrorCodeEnum.INVALID_OPTION, message=f"Invalid option: domain={self.domain}" + ) + if self.authentication_type not in {ApiKey, Rsa, Aes}: + raise InvalidOptionError( + code=ErrorCodeEnum.INVALID_OPTION, + message=f"Invalid option: authentication_type={self.authentication_type}", + ) + + if self.api_key is None or len(self.api_key) == 0: + raise InvalidApiKeyError(code=ErrorCodeEnum.INVALID_API_KEY, message="Invalid API key") + + if self.authentication_type != ApiKey and ( + self.api_secret is None or len(self.api_secret) == 0 + ): + raise InvalidOptionError( + code=ErrorCodeEnum.INVALID_OPTION, + message=f"Invalid option: api_secret={self.api_secret}", + ) + + if self.max_retry > 10 or self.max_retry < 0: + raise InvalidOptionError( + code=ErrorCodeEnum.INVALID_OPTION, + message=f"Invalid option: max_retry={self.max_retry}", + ) + + if self.timeout <= 0: + raise InvalidOptionError( + code=ErrorCodeEnum.INVALID_OPTION, message=f"Invalid option: timeout={self.timeout}" + ) diff --git a/tracking/exceptions.py b/tracking/exceptions.py new file mode 100644 index 0000000..a74771a --- /dev/null +++ b/tracking/exceptions.py @@ -0,0 +1,123 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from typing import Optional +from enum import Enum, unique + + +class ApiException(Exception): + """ + The base exception class for all ApiException + + :param code: Error code enum. Would be described in the following sections. + :param status_code: Same as the http status code. Must have a value. + :param message: Error returned by the API: same as meta.message, Error not returned by the API: error object default message + :param meta_code: Could be null for the error that is not returned by the API, + for example, timeout error, network error. + :param response_body: response.body, if any. + """ + + def __init__( + self, + code: str, + message: str, + status_code: Optional[int] = None, + meta_code: Optional[int] = None, + response_body: Optional[str] = None, + response_header: Optional[object] = None, + ) -> None: + super(ApiException, self).__init__() + self.meta_code = meta_code + self.message = message + self.code = code + self.status_code = status_code + self.response_body = response_body + self.response_header = response_header + + def __str__(self): + return "{}: {}".format(self.__class__.__name__, self.message) + + +class BadRequestError(ApiException): + pass + + +class UnauthorizedError(ApiException): + pass + + +class ForbiddenError(ApiException): + pass + + +class NotFoundError(ApiException): + pass + + +class TooManyRequestsError(ApiException): + pass + + +class InternalError(ApiException): + pass + + +class TimedOutError(ApiException): + pass + + +class UnknownError(ApiException): + pass + + +class InvalidApiKeyError(BadRequestError): + pass + + +class InvalidOptionError(BadRequestError): + pass + + +class RateLimitExceedError(TooManyRequestsError): + pass + + +@unique +class ErrorCodeEnum(Enum): + """ + All available additional fields + + allowed enum values + """ + + INVALID_API_KEY = "INVALID_API_KEY" + INVALID_OPTION = "INVALID_OPTION" + BAD_REQUEST = "BAD_REQUEST" + RATE_LIMIT_EXCEED = "RATE_LIMIT_EXCEED" + TIMED_OUT = "TIMED_OUT" + UNKNOW_ERROR = "UNKNOW_ERROR" + + INVALID_REQUEST = "INVALID_REQUEST" + INVALID_JSON = "INVALID_JSON" + TRACKING_ALREADY_EXIST = "TRACKING_ALREADY_EXIST" + TRACKING_DOES_NOT_EXIST = "TRACKING_DOES_NOT_EXIST" + TRACKING_NUMBER_INVALID = "TRACKING_NUMBER_INVALID" + TRACKING_REQUIRED = "TRACKING_REQUIRED" + TRACKING_NUMBER_REQUIRED = "TRACKING_NUMBER_REQUIRED" + VALUE_INVALID = "VALUE_INVALID" + VALUE_REQUIRED = "VALUE_REQUIRED" + SLUG_INVALID = "SLUG_INVALID" + MISSING_OR_INVALID_REQUIRED_FIELD = "MISSING_OR_INVALID_REQUIRED_FIELD" + BAD_COURIER = "BAD_COURIER" + INACTIVE_RETRACK_NOT_ALLOWED = "INACTIVE_RETRACK_NOT_ALLOWED" + NOTIFICATION_REUQIRED = "NOTIFICATION_REUQIRED" + ID_INVALID = "ID_INVALID" + RETRACK_ONCE_ALLOWED = "RETRACK_ONCE_ALLOWED" + TRACKING_NUMBER_FORMAT_INVALID = "TRACKING_NUMBER_FORMAT_INVALID" + API_KEY_INVALID = "API_KEY_INVALID" + REQUEST_NOT_ALLOWED = "REQUEST_NOT_ALLOWED" + NOT_FOUND = "NOT_FOUND" + TOO_MANY_REQUEST = "TOO_MANY_REQUEST" + INTERNAL_ERROR = "INTERNAL_ERROR" diff --git a/tracking/models/__init__.py b/tracking/models/__init__.py new file mode 100644 index 0000000..bf4818c --- /dev/null +++ b/tracking/models/__init__.py @@ -0,0 +1,370 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +__all__ = [ + "AdditionalFieldsV1", + "AftershipEstimatedDeliveryDateCreateTrackingResponse", + "AftershipEstimatedDeliveryDateDeleteTrackingByIdResponse", + "AftershipEstimatedDeliveryDateGetTrackingByIdResponse", + "AftershipEstimatedDeliveryDateMarkTrackingCompletedByIdResponse", + "AftershipEstimatedDeliveryDateRetrackTrackingByIdResponse", + "AftershipEstimatedDeliveryDateTracking", + "AftershipEstimatedDeliveryDateUpdateTrackingByIdResponse", + "CarbonEmissionsCreateTrackingResponse", + "CarbonEmissionsDeleteTrackingByIdResponse", + "CarbonEmissionsGetTrackingByIdResponse", + "CarbonEmissionsMarkTrackingCompletedByIdResponse", + "CarbonEmissionsRetrackTrackingByIdResponse", + "CarbonEmissionsTracking", + "CarbonEmissionsUpdateTrackingByIdResponse", + "Checkpoint", + "CoordinateCheckpoint", + "Courier", + "CourierEstimatedDeliveryDateCreateTrackingResponse", + "CourierEstimatedDeliveryDateDeleteTrackingByIdResponse", + "CourierEstimatedDeliveryDateGetTrackingByIdResponse", + "CourierEstimatedDeliveryDateMarkTrackingCompletedByIdResponse", + "CourierEstimatedDeliveryDateRetrackTrackingByIdResponse", + "CourierEstimatedDeliveryDateTracking", + "CourierEstimatedDeliveryDateUpdateTrackingByIdResponse", + "CourierResponseV1", + "CreateTrackingRequest", + "CreateTrackingResponse", + "CustomEstimatedDeliveryDateCreateTrackingResponse", + "CustomEstimatedDeliveryDateDeleteTrackingByIdResponse", + "CustomEstimatedDeliveryDateGetTrackingByIdResponse", + "CustomEstimatedDeliveryDateMarkTrackingCompletedByIdResponse", + "CustomEstimatedDeliveryDateRetrackTrackingByIdResponse", + "CustomEstimatedDeliveryDateTracking", + "CustomEstimatedDeliveryDateUpdateTrackingByIdResponse", + "CustomersCreateTrackingRequest", + "CustomersCreateTrackingResponse", + "CustomersDeleteTrackingByIdResponse", + "CustomersGetTrackingByIdResponse", + "CustomersMarkTrackingCompletedByIdResponse", + "CustomersRetrackTrackingByIdResponse", + "CustomersTracking", + "CustomersUpdateTrackingByIdRequest", + "CustomersUpdateTrackingByIdResponse", + "DataCourierResponseV1", + "DataTrackingResponseGetMultipleV1", + "DeleteTrackingByIdResponse", + "DestinationAddressEstimatedDeliveryDateRequest", + "DestinationAddressEstimatedDeliveryDateResponse", + "DestinationAddressPredictRequest", + "DestinationAddressPredictResponse", + "DetectCourierRequest", + "DetectCourierResponse", + "EstimatedDeliveryDateRequest", + "EstimatedDeliveryDateResponse", + "EstimatedPickupEstimatedDeliveryDateRequest", + "EstimatedPickupEstimatedDeliveryDateResponse", + "EstimatedPickupPredictRequest", + "EstimatedPickupPredictResponse", + "EventsCheckpoint", + "FirstEstimatedDeliveryCreateTrackingResponse", + "FirstEstimatedDeliveryDeleteTrackingByIdResponse", + "FirstEstimatedDeliveryGetTrackingByIdResponse", + "FirstEstimatedDeliveryMarkTrackingCompletedByIdResponse", + "FirstEstimatedDeliveryRetrackTrackingByIdResponse", + "FirstEstimatedDeliveryTracking", + "FirstEstimatedDeliveryUpdateTrackingByIdResponse", + "FirstMileCreateTrackingResponse", + "FirstMileDeleteTrackingByIdResponse", + "FirstMileGetTrackingByIdResponse", + "FirstMileMarkTrackingCompletedByIdResponse", + "FirstMileRetrackTrackingByIdResponse", + "FirstMileTracking", + "FirstMileUpdateTrackingByIdResponse", + "GetAllCouriersResponse", + "GetTrackingByIdResponse", + "GetTrackingsResponse", + "GetUserCouriersResponse", + "LastMileCreateTrackingRequest", + "LastMileCreateTrackingResponse", + "LastMileDeleteTrackingByIdResponse", + "LastMileGetTrackingByIdResponse", + "LastMileMarkTrackingCompletedByIdResponse", + "LastMileRetrackTrackingByIdResponse", + "LastMileTracking", + "LastMileUpdateTrackingByIdResponse", + "LatestEstimatedDeliveryCreateTrackingResponse", + "LatestEstimatedDeliveryDeleteTrackingByIdResponse", + "LatestEstimatedDeliveryGetTrackingByIdResponse", + "LatestEstimatedDeliveryMarkTrackingCompletedByIdResponse", + "LatestEstimatedDeliveryRetrackTrackingByIdResponse", + "LatestEstimatedDeliveryTracking", + "LatestEstimatedDeliveryUpdateTrackingByIdResponse", + "MarkTrackingCompletedByIdRequest", + "MarkTrackingCompletedByIdResponse", + "MetaV1", + "OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateRequest", + "OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateResponse", + "OrderProcessingTimeEstimatedPickupPredictRequest", + "OrderProcessingTimeEstimatedPickupPredictResponse", + "OriginAddressEstimatedDeliveryDateRequest", + "OriginAddressEstimatedDeliveryDateResponse", + "OriginAddressPredictRequest", + "OriginAddressPredictResponse", + "Pagination", + "PaginationDataTrackingResponseGetMultipleV1", + "PaginationGetTrackingsResponse", + "PredictBatchRequest", + "PredictBatchResponse", + "PredictRequest", + "PredictResponse", + "ReasonEventsCheckpoint", + "RetrackTrackingByIdResponse", + "ShipmentWeightCreateTrackingResponse", + "ShipmentWeightDeleteTrackingByIdResponse", + "ShipmentWeightGetTrackingByIdResponse", + "ShipmentWeightMarkTrackingCompletedByIdResponse", + "ShipmentWeightRetrackTrackingByIdResponse", + "ShipmentWeightTracking", + "ShipmentWeightUpdateTrackingByIdResponse", + "SlugGroupV1", + "TagV1", + "Tracking", + "TrackingResponseGetMultipleV1", + "TrackingResponseV1", + "UpdateTrackingByIdRequest", + "UpdateTrackingByIdResponse", + "WeightEstimatedDeliveryDateRequest", + "WeightEstimatedDeliveryDateResponse", + "WeightPredictRequest", + "WeightPredictResponse", +] + +from .additional_fields_v1 import AdditionalFieldsV1 +from .aftership_estimated_delivery_date_create_tracking_response import ( + AftershipEstimatedDeliveryDateCreateTrackingResponse, +) +from .aftership_estimated_delivery_date_delete_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateDeleteTrackingByIdResponse, +) +from .aftership_estimated_delivery_date_get_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateGetTrackingByIdResponse, +) +from .aftership_estimated_delivery_date_mark_tracking_completed_by_id_response import ( + AftershipEstimatedDeliveryDateMarkTrackingCompletedByIdResponse, +) +from .aftership_estimated_delivery_date_retrack_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateRetrackTrackingByIdResponse, +) +from .aftership_estimated_delivery_date_tracking import AftershipEstimatedDeliveryDateTracking +from .aftership_estimated_delivery_date_update_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateUpdateTrackingByIdResponse, +) +from .carbon_emissions_create_tracking_response import CarbonEmissionsCreateTrackingResponse +from .carbon_emissions_delete_tracking_by_id_response import ( + CarbonEmissionsDeleteTrackingByIdResponse, +) +from .carbon_emissions_get_tracking_by_id_response import CarbonEmissionsGetTrackingByIdResponse +from .carbon_emissions_mark_tracking_completed_by_id_response import ( + CarbonEmissionsMarkTrackingCompletedByIdResponse, +) +from .carbon_emissions_retrack_tracking_by_id_response import ( + CarbonEmissionsRetrackTrackingByIdResponse, +) +from .carbon_emissions_tracking import CarbonEmissionsTracking +from .carbon_emissions_update_tracking_by_id_response import ( + CarbonEmissionsUpdateTrackingByIdResponse, +) +from .checkpoint import Checkpoint +from .coordinate_checkpoint import CoordinateCheckpoint +from .courier import Courier +from .courier_estimated_delivery_date_create_tracking_response import ( + CourierEstimatedDeliveryDateCreateTrackingResponse, +) +from .courier_estimated_delivery_date_delete_tracking_by_id_response import ( + CourierEstimatedDeliveryDateDeleteTrackingByIdResponse, +) +from .courier_estimated_delivery_date_get_tracking_by_id_response import ( + CourierEstimatedDeliveryDateGetTrackingByIdResponse, +) +from .courier_estimated_delivery_date_mark_tracking_completed_by_id_response import ( + CourierEstimatedDeliveryDateMarkTrackingCompletedByIdResponse, +) +from .courier_estimated_delivery_date_retrack_tracking_by_id_response import ( + CourierEstimatedDeliveryDateRetrackTrackingByIdResponse, +) +from .courier_estimated_delivery_date_tracking import CourierEstimatedDeliveryDateTracking +from .courier_estimated_delivery_date_update_tracking_by_id_response import ( + CourierEstimatedDeliveryDateUpdateTrackingByIdResponse, +) +from .courier_response_v1 import CourierResponseV1 +from .create_tracking_request import CreateTrackingRequest +from .create_tracking_response import CreateTrackingResponse +from .custom_estimated_delivery_date_create_tracking_response import ( + CustomEstimatedDeliveryDateCreateTrackingResponse, +) +from .custom_estimated_delivery_date_delete_tracking_by_id_response import ( + CustomEstimatedDeliveryDateDeleteTrackingByIdResponse, +) +from .custom_estimated_delivery_date_get_tracking_by_id_response import ( + CustomEstimatedDeliveryDateGetTrackingByIdResponse, +) +from .custom_estimated_delivery_date_mark_tracking_completed_by_id_response import ( + CustomEstimatedDeliveryDateMarkTrackingCompletedByIdResponse, +) +from .custom_estimated_delivery_date_retrack_tracking_by_id_response import ( + CustomEstimatedDeliveryDateRetrackTrackingByIdResponse, +) +from .custom_estimated_delivery_date_tracking import CustomEstimatedDeliveryDateTracking +from .custom_estimated_delivery_date_update_tracking_by_id_response import ( + CustomEstimatedDeliveryDateUpdateTrackingByIdResponse, +) +from .customers_create_tracking_request import CustomersCreateTrackingRequest +from .customers_create_tracking_response import CustomersCreateTrackingResponse +from .customers_delete_tracking_by_id_response import CustomersDeleteTrackingByIdResponse +from .customers_get_tracking_by_id_response import CustomersGetTrackingByIdResponse +from .customers_mark_tracking_completed_by_id_response import ( + CustomersMarkTrackingCompletedByIdResponse, +) +from .customers_retrack_tracking_by_id_response import CustomersRetrackTrackingByIdResponse +from .customers_tracking import CustomersTracking +from .customers_update_tracking_by_id_request import CustomersUpdateTrackingByIdRequest +from .customers_update_tracking_by_id_response import CustomersUpdateTrackingByIdResponse +from .data_courier_response_v1 import DataCourierResponseV1 +from .data_tracking_response_get_multiple_v1 import DataTrackingResponseGetMultipleV1 +from .delete_tracking_by_id_response import DeleteTrackingByIdResponse +from .destination_address_estimated_delivery_date_request import ( + DestinationAddressEstimatedDeliveryDateRequest, +) +from .destination_address_estimated_delivery_date_response import ( + DestinationAddressEstimatedDeliveryDateResponse, +) +from .destination_address_predict_request import DestinationAddressPredictRequest +from .destination_address_predict_response import DestinationAddressPredictResponse +from .detect_courier_request import DetectCourierRequest +from .detect_courier_response import DetectCourierResponse +from .estimated_delivery_date_request import EstimatedDeliveryDateRequest +from .estimated_delivery_date_response import EstimatedDeliveryDateResponse +from .estimated_pickup_estimated_delivery_date_request import ( + EstimatedPickupEstimatedDeliveryDateRequest, +) +from .estimated_pickup_estimated_delivery_date_response import ( + EstimatedPickupEstimatedDeliveryDateResponse, +) +from .estimated_pickup_predict_request import EstimatedPickupPredictRequest +from .estimated_pickup_predict_response import EstimatedPickupPredictResponse +from .events_checkpoint import EventsCheckpoint +from .first_estimated_delivery_create_tracking_response import ( + FirstEstimatedDeliveryCreateTrackingResponse, +) +from .first_estimated_delivery_delete_tracking_by_id_response import ( + FirstEstimatedDeliveryDeleteTrackingByIdResponse, +) +from .first_estimated_delivery_get_tracking_by_id_response import ( + FirstEstimatedDeliveryGetTrackingByIdResponse, +) +from .first_estimated_delivery_mark_tracking_completed_by_id_response import ( + FirstEstimatedDeliveryMarkTrackingCompletedByIdResponse, +) +from .first_estimated_delivery_retrack_tracking_by_id_response import ( + FirstEstimatedDeliveryRetrackTrackingByIdResponse, +) +from .first_estimated_delivery_tracking import FirstEstimatedDeliveryTracking +from .first_estimated_delivery_update_tracking_by_id_response import ( + FirstEstimatedDeliveryUpdateTrackingByIdResponse, +) +from .first_mile_create_tracking_response import FirstMileCreateTrackingResponse +from .first_mile_delete_tracking_by_id_response import FirstMileDeleteTrackingByIdResponse +from .first_mile_get_tracking_by_id_response import FirstMileGetTrackingByIdResponse +from .first_mile_mark_tracking_completed_by_id_response import ( + FirstMileMarkTrackingCompletedByIdResponse, +) +from .first_mile_retrack_tracking_by_id_response import FirstMileRetrackTrackingByIdResponse +from .first_mile_tracking import FirstMileTracking +from .first_mile_update_tracking_by_id_response import FirstMileUpdateTrackingByIdResponse +from .get_all_couriers_response import GetAllCouriersResponse +from .get_tracking_by_id_response import GetTrackingByIdResponse +from .get_trackings_response import GetTrackingsResponse +from .get_user_couriers_response import GetUserCouriersResponse +from .last_mile_create_tracking_request import LastMileCreateTrackingRequest +from .last_mile_create_tracking_response import LastMileCreateTrackingResponse +from .last_mile_delete_tracking_by_id_response import LastMileDeleteTrackingByIdResponse +from .last_mile_get_tracking_by_id_response import LastMileGetTrackingByIdResponse +from .last_mile_mark_tracking_completed_by_id_response import ( + LastMileMarkTrackingCompletedByIdResponse, +) +from .last_mile_retrack_tracking_by_id_response import LastMileRetrackTrackingByIdResponse +from .last_mile_tracking import LastMileTracking +from .last_mile_update_tracking_by_id_response import LastMileUpdateTrackingByIdResponse +from .latest_estimated_delivery_create_tracking_response import ( + LatestEstimatedDeliveryCreateTrackingResponse, +) +from .latest_estimated_delivery_delete_tracking_by_id_response import ( + LatestEstimatedDeliveryDeleteTrackingByIdResponse, +) +from .latest_estimated_delivery_get_tracking_by_id_response import ( + LatestEstimatedDeliveryGetTrackingByIdResponse, +) +from .latest_estimated_delivery_mark_tracking_completed_by_id_response import ( + LatestEstimatedDeliveryMarkTrackingCompletedByIdResponse, +) +from .latest_estimated_delivery_retrack_tracking_by_id_response import ( + LatestEstimatedDeliveryRetrackTrackingByIdResponse, +) +from .latest_estimated_delivery_tracking import LatestEstimatedDeliveryTracking +from .latest_estimated_delivery_update_tracking_by_id_response import ( + LatestEstimatedDeliveryUpdateTrackingByIdResponse, +) +from .mark_tracking_completed_by_id_request import MarkTrackingCompletedByIdRequest +from .mark_tracking_completed_by_id_response import MarkTrackingCompletedByIdResponse +from .meta_v1 import MetaV1 +from .order_processing_time_estimated_pickup_estimated_delivery_date_request import ( + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateRequest, +) +from .order_processing_time_estimated_pickup_estimated_delivery_date_response import ( + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateResponse, +) +from .order_processing_time_estimated_pickup_predict_request import ( + OrderProcessingTimeEstimatedPickupPredictRequest, +) +from .order_processing_time_estimated_pickup_predict_response import ( + OrderProcessingTimeEstimatedPickupPredictResponse, +) +from .origin_address_estimated_delivery_date_request import ( + OriginAddressEstimatedDeliveryDateRequest, +) +from .origin_address_estimated_delivery_date_response import ( + OriginAddressEstimatedDeliveryDateResponse, +) +from .origin_address_predict_request import OriginAddressPredictRequest +from .origin_address_predict_response import OriginAddressPredictResponse +from .pagination import Pagination +from .pagination_data_tracking_response_get_multiple_v1 import ( + PaginationDataTrackingResponseGetMultipleV1, +) +from .pagination_get_trackings_response import PaginationGetTrackingsResponse +from .predict_batch_request import PredictBatchRequest +from .predict_batch_response import PredictBatchResponse +from .predict_request import PredictRequest +from .predict_response import PredictResponse +from .reason_events_checkpoint import ReasonEventsCheckpoint +from .retrack_tracking_by_id_response import RetrackTrackingByIdResponse +from .shipment_weight_create_tracking_response import ShipmentWeightCreateTrackingResponse +from .shipment_weight_delete_tracking_by_id_response import ShipmentWeightDeleteTrackingByIdResponse +from .shipment_weight_get_tracking_by_id_response import ShipmentWeightGetTrackingByIdResponse +from .shipment_weight_mark_tracking_completed_by_id_response import ( + ShipmentWeightMarkTrackingCompletedByIdResponse, +) +from .shipment_weight_retrack_tracking_by_id_response import ( + ShipmentWeightRetrackTrackingByIdResponse, +) +from .shipment_weight_tracking import ShipmentWeightTracking +from .shipment_weight_update_tracking_by_id_response import ShipmentWeightUpdateTrackingByIdResponse +from .slug_group_v1 import SlugGroupV1 +from .tag_v1 import TagV1 +from .tracking import Tracking +from .tracking_response_get_multiple_v1 import TrackingResponseGetMultipleV1 +from .tracking_response_v1 import TrackingResponseV1 +from .update_tracking_by_id_request import UpdateTrackingByIdRequest +from .update_tracking_by_id_response import UpdateTrackingByIdResponse +from .weight_estimated_delivery_date_request import WeightEstimatedDeliveryDateRequest +from .weight_estimated_delivery_date_response import WeightEstimatedDeliveryDateResponse +from .weight_predict_request import WeightPredictRequest +from .weight_predict_response import WeightPredictResponse diff --git a/tracking/models/__pycache__/__init__.cpython-312.pyc b/tracking/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..947283f807c6a5423acd046236439357772fb160 GIT binary patch literal 14191 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 bw0xQca_*0um+pO^9|5tA6hWNDL{jD-!pRl* literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/aftership_estimated_delivery_date_create_tracking_response.cpython-312.pyc b/tracking/models/__pycache__/aftership_estimated_delivery_date_create_tracking_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..349f6e36a4cb2b1cf310a40bee5256e9cf613980 GIT binary patch literal 2573 zcmb_e&2Jk;6rb5$uh)+4?FY1lLYojZt(6bARSW%6q(T58l~f|>Wl^-+de-SC`^C(< z#8K4d5Kwxd+)_^Dz=0~49{UGyK;q&kNR1W{AdnEZ7Sl^lytnJPNkw`HjFPu+-kUcw z@Ap2&-xZ5_0;AtqocvWGUAZ2qTQT#G?kK$V;wdNbr?i*;5R~%NUtN zuDGg~HL{*&XkO09d3htB$TM!2S1<~cNaS6@)CIz_wz49pXBfqXRM!5)Ntwo7mhT6V z6*++~M$1y1d(#s3`vJ4vIP;EUyR59l@hz6Dm8z^J8TdSs9 zr?hY{az;?01g0j-Sfl&m>ZdTkRDS^Lx;!_uEkwr_JQ3V0=`M`1mx zoIHK}L?vuQ*8;y1wZm0Ojt~`VBgE!*SXGlSn;V8EZwGoPY{Y65m=L7d^E(OmP-=Vt z91@3t%#$DW7jNIVb>mKOhkY4*5v(41p+^?x#xKNY@?W?Q3sio zHplmF*DAIm!U$w-FWdwG$UDOEMPxyPd35U|HgW zu*Ym^1h&LxKhO=&=0sWHSkQb32`+e2>U4U1IdMTh+8yYKw{9?zSn&$1DeJLjn!e@P zrWxl=6Y#3L$QMlWqq^m`HCfYSLDe*Q5o}`JG&eo*AT5EE>qvGX!J_8au{fql+*Nfg zAv_!UE8|B|Jb+{`60GhdH+ca$B)E_8fP6w8Nm538sFI8_e<}r^*$SVf{jbZ-nr;a}_0+a$G}_L*4FFXWBE7?F;-h z#PQc!>giVRpJ*3SR K9~1m0m;VRQZL*L6 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/aftership_estimated_delivery_date_delete_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/aftership_estimated_delivery_date_delete_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd5906b4ecc50780997ebf9804221f2bb8cdd17a GIT binary patch literal 2607 zcmb_e&2Lmy6u z&+mNP`LR&Q6Bq-|;?zBzkUwy;KGH3QHZK6PL^$EpB_6dXMP73?OM`F9O?kSdduc13 z$aOd4Wv#4dScaFga$erbC-Su0<#k)#lxXAw!ZTM1&kB7d)jGo})U}dv4<{uWciFxl zC|fy!AB~l?I5%QP;=_OoH%`Cr2$z@iIQ6bykM&WfqGJ856RFrZ7vcun1q1rHaI2M; z=@xCDLz|z&e2EBRQBExFJosd#xMt}*CDL3!1zMP8cp7Gz_AHy|vhA6X%#37K>bA@%tK8}=}jCYImOE7>s zxdr2JjXATkuIdK1nvBg#;8z_k{EA=|h)cY8i>=Ia{HG}G*$QoAgr6+@cM(FHXMtHF zs-v6MP`!C*WS&ez%04+bb;vyZmVQZB+WW`JO>OKZDW&2}7)r-iaWkG?3Mk03_nS$8gTCBR(@UC43=m707Z> zQ(;Y&j~+jKq#V}O#lSDCcG$|v5mDJ*4>j8gE4T@So2_qT7wXL6OtwQl9MG`}t3;WO;JOsVjx2UdPxprmM zJhZ$ENW(bP@?~R*bfRIUzzDcv4gXvOxYkcKUYo{pe4}&NR$k1gm$|>|KU*Kl~k}$l-=D{(}ONAO_EA zMhaDvew>0xmNYp8Hs*?>U=p8!!5(;6Cri4-0++)`aKWQu=MBKO6&DQPzC9iBW&@MS zE?I^(B{Mb{^KDNs7UvlQ%xW(3-Hd%wv)#5P%NP$TjL8D*iA}~f{0IPP5v0;YvJD9q zxWo=7F;(KOifc!aC!q6kc@V{eNOmH@N>6fBb|Z%b?L;1s&&UH!OB?qyWcX-9-+NQj5`WLNJl*X5BjZ#H`P1?wEWx)iLZt4eD5Vd(3GMrt6#gOyej|fx WWbjw=+CRn~IzeyO9}@f~m;V>d#=kHC literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/aftership_estimated_delivery_date_get_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/aftership_estimated_delivery_date_get_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3802d952b524e04e0646c4e561dbeda557ab6caa GIT binary patch literal 2583 zcmb_e&2JM&6rWkI*K5c2^3ehTScSAvksf=S7*mG zjv~l`w&7BG3q3W59*T0|$RE%{rCuDR5@_41m8ewp26ee`>U(R)B&gvKI!fNYd2im# zyx;p6|5zyG2#kJbVe)}W$OD|LjdY8l%}c;65>7aEiAPOJkyl*BRN$L(Q=V$7UfN72 za@EzmjG6ItQ}?oF*2|f>M4ooLyu6vGL?LGh*RB(uvDM{N>kP9{S4#R{I4RM%%kup| zTG9#pXtbon+4ro-{xIOS8>c^TY?qhRICaLa$Lfevk+FK-iDax_2+_cDVFPu{cB_@v z)-BpThc-Wl`6982NjWi_?O7(#W!f`6nd!-_$g|f~ zGs}xS2j3hwco%%T>^$Gb^Viko_6^JeNVfCBI!O`y-4PF;sY+W!m!0taNIIS+Z9ZbV z&J|nKM__W+mgB;zOgsMMd-ZetBRdKK5qtJ@t{cXdY!l1T*}@uFA4gJ5#Jlaa;~9XQ zoX#HR-*ZQmA_3`9Ao z$*?BNM~4p|DTj4=Iq=J}9kX(BL{zrcg3LCaE}w|0ei4SlRd19Sz8;alD})Zz8N4f`fe^2~Hm{ zi%`D+KQ4M^JcWOZh#jDWLNuPD%%-Bi7rQ~;##g)we4K&Xp=S2oEjx$idvRZMah}{a zdKct9qjv@W2A8Tp8v3Ak4V3?rTVfaN_1~^=Xh<*M3YzajSMUUMW#59ldF{rv730v- zE+7s4P|K0^WzmVxAu!rJK6A8+1)^YqKw;2Ph|kVee6CoogY}+70;(ldaidsATruy& zD|jR9pwM+%QOj0E;I-m*dTVj(Y|w+7V=By(-;KV7=$_HHV)QM|tQaTmya}YCpLmYT z&-RNsDm&0Dw>hzMvyQP55>6m-d*LR4K+cIAKav*oIf2b7E^b7sloAI}oC+>YZHiBl z3@?HYZh*%`B_Q+Uk7K9qM&FP8bnINi=s~1&X{j`He+#)F#xRQBA;jMlbYqWH5tZuP+?3Iz$P{rTld(5vsnyf z5|}4(SH-oW$g`o(a&ZvF14wov!2(aRQ{<6Dg8M`skk7~?MM>)qH8OOxq3*pkv8o=q zf3Sc4!dGln?Z1CyxS{S}dVN(LUdJ|7ntr>f(ex0K64+|n|5j-Fon{KShsbqg<1`UI z0^vAq-2~4s6%mMP4Z;9G2rMD-5|CIA>)i6CQxPi4u!5n>*F$*eg@zK$IiVxTqHcRj z$Ltwt`w{*w68O8V<>^N6pXeuB$e$7?UBy#l7U~z T8~^Bg=s3N5?lHk{a`}G&Pi3`A literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ac0c5a6c0f54cd0caabadbcd70a224d08a8d534 GIT binary patch literal 2664 zcmb_eO>7%Q6rR~#+iS=6_6OQRp-qUI*2<6Ds)bUjqC#jDsZAx4UKT~8t!JHXvVY91 zOB_XQ4h5wbinyel$bkb@E^uKUWqH&ky z`$1$yPT{OyyJMYLS)-Q&*z;eNWHfFok zO3QSMw)dgUPhh-AY+_PQOyv^zWU5>-HLltzuAKrcjM6*>qjYXGJz2 zwq56{E$YKCxL}FtabZ=a9e?uOzzba)CcIN0;qTir1Z?ctkz6;l=d_a87@aMw0r-K8 z#6-N?UON&4;FB{k4u_gGI`gV-U_}$LQ3?F2!)?D}vkF8h-n+?C<~jZ|l-5jzwh_ZF z1OF~UX!ATUizMpkrW90fYzmnpQ;@(*&4y+cZBoDM_b_)(k* ztAPOU%#(2#O?4r)(Q0KFGuY#mXj@H*;)%c+Y~DZK3iJ`xVFR3F4vjE znP_LgP*{)CQNSQ%vuB?(4~ANH_JF5yKahFyv+?4sYd5dm4sP==gD--WeQ(@N16egr zH1rcq#Ck)-@WMzU)(6ZY6gtENCq31k#AJ+!9iW7YHJ(7vrexrY-5_s+E?x#c&cNwV zGkb0e+(biraR+pEp4>Nj7ovMc?+X3~m#RP-`k;6Plw0JW*af!!-zg4v*p@hjhW4RT zxEDILZy~yM{pR%*0i84=qGx`?fJ)>{M z=v$guF;3on9Y{kz`3&cuzGCKR)B$O^&550xT{0WN;RMpU7fu3L2mv*&3wK6mBR>K<3FG$4-AEzZ?GX*hs_ZLCktqjGiT^fx}-z z!W?esW8X(W65!w+P76D#2|rdLt|dhbf{oeYFqp&_W1t&e3Cx(dtKwQxdNy3rTpUF40Fs?Zu>6yZ6?x>4pdIM}`ItOZ zl$8D;O@@v(w7s_{R<$Gd5BASr{EV$?{r8U?Z)p3MUR~9WuVb4UO}*Jn)6@`>60A*c z|68G{x0)(&50LA~#%Usa2*PpNItlJyDk2co8iWCW5Li~?1t75=*16?JPDN-a!>WdN zp&r7QgGi$Uvrp(qvZ&kM(lL7`vVDmkS^_@=Tb^$8{;__lh5Tu85~koYDiNs%Dy8&M ip3vT(Na0U%;8!xRN(O!*ul=L%q2u&h=Mlj^IsAWnDAtw$ literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/aftership_estimated_delivery_date_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/aftership_estimated_delivery_date_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fd6f6eb4149679ab4ce2343b9c0f8bdec448f28 GIT binary patch literal 2615 zcmb_eO>9(E6u$S(o0&J$nR)yupeVF96ej%{AfSMR2viLTmV}ngGtJFo?wj)3_vgKD zu+ucq1)35QaaUZ~g$qeHEM2;AVd7?*n$SEonrLE-8*pU9%5&bE4lS`Pz?=5GbI-Z= z+B?CaknmL>AhVjh%6L((+ z($r2o#qB41$Se&z@GP}Cv3;{HvJn(BY=K z`}X*XdT4cj|J;So*oxY}dgy3V-Mjeeih6V%+fr%zcq>EGLrBW7H?#F`g{I$ZrGUGS zTt_xWW8ni3j?v^Mcz(HrK-B6G1^_}}DTx<=L|V|`rWe{(p`r{c89IL>fY(H1P=a|U zG$c9HZB2B{nhq^b;_oJbzv~iDH+ug_JDDJVN}PZt_(DoV>VAq+`mjJ~?~kPT2if-v Z8CW3$Ka`c3X3!Eb!|e*ubR!kPd8 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/aftership_estimated_delivery_date_tracking.cpython-312.pyc b/tracking/models/__pycache__/aftership_estimated_delivery_date_tracking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..892cc7d392737d921acfab961faafc6f436bb237 GIT binary patch literal 2459 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 D{G?Dx literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/carbon_emissions_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/carbon_emissions_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99104d9c75bbce5b92fa0d4c89c82743494bcb20 GIT binary patch literal 2394 zcmb_e&2Jk;6rb5$uh)*9Z7D6~qisTHsA&=hRA>klh&BaPY6BuEhegq9<5`DI_KTS@ z)K=66sYvOC9#c-_z=0~49{B?}AaO|)q*e3d2im# zzW00YO};Oeiv-4DZ+Y%rjga4Pu{ClTL)){!tPn;R^+`Z2N|9H5#Zq8aeKpW5Ey!89 zRId4Ykhk)IVHrWeDg;HVn96g0Pf)T-lqlqF!t{%T1T%T36M13=CCfbBolZkfP6EZR0iP6CE;Q(#Q_3O3l z=!|ymq3wBCuMn45lo3lg3qDyYQ!I_CZjNckKnp9K)c}XfW%}y_ee_M(~e~Hgu`c}@MPc#fexK<_`)=IY71UCcOnX6-<2*q z-aN(Lb43h#w>4hugYmFtsnKMsycLEIgyb`c)(Ab>GP}aMA31U+$$jkj4Yx)+ACFTW zem#WH_Gw^Ni0ta-6;y8@3RxuckT3TSMm@4fzoMVhwT}H1xvETFB^5Q%)87GxAx1zQ-N zb3>OqGUC;!A>)RuzV!0wi`BR(Ka9ev>;$-)ULmTr6a(Ac0>KUd1$%3kUE9LJo^9G5 zvv~)Kk+_-YGO{6*t)mYM$Vg_m2Rso6fGm-p%-xsIUpjv!y28GUzKAyVAHAjn*)+%2 zjj=YyavLI8e<>n^z^p*sK+JK|edBJ-rwHExN+&BtXhkGlai^?G|dN3-Bw2rl)U@brm&`CgLSB47Ip2r;N zrtycuP;0(O3=AnI8h--62>TT@fefocoku~2*7!rC)wRVO6bQ)@`PCd;7T3+e4Rdhy z+=e-R?G+&F#`u4Ddw*A0q_P{8wGPL3J*Y2ij|L-9Q1P^?C?^A8M7ngWj)8nne5L3K{tB}^CUqeca zt{YR|Ng!#Y;AzsiD;qpaR6wqx@WXIMt9Js9#P&PX2anWDMdQzbm=7Vr4R?CG?HJ!F z+<W#H!&VU$X6w8jj!5?$x$Vb0bJ9uu0$fmqK%|wN>D5BG;8o(^Pm1 zgwr&;5-+OsqM!8!L>c_#SQq>;Ac+w-nG;H{#x;~-SwgRF#_+6i9VM7e+(1%5-OfyB zyXT}ErY|wae|<8Sw!3-9IF<$Wbv_1L@Ff$^1G%YEN^h449r%%y{~!l{Aw!#F=x6fm R-^Ly~O|La?6P(kJ{|5`bag_i7 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/carbon_emissions_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/carbon_emissions_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d278a5d42e0d5a0b03c20fe874aa9f8ddc9036f9 GIT binary patch literal 2345 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 G`F{Xmxmq^> literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/checkpoint.cpython-312.pyc b/tracking/models/__pycache__/checkpoint.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0956c932eb0e828cad212dc8d484d0387a0cf700 GIT binary patch literal 2990 zcmb_e&2t+?7VjC2q_J#i{1qooVp~q)thLxuObDML6vTvGia3XuJq+cVnoN(y*z+NJ zMj=+EK!-qy3*?q?A_oqna^c7yz+tQQBA2!bRYPj20*d0aVZB^(+V@(Mk?kdW+9}nW z_j~Vk&+GTq`ddDqBk(-ow5o+HAwM8^^rU-?wDTb_w+JOva)~GDl7zhM%DN2il$-Jt zUGdU-TF4bQ<7M@%r|POVpbvOCJtyR8chDQshXkK-^IkzO2tMm--mpF_c-0;8M)gsN z$mBIb2W}9Wvz2?Po*(+ymRuVA1wl#TgQo8Xkr_FGAFh;SKJbbe+7|;SaCycmysfG(o7dB8X+wMBN$Ik}=qmFMz_W8GMYqJ(OegyLLs#*QZ z5-`KBUbX!w>?^IFKRp^dC+(b-Fi1AhB}#PpO$e5rqOz{gl%1x^S+E9_5hxv_tU#F< zsRCtVG$4=~qntnkF&Y#o7o#CM2wxbAQC{fsF)9dDh><3c7NcQ04C_W>G$M4PF&Y(U zEJkAjjmK!59)NWdF*+c02L+m0x*uvM1>bJ#s_27spLM43Z)} zx=V5dQaj6Y{TMf%%oX9ebY;V~q9V0Ji#b>9uxKSIDmwmpz&ud_WnsM1$Un;OTVcf3 zc+O%rq?H;b6hP?Kt6b}^HzLQgx#|X%*n%sT6K(Ny2sLH%RKuw?rjy-%uS9VBq;hz{ z3hI8uwhU%hp~CpsUTpX#d@SqPVQ5zEhL-FsifoOiBD2afVf_le3%$1yTk|Y4-!(wd zC??CWn%~-AmuqW0V~bjat%5qUYzt~Kd7!K?D5zCJy17`jeVdt4z$!sKs@0>)lV?sXRcc$&+ksz+ zm}zY~ezhV#5mx$nE!VbqCJGFwfW}C_pvpbbJbX5s0n#MjX$L-e@1yr_2e;{G!KcCY z^fO;(fONEH+v>ABc;Y?b!)YkOcM_OeFrgqoXteL?2k0_k$3O`aMC-@F*a!ok{Q=~0 z1lS*e=UMO$HI31|9;56DG(H5RNxItcR`iW_d>em@ch-Tl)kU@d%KwwE3{Us_{!y5t z`~5>%8U34x{hMw@pS=Ik``g<5oe3aqb-w4_?h;EPiOG0;B(F>BSZp#D8x)ze0+Af+ zMe?fYIu!a;#0)AgWw{|&F<6*(Rzi<(FvA4t#dlzx1zs=0_w{ zexse-)=u8Jwyiz?<hu5O9QzyUx)deny%%$A>~Sr%_neeK-JAwb;8-~)bbJ^{ zzGXA)US8OH{8EaYL2)X$vhmnMi?sdMp;3x!LyT3E{P@(lufngF|NhjU+uAH1e|B4& zy#qyd>I+EYskVCguMrRt1GsE6%#P~J=P8JGNoFs?9*x2>Y>9Jsp$OORT1jC~gP5H| zf(8!@$@IdT7Y$y(b%zr1-VN5oD)tiCl#X)M5F^wuc+M~&3U${8e#kK1shchiS3p_A zpn+u=Y#7#X%`kTTMF8mtNZBZoF(l(i4j{qWWe1U9m$6ACSPSe3lA}nbkW3@N*};lP zurFB!304muv|KX`JsZXoWzV1(??iSS2{x!GM5ZB!1RV+g3FHIvt1PG02N^Ou*L?kE zzN4Jz9-eM4w-!6fba$@QymWJ|qm;VS$C`g?c^&20F71(-=Buq2JIYLVa;ka0HPun3 zx=Ux8ueXQG9py~-#C&t*=EaUO-z_b+m4mlIzu29cZNAom9cR0+`h05!S061lFSNk0 zxNAw@u5!A0p*^(FQBL;_cN8i8+)hSHmywjf`^?C{WGVf^P71gO$R)B>NeF)h;i}Y& z1xBDWj=5Z~LnT4>81^eW0feiyEo%CaV=)C~I4)qKZ`EMjvkXeG7nq7<0Cgihonc># zY(K<5gbe@G^0`NsL|L>=Snl7~M*qHGFw_a3*l!E>t#NgU4WV*&zp{7B?%pI1cD>~8 zP549gY_D3+v5R1WcV>7B$b*z5Nxuyd>G-!K|1+8U2U+Nlh5O{#PvpXVGJl_(`*&te OT9s~2{zmXE!uB6v#S1n7 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/coordinate_checkpoint.cpython-312.pyc b/tracking/models/__pycache__/coordinate_checkpoint.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a897bd0e99021317e7e554080587f21fb38a53d GIT binary patch literal 2157 zcmb_eOK%)S5bmCt-JN}T2zd}77(0$lme}5a0wf`d1hIff!5r*xm?#=ewr8EO=S6of z#Fmx#5G3b9jt(b$;6UU{j`;x`khs_~QlbU~5=e+!!jg+mRLyKQc4X&7%lmb8RX?h} zuIllR)oO`AJK`@+9W)5}0|$>=E)!_`5(rC#5k>Z*wtCBX8w(X8dYUCiel+X zKaRwBO;g49UEzHkGcQoN4}33RHACs|MYGBn^BYnb=X@cR`ALEc+yFK(CcL28$hOX~ za}I4!!+42!#HNhc+Ifh{)|qA-O!sokI0aT1<q6 z#p}jO=M=jPnjTi#q^UqmmfCYBjydxqS9)hIdySbS_9HphTk3ff4OYSyi{AjA4 z9wF+DE{RT~%i?GC3n^$jKy%pbL-^5?XYrXH> z$pfrg$5+kcZDeB$r&t0hr$ZntLFxi)IO(bOgtZC6p93T0p!I|tXIjJ&-wXNsl z2hdaG8a?e@lsB*4xVB~;Ufu_=Y97w~+?0B z1D`=Wx4s6KTVw;4h#@So%LpS9eeV<|WeiyMx^tFT5{ zjHzmBjA0TUz5C|*Gc!GfRo6yQtpP}6ee zgFNXUT=-})UN;Wi2kGqMwRK~#ZP46_cAn-&5o$0gzv~~3=H6}VAU!~-tDB^$@*yZE zX?7$YRO`Vwn=N1&;^dg${CNOnCbP_qq~G8M>ae`veVk3;9p!n{V8(D0p@_C!na%O8 zNG}rjwdMHVKo-*0FgMIo8L_ANahQVN2Jsre1D#U(s6yz#&!qYn8T^e5uan_l$-#fk PeRPuEI`N2LpE~~^Om`Bs literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/courier.cpython-312.pyc b/tracking/models/__pycache__/courier.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..265d3d4a1029ee0efaba2fac390a4540c859c4bc GIT binary patch literal 2437 zcmb_e&2Jk;6rWwM?Tr(AlO}0HX;Y^kA#RhnDJ_%|5FddGR8pa|mqpQP>lwS7>{n;k zZ4*VU4@Gh>w6~NKJ#e6kkb2|~;DE%%k&zk=Ado;p+*(2}J@MXp$xPLJLr5t*DOGQYe%&RuBsHtd9ds8zxZZm|ZTl zrf%7I9cfblUL}m^5+%BP9(>XhRMr)mU`eV>Lo1+Egpx5zM<^8|HA3kabwx;xQHFNG zESVT}N2ohSJyFk|7-gfjY>aXd%0*~^YBv;JqXV=TzP)si_QAK0?Vvm9jvLBa?3LaR z%r4r$jTrz9heY~augWdPmxnTWC^5==7ZzA4jHub=?3Pxa1R={O2T&A zf{e|bMJ6j`LFwcWQOP1J(wEX_(po%zj@*-H?~y`6q6x zEFL>?bgJktg&=e>g;YOjd3V8_9V5euwQ)%W1AA&|m zDD9~N#zNq^d@t~^?>rB6k%rx2%d)m@yGV>+Pn@PkHnaov@PT$<9sefomccaC3BDg1 z|EG=eJuuh5Z;rxM(Xlxs4&vr^#+w_ihqtcZyuPlD-Q5YMp^mk-wmq!c8jiuB=WDnk zl`+6%3@`{RX%;l>Z)tehv@L3eEK&=iEm5)qp`ucF+8j?dz}pIPx20@Xlo64(eOubL zsh6<(ZZI|St2SB>9%!TM+UVV@>)NUNuYhT&r~bo$#8g8W zZ0tJRRHimgPB)Z%WB-Y!GQFut$=5bhQgRYa0oG3S{UuAu*EbVTdx*6*cTS4PM?jvF zTAtwk3ptdzT!ljhVL2ud$J7w2zeG(pv`Sn-4s#f8*CikBU7kV)W0b3Cy0ERU)n>4( zA#($KfH?k2YAMyJ-V=4Yb*^vnx1bBYB>`&xFd<3O;~pX%_>pA)AcuY-<4rRDGui*Q QIxL-&>egd|-)Qsy01D4tQvd(} literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/courier_estimated_delivery_date_create_tracking_response.cpython-312.pyc b/tracking/models/__pycache__/courier_estimated_delivery_date_create_tracking_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0033eb4a97610a238230232fbd97cb663d246af1 GIT binary patch literal 2494 zcmb_e-ES0C6u)<7c6N5V+YuYSBtQYFthC)iKmi*PrD{yDCbqncX(q$o+dA!hdG9QC zn+6(#NqLdS;*)*wLDCm|;}7t`#FuSq0vR=$XkvT=S6+DXoSE&?5=%nkO?&RS=iGD8 zoZq?U-2I_kE)p2W-NmVIH9~&J#rnu)3~gNoW{EJus7HKiQHs3cDV74W>Z!hFX@1Vi zrE<;F{k)a;4a@KgR>3b?#Z;d2y8Mz=qC_F@5~g1#EYGzSHS=MW8%o9a3l|ldbU8r~ z#!l>pfgG(UN#QL=^7li=y(IUJ%RN@n67|iXk!T}sEl#wHu8b4og9r^A4-U}AxHnnL zj?QS?4{goDdWmpiQARA~62xSwOtCbk@*LBKK?^HAUFF)Ve7e%pRf*-VYnH)E%z(MT z%B%o$k$16fR=lpQw0&A7keIA%g9IadAvt*=tP7Wmw`J`5PR!W|_uMO7G)7=?L2#hs z!l});!PJLbMgRbx8!q<3cz(mwY;>-?4$Ma~78A*CzV6xvKvUl~1GmY(Efluz2G3AB zvo+d|8mBz`cM(Ec7lBzKaYr|;pnCIA$UK>bYxneE)Ft!uYx)IUY1@yH+sf!|Qc)8< zii8`)Nj{nk1wfb-eY_bqtNYPyCDA0LKGA1Bb;OjE=(D%?@n_Xbk_%a#^#&s+sE%+s z6Ngb%vYCM?9&q8rp{R!SII73hlc$GHRHH`xaTrwNb}Fi=3t6pY$+NdYs+K0uUN^Hv zJB5Q$Bhll~h6K!=ef~raW~RF#7V;qPO z#&KXVzIpA&wN>-j@-84v<5(8O#zN?1<`@`lotb$$i6x<6NkA#kQOHbBmYFM#=VJY) zIe_|5Yo1ID1QoBFKu{%iKWHIYz6z5f^s|f&ZzE$J>s~w=6SqKqGy4|hJ+p7s>|35) zHP7974M@{C_l$U-ZV&S`?%=Z0=0wj{4PrAMjKF<83||7_7hUNFGIoL*7ubuE?#(b& zRPi#3)$sE4mf)n??!$+^7eS&z_9}|#hco87N8m_o-~GMt>`hcOaTLU2010k*+}-K%`10X~ zSJ7@yN4)ufiPTCA!k$WZV%T=z_}sRWqHP0Obr1QHZGTdCytXE9+bpcvwkU&5V%qkG zCmN*PAQdJOyb$65l3pN5SIu*z^f|OsCb0X6<49gaf+d|^Nl`)$2_7Nw;r^UFRFs_Y zKqrGIo7%ox6KmRu`zKB}wS&w1*R<0c*p^0fXInbW4I-(4g}&o&h34L9slYuzt|J?# zsqi5P$7$vty#fXh`D7h%hsXt1i|7H87*T^cLG0FqhB7Qx=;MtDUT2}B1aFuykQ7k2 zBh%S@Hs*oEpDzM`US;uZj`^`MoI!nFoP{m;%*j`PJWwg6k4l6d`H7VOBu9TG{cEKE U7jpO?V>cbAclSObIHw=~FMzX`B>(^b literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/courier_estimated_delivery_date_delete_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/courier_estimated_delivery_date_delete_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30b06793fad49c5df555d07853232976786d4f98 GIT binary patch literal 2528 zcmb_ePiz!b7=LeOc6N5V+Yt$WlmIPAWu@%`0R%*XST!VA6I%|BX(q$I*E;R|^SxQ@ zHVyQENx8_ec(Ml%l3qCC-GhmjZE6A;HJWH*yn!nhPJZ9ac4>*_P<&~>`QG=v@4ff^ zzCUk&D3^-_#vylp;#-Z7-*K`!av4Kgmw{Ozj4&?>d)MV2t7wV(R?tYaA-5JM+C^8!iSa>%295_CXd~PkuVq_j zw0#b3O~ZVFaAHwLEaejTWT{NCG^X+#)6RevW_miywP*Qsrl+$K%U{W&b#1AArd0xo$-34^(8Cv!6K{ug;d1egj9uS}IUC}hdxeX}5KMsQF&`C9 zZORQM&NnWw54ns01U_@F*aKs8#;NJ>OnDWck7X>zk{x{Y3N`?n-oa*YiDcIX3fp&s zXDFTN8f|-zpFI3`5kgxRfmtANM>naUdi_wyESZG#dwMYHl3DsS{emvF?MKLMW%xF! zsEHm$!VTgiAB~3spiGKBW{Az|eso(&Gzlq?=u@9LVnRwhv#00reD#v#LRP1}!N>`! zLtIY9VN{iDYG8r~TsUzks$o5j>T&hx@xw=|Q6v5&461QEB-Qi?S*>M3v^PQu?g4?c zSIz9p4cle5Xa{pJY9x9b+7O1BH#Zm3!OVOIxFz=jnIk`&+iqUHarIVsi+vS-87}X6 z{f-V~#XQ+GPPP!(b>YF~>?ij#1@|)Q= zFYlRs%Vyu=^s;&S&Iuq*A2CEe?xs;J@>6szIo$qfNY)8V-Q!X5A&SphOf{y28_uKaH3$72_oW-mh3yKMF@ zLZTo32GZkj(-`?a29n|h&!H}OTo*y2LKG{C=!ZRKx`$v(Z0!9#@Gy>5G;sjLVgLy) zc--CT{`fZHg4fV)XGgq#gR#^~48od9cVgIf;P~9OlcH?{Vs#Jsl5Kxlcf7VHZ`&-a z*|sQyO=8;innxU@-5?bv5=;uQ2T2c*q^ssRQu-VkEfd&{#33XvBEj-bQ&W_XLxNjK zeA+)J4;3Y6JkZJD(WbWR*4T=6OVu?iKC$8n&g;+^LpMbAw1KV4-jMTcNo( zS}Jf4kn6}sX)1gO!cm%?kEa3#;Q4qRa0kx?R*l#SBr&1}bAs5d2@Pdfw9wld5xn0* zM+s(`Fpv~bwJgt>lp?QqilxA;daAEknxC_B zsa*4PKX2uI!!rDWRq%^eF_q`MF27`zC{f4-!t@)2<+-+`W(8bh$Sz~fQj z)TZ2E;(X&G`-IB~5a2Usi#;$lVVT+u&y-i8`BcVYEZMfL7GKH0T_!uH+Z zB}!+yM%!`Yl!yN=LTKv}FbgE^=q43ZuOAATC6jRRUL1_NWR`wIzobiT`w?N8_OY5R;;hcf)3NKf0?VnuO#h`qUSWn2-{E_VhfvS-mW|kkx5#Fmi(G z5SLSN7*!>k8kpb#7fu|CYFLk>dR#qv{P2-#)QCR|gKFH)M>TaJtFfnCuJCj?I3SsD_#RW z$-~#7X6E!JLqp@&@zk9_=Ex&+|9t$=+`o)}1B>H8n#O?G1pqCR3&yn=pZ6Qp1SuAkfw3!B>}(KC1z>d0cNSqiLD#;iS>Xm0#|k)dP} zU`tB6*W*-C#TzJA!z+^;qLW^P&7*_n=tNe4%#lBioqHg^8~X9s#irSdIQ1@@y^CE_hrQL83zbDvIcbGiJJn;7Dxa{XOsij#V^q0K{Sd32u1S z-RbrC2I7Xd&~9f(y#9c()JhD(o=SIO*mmIf+_saVZ3A3&5BZX9e_nUIwkB`eEUekK zD1%L6+V+~q8l>GI6($nA5n>OL9w13q&2yymIkZ(Kumg!hNM1#PRh?c+Q9=$09wG4w zze%1bO3rw!lfk1+ZP%T#7468QBgdQC-o@Q3+VM4POQX4yEuH2DkyOA!-}1LYbEjJ> zaF3De$VO=@d;-Ezn)yesfB{54UI*MEa)I?CwgO3vsKJ~dc56aI8I~(F^F{1;k7^FZPc8G%2vviR1={LDC$L48h~ge~~o$v1&KRw<=VON8$KiIo2& b2Yw~}E2RGyvhN>b2OXskDo+W{>Bs*I3XqxK literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6da1404c458e481b216593cc8e19cff1853bbf46 GIT binary patch literal 2585 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/courier_response_v1.cpython-312.pyc b/tracking/models/__pycache__/courier_response_v1.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b565456c39edebbddeabba202d62b1aeb7c0233c GIT binary patch literal 2325 zcmb_e&2Jk;6rb5$uh)*_O=Ti)WoW*)L|+ zrLm$mha#mHdQ3Ty0|%;HdgKq_fW*a7kXkKNAOS+$T1+oF@!qcEHeZ|=dEdNwZ$94p z&3kYBLw9$UKs#Amnz^qK@*55|TPk5_s{zb1VT4hKxYVE&dC8Fs33}O)UByt`l#z<% zile$|BkgL2=4OnHn>DhrJmqw`IU^VIs?+V}jeN|f9o_9QdMJ^|dxUAX2+P>Ys+^o{ z^v+Ag>|Z!2(x}VwJU_I;n(v9pq7-G`wuF7bXSNfi-mTdVD=LxvmNy?M6SYbhDd%e< zjI<8}Twpn{fih(~Rp`|Vc4%E52kyXx6^RizLgL+tg<<+tAaxfoW^}TY)t;$@@ zn<>Xfh;kc9a}z%E+IT6LkJQjNMaUb6cHBlO(HsIZ#4#X?d$a7XNB+agCK7s z!jAwSrNKJXG!E}-II51~8Z>{AJk$r5!Uy``8vaICsz93BD1Q-@|C7nQ5BA#KOa|$? zhncAAM>BCXn%Tb;-nn`E=9)gd(g&oe4JSrEAAlWPhhfp)xGvBthN6U_2q8!(0oVNr zuGcK52GMWF2tr)S6-PuGVurE652Hm`7$6xFv@=!iy9wS$cjDbq4&Xw(o<;JjKC~nr z=tFDz(8~2S{mlK>fHbu;|KZN|tXrUA$L-ZN$M^4*cU#?M1cGT0ECKJbHBs|KXn7Tz zV~R)lttb>_egeg^|Hoim+z>=EkqH>BKiH)xo^dH6F;7Mzo`!(3Il8UzzRg( z*f(&gV@+-9`w&PB1r&Of+hLu1kqp=uB|Zv!H1ZR$4i^x4CHh2 zM3Pe4W0mwDUz})WkE|;L4@bt3Ev_qLErq7uXsI++LQ;fjYVY3?O}*KYfqRTxM|P3M z!Y3fSNRvbHsNz2Kv|0z8!BdX0&0hc#X~8_Rys%c`3d%6Gpd`)*P&m1Y5)2rwA<3Yw zH_@5)_0aYNKGhumVnhcw%WWx+Em6WZ2udu60!X6a?OJ?#%v~xn&*4ciLR(SW(9S0J zbdKZWi!Y17ICv~mN}uKk9sG%O|4B~#LPplf$Rl$65AyOO^1(l9AH7KLW}Xu4V?6!^ DkE}@D literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/create_tracking_request.cpython-312.pyc b/tracking/models/__pycache__/create_tracking_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c018e9da79f3cecd44b503230ca8d6550d357ea GIT binary patch literal 4335 zcmb_f&2JmW72hS76h(=mJ}udnsBcP?L{d^@MRwxUag@4FEC-G39+(P?4R=MawO^TC zI+oxjJUE4NNp!P%st!HG@FmCo0X-Dxg#rtNnAB*2wkUdYs^;QT-y06el_2@lh4AD2 z-kUe`=FOWoqd&!BQ31YLeYfyMn;`rhN&O4e8sgEfq47je1ywWzQ_P7XwgW~W7l7ZO z5j3ToWQKAfCYOw`*^+B9Be{s#nrk(qxhRu|j5f19*Us8uBW8BwI#|2Kh?||cPS%bX zU1oQ#TNDDq4MA;vET~aUdKRqtk?YwGq}u+CBqh=|#jIvZ^}6C}YqqKx zH1tzlGt`tsgKt~gR9e;Z9+htCu16yuIB1|4Fo3kK8JjrJx=}3LAa>FD#RAZwTZ-$g z>4x?W(G*X+LzMiMZWTV%J}GLh2OSdc6kX3YHR7JyBVTj2hTL=U$O&KsH6bUeLN0I@ zBAE-Sft;iUwU8>k3B7@Z84GdN!dRHI2xBdrwK5jrEULD`C{fPZn68bpcE;K{i!m1C ztb?%*&f<*4IqPJsld~?yx;X1*tedkQ#(FsGWvrL8KF0buJIB~L&iWba=WKwn0nW}d zcAm2fj9uXDB4Zah8)R&dvmwTYI7_Grh|4f%!%R2A*$88!oQ*Oz#@U!U4t5iqjWgXO zXA_JiIh$l`inAnR)0|B)mf~!hu^G-%jLmX3qt3y6Y0hTV46rO?m(=;kQf^MYq%Od3 zT3uEb;WwjY)z{V69!t-7uI1)IvZ5~eBnxm>F4MkKQ*>uIIs)IRI;Oe36RRJTk6e#z z(74Bsfov7ck2OLi7Y+>#dAet4G-4A~BeJg2SiL1Xig(X93LL}@8q2ejBX8pIbZNv; ztU^&KXmqe<<`CP|T}_qY5bF;#vMsA{0%@#4y=_OMaYxT@6&=~I^X&A~HZFj2pwa$@ zr%FC=7cH;uaeG6trESyh26OM}PHmn(o9G4Il9?GyPP78l3fj)aE)*M$w$(f79*n|? zV}sHFLsg?aTt<{nn=W2Zp?2sN^Y`TVU4C6{l1{%Uk2CfACI0CK{EB09N*IrwzQ#uS z%G?Hx;{M46ta>zBi$04rEEczt?{W--V`>mYjQmbdV=OGDEHhwJn|+jmOZy;tM28{r zwqCkD1XIC18`5q)Om%gs9r@^&v921yWZEIfBE@geEQ%VKshp9bJU-ZjrdN3 z(b@5RByM7A1~4@tCB@qi-=120A1H>7)rCb8@-&z?p!#FnFfYhY&?9^)!JSl#dg~_K z1hu#ipC0!{hZ|^o0iY!OEuP$Uzl$di`Ehw&@lE(4S!S6;EClPB?!=rxx9jJHV7 zS!eP1l2ri`>n3;tD~#%{Zb3P+@*2ToPdkoBA{8X>qc~`PeE-b#v(0?f`mqBJn9-yk0goX$ zkAP`GE+Pyf3?U>Cu+ESXgi(YsgmHukgh>P}CS(c$)1F|2$qd3Q!W=>xA%l=bm`7MZ zSVVXYVF}?9!ZHGu3GyxirY&vD!yV(+E+(>u;tvrnBV0$gh7hjfJLd(u{xB z%wky@+z08RZ^6@ZrT5C6ljy+6MCrXf7;3^de{=1rbZM>Jlf+4Vo-VDFrLlvxinLO_ ze6=i1eFI)yt60DcLN-8HH0qus)J205sxk ztBU36c_N_<%QIZD+xW;KVU%FOArXXD)OFQ#vi8u^EEoS>CipKu9jf2e8CILzO!G-7 zKUg4er3!T6WS_>PNIv7jC+(-&HC{w#+Qq=Gmg~p!|7GOOTB&%8|szu@9gdl3{x w@yB*S9RFU3{Y#kqt1wp)=AH{<{}e7g7e0C}{PMryH^e*Q{>>i+{AH2-AD@NJasU7T literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/create_tracking_response.cpython-312.pyc b/tracking/models/__pycache__/create_tracking_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cfc72583bacbd42d401850ca31b185da022b231 GIT binary patch literal 8011 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 G`F{cE>aB+W literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/custom_estimated_delivery_date_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/custom_estimated_delivery_date_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f25bd4f9b44d69f276914c24a2c62684a6ade470 GIT binary patch literal 2515 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/customers_create_tracking_request.cpython-312.pyc b/tracking/models/__pycache__/customers_create_tracking_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfa117526bf967c5f962c1e674c031f636a2d5f0 GIT binary patch literal 2346 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/customers_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/customers_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b6a6e36f61bfc440f3ef0ba1cbfb963ba7f04cb GIT binary patch literal 2445 zcmb_e&2Jk;6rWkI?X_cj8%j$*AWc&UH6(Fb1t@Jnq75IF+8~kivZz{ZJd?1=elfF# zI*M8!isW7>2c(n}IdGuLrAPh%4oF-Q1*y>h0tqC?1v^5RP5@Cc_tRE7 z(d%Bu&stgEuna$E<@~&rPxNW8$1hj~N;L8|VVNt0Wx2kRYJbBj*0r+nCkkb%dYm8# zV<&dQKu(l3l{@7~elBF(Q|Y%{?y<72Qf~xxrH{MSSm|e787t%62pt>`0_c<6o2j-# zw`u1)wDmd2ON0}PGGb}xVNX_yX_n4XJk9izUE0O{7dmG7>4fD?XqxVfRm{7f#n?9Qs_ybB>sw5>9pA z4Q5Y=e&q3(vs3jm>^&|c0EI7%<@;egzC*HnVxhPR()%(N7nCkSk1IWJe69-72VubN zpyp3=q0-!UTu&LE6U^3}Sze``>~YG%e-9zFbrzT<5_fHL8k)BbjVzKmXsw3_qb^yb zU(rwLO2>ba+|VX&ka9|8qDZ(wtg_KeD10YYc^|89vzi~>(3CEryec#Qu_I=s#BcWZ z-&?4hmjGSmqBjybL1moF`8bR!lFbj#@_-8`4n-xb#ZfJ;9DQl@NF}Pru;WVH!MT!r zLRPAqMX-ISg1u?BtDAMOr|Y)MY|$yjNK{vuIJ5!Kg(Ht&kdd~_UPxXZ0MZ~onY*rC zx_aq)c%6M2ei5$qy>c@HWZgWrY8-1Jd|Qfur!y(SATUdCssLtO^w78u^CS^F!3f90 zypN_mC&NJO0euHYu^)Jqh3wF>aCCb+LZ7EG7)ET64f9YlzGWU-!@uF>86d01uy_WH z|I=Q?QxNOl^Jj23Y&U=O!D`6eo&5Wn@wLlWFRz)0mv;kMH4eA4f3VTJl{gGekFLZb zoxzsZu;roE=>$|_XS)&~IiAa$m?xM+|EH>+R0e{HZ6)?$MtFn4k#E;0HzPv7U7@jU zRH*AUfDtilgZyd^HsvjIaLpWCzPM%{zxgtdRpa=7?DOGczewXQ9xEMA?0nS0---hx z(3j6bCa~?iE8RfGPEh3n?-*6u3QsvDu-R2AoSu6mC`sA34GMZ;Y*_}C!Q+|;R0^t9*2DjN#FreAGkXnF)m8A4=w|I%psL@Nc{ZREPTDViwnfO3kq6T&pg zB?M)r1|4bqKhqm6f&E^+l9!UH( zBJkHzd&65nxM!SfSK)PW0+!&5Cb8bPQtyI>GVr&tmrl`} Ld+!pQljQ#ax1)H9 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/customers_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/customers_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d366b3aa0774d9367426f94af4190e2e4dad87d0 GIT binary patch literal 2396 zcmb_e&2Jk;6rWkI?X_cj8$wGzAWhQ}YBjL~D$p+~(T0yoB}h$rSyZhyo=wC*Iq2+@_)^NQ{y<@4b2R z_Ra6TH{Q_bDux1c%1wEyp?YZ} z9qUy$<7JJkrx}`;Gjd+u$jAD$+v63C0woH0hp@~w!m_ryoJzi76dOue`vZkCl|7d4 z2ay#yfiK3(ip-s{g#BK?Y*(h=c5IiGRhfFzZ%B2_sYOyf?}$ih?}xa-a>0Q*VY}0{ z#C1YD-=Xa)w>j zW!m;E$Ca9E`7?EE#;(y$#5iT)zlRXoJ`c3#hupz1! z1;ACk>{dd{ua4PbE(*e`U~?lgwr_JQ3V1cBM`1mxzVhnm%hj+E!HKIex&Ul7{)DL3 zHi0*Jg1otDVNNwnhk-glzY;cNCJIbIa{kD6a!^T(_dvX2KaeK*QQvvv%JnNZgPZJD z@MW;t|N7kwkTw0-igv7xh;6|gn=rw$!4t)J{ z7byYvSvLH}dRb(j^|G0srtshTUKhA?6g@x2%kUQW={NltRpJn)jNRJN6suKghTLWfQA zi$2s6_w=DveQ4?Os(#|`Yd}`C6aR9;C;NJVMqMP9I~?zOT4!%XfDx#|Ll6lZIPVC@ z7m?-HY>tfDzp$WU3~74R`%8UvSjgANbC%X6u$@|Qr( zt4Ppbqtv}-@$o@}VcfU7tKRD1QoM_gf=zjc)JzjEWYd&+(*%6#F7gG_{HSiZot3O< zvY=*~ya;=wZkmt1lAtYtmg`7%An8SdoyrH0U~R~rnrjK+*>DFkjup*EkUWb7TQ)90 zUO)~BIuj9)PssyCNo)5rWZ(YgSZicW?O)&9zsU^_HP3$zx}kMgeXI4xn!10zf3W#( z%Ue?i+bT^TZ)a$_f}{*CGQEE)G<~w20`5L?UEL&&l@CBUNt1vujB*JWZaRH^K9!Z1pl z#EU{PRaIo+bw{}GM$GkP?oH42SyhwjYhhDrlU_ZM+8IwI(s(b%1&$9JXw$AgThF%6 zu=^g``2zH1;u4E8Vku`KCrf3Dr7_jbG3_LHLDN$$*VXc=rgt?X)$(1fkZMM%RaoJ& zW))e572(;(Ox6d_l3QlGSn0C1+KtDmfTf?6@3WYY{bREKbVDRj;Bqm;o%(_o&MgiU zhhRKpPpwmn<*k(87YRQnH6Hn{)Iuk4WhwqJ3SB#F1m|5Yb8g^xzBGI%oNG99Zk={x z!ABnc`v{?(GaxLJr01Jg(7k;qWQoi}p*%Pk^~e(antn!CyX&XPb!F;0sj59+iFhq)Byl6Dz3}41^R>8{K*qJC%Umseg{alHD7Cjd<8f2!Nn`_Mi~Am8 zc0BX!hbY8BfEM}L+;jEfm5bM+YwWA&%V>S@;cM0JGAj>>Nhn~g#j|?1LPvRO}*dm+e;dXM< zJiLy7V=J=&YsMIV3Y`B_$ovV|>(OB{=*%6$L>F=^_IAS@Y$sPQUAeSw9$DE7ux1>| zg1o=}db}QiMLYAlL}#%Q6|6+4Ksp7y?#_7q*zrB)ByP$el%-ntg*1>etOb4mBf@I} z8ZKkIFw3JL<9py?zI)DLT!^b%*mPHg?01zjh6t{jN|{2&Vx<2M3Y|H zt6hoj-l^@jr^^Tw)6)n_I*mzC`-R8@`@D%I%x{EoS&hqzPj=)^5V z6`)1_IC|<^@!jN)N8ed94sU zIP9@lnS?FzE*l+!+x=Ws9&paN#y$9BY-2Av}(NotKstFQJ5hn~4PAQ*v8Ta>gy43><7tw#PQK!Oa7MThj1I z>&)k18`%W!8|_y&w1b<2!>za5!G<>6(P-|Kj!tvq2vyiZ@Bdq&xf2}~q+2NUY%?@9 z-Uj0g%>u$Osud(1q;PBlz6U@Wag#Y=;?=o^Hta&UJ)1FnoVbn_tSxRJ6wue7 z`E2(>;)Vi0;2eKoWC?F4;jVEqJB3sH1WduthQRZ_rBX`oln6ci6Dj{mp81uGZjjMm T$nZbLemX<1748sxrosOUMnNU; literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/customers_update_tracking_by_id_request.cpython-312.pyc b/tracking/models/__pycache__/customers_update_tracking_by_id_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d912af960aa1c0ae4dcd11bc5cc242641cf41897 GIT binary patch literal 2380 zcmb_e&2Jk;6rWkI?X_cj8%j$*AW2gQT}a}93Y4}~qJ)o1B}gQ_EUH!;&n9fLU!7S) z9Yw7VMRG5c15%1OkOPNSx%9{%zyXO%q98RIKp=sHxV4yGdg8rZ$89P~b6}LbdGF1e zw{L#$y%~RBE*A-m=iS!qmntE@p|Cl!DMQ=Sz$_6)81;xxO-hkhJjGOC&UhJLHB~=r zW)r>Y<@~&v_cc@V3ueJDn#Dw)^?Ll0S)xQCZxfcgL|EQYS2F20%yL69v_DZWsO+(W zAdKzU4FfS@D6(+U7S6jNb3B=S%XK_vs50|<(2(l5TZ^T7+7+?X-ivU9?STVz((z_$ zsq2(>zC+uegSVp2v-LLz(hl?{2vtwt9 z+qHQ&m_6Az#ol+$)g2Kp3>ODrJlZfZn^-7sg7Sfg`B|y*&~v03*uEo6(T8E+SV7&N zcDT$szU_Ka^Xy=@ZqGV3+KCpYJpA_%LffZ-St4OmoKjAhn9B(S=A1uQQu$3UE~kJriUZHNN2F36|88e zWI6%J?@W>Z$o5=p-~?kR?@Y}TQbQ22eE2?$2rne)+rfwWI%Wz6ZN`k;YvdRyrKt`LKT8dVWTr{+@Nu9>8iInIGgO^V_;+KkeX%TC2U!;XjyXvois|eZ(Xt|DL2a;YS*rR*^308*esd=^#z619j<5YJ_C*46%vzQN`@ zEq`4dY^yZ;YCA`>qeu*Jk?Z|Sq1j{Y3~;xQ>*}UxqPz{tDVhd^VHgzzWu^`(0Z=$L z3f~1pYEgsPLG0GJiaP95xRM(YJdr$y8Z0)hAt~TmZ@OkV=VK=j_+x_OkDc_uTS2(1 z9Z$1xf*%7De4qs8`&NchdZ$F_!5>Na5Aw_}WO$tn|4at|*7njVdTs9=f^!o5KNXW+ AS^xk5 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/customers_update_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/customers_update_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..992528661c27d6727bffd3fe5daa33a820d8c77d GIT binary patch literal 2388 zcmb_e&2Jk;6rb5$+iS=6CX|+bK$0d9Y8uA@6)0_~Lrsk*2 zRHE0sw4X6EzHaJ%*39}jGneR7UXPzQ^OPv$EyB{53ClRzn%e$`S*R-|{ZAB1RQA|G z5XN@whJlzYDKdM;7S1~%b3B=P({(&n(xm!YP?y?-TaBf5&K0rL-;HpC?STVr%JJr^ zZP#tu`3`M;4)O|dh)EeSl^HmbsWQdXnChgMb_!NON+(jPBV`gP-I4S}%5+9aJV9u^5L@MX<&4yc0OwjzeAvYjISID=)k_{(L2>$8h3G+`+Yyd_q*J z+pt@;1b1uOz?!XFF0*(C`?07l({X44kW0_)A_HS>+XE1-7y!~BKN)+kUc7SgT6m3p z6@C$J^uK&F4P?_ezOEl{AznLB#|BJL9|2|s8V7JiqldKNOF-836aR6*hg*7?#$6!RIvn5gsHWZt03%R>PeUYd-kdAk zK*V-XbvWK1vbYnMlFG5Jr5esIJQ9s0(Yr?j&C#hS0cnumkDdNTd^_>Ov9s&OVZ`O| zhH-cm>UI1&Bz}BdpZYEal7Iv6Oqx4!jR#VN{FD?v20oUG6W|i>&e1`5an6@C{w%0@ z1qmA5D|Rnfe00!Y6!-1#s&_g#pX}n}U{mUqx@F;2Y*{jASpZMXLq2a=AJ%NIvy!na z7FI2b7hsPxEbD>S5wu0nasx>(l0GEZrhE_ymWJ%9dbSY01GgXJSkJtSB#x@npy?|^cewgbX2N<{=^t_CRqP&l>< z-wQ{hvkI_y-qm+KKcl{}3atTwJA$>LgHd(Cn##7-daM+L_pJ?#VU1mT{3 zs-19C3cUq^NFYld2 z+BDDyOv;Nq7N6{c50bv{=pW#Ni7(sK1aj4AqQ>|JuDtN%IWx;bo0cbUy1#qwIrrn7 z-#zzCe<+uW1lnP5aq6r_$nQ9K)N+|XJ0S>5gb_x45>Sg$loemG6zEl74Kzy&a#k+Y zYrY=jt$biuMo_Q{LD4Fv`kdbvl&n%J>wY~)#EBuXv z8kK!c7)FVccu^?EYKknpn&sODxKWrJRRQEtM&j##A@Qw3A?kkDi_gG_P+8nJ3eb92*;>9+{_K(=X^scl|iIrHtJoHC5_y%)vjIk0&D@IEgFNB4?d`bvBvs!(4v2k9wTr@8G_1Fm;qpp}qqPQX0%*d1*y4*=3-iTUB z+)5fRy?o?oBc4q@iNZ$0o#u=ePBqdaM1ujdb~kLBce%AM9j(W+QcogVBz$h~rWDsR z>u&Hz^aCuApUs^&u3W!zGrGyXioT3i_rH2u2Us(Yw~gZ+WMmz$_+(OE2SHeZ^akc| z(uVe!xpBg`gAwx6d`yr%EuxU`0)3Yn{w&Bc58k0=Zr_&9qxm^pw+CQ>+%*p_CU?w( ztN1svJPFV?M)>n!{GZ(BJ7KTQU1jhdpW-T-_o1s8C%U?SF}ZQ|`qfo)Xn7Yv+Zf6m zeKI3^{0_mQt@)j&lbD+d<|gDM9Rq%MWc*%od=C=DO__v5Rhzz$2J(h^!I3wCRRLaM z#(H6rM?uDW|K_~+CRA}T(!W4{GY1#N9dmHi99+J_h zN_@vwk8yp-j6h-?08b#oq9?piBu?0LIlg;YS5Q zJ?1K-u;m3%3|FDPPt-Ji2-JK80Vh1H^lBcKc%1MeuG`a7uis!IUB&A#r&gARZHG?a z+O{m(HW1SCQ7+l`r!B|tTJpBdqNZ*03apW)Z9nlX0<8&Jj@QliBUAxoU(`XifJ~q1;d+{0qTa2* z9O_{f>;@Jd8YeT}Pw^8l1wSDIFYum9DSc2P^x#jV{1-X&D;ZuR!@rONf0D!h>bvMU Mdh_%Hf_)m@f095g^#A|> literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/data_tracking_response_get_multiple_v1.cpython-312.pyc b/tracking/models/__pycache__/data_tracking_response_get_multiple_v1.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f16d3d0a616e48c5a3007b27e60c54e66113464 GIT binary patch literal 2527 zcmb_e&2Jk;6rWkI*K5b|CM_-HLnR?<8k59sQ46J1m5KsYQ5q0QIcycJ7SASZvR}-M zOKnAM4n;~Y^q6uY2M(=r>5)Hx0}>ZUL29*7fdmL~YYDyd#Cz+H))gf|Vr0L0^XAQ) zH@|uB&3@P0nJguslp?Qqim5=K@>0HPs(#u` zCvw%({EV6LbyN4VX4cP{xkR4!di=bZPk7Di^$TVp;WM7$_nCc^DC9I@`W3>mj=G*o zwkBqOO)2L7z(JA5J$4X;(w1%*h^e9yXWz1gb2em-7pLEG9gh{&ICUzh#p;Axk+C}I z3K{F~MYzEBz<@gKcyrK?zHiUFL1Jjami7#{D~oP0|A8YSFzuXn;Z|vdLEPH0gk?Sa9gMAqqzZS+v+7+Q}v^5jL!cDU}oc7 z)Pb?SuVVsHKi@`db~et+7QCWDTPMRV1OFb3u1R24iR{cRC^+5S6tYAX)NUD$7$Vo`=sS+K?Nc_(nVEkj-ot1_y}@~cM=9WF;T`EeMO+ea)X zTZl4)sIuBZi?`y+ns=n-w<62BaJUrJVoipYki0&!?Om0cn)|?0@e+__@}sfm+NG

m=UAPs$_>Gb0<+`)YW7CjyJB|3-E ztY9=l6w@ideRmW03%2J%NI40@5ZbAVCt@8j#Mt4_p+{JbAmy94k)7kA-@K2}?eC+b zJcx$yI+w}M#_)=`Z47T1!)q5ejN`Xn1Jcls|I6{7OynghJ20%bIKKO7soZ^hMj-fx zz!Nxa&J}JTq#aZoj#VQrbfZ#C@dGGMg&!?E6^rDOcZvlnqe)Q&vP^zGa`J2O&BXUd z&NPfcL}hTp7+ix$J#+&u{ZK=n{#F7>pn+#eAW+cbj!Z8x!o{DD+;X6>`7(a;OF(kW@U}`3@ z#tX4(2CfqX{pD@t0wr;#)CEM0!L(f9VII(g@n(lP*ea8oU9sWkn@mPXShBt=lv z`u|jD`pvBraQBew$Yy9Fybr<|+T0d5EAGOx&Q$?vI4j5K=g$C%^{B?|K)MyKq70J{ zifk={_nm7f!4Tp)k}S^kH|H$pqI3d*pB5ZHiQ-f3@?A=zO~8ZD{${Ws7k5zJITTwG z?|aftd(89bLxNs6q7U^G%{x5F@pAzmHi0p6FGVSRkSBEL2h#gHIq(x1+azOm$;-cy V+FdgKm$sMA&>PtY1p5T3zX6+vj literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/delete_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/delete_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1bab04b06116e5f2d91fa36417c4e291cf3c6e6 GIT binary patch literal 8187 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 SdHw;vedsHAyg-3Qh5rG_6&QyA literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/destination_address_estimated_delivery_date_request.cpython-312.pyc b/tracking/models/__pycache__/destination_address_estimated_delivery_date_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4cd4cd632bd62eb4efe609f0c9edf63f63db284 GIT binary patch literal 2489 zcmb_ePi$007@v9jcK7YyM@5i7Qd+RJFSgxk04pGgX3-d-CKe7pLtY*`ul2R>&oc8C z*rviBFew+|U{XBUg9k}396fsQVB)1sO=w1qCYl&;;L3%Q-}m0KP$DKJPTFtg`)0oH z&G-9#Gqc~9N_hh9C3j)^8^(f4OmWj1=N6W@qrlV=GmhEV{Skq#y z%yL&$GtbH_4}F2@tN?w{DX}fActu_A?8hvFrH7RsvFMQfGjg=*h{z4%yx(AqJ3<@> zgKtL;t2&;0-r>zEDDOMx8nAM1Jl_Xxb560##9ZkCSRaarpONKS*a#xtw74@37|OH& z^c|_z+^8uF^$=9gssRDA$n6W37uMoU)@Uas?6UA*AcVG0z+jO?-MJYBr#Ci*%##_Y zx5pc!E}5ra(ogAf$A6OCR3>f`BPBESI(LIeX6sWS2T)|*$C9vE!>`{|q$+@OnVG#{ z^JyXQn|*!vKdzh>4i}Y+-e}zpDuC5&6xJ((&5levfy3=6iZ+yF z@Mzt485shnCo?inr|<+QcmkmE=>#ycHDTnu?YVJ%A%<`qQZ-LV4HYagz6*DRw;Wsv z2~W8x9{LGW$wl3V(1q6RUcdsxAnnQeQ@dGs($#^ArLFt;s40>@ta_tMqNyn zJ0rgJNq50UEEs_reF1g?spnnc25=_@HHYK1Bg-2hGEy81U#7ydGfxC2rvIscK~Ib? z3=l2y`+;L$i*Ktx9C&9%??;IGSM~lSDCn`Tpd7|lw8`%x5HU{hm}R&VHFzLXz?z}( zQHU{Du0lw>iii8)SvzB>{6#SH3JP3szudjA@nypW!|1o8Yu*^(Ozg$SV2!awYL*q) zzGGQ3Z&`p;!^3gWvd%SZuQQXiEEd)*iX!A$6AaceShh$56W33!sYC0#_qL8N zyuPOHUEkH)sxFMIslDs{1Fd(j?^#m^*7pszPFx4uU|Xf>*V-AH9z|h5h)mC43QZqr zr(kpkM_t<~8XNC|@f1xqgxfI62+C9gC;?D79w5FAgw*OyW(Sd5<0{(l{K9qKtiz+g zGibrW;~I(_&h;d7mUA(30)f9=IR3Iq65a^HeeGz%!ZCgXmf%AtkncMwO6k2Kq5FR% er9a5PFJyR)4F62_{jKe!r|7K@?h)+c&Hn?G{)|5W literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/destination_address_estimated_delivery_date_response.cpython-312.pyc b/tracking/models/__pycache__/destination_address_estimated_delivery_date_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc20cf6ecced99543bc9a23cf752c5dabccd42cc GIT binary patch literal 2497 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/detect_courier_response.cpython-312.pyc b/tracking/models/__pycache__/detect_courier_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..380d61d2d236de5ea4a38f554549980c1af50c29 GIT binary patch literal 2242 zcmb_e&2Jk;6rb5$uh)+4ZK?VJw2jl!D5i;BP=QiPB_MoMDnV*mA#D|{7SASZvR}-M zp^2h4ha#mHdQ3Ty0|%;HdgKq_fW*a7kXkJukN_cWDW;d4cyHHrn<(jtQT&@X@6E@1 zzj^aEKa|Tw0`0iBICViIIV+dy zHD3?%Rz5H+BPdvfplB6Sea`O-N>(YAb-x@`tO_Lxd6%&Kb;1l+TT!#~EOS<=75>IS zjV66g7)H{OUKEP4nvxXWbcFkU#9Tkgz2mt)t7(b)MmU>jqh3=c+IdgN#P}e_1&$9J zXydLw34Q*psKq^(H?vbR>>f!w(=c8lF0m*hmU0O~wN$298dKdI)6ReuMmo#ENKZ#4 za9gwTti%lH4OV6a=nHOI03*`X1AiAiQ14-ceV&P1$wof-7PO(4Ffq zR-tWcOD$t_<%h9d_Ch(4q5kfoXL0BTP zXPZ{gytyf4o=ih>Y;BBsWS)Lazo0AK_2cBWGIpEP)I^VC4*n(icrxOFBa>o)cV@Fz z5Z_i3O~9oj`pjnzpArJktX4Oi#wFo$(YWH*V<&8kx?)B~aYL|~ktsKHxg#Uqh*~mk z$;OK>op_-U&&rRZupznAobke`MtX#3u#{Q58@SE8+}7jSM3<2*B%eFDEyMN9x*yyT z{QwK(XLIk(t2eIRif*y5qA#P>!>`=Y0oKe@ZR1o23E4y|zL=EOK@gT8yMZ{Iw52^F zZk+JlV1)EEAMs;Pizwv#K;LDCKMit{2k+1_cW6iF(fkaqI{>gi?wLmyr#b)P$6zW5Dm8jNeZk-(!w+Qzju#)ut~J19`)|;K-Z6q5zLDW4$oR zqafqGe|z406RNlv>0cnfnS+bst~t1B4lZ9=HBaAp8K7;PenLoFU*bHKz0g;>65q4a zTihHnBam1}z!QkD=m{?r(g~X`$7i2ZHZxIE`E#gNqmQO{j6c21C&iBwa2rtrSRj9# zJo~NqZuG~K=i24~GBL1f4lF|!p7;hX_e9$m|6T&5bU;zpxhq>dOjNjon!<-+kGaYy zYj}xB9bq9Lt%^OUlt9Tve)XIrr+o2PuXy7y`kZS_u7?XYua!}qq$c* zI?dG)YA{RR{f|O(uXR+A)=}!|F49zaACwnqb|#(#UmOT@vIR6lpd3@2?*T}Rc$PV# z^qO2l9lkKAlCv??Q?8>1bA}rT1+?wXY_@wvx}m_YGROZQlKl^>a6L^gQSX*t4)rh# zb_)v|#+i)wv-~tn!7qrw3tU$zr4LGk9{q`w|02hJCBtiE_!n~IPjdWUeILC@Z=HKU Iuur4=4;0@pH2?qr literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/estimated_delivery_date_request.cpython-312.pyc b/tracking/models/__pycache__/estimated_delivery_date_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8050e654d0d1c854fc8e6f062a27e55cd9fb61af GIT binary patch literal 3239 zcmb_eO>7fa5PrK}+Z)F}`RBJGA&_9@$F%%~pVHE%pcV)%2`btuT5bI{VUztaZ`Y7S zDfmF8Z~@dy;M5#?D9VLnPd)WesTW7CM6_+xN^Mp322Hte>dda$#8HT;RLhz-GjHDP zyl>{sdp{%+F#^ACZFcNVl#t(0c<~GS47c(HFmr?w%IU=5B#uL#*LjJDF{FnKK@yCx z6!!Fj9xr;IwO&f`VB-e`~-JibP6 zG@7I)j_~9Rp|M+p)~don$d5^Cp5oK-zfeeXZmnXPmZLbDW!i&j-mQ5@vDNbyRdqLf zT2pnJ7TnM&bIKJ4w5;O_=QP`K#S1xHpy=R07*h377}FP+Hl~@UC}pZ`zh^s|p*SiX zP<8E^%BBWDxTs#utF{BieFHFRruW%bTe16NRU5nFRPoy#%zvn5C-S*K+#rms4~I|7 z*l;V~f;>l5B5{;R{3Xbn6r#K&(2yFY!U>oKDdI`tvJ|Ben2VMrk%}PIl%*OP1F5zw z#b_L)L|Ll!yd=v~oTgx|&XZbb{VhRC&=%SNW0G#6jWDLvI=YoM-4YhckxTWU*+!e! zXc{25+ufa;?R&a2)&{@LOgw|Z>BNgPe_}gq#1(8kKjzlkD!Zm-RoR)!sj{gU>hyuY z?v-m`#7$aWy~v7RFw^~klmAv5BW@#AgJKHY^#ty!7tV+qx$afhnjLGVGvX$4N_IjS zQ{}9cHyyV&=M|L((9aG2f5#C3&@**1Q&t?jv%xdb`4Gn0B>PBAl(o(adwWo$apJEoc{QyhzBth|%U zJDE2Q?SDO!n{uvLX2xNFo@S0^yieGf)t$o^y`~^j=n69P+d^M%%8fXd47E1h5n#H( z!R_;n+8{c67mxz^In{jk#_b#Tt^4##>w&e{dgM_ANGa7{6#G}egjAr6&Dle_6PP(@ zl7J%`t^2LwI7HZXn1sfaT7^pE7+1dKjI>R{u z0t;o1HNNb;R_>e5rdC##Sv{{0 zNbp!PJfN%#3BuymW_8834HX(3Wf@c-M6v@3o>Z^?SRHam(6{{n$mirK&xge)5wc@f zVPLkmB(yGdbr*%^d!Lnr?xha~3xma`GbLegY4~zc*izi~QAxPGbo{Nt>0-RUB)qlM z(N#Eq@6D3XwbZ`1aQ5D7C1LN<;KicQRBSn05-zR?T=?ipgbVi}NyB#{^?&nR`1nc) zxF^U3x?#>!J_Y44=SPjPrdtrm(LAIPpksKT*iIm>n46-C>1bIdpbpP7H0r4ww00Ij z4VESok<{Q^y+0?bla6ZI_^@R7P+v^vv248+8tSUCV?N}1r_=QqgJkP}welee9r@;hoa2rp>lMu&o u&*FsZ_=zO`Bzu1$Jtfk!Om_c4oMm!jnW)QT@}I~~ZkU@t`i$V{<@R4E_MRaC literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/estimated_delivery_date_response.cpython-312.pyc b/tracking/models/__pycache__/estimated_delivery_date_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41e83209e162ac3177367f6054fc742c2c63ebb8 GIT binary patch literal 3531 zcmb_f&2Jmm5r4Z}k}Hbj>RbMjELD+Z#*%2KwqrYP5(i4!z>X9|Hi~ROEVg_rW~Ke= z+ofX>ZbG0gpj;Xw7dxlw&_fJga?BslLxBPX1r`YLTB8M$Ajr*$;)_q6S*}(eus#ZO zLCns~n>Rae=J)13{w?GCKR?IJis@XTlo`JN zx*wRf9vF1Su*{nVTb=>o9mDtFGX_`}XAH1#!tWk%%Gj?Bv+{nhpXbTg;BB+KRP|!< zS&@|6DQVLvKf<~sV9gAo3Y4hg4XB-(prR_#gps7uWv~V*6-voSN{3P^l4P0&OF5D{ zXa`7{NXkGhk~AAhoiqnhK9aJb7bTK%va4$;H#?lb!7FgivRicm-sy!P)nK<6we#^8 z;*1^u!zJE@(T2NCYrErvn;O{3;Re(w?7*55e`3LMb%;kPyUv114F@VvhHcM}?lM)g zO=pim{Z<)vP5h*R>m)>2zXr@b62xPRVr&yLBDqZ#rC5v^DwyQ9@MqzV!oz6(Jb56_ zJ|KkzPkA1Lgz~hv;4)Y{&)C?sG+MR22O?k#x)M(Ku(k`pUap(#0$eZ`gjsSUu{>RV}ZGLyABh3*C95XMkhyr)X9I86D$5#%851Q z#Okdz<=e75DBa_WBR7!2RgJGhW&x( zw`Zh~U@xFL;r?cE*F1#9JxCtV5Z(C*x;pvh?8{&Jf0_Bm**6=?C}w1IO&MJUbe{ek ziha5v&;K<55~c;NK`CYgRp#&n)TAJ?OW>oHp8=P6d`*tPg{V}J*v~=DUP6KfPxEne z#XAuiT)=sUV)b?hrEnI*bGmSd%UXE&X&TRH8YHG_8Ng>X?YC9k!ebGnw5CzFtZA$p z=5R&Rwp`vo+XGtGi=+=pKN18t8$^OTlO0Ba$Y4j2978gM1o6x!ksx?@XW7zy-!`EC zQFa#97m4nsQ%hYt|=XB9T~3AtV}hf;nu{d zhSY!ecTMS3>*`#6w$b;irZm^O@oqyJY#e^4DZSge{A&G;M)qP;dbKq+QGe_1FPhRs zYjnJR_3ltp8gI?bH>AGCz_q3{-K-!~Ouhf7yfMf~8P{NN4c(fUpi6>u!%}#;w3`e7tot{1?Gr**IjT!%g8& zZ@J`;IQz=Z*_-i4H=a$!wi}AJafq@! z_-P|-1i2V>Pvy()?eQ|Z3IljE@XrHzoDc-zNtOs>|0KEZ$oRj>WRpxjB0u|<+B#;odme5O2ytnJRN!0=ojFLC=-pm`n z`Muw~*>4MlJb^ag%ujuqCgc}X?l;h}(KR3B0%3$vmw42m6vv9I7z*?$H|42@>ZOfz zY**ckmo>7UW@ui{$a#4qAKTMzhu3Lz#^a1z@QOx}5{0};SoShunyoIS;-4diURO%F z-%%-1*QGkk+pR)>>?CJ4KgENJErjDwO*o$Yx`-Ulifneusm#>EwmNFN&Uu^HM`7+=`&`Wy zQ6&j3k*!GS+Q*nue;tXmGW4t= zUO(0-+=upzi1?(;2Z*W(Fxs*!8CPmiP_4$MMt6HP=H-mzN0XDXaJB{sfGn8Is*A>3 z?KS@`LzA*62_S6eI1ZvhTfkwLh5ruZ^l=z0kf=R3t>E;=rjS`Ot!}iT#;8MP=@;}9 zy43O?CpVO_8>EzynK0yVOqmU<0S9i$yoY2pSB^;LegEQC5KV1=68?Iww{x){oF1Qx zSz1NbE693aI~{{ubSJquZ@ErPD+Ca(K&s*jsiA_*;!k5lSTUjABpJ$8dEg~EI<%P_ zwcU2%mbmX6`C0Fu7q|5OWxap#!m@tk=8GVj+L6CG=)+fkmPTzrmRcj;{kY4&5ePJCSQ35eXem!{XEAjQ{ zcL(2Y>V1e$-?HAf2s|G75{NL;)W*MwK*S)yqnhD%RO7x(LB2`~ABH^|#ZlN2i~L|O zJg<`_mG1*HFQdQ(_loVhjV~-N7(~BqZS%$rCSxx?0&7aT)J)U2Jliy7-ZTNGnv3I3 z(>zzR+}2FiG+9tFOj0Zh}=<>w01i~`u5JfbFHwV?pfV8&{TV_eYm0ytd@r6PBgpw zSJa`^>U2}x-rP}HQK#2bntpjLL({`3O5mL7`a_}VSJqN6x{af@ZGy(eJ7AokNhlaV zX$vAztwA0D36A%L_kfUESZ9_WITfy=4X-N{?Rp4xpJ&j5RO1?o9L{wmbEbVEvVDP{ zO&mY*;1-@PFm>UaX-L)hNajwX3M#_{V0A4-8KxSgVu-t8oG l_xGgm8`=948C)TQKayQ{RYK1ye`dDP33{`1mtY^`^B1Di>+S#m literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/estimated_pickup_estimated_delivery_date_response.cpython-312.pyc b/tracking/models/__pycache__/estimated_pickup_estimated_delivery_date_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d879be5d19174907db520fcc5deaf7ff029315b GIT binary patch literal 2778 zcmb_ePi$007@v9jcK7YJyRW5`fC#qM7B;lqqKJTq(Nqlzh1e34N1B(%&TM_{`{&GC z?A8iBU{Wr^!K8Y!2M>~7IC}8t!NkipHKBQGG||L(11lF!e&5^emJ%>jowVP~_sx9s zzWIH>`DVY%<+23Y0egPp>m(t+qO#sV$41vYkPCznMjhf(gHjwTj$$a#C!B<<8mgN# zlCfQNQf}HvyPBc786)FnjcjaBIxTLi(Hf6aPR`96c}f)W24U$dglSw|O2nTdhF(<) znLkh|(5S`oJU_HT+xO&1L5VW2T9Tjk8F!-O>o#{-L5&ixc-2T9wo758p0Z^aX=eg- zupHPx9pz3L`j^iL#>H9Tm$;O+H!)_r{52Wct`%~2)-Fv|f~Gpm9s42|)nS->o67*c z%}e#@>ar0kUHb&|1;U9z88MV|0FjYkilMRuPcrp5%z~DRwPZs}vlPsw8=3}3PqIuy z%fu_QvDU^~uBb+qwXs&{TUa~GLEp-AY#Ym8QI{I=72x4m$DJjz|DKt>=f zCbOz?=45lte@xkU)LD-pXlA`0SW6J+J61}x0VH;5_-{eVpMt>x37d113Qlis3YjI7 z>Sh~ijM`+DenCH`OAY@~azh!pK?;c|6$Anf9i@Y^FMxVc)9 zeAoAip|DC*!1QAL30dUpY&RRn-!MQ3G2tNrAvZ;X@`FJ&N`<}&iJf_FE7TaQJ3RsM z%cnrhkstNWYnQHG`qclFeeQqeFYkTfW(vfLex#-yS%W2HQy#GN#Chn0!2*;CKpGc4 z&^C}BC1N{F!adhF05vD2?}=StZ$K%YgmILH=x}D{&{ofcUVCu6ogn7Os@^jn-qL%P z@o!+U45FqDh`liRKb=P4haP?c2IX$+CqS<**i-HRfhX8IA6~nB_42a5e{lzhnzp|l z|NVS#W@A4%Jvtk+w2aJGkomxPIs)0~sAuD%<=8Q`5J9*GiIO8D4HYDp*o_fkO@$Iv z&rzli-2S=!d(@ z0*E>C+o2O*$!~_gKXkIDcOyXE%X;@BPedSJCMFn7Av(YK-wtWHeT)LpgRY(uDw2I^68L!5`St5{8<>iv;Kq(#w?YC4}DI}jd$cR9~J?%y^iJs zFyGUT*YkWryaY?|`IJbQ+X+hP-Bv<-ejvHuN$=03e}(k_M4rB@63UdnQoHCFy?OL5 I!9E7)Z%TCh&Hw-a literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/estimated_pickup_predict_request.cpython-312.pyc b/tracking/models/__pycache__/estimated_pickup_predict_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9f52264f94d61cc0c86442f4eef4ae09b022c95 GIT binary patch literal 2567 zcmb_e-)|H}9G}_SyW6|=ZmG2hBG~ey`FJ|_X zUMlnfO?eUCicj{z2b;d|=pW#Ni7(gGgl5!eqKWYhti15#_q%%>lt976$=!EmzVn@# z?|iJ{G#}gIpktFzOPI8kAyNaTP;>I_0K3)lj{( zk&gAMoAI(n*3%5l%NaQ@Z{%Zr+U@WKG4vUw zl=}-iB`P~C-wz@yaspqBmK2$L#}f9*fZ480A9HM%l~kE}+n0{{K;|0v)>hw<5`i-PCM1NvozEHPCR88DT zWXm_Y{yFp)h)oR2h@qSTOpFv$43(wqG*gejDD*OMFWu^8Sq8?kt)2#FO|x9w(^>wC zYUG&CI-t(8Evysj4!e_evBDK~x#fXT0L^o(_>iUu7rqgv#i~Yk+Zxe6>-f>cge;t|1FV3p$*dXCINY}RueeXh zo@C3g9jkcTDs91mRTlmo$juYbSRhe*Y)Zl5jYT1|WJ=wr!ycm!nWbOTFX(b>{uo(O zMwdt_B{N~j;b1Zw)&dS3k$DeEXR^8%E-6wKz$%%U{>0*wLg1dgz4xXnXN1i~<)T{- zEx$5ii|Hr`D}qfAP1?TAttjA?pdN+wsPgJ-!>?4rndqayuSDFcP6H(?@fM;2jKiPd)SPrM9bj{L0mT)TAj(v9E-`zrV{SlRW) z%?yZD{ZLaov<@a@1J0NOVx0S-u>kiKkVK`B6DO--!mWG()X<3Z)mXwqNxq>oiO-6xzAsKwI1&>=7?u- z8O;!Lv9;y$uKDQN<*S!h^!%n%dz_j`rx4ouyG5g5_3=cR%UUZag|8K)Ai&37j^!2u0%IZ*;JNB%f?^jq=W$d3n)H}yV5q;Eydy^U?QHyhry<#OU*QW%d<^W=1miTsk_+jG|dZj%WaKhO_K#x)8s{% zBX!e!=fW`115LH(`lqYvfwj`m+{tEl|EfB)_Tjmvy1lvM%&K~B zU8U(a*E2L-Mp1&vnXbPTntp3N1+ClIYU{>nth@utahkY-4wSYa616(S0g&K$CwLDC zsf9Dl@*}6pRn*~?gmgO-LWbrU)F8RIh9ZY!UCEefUyN*D;D-vwk1BcWeqJxfJQU@} zK5ORFvOS0Vn?UvmmiM$HNgR)I{F=ZgOd#a9Q1sBMxNdN!< literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/estimated_pickup_predict_response.cpython-312.pyc b/tracking/models/__pycache__/estimated_pickup_predict_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4adef72d3615dca2358e58ebbc9eaba34c5dabd GIT binary patch literal 2620 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 GyZ-{z&@XBL literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/first_estimated_delivery_create_tracking_response.cpython-312.pyc b/tracking/models/__pycache__/first_estimated_delivery_create_tracking_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..928251ee37b340dce4cb38bd3902797ec26ee0f9 GIT binary patch literal 2469 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 MJLet{{KlLA2OCs|e*gdg literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/first_estimated_delivery_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/first_estimated_delivery_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd1cdb01ba9ff59ab07809395fed7917c867c09b GIT binary patch literal 2560 zcmb_e&2Jk;6rWkI*K5c2Hk6i@mefrl)FO!kDzvm!Q6Us6wLv23Wl^=-de&i+{bFWa z;wWl;D3W`j9FS5@52E&j+<1JL(3?6`#xsg z%zMB0X8c{DkRvc&a$D2itAzZ9!p2B<7}~x7%pzfgQIGi4q!f9@Q%nWEDKF)#rs}87 zbfQ;1&Ci$_UpI9>Yi9kNnM?F(ug}k$c}f)W4q@6A!ZMD!oa*dh78*)f{}Y8Wm3?*) zgs~mFVIU^Tip;)g3+HUe98acCxsJ!ms!W{>8d4p1tFctixFVMNdl4?MJ#e5-I$o{X zaowTaeQ5i0kQa$VOv;FhXAULAY65;fuv z!=Ms(vtLQJ5S1F@WH}o^S+H+{l;s0d*2ZkBx&fATp<%hq;$6H(qlVPt(1JwIpLk5v zMmy_wLttVbkS6)b*m3RB)l1jI>+H+$i*R+|@J$WKnsH=BKhnn3ZUG3JI{|12m_=wx zfB+{wG#)@ON%(d!LU$PtGHuO>FyOmD-_0@K1H8<@>CiI&#uJ2x4)&sFbl)WF#(`FR z+c>a_eV5rIEkIzUItc1X0iJCvv?xB z8sYlrAeXK2(C=V(@^P{2xfn$ExJQ%xY7Di+ZDVNF7+RWJHICkV4akaq^gn`r_~uxk zaW6T`U5;;m)ZMW)DU3k*J`X2>9OPW#1|qhDs>AV`lEtmLDyKO1giM7OW*(WLq#&Lw zL+AoG5@jGw^829^x5PK&KO8!}V(iCU?O!$aFF~!3eGLUNwxUmd8v{ua25+Lqow&{e znF1Wk3Lga@^Tly+iTC$#30}wZWtG1OYFHs5XeYwFH^eB=txX}9lQfT^EI|bYw zb!W@dsKb;H^oxuOIKAaDpF$DfmJP#QRQ)QhF~>=z$+e;Sch{ ZFJyR)4F609|JHZYDSFGjNAQ~*{vYR&r^^5U literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/first_estimated_delivery_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/first_estimated_delivery_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4890f40f2de972be5f537a4cc07ee435e17bce8a GIT binary patch literal 2511 zcmb_eU2GIp6ux(Mc6N5VyF*0~1WPGe+1PfAK?O=kBn2gbn$YqxhD?UNvvu0}S?`_2 zZqvZVV6wc34<^MY`{0A5FFf*Wd@%8)O-*R78cj4YzJV(*JbBK{c4>*2K)h+soOA9y z=ic+3bMD>m3xynk@tWJ3{zfI_HxxETI$>!05-^K|5k@`YQT)XC!z?tElKv+OB`SOD zAP6Hna>GDOloXjgX$$9E$Q)0mPrHuCN~%n~9WBw7ZJZG)u>T(q$a{T zuQ*a?a0obxBl8=a<-5UV$)2mwPEh#Cz<&=Rw0#zsMG|%AW)z&>Iux=%W}xC8AB?(W zfqq3lrOO@rNpee>xJ61Ssnu%S4I-JTRYMLK$()ZxVX?YjyQN4~K-Q%;`;pD3g}^=g z`yYN>z91Yf%5&aG%?`@rj+l+YT3N8!;b|vuxE+PO9M+>+Ju1Kc#^|APtr2|?2IUxY zfV&)TA<9+Ejpb}4$AW$1>{vWWkF{Z7U20e^19g(3ky=A)QD_0e^GBXKQ6q`vZiq$f z1JWcv89Q!Vxqjtlc$0k@ei5$ry>(jyvSu7v(T}td%`G{>9*%P|2+Sh%9-xkk9vhEP zpCo)cOhOYGkHEENL>Ta0pzpxS_W&<5a5|isKl)68q3K@qiH@6O-8j&S?ivSH@o#vk z3S>ne<}bnI{}d8`0et;?7z{3wXAA>PF*jmoCyc&UbmQvvtE4~NgJ82b^W{j0|QC8+Gtuc0VLSMQv*hs^&Ha*OsErOOCNVXyAMS=~@`;lOw$exO4 z3*kF(r!tPU&WDjaj|4kAE=`_C4hcFF5s**FeML#@_cXF+Uvs=Qyr%Z8@9l4%Zk=0G z``7yhn(wy!HFaQpV6b`iGngHG#I;qLKHAo3dIU)cTxh+2DKtISP62lhxvp-C#>)Gk zoTABr@ED~cf>NzRN&pm&ZNzr~k$SDc>>zS0TtyvrG2HHr8axzSLk-p**O6p#t~Z&p zoVmye1pc1k_;Ztfb1s8$m;=<8CFA>N!_LQh%?83v3S@s8fzt zt#n*>Xm=ml{v70G;t-QEVk#HlOlE>9rpgjdlBs8479=f}l3ghkOIlabV=2{@(y^q+ zQl6!+s%D1eSq8p+%wT=+%{n=@hh?v-tKE3aJZSn^ZimKz(?2B#CR{F}w?yRncI2>e z$8#?^yfMw~%DfxQE)Hc1Fdl6bn@ld|w!!#7M0`f7QKRNaO@wt`aiq?`J#6C0>^5il zZm?6b7b>(HE`Cz*-$w{-p95x@M7_B=1*dlpg)EUdsHF!7qb^yZU(-+NYIpq7P!RAM1oxtIC6!LOdk81U({PHVfFO_SJ=)*85M_oM2@fM<7Mbs^48+Hr! zjd8cO4M%GYsYRg$P%a*SH2k9-vx5+!I0B?eem3@9zkKcTjqnEhD*Pf`A9(GS24urH zxu&0NBSyQB#-59jE&{U*y#iRG(F5Z?mQ#f9g-IxS<3428oCpJc0Q6n3_#xnB3ZlcA z#p2^nfp&+{0eWeYP2*TAx@{a=$G?%4Dv&jOgg*z9|5N<@8SwSrF*E4$Cy5#D5OuM? z8}mRbx_;%_m33oiWj~NLeW(-h&Z_MpJ_L&%j`$L-V*M&uzfiYy5)j|pLHv^Kx!6cC zwouH8iYKIw0Ak7TXE7qYf1r6gc}Q1z=yx(P^q5TaECpmEXhEOJQDnTUXVLhdR` zQoo~-Lr0q9t&t6NVDoUHIng@5p%yj=2Al7+{0((*bFkPv_ZiF6|SNV z`xCC;Mh%`ouAv4Cjq6C#IM?5qvz&#<2?YLT;P{)SbKu<|Z0Tn@Svbp2g9$!E0`q+* mK`FhLCG^-&B=;vd{wo>YAj7|q!GH9FbegWbe~;id4*p;H*;O$B literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/first_estimated_delivery_update_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/first_estimated_delivery_update_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1327c4daa1447b842fab07b8341590823cccf102 GIT binary patch literal 2503 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/first_mile_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/first_mile_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91965af180bfc16dcca378726630781e3618f7a3 GIT binary patch literal 2439 zcmb_e&2Jk;6rWkI?X_cj8%j%CAS7)uHBIb*3iOLgR8di-HkF$6vM5?@JnOK@ewdkY zsiUa%p-Ab4_JEXfA_oqwa_Nyj00|^6j)K%^0f7V(;?`n%>52Dt9XF{c3KFB_&3kX& zynXX~@6GtTd_GHH9Cj9GzEKJJ6@`tFj2YUQ24;yc!l+9;YEX*2;wpv$bHYt{s-b#G zBN^#cH|3>`w5J)GmoYM4*2qTsq}%7^j2tBjd7rS$VdR@iN&5qZ5)Jz- z-w&iEoxm64B_+(9wuF5?V7413&p5WrN@|#R&u@n6m{XOZdd?9t)GpLG>8uatoSkPoSnj&I(v8O`fTo}2H)(V@{d3{LGY%K>yyMyzZON_b z+$0jmpE=z;%P!iY4sh7>W~HcCH<7HboWn?yUO@oQc8rWdYwDI4Ab>mz&%TbSr042WDT!=SAo+& z>ciCB#}=Ov0>3#p_*hmh37d<`6}Mcs{K}Xu=44Q>2sSq|WBWF@WWXyyL)IIz^5$Ek zZ&d0{`C;H!HjY_|J|QYKOpxh8h5(po(cCaGr<#aH?H0eZnH0f&x6&0ckZQttm#MF+R+X|wgq_X)(H3_FiX&704*9l zHJ(5_LHJHsgm%%NAZX5tz~_5F-^Gr<2z;1^=x}9zc)Mpo>zB|C`f8DN{lKEUuOC>& zzmeq{khV6$Uxvm1=@k40@b%A;Gq@$TA30iM2E^`e%~>QxO`<*KYs6RAZ_jVznt*t#$KSZhr~*k z<2#?#+FKD|1gh{LL;?rSI>PaVwEU{g@fHaSTY)JhIF@#p2&QMB2}hLb{{RQtqgPP^ z(jvbdIrWwJdhGinXWRM^0yDI#4=qE@#?3Jr#F-=3a&tAnX%7as+i(vDCwP2cit z(+snw3HUVNDl)^IX@1nO-0n)+G+9tJO`eB6p>CR+o>R~kK+AO`JCO7v!A|9aNU%1- zzN%{p;n{ErGL99^N02;^1Y0&LK%PSm2|5#(fqX(9DoRp&kRrv`TNiFkt*NE;eFLqr z#gR32V10kFb?z2$#r4CLwz~KByK8D?6WdW~@>nNDlVv0&aFXi(Q=!Qdodj?Xkn8Ct zX{3Az%1IiBgn^U_2urO2NdZ_mwhP|{B-H9nX8F>oaus#ht#Caz>+lTn6l$>GxP~Ny zYyI(>XGggP)Z-=2tDuv$^TAX{h17} Wk>Q`n{=c-nbdugV_K4sd1^+jzb9MIs literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/first_mile_tracking.cpython-312.pyc b/tracking/models/__pycache__/first_mile_tracking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8951adc7e2112a9a54186d557430ff3ae24d7284 GIT binary patch literal 2283 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 MuYY)tV4p_!A89o+X8-^I literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/get_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/get_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29f41d7f6d6ffdb03a41ad8a3081709e80c716e1 GIT binary patch literal 8073 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 Mui!}n1$OBF0|Vdd00000 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/get_trackings_response.cpython-312.pyc b/tracking/models/__pycache__/get_trackings_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..992a7090b0d0c5975ad23d8d89f32acf8961284e GIT binary patch literal 2313 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/last_mile_create_tracking_request.cpython-312.pyc b/tracking/models/__pycache__/last_mile_create_tracking_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e5ae082ef5fe54dfe1ef562b3272fe7e6eac4a3 GIT binary patch literal 2232 zcmb_e&2Jnv6t`z)cW1vcgwj$f8WPf`oi@pqsz51KB_IM-YEy}%90o3R|-nUAgQ zg(iyH9Ey})D7TaoIdGuLrAPh%4oF-Q1*w$*fdmrbma_Dc6YtGzwoOGt4_G_T&+k3k z@BRGzyx&)=B?9eeusC(xAmle3Y_(j*(AFhjmIxz^h9sg6rO0cc=4jCCp&l8I5#^j* zDmTJ>RB#HB>6lT`DMlryl*)5qIjT4nN;L8wVfpKX6?|hw&-QStvzl%Gi36LevKPmR z^kk64V${}D@oi7|=M(0KD)(;Shs-vV{#HDzjFF%&m2oZ*QkfSTIKc~H0b|S$C+peL z8Ex-FThlOJB0g~_BaU_vVsdn*IR?}H95YUX7DoAWluJit@YQe%tjr3~o2crvLexTl)r|mGx1Iv)ZW*{dgLb$vtMW2&0j;?MI|4kMS?vJ_#Y;dI$WPYp zn^$jKy_MWzUnXB9Ydx>u$pcxpPOh3KTL{rMpz)@pKo0=31Q`xcqS0gRA(Uf;KLbig zRqG*Q?zBi^z8mCitoUBwRRO$1&D_EN3_%acG>%^|)I zl>d|a{5e?b-(6;KHJ`#|G#*5TznKvvDenZu8!YzObdFzLy7 z&(ldvUJa8Ml9rAF-n%lqKlZ|a!F5cLg-q7#p-?8`hxx*vM~|>(z}?JFp*YEtC_9Hk zJD)?x5K~DY*bC%WYhY2_wFcI#f#oY})~P$M0a-Oq?GW1IcXpo24g@Q0j_-QXt=%3v zBam=?;0Z)p3PcbK>BV)QV}Vdz+YzyK-j8BExitMm9MZ#m8XV9NmlHOS1@ileGvA1B zM}9bQcGc=bMEcgOzGcYHV_(BzA6qrYzLP*wSfKFdxi6bMRyv%Ct?{F<#$4A3EQuv> zuos?y3ESWYK+Fe`puuKWr%vK4fCjkt+}@6O`vMc`EItG_c2$|K8+(!Ox~k;508A6= zi>oTGd%5X_ZB4;-SyFdhUWGZza@|LsE0A`9l;bVr`;lN4sB#_3m56+(WQ-p~@ew55 zNH9av9OD(_kXZ1E4}g41?rU1k+{lxGBMTQkpIA5Sd;5A8Miz(Gjh>c4b8ocrG&hXI z2BUoUUmDH5+0udAK&~Sjr>XEh2*+u*C2nMQVVsjqKpEoXnDP8sAj)jaGB1`vof{~_ z3kSt?wgE2}&!YrWhnq->sO!#ju75@PvA~C$;~$GGr0rpDnx`{h&+wCAf{%(g1Y|>} lls>2s+W#Y|{y`4@LI&5#;Lqgczs)^#oGzbzK(J4p{|BWnFfRZA literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/last_mile_create_tracking_response.cpython-312.pyc b/tracking/models/__pycache__/last_mile_create_tracking_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7db60fd6cf67faa93f5f3b3005c6a77771c4ce30 GIT binary patch literal 2426 zcmb_e&2Jk;6rWkI?X_cjo0e8>DZyz}6VoP6QGrrQB_Jw7N>YiW2Np%Et!EN8*$*=_ zh9-(yABvP-Xm2SeBE*3zmmc{8I3RIx6r@H=5lA2*ZY`#lo_KHVI!Q%84vdmF@4b2R z_Ra6TH{&1k`7D8P)LovvqZ9Hw3J*uJ&Cu2bU{(ktjC#bU7Ny8*o@Qw`-Wxs87t#wt!%7MdOd#5%2A?`_XtZ}AuP@HwM6?HR(?S%8-JltrcsX* z1fg=28wPTstVNl39LdK+#=R(c*5w{6>rvwEU?I{+-KvW8F;}X{I9J0Bjt36(N$$;5 z+pgQR^Bvmy8srtiiA5Q)wDWK#E5S5NX9=EU`e|4NDHTh}j+Bn2R7WymDczAWv1D|l zY%FDB$z<6py4Ax>)&p~n?P58Y^Sr=%S^kQ?)``wCL9?3`wrO?&7JH(;F-NL#*W>RB z?kGMboa($A%znUS4PfDmgV`dCCmY2k6N~wW(0nA7n2t=<@nr{f{{k10F1`9}lmm4j zU1clR=h5D3SQjoAcGuW*gZVAB;LH`gs_a;ul3-osRoXcfPHFh>A%wQZfLS4`yEdoc z^3I`=B{ByE_~>BNB}?=h`UPFx@EsLpeXJ3i)&1H{ z4Ne6`5T)inbHuEa_|0PRfmb;%xsa8M-f+zcDx+M^tFTs)Y<_5#2V6KR6qT^9YIRk4 z<<*hnmD+;(I1DNeQK-b9kQEP-WBZUDyBeow3ntM?&~R-bN~zEW$QO@1IZeZDvx5+# zd=W^4+%flFyL9!^jqnEhD*Q5B?|c1L3dn|evT2-bAxJx*#!ii)E&;Ow9R^^c(IaCE z%t<1igGFc+a|<(jPKJRv0QwGE;t=pr8luCM#nRJHfp#yTgZ)4nWYZj2R=3T8b^IGz zodMD`hD0AM{!j4>{Lp{L%;0W#mYC752wvnqAQ*GsvbuKp>g9EFaCIM$rZL!#czfA) z5g&w2k4Joo&R_v+Sin%YbOI3H(?Gcov-Omr;=&l5#@4gz7|iVeYX&#OZw|AkY&1$uf`z z`QyZy@8tKRKb?5LY4#%|{p)7`Dir9*w~+3UrZM@00uti_k55W)RTn{&fUJ}?Q2`%| zg;8*cm+7%0JVVoEU0@lA5hQ5vpwPW>@g+ioA>6mWtKR8gI^HFYgH5?NGHg3=d~VxO z*0uqeI@~gLl(X$m>W2tW_m_T^MFp|AUuuJ306FKCNphwvN@;SMuX-VU5ij-b%oVz}~p_exg_BBSA zhc@)S&BLX}*mdAan@1~6{lJa4HuTDN_E52Lc6oe5FSc}=e4~}3$zddAaF^=+TcgQ0 zTM6LqBG=VT(O7v8lvA`F9EMabAWAcJ$Pu6yECk!MRTmryd_Bi3N5yK`FhTBXrqvSmr8-hNmh_I4 ziKTQb87y;MHG7!Bdf=O7yI2;!Ii6>|EO%X9?L=o9pxMpxTQs`>i#^fdFj$15plY zVYL>P-+XK2M7dfIKMDNuGZf147P9O@k}MChWWkP*rcIcp>z2bT(Mi>CwH|3M6Q!RvR8|c`(G3Z5L zmZ9eWRy2BUY{EK0#49if&0}n$XU)mL7Y9J!!A%?jK1xA!IJ0nUXD311*U-s+APur% z3@n8YjDa=$8(NtG($t4UA58vFXArp2zsJqs#@K1xXj=eJavu0>D9~i|oqquTq%{YDUZ6Hnk^naZ1 z`F38UVHbzh4kz}!sG+x?pAo3PBM=E3H{(dhm!a)fxWKz3%5R6Iln`&AIuT6Iy%3Bz z%{vAItlv=6k4eD~?)c4koNl+;qI!fNW_vX#p zH^2AZjK3=sasX1T%u2VJ$~NGQ=*UyglRVj%W!oy)&7Q6s4J%aCkiHwdz>H$ zr6b)ih{jDN&Yp83eko+!i__;_?lDu1Q||`#SRHjMGFHdjNXGi*DsFH*aG*|bZ>G|A z-KL%I(AF0qFB48I%7~?0fiqbtrdTRV@ibGuBBeW0CXuv`q$g6QBV`jw??|~s z$|jP*ayL|~hZ(E~<~-ZM@-P>8k@d2|4Ry5>on?S#Co68z>;Now#RtcnNM3S1eu2wL z;Z)|`VD?=7B72WVRltQWn7Mu!&#_8u#uo~k;JhD6F%=uK!bO%%$>C!(?k>9Kvtk3Gu)u}wgy>$b~m(Mi&9wH|9Sv;p;n(sNQZ z+_u{fVMYgmG{}#}?pxPxUb_?CVV{Seg=>9p-qV1r8>gE3sTKmY4Q}k$1nv?r%g|>4 zC>lLAo&Y*Q#7nRU4P!jP&7OPe|#!$X=95CP2#{474bD1M~f-cl_s^UeljtFAah?g-U zyuF~;+nLDDh|q86!hBvXx~7BZ21~0!el9>H zRCYmF?Qmk(vpRVD;TeIlI}DM)S#xgW29b1v3Kw`;#KrBHm??1t)v0iL?wLp=34Spo z&=eg;CXfdC{p8uNqi;sPKY6if3?L>0YsSC|)ab}pknoYFKJl#tk^lqGkS4gSi6Blv zUQ9)l!N)>z6kOt^db}SVq$yJsSO{VS2^u^uc5hyMlh9xY_wDVfw>y|hc8L>UWA?_n zZ3m9eZ9C4{Hb7H@+s2Obw*6tv@j5FR+h$?KwnYK<#D;Bec|1W|1g$WT>_F0sWG52r zPceW5Ya{Ndz=an19PT}~y0otLw^W*btEJKOFcK5o zX}y0bH2rof1>6JVy1Gf4C?A4ylD31xkjx^YG*g2d0ZIaUMqn$)dbQ4+K)My7q7GXY zF6DX^9#o;B21`%qNV2%r+g`KzRmtHwgvVCkkEHhDw*&H6KhsXjS%Hr}K2Q-B*nKB4|4bya(tZ}|A`#>Ti;J7>5BV^;G6{i57UotMgRZ+ literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/last_mile_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/last_mile_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e67963ce1181326b56b706483ebaa868d381be9 GIT binary patch literal 2517 zcmb_e&u<$=6rNeH?X_cjo0e8>DZyz})1^(E(gLNFN|dOmQj$s}y)24W8_y(cvOmo1 z80si$eJE0Tp}nP?h!6*=TzcdW;DE%%QIHxfAdo;p+}fI6dg8sc<0KVDt;8t#_Psar zX5M`7&5VD@=d%RbF=uJ^p-RZ_sBE@mTcE9J5S9rejJm|5CZ#AVu3{?iO}Gh9HB~QZ zCS$wmro6P7_B2!TGG@lhn%UT%bbGvybL*RAi)%I-!iTOI38RU6??f;O(JI$pf3|nOv;F5i6(HLas% zV=WVFI?G;H%^s$+9{A?iE|!CDo)=gz%U@SlJJFdsSa!3*Hp?#HVozj@+MyhCTs~%t z`AK0{<{f|by}+xwTyl24evy5^!zwVu7fxo2(4KjGJbHW~ze(7Kp%hb*E<0;je$AWa zB2q)QHXG%@?1zrDq~q~uZzZS+hYPDa*meB*EwkXv5xgR;*qjPsbcI)FXRr84!+#GU zv^5ICGLhZBIR(3SHiaybIVj5~8>0?cq+ip|>1xM+g4|KY?+_yqrK(lo_%cdYX9D5b zGRk^bITovV)jJC83Q8kN&3|f(*)YU4i^aza<;x)#Vfl(XRJHx`2oL9FP%VdSesGri zT-Y)Y<)9|3HCcY`_2CocYF&O5_~lI&%JC9m*@cu@9^}mOAZc49RW{RRP1h}lS)!A< zp=v!!$-sgHEDS$${)XBf2O;+GWq=0xS>Jo}>W!FIe`q%&CW3f4Q+IUR>Q>}luW6Weu|EqTm1 z6n~=PhLMI`Voiw`F(SPB;Cg6hCo>}gubrQh&z_&I(*RD0h1Vdz>7}Lco?cqhODk8_ z^fPzg0BCAw{$ra@9{EKoyL7B}B(djdhkhpwj6hKyfk6W$a zH3n+|tU^cFh0u$z8v#$R=tsaRiFzt<8-^Z-i;@YXM+_nCMZjYm*Q3axgn%=K4S>(c z14T({_fw?wYU9$asdd%ZIM~-1SsGkd`!)`j8l$&BDs3DqH`N2T-&t47+r>l0#)YM^ zb+y=1Y4WXBiYA8;445v}`%t0Dw_6F2?xWPTP14x-0F0Bg9UO*a6p*Ev8srFA5_paT z9`8u2)|u@~ry^9e;W375yk3O|TBOi|MJP0c4EFW5`z(G%a(GMO%@+8ptG)T1ggn;H zw$pM>;I9aL-9jv|`w2?vqa2|FKau>Ozj5&Y0O$UY A8UO$Q literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/last_mile_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/last_mile_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eec84eb18cf74a7afd58ac9a3b3a94a1c6cad366 GIT binary patch literal 2468 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/latest_estimated_delivery_create_tracking_response.cpython-312.pyc b/tracking/models/__pycache__/latest_estimated_delivery_create_tracking_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e2bf94ecd994a6d66c97f75b591be775a1ad9aa GIT binary patch literal 2477 zcmb_eO>7%Q6rNeH*K5c2Hk6i@mefrl)FO!kYH4Y!N`(tL- zC61!jha$Nb$^j|mL=GINa>)^K=77W{QIHx9Ado;p+*(X8J@MYI<0chFO2sO9``(*< zZ{~g9n;Cy!DC7t{FS)JhZ&X5lLu2zvCkky}24#^j!l*}lYEp{2;wh#A@06GFRa5oT zW;*t(p5|xFjIW!zpEa|7&dkOBwAbV3%{(Ovd7CipI$;?{T}~x)n1zN?*8fDKOl6N9 z1Yu-HZWxI1vLdr@*uuFGGRKqYbFSmDvMN)r2Mwu?y46UkW3Gs#{%#EeY!4Es6OK1k zO;RVaGY@Tl2KFLxh)EeSm5Wf5nPQ5mvXql%>KPaXON*^^$I8T(*0J>1%5T(q$a{TuR2m^ zFd3}Ck@-!{^4(yoWzSVDJ)SK=u| z#fv$yfR}_63nq?Pv8pjG)@FdkJH!mv8d8fw3$UF(wj+9mlc@brfj9)BNq#c++`M|@ z>aFk=`y%{2TkKG9$S8UJ4Z5SgDTOn2TgwzpF>@WT-t_aUII0+J#vQs?t6P`}&jHhm3 zKPJV@P4cTT&=Plyfi+`bX>QFpwel*6RsGa|l=|o)ut1|OB+DI*?|$4dupJ6Uph2I9 zl|bb=SGa+Q?4as!JaJ@kJ3{3Y$F7&D@bb)Kaf!))5?nA4(~B~QCi(r?*{{X7qdy!w zziJ#tgbuG6hnJw6N4|n)7+KXPzKcM_Fu?_;aVM(tK&F7RvciWU$9!=VQsMzTSc0qU zQd#9Mf}2-R;0F(i-BTKGGyGr>%i417g0~1>ZlKtOq89~jVqQXlO(J`$o-Ks$z{$xt_BbCx z@iYqD&2dZeJZdN~nTSAqOztU4TEDB21BaTUt)X?bZ{uL8d9HO~T`g_&^*7&X`Ri)` zM*l!_>{A#Wc&N2intrXV(eyBiGNjOY|59lBbUOvwUDUe1Ng6xvfpd~33&LfTiwMe8 z9Vh`%IBp-l2ZYpX4Q27%Q6rNeH*K5c2Hk6i@mefrl)FO#fRG@9DN>rgxDGd@yFN>y2%{eHsYxmFil>+g%qcJBtETFw z&2+3+JkWB&UwrtXnI*;i^hQHpNWo)+tLy8Eg@YWI5y^Z z?j?seV0NT4#qH{x8_b+;oMrDhq6WEf7DjU=7*A{$TTLt!HdFS#ko-cV%0|tJG!fQ$ z)roWlXMmG9QGS!Nd^gxC+4EJ}2@0nS{Pz$-+vC725!qdvRd9LxP{<;gg^GK0FzS*; z`W5|@u5|1t$xUVACMl;Ptybf1AfrreI^>X|DCc8QSgh{XZYq%~0QE?l`^e@qLg1dI z(u0pH=Y_*XW!@XE*+FH@5py!ERRo(GnsEY$+cM;pur6zLS$Xxfkt3B_Lw*nj71>F5 zCEh|*ycin`@JYb2VB;7aWB?v()4;meuv}*G4n)JXMx@Emf($Pldt#u56U)62i#PzJ zNq#bRUB7(o@{RBY`!f6@T@Dxnz4THfD?fG)JoHiAcwsVy*G#@kDs*!Tpe+m7V6H zpWrq6{nsIO$DtqK>D2kC)eeydABu*7PaT<4Iod;10uq!Kk7@Jj5{xYa}1qpuepxC{?@x8+j2GMR$SH0cAh1iOZz&GU`k#1Rm?K_qg za5^RtFw(ZIz~vw>6p`Mp6bBTJK*9O^>!yz}-cztDB;+@*XIs zXmTJtM!ASdnXUsQkQ9z>#CHLS^jd@2fpn`}MIClA-0qDUyvtle4b~plkz{eLH(9fs zdFccKf6s9Iy_E#KJqZu=lL-o^_$YjWkDoxi@1`iF_w$4v`jHg=ATRww2G_~p&!qov QeJ`D&x3l*N&hg>@0SfPvF8}}l literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/latest_estimated_delivery_get_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/latest_estimated_delivery_get_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9d48d4bc607e0a40827195c4c0482ac4ea55368 GIT binary patch literal 2487 zcmb_eO>7%Q6rNeH*K5c2Hk6i@mefrl)FO!kYD;LVN>rhxQW_+Z9#~YZww_JcWdE2M zmpF=AABvP-CU)zkcpnelZ~_p@f!&zZSIpZ2=^yqTv&A?FFxZV;An)a6ub53^8L%KD!ulxf^$ z2SF%p>4t$AD=TsKtSy|2A#=Pqea>|}R#xNGn?XHRN8GB6)lpZ-Sbrx%1KR@!>bT=g zR$H!Hw7m~)eg^U)afnG7F_lXYlbK?Qsj`%lX6k8}1xZV!bX&?KlGc{=M9Q?KY$EB2 zRAkv3s+nU&mV<8>GgudV^G<>7V)+~Da{D}H5j5Sbutj4)^v}eDqqcN}d`n2z2ab(6 zo_p2d_4AIL;C6M!4W`c4FR*tV5dkpH+;FZ0V`oN*$=F)?{b_ymQBQmZHIy*?x#Z90JlH zKN)*&UAuYhc6gh85q=)7^}N2K0a-VOSM}j0;tdN#3{&HS>c1=W3D&? zF7YDnFTtaBxvcV+LCq^jaKXc3=eEXo4HxvI-M)@`yMxP#6(52%!m4HQ0@%ccWo>zYL0beZH<0W?(v1ZBn3s@XmBd|D&lbXW z;09$JtDFxYc@_yabW)T&j~o(oCM1xL$$dph>-RKr;80^^VPIYD**I8goLjiKu9h}> zdK+&q`0Hx#MsHtZ^i!Dad&D(Wntr3H(exmaGPuyX|59lBR5JzKJ>)vN37RPHgK~nl z4ur=j7ZH@n8l(h3;n+ZY50F@o>dX$LTjeV1uz%q?uSf6%a}70Ecw9%4#kua*oaM|) zClL6%h2!t4R>0dqc&MLlW#J4z1xxU$6PWLNDN5;sJfTN^B!xf7OTUo*b<+Pc>HS;Z PPbcWgdk+YHlf(Z5gLH|( literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/latest_estimated_delivery_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/latest_estimated_delivery_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..967d284507d9888ec47f30563009c5378e3fb749 GIT binary patch literal 2568 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/latest_estimated_delivery_update_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/latest_estimated_delivery_update_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16afb7dc2c2ee29508c174787a72a48667770a8c GIT binary patch literal 2511 zcmb_eO>7%Q6rNeH*K5c2Hk6i@mefrl)FO#fRG@9DN>rgxDGd@yFN>>o4h z5=T*Mp(42#$^j|mL=GINa_O;W!~uy*q98RIKp=sHxV4yGdg8sc<0chFYQ-pd``(** zZ|1%4y%~RBDC7u?SKQ{zH!2~&p|Cm9ZHBfk0<%OIVbmi&H7P}2@f1^mZ^}#gs;T;E zGo9#FPxCWo#@9{V&zf03XXX-p+UxQ2W}Xs-yiJ&Pm9UJXuB6&~n1#Ah*8fDIOl6N9 z1YvB)ZWxG(vLdsmZQ+~?nd8ay8Q1YxS(T|bgSu45+-fYXw{+XDycq~lFj z+pgQRvkz^34)PLlh)EeSmGcmjnPQ5mvXql%>PeUdNlT=3N6I9U){*o?%5H#ND}B1*f+Ug)EX;sJKT5qb^yb zU(rwLO2>YZ+*BrRl5$FFQN-OKmYHZeo)u`u8vxTqI8!2AU!^Vs|HuzGi&=%C#$N#^L4NKvwm`?I5;xK^K?9 zVDxxg7U?whgM$44eLyDwmz`}~F4>-ojhP?-&5^2lLh6`PtTp~To(OL}xF6bRWv6-Q zxA7W%a=g06{pc9IH^{HXKvUc?2G)#$<@q(^#I4tXtm-HJBiu)?hD928)3Vax_|C^& z4%^eg2o&p!a1w|<=L$Cvu^m($j`xr(ZqHIV#jyiqD!e%R*xV#V@U*!>W86ZNfi%eP zM^D`r-;Vuo^z5o}5VLe}%{aIWl|Aw`6vfD@KKWe?BuN!KaT<5x8V_U&uq!Kk7@Jj5{xYa}1qm*AQ0(5{_}<}yLA2Y`Rd082A+h2ku%^62>XsGQzGGQ3 zXIYS}numPevOcWYUS}p_SuCtt7B7H}G%Rb&!wlLYXt{x82a;YS*wDO$1Pev>R6Sb= z-+?=oajbPdgydNy*x5;G@;q`#(3yyVd_wLiN?O0Gk$ndmW6hy;wQpm8sd1)xZe1;H z^z}F1Y5MDG|3?2nWBfCi9eBvKRGL2C(r9`ZNf}&dy?-e*J=#hEcNe*?Zi*(#d!U@6 z?E~R4%0*1dbPXVZq;PB_z6*%dqdK#L*sXFEb=bvlyVoOlm$`--tUazH$>LmZd(Lv^ zVaM-t#(cTv3_>qvXxo_ujmD z@Aux!_`6~;PhgzzR^|?9g#3mdyCah_v@rwBDq)0Cp9IvR6nVv0ECpuOR|Cz`f{c}E z$~9jPvQ{=QEF;KSxgc-loAQj`6%?!jB?@_uF#QH$Syx+E(><(WT`3!X;zyY#T}~KA z(ve;iiixt4$9?!sPBaJL>u#}GSM!1LMF!hF)na?aG*`P{%kdM zozm7mwDA#quM(G7lo3n03^`dUQ!I_CZiZ=RLCf+ib3?Oqn01)5tczt~HryO5Fyn@{ z-tueZK~iM7J(4cSqB|*#JA7e^JJkg*oO?G4V&9c6J72%ZK5(zpTp?4ZWs;3&BOW+1$p=^to7IB&j*@5s@J{rFPaQrd1nyZX?L?K! z!sViJ)gOtSurlU~1sTN^!4`(++|cEYjCdug$+#vfufH++S|zT_kE5_6TgX+KTZl>k zXxh6%ySj^~JyW+mX7d!%k+`1dGO_`p#p6!{b|f`C1aXR&fh?1s%tN=X-Mn@?y3M|f zzKAxDp1P|8*)mUW7^fSER0rO8GMaez1G5Sp4Tz%AW8)E`lZ2a~gw`}40cX!c9r-gL zZ$ZYN1wP3_bf{Sz*iRm4c?4Y`StdW2eJk?5*|&**!)voZHjH8Z94P;%40sRt`uC_A zoW}h{jg~K9)Q4M9A6=2RuHU@AX%4I%2C`ucq%rU9-!|$4u;|ICFVR`-WCc4JI+#uX z>OCpypE$n99O*Xkg|=3!zDNv&5F3YMFamE1IGkxMa(Aj{-e zvwub0H~Tlu{m7~48|sdxFp%J`O6YG^d`Rzs(m5hP_$=?DK(Xy)yP3fwkwZP^rU3Lk)Qil!T( zdw7~4vDq5H3W;%Sbbb&>V#Iakgwm^W4P|)F;4-bp@O*I{CD<<9K$1hVS&)TA4%~K^6D>SXp0Q}Opg6+9HLWn Lt^SbU+zkF7@bE0T literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c819cfdb79d55cc7906904a161b22614bb79aa2e GIT binary patch literal 8463 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 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/order_processing_time_estimated_pickup_estimated_delivery_date_request.cpython-312.pyc b/tracking/models/__pycache__/order_processing_time_estimated_pickup_estimated_delivery_date_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..512c74638a95c90e7b3ae8c37c3c6eb2d1754668 GIT binary patch literal 2507 zcmb_eO>7%Q6rNeH?X_cPTS`m$X`2ulYMR6a6)2@D0=cC~C9Oz`#G+`m^^C(N``4Lq zsjaBZp-Ab4atoZufdf@8J#ys00f|eZAhlXRAc2IqwU}Od;=NthO)API9ocW*yqS43 z?|tvR*&oW~B7wHwU6}TCLVm}=y_QWG+Bpl%B4LD4kNDK06nV|lEDidMm+^H=_p??u zk?UU0&s%xlunfOo75t)AOypUw&o5aeN;L8|VY$nM<+;9`Nzbs#Ev;hwg@X!>`BP(6))?{-BYYSkeIA*oumXdZHbSb5{!$}BCK;M-C%ms_4zTWT;EZgop$T9&8Ro5 zanC)^MXLsL@9}d@E>-(PaRA!plq4#~+vR&M`cNt{73tj6Bm7i+h$Eax~9dt1U%#1?8lCnmJ-h#7`Xdc^^D{~RxfyCkrPyFT+XU6 zs!BFHI?V$v92JUc*i=zdRbP7fz>C$Wr9KLSsuE6p7J#TGN62c3_}EboARDmZHn={8 z$c_?>)(PNZ2}(8tm~4^aG#0huoCe&>BnC>;N<69w77NXLI}2i&rjw9)8Zg z48I6hcfWc)2V~7Wv|=3Uprbdyg^8QMH4MxmBpd*OiymnA0hu6T3rs@hnD_l|&&V(k z+dEt7Ss)MXcd2>OAR0^#;AA-CLfV~;&IUR z-!?HQC6B@;)bkA5g!rLNyBE~eOII$fn){Y^09i5ir53GEogQNQVAI19o1+a(A`O!W zl8251V%t*0AZgts9?_?eQJK0YV*>{mlHv)x5f(wHB`J=Dh6w!>$rGDIvZo27RU%yT z#qP=F%JKa?GF~0IjVX-TJCaU+r!GsM&B?3F+B)30ap}V zsJl`*L7fY%WO4sSmsK)i2*sK3?94+Qm4wG5aTIF8^JE3cJo)3`(Qo8;wI2_@vtkaS z%LZ4?!6it517Ab999S_XzE?mJzrkCW6I?Y#5N80@iYE4hj&^?yRANmZ8Gu)Ds-lbM zKrBX(;DWpTy&8`XBQC(R+dF&WjS8lcU1Aj0RLZeo+kpcW(Tw{qm^J@d7N(KUVd&0T}@#}?jL(+4{`&A!&j(d-zK3M|TP{ad5i z*E<>DZXwr`P0~bo8-$ZIJrWP9^rM}PCU_a_6qqyOF(9!KwU`qqw=Q&)Vah_qZ$hMumqn+`8<$Y8A|D$5}`vs fk@BBp@2_NJjg0(4p8dzzK_}_AAKW3>Czt;hd5@ui literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/order_processing_time_estimated_pickup_estimated_delivery_date_response.cpython-312.pyc b/tracking/models/__pycache__/order_processing_time_estimated_pickup_estimated_delivery_date_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea9e4ccdf4a0c984a41b01433291d024040b71be GIT binary patch literal 2515 zcmb_eO^g&p6t3#->FJrB*#;5BA7Iy&m66>YG^mIKq8T70xDa>o&}P$VrfSyS?LVt} zkeO^?511?$iKoSrd+;FH3rCM0JeYXd&6+@3jV78HZ{Wyb>v1SN%h|TqMx;y9?8SM#%3tc+hegLp$ezStN`w>Jgt>lp?QqilsoWdaAEknxC_B zsa*4PKX2uI!!rDWRq%^eF_q`MKEGs@C{f5s!t^VI<+--3W@lLCmQpeP!a;>5eNGUB zu@k#tAjd08Qh3*q{JoHIFUg&7xyLG6qP`Qf60PRe<3u~{$~ZC3M7Y86K!G;Fy+%D# zozd<&v@-+aMZ$?i8L^aeV3VaX#nPC{b4)t|voO+G4n}%9DzW?(&C0V9GoUwEnH8Wf z@FMGH#Vgu!_Y|uSBqr-yCn8?gmz8?vq<9J+>CyS-t3uMNUwyaXA}@ zQB|_p(P;)L7I?^f}n2Cy>#S>8VJh^QSEyTCXp;i2iE;WFx7^C7jnA{`-#nYhc zzl~y0Pd3FURP+KGg$SZiyBFeXm#9IK0VC#!KTM!Hb)znND3wr zBoG}3%(i8iLE^e;OrldEtJJzD69WermEsw^5tc$IC>fH4h6w!(%TrH^Wlt3btVF=( z$#3THg1lu8ubRV47gx>0H{SrVVjTV-;~%Xsb2RQbX}QaZZI7!l8=b=lg!LfY1bk6+ zq5R6&3F=&6IZOIC`mCagAr!0O`I*OhDh-g$@f51U17!usJo)3`(Qo8;wI2_jS}_OF zXM?Ne;1cA(fv+K84y+gx-^V~w$HAMZ3m!K`kf?xbMG^Z!N4viUDzUPU48ZF+Rnf#t zAQmG?aKZilUZuwe5*Ogv?VUaGMg>#pE-?ygD&@qm?ZAP$XeUM62G=z`b8mHYnj1q>fkpb(zZIH$ zyQ2bk2f3bXlBUADAe^Mxk$6z0AMI>3!OLK$z^oBZ0ZELg#hf5^>q0{rCM}fxRs;`< z&{2ZHB@845oZFhs+5BS61Bu@>0>8O3lQx=p-#C&v_NX`nOYo7DF9W%wQcCZY2p#%~ el>a1qelQ5hw*Al{6wLhegq9>sg0Q_Ny~v zsI92=p-Ab49#c-_z=0~49{B?}AaO|)q*eXU$4l%lTqilx9)_0>SLv><2Y zQoH8sLEg#-hGhf=s}K~eVrtL%eL=}8QKFD{3DYkUmUp#vHM_$qH2ty` zl8*GEP)t{pr0}*Q-1j5q`bq8`&-GbFOVqc*W};1bHJNB9Js}h0RE!Re4+m(ou3xWZ zM`yBo5A7_%e3iJwqKsI|X^6>EnPO>7b#qKR2CFdBSq^4;IxDgKMa{~y5;Ndwure#a zv)~q4KPz6;*1NY@ePA(J-+h)6#Iz$BKgF5LXLwX|h48|KIWKTe28qroCVCumFO*3> zu16fAPl^FjYO_WVUsV!K0B4E5^r^!agupuo2JW=0r-jQ!^_)KzJ7IOo6-zRTtAZ_! zF1Vq~9U1Xz)R1vQR$qB_{N-xglpjZ7RdT1c1YlRwD?~Ly4(zx`f(`h)Hh`VcV8BA?#t&doxc)YVP8gHM4S7MUeiHr znG+kvL%1c2gHVPD2w6#0_d@F2%H|y$}+8EDJWP9Py%!sSlN}a0;T6M zDE<_Gs0+2`i^M=kG12%__(s^Spa*1J73w?+GPWiknXR5L=Ab}I+T>Srctu<{hd0gP zwR4;1W3rmZJ2`y(%_~!xCUuG{xzh; z_=Yk2odl601z#qeyRyNLuGg+i?8uO5V0vRI_bf2A{;V z?fbr`VC@Gh$MWU-P+(#teKp?^B5lTZ)o1 zZtCRO1MR7m(JgKNjeUdd6Dx0SX@eb&=3ejUG&hE#0-N-meZgIYd<(G-md7D9^;*EBbmo!NTZ`{m56 z(oF+3!KA#%WAVv8_+Zl)9{B@&F!7~LO(0i|CYl)Ez?B!CJm=nJp+rm|PIk|nIWuQw z&iS2l=6+wPlnAu_-s1EbgOJ~FaIfVuhPKZEvqTtS)F%P8DMeoMHCuyT_w~TAjUZ>| zQn}&hgMwWMOxp~Kb}=Z~rBt5tdxElErbHv}5|+P2Sb-a>dUl3gnbWG~pE#(}q{j`z zNV&?3LOEX5lH%L0G$7Tw;uQb(I(=J*g7&RE!F)4;vU0+;7yg ztuxv=hqh;6yhJ#$DI>Oa7HqP0rr8G5d5#&!U=~JsmV;3~9hF((l3^EEnVHa=tip=W z7kP>GveG4EwR4Ky0}_k%JRm89OWJMcaAyqxe$FcB2l@#Je zB*6Zp6dT3rM*5Wz!Q54pcaO<<+?pk_;tVM`|6L(>700Hjsdq6mGiUcf3 zp>RY8i;;LP$*af#SGGnU8|6@ zx@L~H(V3ed!4ym(83bktQU{!liymtCojyUt7MO$_u1FE@a!nZx2anEani5>LZk|854R&l8$~sxP1! zh!UEydr@7vc=_VGwQqR`kTr8(X2gR@(8XmRC_NgNdD_5q&@de!4d^)FvMs{}($8a1 z0#XDZH}twM6BB)ku_m6u8)4CcLXe?VY=|hx@H+bVcy*OA3?+iHKz_9b7v&9WaNQbQ zKEG}qx%N7cHS@@SnEP;Ln5U}imemd?wmqsgY<34D5Ul-h6R^JIL1~oA4eMNB8A^IL zd#S360Tk=extT}$CJllo^$jZH5wZ$of&6~x_;va1*bj%^TeJGnOa1Fs|1w1Ofo~uv z4y>6I-zgxetKfyo3$B_XOmx7ms)_xuN2_-Xw!|7d)CX_XRMikKfmjS7!3B4FyEPe~ zD_nqQw{~{Ln>UzBwZt&2sa6uxaY7d=n3I$o2b|UPkuN*W$4%Go%oH4lMRms!70^j6 z$9dpg1!*rx1!l0=g#;rb>8bm!lmUkt%EVq2zk*~d5{#NO7DX93Bo_ST2S7e2w>2$i z-pZ5b_biMp4sRH{Z|>?}II;NVhSA?PXzp-3Pje$ks<0@(^)HR)j<$8+ZXwr|P100& z8-$ZII}#77_M)AQCU_a_6qp&}DIkd%&oMVtUR@X{!^DJwJr_gi7kQLmI0+L;5$CpM za}GbRcqs7;L*N%sX3}Oe@0!Ol#~v4>umqno`7)4OI;HeZnb3hBN#zf+_ZKp>L56-N SFaB-rpp*1^@eaX0z5GA-n06lk literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/origin_address_estimated_delivery_date_request.cpython-312.pyc b/tracking/models/__pycache__/origin_address_estimated_delivery_date_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e62320665f17c7bb218d2de4f712c350cfafad87 GIT binary patch literal 2449 zcmb_e-ES0C6u)FzOMXnv|lhc#5gOGv%dx)l~ho znU4Lcm+`Y^*4IqU&zU(tZ{}lv+AH`)vq*_T-Xkn?m9VU%E~k=rn5Cv-Xn&$%P+72p zAdKwD4FfT5C^C247S5@VIi5_v>pC7YRGB&!G^JW~Ymrn>x+0R=={g439wbmF9B;Cg zq)ue#J+%E9*o(v=CS}A_&cdF|6jMx@QwULUU>pDR6t=pzyFbFy3u8$raI7I&rqIhhuK zxg*t@8#QI29)jsvHGo|fxqZp^3lfr!;0@5R^qYU4Stz zdSX1nc!KcFFbT&*e*~p9Ey93r1AhlZz7uqrh3ar-Zr^il2t!`RT$r#$*7dy$(H(v7 zD*lZuO@dg_M))q6{GYbMUxHl!UOs~>;yKI55adE^?UdiU5M94=?aHb?w6qn(iZ+xK z|9Fpgc^HDAr}HpRC$ZZV>~`pKIu1N+PI$Ozdv4rN2p_b5s^$r)p@BWccVI<$kHN`L z*vU=u&`Vpg7jy|}m4=&BF>W6N>31US%^dH-N^1#p2s0+t( zN8_8HcH}q0zz8(uD^LmSI`0ZMfU75{IUH{nS>A|_k>c3tG8LYmekvw0>CcM^24QMp zfM}854;=kQd|UnD!22tDKcdsWs`oEJ2akOPO)$2iO?(%Dh#`WHRE9fIg9kDNTp0=< zg&cF`Dx}2AcDN5dSLY0szY1<%L4gY%l)E=Fez9=DFve}`x;G{`7f10iSYvFGnq>vH z?^u@1TNZ%S@K7&W)`f=cb!M`b#lo6p@e;&H-LfA0w1T$`Uaq6qgrWxp9$ems0vkjY zYMw2G@4yYoIQBLlLGdCAJi&1*@*-*|Fqw!zd_wLiN?N;{Ap=Hh{Kly@b!dI(?$(Kg zch=P1>pOZ|)rFBYwRgRLp!LCxU2E#V`kuko$s6DsY^yZ=b~{7UqbLkWk?HwMq3Ofz z6lix*>-x^n*m)0}XJ}FomSL0;l*tBA0-$g_Hhc>Rsnwgz4kEY4RrKMhghiji_ z(1Sh4H556V>q+J;XEt&Ifxk#N{$fftyb**4+L45Xqx>)|!B3e$zVD_erT2@3?){OJ d{vZRtkl{5l{4?3}x3-<0p|^AQ2|nZE{{el;dhGxJ literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/origin_address_estimated_delivery_date_response.cpython-312.pyc b/tracking/models/__pycache__/origin_address_estimated_delivery_date_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b78263a7316b78c4596f55579ea463c5ee46756 GIT binary patch literal 2457 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 G;Qs--*-!%j literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/pagination.cpython-312.pyc b/tracking/models/__pycache__/pagination.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00906ef0ffd8c98d85f66530a90985e11217b009 GIT binary patch literal 2148 zcmb_e&2QX96rb_hUhk(#`VF+*v`xs;BwMNiZ7G#N0fcA+Qqqg7$hbRB>cn5ncp-_R zb`M2LFSNIm6FG38%B4sC01il85(TN10f7V(;?}bCk`wRQ+f6o5PK=V@y!p-7d%t-z z-tS7KJb`lDS(-j66Y?uIo)jfDXzL0X%Y+d|UE)!LQnV#kG9;)oZpM=h*;5Q9;bm9# zvPRa^49&|KIWKSI6JBu(UePF0B9V6pQ*RKKwdK`Jx`$Dkm#W$y*r?LDVEKL!S&9gUksS-#>(4{?Xs#IXWsDVV|mo6N3ndt5mBtYAL0bdg$3ks+nuVXOQ+c0 zhqmURy-aLkP(}>t62xR=m}JN-V=GKP2fffznF1}f-O7Te3e%ESndNTChQ`V)4|R^| ztN?Z1F0f}<@rJzG-qR=o)5A*J7>uwt&VOJ{JAM+{!tQ(p$`+9{#}-OY0=ew?(PXSd zAceb)6%n6|3%)%Une_%20beM0W?TsZcQP(rwS<`r2(4+mPTNjlm4*KTA+&V?jAasa z`er2T?k*BpBr}i|I}4)@S)^am&**A<{y4cSjol^HOss|>2fyQNI2CZuisHP72WPT| z7v7a(S-{D}>g*>LpB4i5tW-89YL|q~MQzR<2`#@iYKz$@2y24P4o};@&8;ZlwV)A& zji`3=U(ZoyLs(SaEE;nd>*VHdi9-&TMh06Wftci6Mg+wC!O&*I?y08R2hKe`m%*N?8_-|)&5z?wG9 zpM%c-$ydGy*7|q<7+koW{vme|{lkdRze7vWt?M_huj_*=djZz8!PL9$Db`VP5GFlc z$wfMa$tGd4L6XriP;ytQqKbyvh1iiO9{Q7nPi9`0DGZ*GbQUaIi! zZ3=hT3eG^Go8%XLU`gE92iEn0mAQ5O?7de2*0i(#5y#F8wMe5*ysK@C?|Rym>W-5U z$eSbJ351n*gyW0I^6NIo+Z&g=!>?xeF{CrWm6@joogCXgf<_kSiYh>p{C4X6*W#Pe z?@ztEruSj^ed~JP3MAQyuizL@tZC!lMgWNh@G7g^jvCyLGoW@=;zO{;LU|OHybQ!p z1>Wb$s?7U==EDd$U~}uK!Y3LByomGmcV4jW1tybOd<4c+%duvfzUA4b8RtzCRA{(p z7fth{hUK<95CFoSYJlhvHpkTFy8vP> zoM)CFIdv{0hc^ozzxfbeMy?`*X~Q*y9QO63eI|TCY+v9tNa)cYNa=Ud|1%ldAVWWqBY$c8=mfoe;4#5EasF=+5(zE< literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/pagination_data_tracking_response_get_multiple_v1.cpython-312.pyc b/tracking/models/__pycache__/pagination_data_tracking_response_get_multiple_v1.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e78e6e98c0d8679f23cc275a8edec7ae5cc2588 GIT binary patch literal 2418 zcmb_e-EUMy6rZ_!_wL=#Yax920c?TRuC!f1P(UQnREZI)vBif=n(JlfcDe2Sa%L9W z+Q2?wQeK3&;*)*wLDCl<{R4b3@uf{oAXkkhni$`}l^32o=kBt!L`<4EX@B?3Idf*_ z{LYz~{k~Yt5oib8g}PJ;`3*adTDmRJ)&&q22_uYp#HS{uC@Y>~D)3EtDPJ{JKW(NH zz3ORx#?1J-sry+o>*vf|qECByzhD+9QOIe+w5x<=9CbO>Uc)TTDi!@t>{Mu+w}T** zwsgZlj8>F5`=%|NvmtZ5IQ_Qkc&wtvsW*bzSRHX|GFH#HLdN=g5jxl&OrVZA-ej#k zbsIbD(AEs}7l}hm%803)gP6<|Q%semoHSEUf)#oiOG8iV^fIv1G}Dt_iDj>u!*QHeySAoZGc&H>iK$hzNpp zPCN2!!;^00IUgRHJDMv)+k{6lesr$*h>G)WASdFq1TwvKS|RyFoDZBCY1JBBgnX{l z^|%m*-b7ryXbUSD5ZQI7Mmu5QCj z)pNq(qB`RZM|Myham2I?qpD!jLv<%`xGh6o4I46Q$m-#v2M<-FS$Q!GsHCaMb zA=*xMEC%VZ9@#D4Nsv`{q~&)~WL-Km9L>g>3@xB^?(iluHQe^u0oxaQ0Gi|{W83x1 z*Dl`-Z?Z4LFT&N`uin-G){J8-`mq)gxFHRAIFmH=gRlsP3W&x*PqfEGj}hJjMmQbD zV?M1Z5e9ra=sQgEXF-lLusgKOy}Zeg(CImxZ6`pJ+%@(s$UDZqRs0)Tngm$Uhxqeg z{GWp1+hDGL4}ihlu;~EMX%_~7oL~UE7v%LT*RHG@154WhR`h}P_SYACHx~oo^z>ZJ z(@89Q1iC9NAv9dU_Deww|>!6*X>?9BUc8-p2 zCP!VjGERx9YLZ`#{snQz=wCJZmu6Ot6SrRhSkX`XN1#uh{dp?8ge-R?zV&IReRPkiHgemK+T5`aKOXI*DgL-IN&Ap+u6O1H%>5-c=2HvQz^x|Wd*kHSXP{~ETF03 zpv()h1b{AJ$HNin(yA&wWjvn-9OMgd*jra zI?z&S`glvD>0yKl4A*-8QfT_MRtlthD0Ow?G*R9MuTTTk0&!E5LQ0)KLF{7KXfZezd?^^ArSw68(0xCW;vb~%7c#g;27e}d|JHZVaeBM*fZ#XT{6EW$bszu$ literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/pagination_get_trackings_response.cpython-312.pyc b/tracking/models/__pycache__/pagination_get_trackings_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..035c11fc277009b7e7fe7763925c0b9d39ece3f0 GIT binary patch literal 2311 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 D%yK*Y literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/predict_batch_response.cpython-312.pyc b/tracking/models/__pycache__/predict_batch_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbf458bae01fea0bda7f0a41ba714b68f81ce39d GIT binary patch literal 2271 zcmb_e&2JS|6u)<7-n@CQ?HiB}t3qw9G(2hhszC)LB$A>rVj&bZQ=4&k_qI$sU*0

vSOGp~=fX<2#Go_pq;`*F_i zeBAeaS67k1IN~l&-_i*A9Y5AbE@Nmj0A`6W!l*}lYEg>3;whE_v+Ak7W@&!T%B6D6 z)BU`a_YKSN3s%7|TE$eJ^E&)at25VuONd8gCxR>PKbGgULTB5!i)Dvygt;UIV)|GK$oQrUS!O6Uu-JQ{vA+-51d@m7BEXs(bTmk?rl_{3S zRGwqnNzk$)%iYv09cCToJnH~=G|S)x*2#>U+DhwOs|b=VR@flv05?m?-t&Spu>7g|VF~RgBFIt$R3u4o^JOx5>$*o3A@>19GYNHUsx%m9`ATDG&c0gwW<$ zV3tVS*3BrW-aHgCPi7!xwhl&JGEcvvpVO7r{&8|o8M{ZyYNAJxaDzC>M^mAISR_Rs zBWbgmAKgvOs<|_uaXE`}*DRF8eb4B3$ix`@Rn3fqAT99BU#Rn?S`XNAvA z*}sZ^L(5Y@8pe=#5tRRv)nYH4wY{a7=Q~@9+5>1QVvUyeEXH?k+`h4D9$wxLq+uM+ z?A(})ZFCRArk&B9r&E}g3Z^BbBOL>D_hjf^bvzeKA;l4LRIPe4F%ULP3h_Kzgbe}e zF~httB|<+#y=Pn0+j`6wiO?>P-^_tU`Oq9#H3ycjt(qt9zXhaWoOp&uTZ?d>#%<46 zTAbLkQyFgdm=VaTKClEFEV|MSWb6c0F0kU0(q|2Hu9QhhTJJK-5zl(vSXh4(K1&?bYNK}YGSrJFz zjJeV%9614k!Cq+hlVwf33Su#c1Q)E8+AR?~J}$t!=epbC%?C`TyTlNzDR(A@Z3m9e zZ96I2HsDe7kngnZPiv0X(&TNMg;m=YCD@agw!PtL0x4FRIEVz}o^(__M@pYVGh*Tp zieE#r8wut_noOb#IV4!}@;s1RiG`kG1DDOh&rfL8!I43Zv#dAOsBdRkeh~28tP=+-H zO|c$9_Y^uxFinJkq=35Jna<|dVjf6*nFaoeNJiFs?r@q>a(IVVr`>%8G{(&REx4>1 zC$k`&631Z)J|q(1d!$lIpL7!1{}bu@iyZou3_c)(zmQk{B-X$BK6;VfJ^qB?oVxuV D37kNL literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/predict_request.cpython-312.pyc b/tracking/models/__pycache__/predict_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..927a9ff6a7b45bd3cc97cc43f183af6b74a6d2b4 GIT binary patch literal 2949 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 rK|Bwzt5QlIE literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48f31fe6412c2ccc89855d740ffc3837f449b50f GIT binary patch literal 8224 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 aC1|gNr~g}%62&!fFZMmWWT3#}!~X%wh$@r- literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/shipment_weight_create_tracking_response.cpython-312.pyc b/tracking/models/__pycache__/shipment_weight_create_tracking_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..264b6925da1a969d3b662a0c773eae2d87a84970 GIT binary patch literal 2295 zcmb_e&2Jk;6rb5$uh)*9Z7B`qqisUk5R(rFR3I%?5fDH~B}gO%X;HM=de+G%`^C(d zHdfT;P^9!ik0~c|;Ls|U9{B?}AaO|)q*eBHU+bx$dv~?DkRl*3PJ_)ErDe{W1SPJy2uLhc>1vx91 z$~9jP@>V`DEF&mbg`j8^Q+dws3QAUq5{0}&n0|?{ysNFN*%?-OQK=Yz;Gja2E+-5l z=}0dM#biZE3U4^VeJ^6JpXA>5T%T36M14J6OtcBFCKK(nCuCy0AL9bYhYhqT*RR*I ztuxv_hqmTnyh>bRQARA~4ESWJOtCbkx;dtugjpErEC(Y!9hF%Al4j*ui5buvtjr3~ z7u+K2X2na|dixZs3nV7%dO%VFpY|k2rsljja6|c#>&?!|H@WLbcbYr31uvZaz!fn# z={84;z0h`}nkr5<%iHdLEF_;vv_|O3rr8nJ{m79sN$yj}Z@4wuHWIr$d|ial)@fi? ziR{eHD>%KgDP)PvLtZ@G81={!{fd50*W2r-$aQ7%I;p6M9>?4ZWs;BU5f2=h6ax&M z%^E>`T}d(a(AVPzFCa=0AT7 zNMgi`%n7Ae;~L7a{NTP_jN!@SI!Z8uxPhdAb9=Kn+dVJcP~f}I@qbC?(oQ$;87DJf xPw{b3!RJRj2jsR&DZN`FwEqWE{+%5CnGA1{;h)H}e;GY=nqE78mtdb7|2LzbN__wT literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/shipment_weight_delete_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/shipment_weight_delete_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1555eb9597ecb37787e4b4f8f155c942e41f4c1f GIT binary patch literal 2329 zcmb_e&2Jk;6rb5$uh)*9Z7D6~qisTHh-ngssz51KfhvG1l^~H6q(#wc>shCp>=!d* z8e37DLy^)8J*J$S1bj3)mH<}(t@0o zOXZrc2YD+W7?u$ftU^$(x_-Tu zZJp81IkY_s<7MI!i!x#*Ws0RS)y*;OILyLGXE_+@>8Ql=mozKSO3Z-XU}aW- zzTg&FFDqWsRy(IyJs>ez&qIMY#&3WO>$>u5c zp(|o=)NLIu_Cb5p<>}&yR{6f$p9smP6Rir2Q zlVX4&v{@sFuPccrAV!Hkci!PMLg1NwefQ?8XN1c|b>1J1ov=FYia8m@Rl(*)X57%_ zj*NIUYRI@DtA}41d$}4n<+&)V$_}2@^axQE9n9_XDd;ww3#i-om)U2Vw#RJVL4GuD zCc2DlK(JMPRQyLXg*{-nH~?gk{ABLFa^doYtI<{VRrF=FzW=owI*<+X=$dh~jnHih z0G3x8fI(oEp)3GmT(qSRvpk_YQ>rZx6B{-DOw zxE1cPNN$+}OY){Uu#Ufxl{%0$V}w5glmC+^{7KmB->qj*+K*>FYCMP5V@%Nc{Y&!7 z#mg7h&7qY&K-P?*%=U*9yc>lfP})8U3$%`@u3)M|iqi>*!mca|P+A^yAiEGf$a}Ts zi^RYICKP`PEyC*uYCDTfq0XZqi_YOkj!stxb4_3f7Rj&X;F7p$4z8PnEA#8-u^X=f zSu>9PhnHK6eSyj@8mk?S@7k{1H>1D^WMn^B0!|k_;e|pvVa?@uvn0Kn!KtWx0L5x_ zc6M7x(vUwUB&dTsiwclM^81k!--vI=e>ie#&Fn{T`q$0=6-eK)YmfqCYsTbv5=e>= zyev9*WrK%_3X!TP{1EKX>K%tI@iraqgEwZnqVX3%%!iTSf_uH)+ZCS~T!3e{_IAaa zH<(Vf_z0}2loP|YLnm-;J1N>WVASxDFWL5|4ae`y;f<0a&fnD7@L0r{NVQIwohj z*i8d{z@)s$WAVv8_yFk(kNg2XnE2ABCXlN}6HSb7;K~b6o^y9uC=pWOO;w5Cb+;0U;|^42lZNK z>kjRnL))`3ULu@0lo3Ze1wJ`C(;S28JjaY9FbgA-dUmSq-N*HjT`aS;&k>8>2p%r{B;o=}LF~B)O(dTq6}dHIqd6kxKJPJr<#-(qf3g zb6F!yu4$}v7j5@!2DdxIm3v>uJ>7JD=87)nV@WeLRqO(M zt&vS3Ki1LS0Vc~mKo-bP_V&x?FP*;UH07G|H#*x?#@-BK}C-7+=tizes=%$@P^=EM(++cy+ zvWFJcO?zk!f1}HFAgk7>cn&82CpW~?u-Ctv&Y+f`z;sl90Zqqfpy|68)#VG9F09%6 zmUjSIwf1!ke>kao`0s;7kH>$W)-k;`Om9eQIsy1^>);RNb@)GA ze6+gfsp>(o(&faq$JO^n2pEAx90W_i?gqk7vQ$C0%U>we(>lG`R(`*2T!cpgNV%FnmxD-S$p6r1pmOQHTj(alEDKnh$*;g zh$z(|Miou$hdo;TSJiE2CC*HWhbhb*2 zf=;EJTCN*;A$Q%h=(+$!Me!?0wj#ky$#PDVkV9g_Uw#ba3vx%(a@K8=JiljQd~tN$*nMl) z;KF;0@2nexZG-0CYMV4ShNJ>Y=GMP7ntQvg19uy_o@|O{!aE?GqMal0ph`dbS#JQ! z;HSU}5KjR~t)$7kNclBkpbQHTF5PAV@1HPHf+-{{Bn6z?+L?3tImIK1UjPEXP&zJc zbn~8dqyy|xaR^lK8Imspxvf)5@0JK1`jM3XAbWoyBkN@3XY%6T)($#Fub#L|u+NPD E2a4@YHvj+t literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/shipment_weight_mark_tracking_completed_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/shipment_weight_mark_tracking_completed_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c99b31cab56113273cc6ab1d69e06a7db084b0b GIT binary patch literal 2386 zcmb_e&2Jk;6rb5$uh)*9Z7D6~qisTHsA&=xRQg3#LNvQ#Zus@`f8wAT9C7H zsa^B+AaCUZ!!m+`RS1e!F}3IXzMy24C{f6Jgy~lZ%e&gLn(bkgn@Yv_6FU`}^f_S| zNk@87C?+aOQaI@d_e{iGKgqr8xjw6CiTYO9Otf*YCKK(nCuCy0AESfg!vfl*>(^`9 z(wXe;Lp!t3UnDNEC?l3~7GkngrdS$N-5k@7!zlE0mV=(2_DU>&MYHm(#0+>Etjr4V zEVxD1&x%*HOhzljprSa6|c#>&={(XB<8^#hu!m7tXvL1+ni+ zmz`{$Vjs97hIrl9(c%EK$Mi~lCR*hU5Iz=?PbXR<^kmEI8S8%J$mt~aspB`?8tuM1 zKJxJIBZPKNgR)3uZ){e<;mu7U^JEsX<>AJtN9O5Q^mDr0^`9g+l!+Upq9%GAb1#%h zKCVYRaAZ;pkWia7g7}7#XaX2Z^tlTTpAiE092mIQuAUVx7uAdYSnPz=aaYXAD6R@N zH#*~nE_YSrctPAWhu6&E zrHgCkv6Vw0R*hr-5$wYU!aS8dP?ozI-}a~@VKW$vK$;H1n?USEPk5n_PFQm}o<2$c zW{fH-A40Plotu3mGHC)l88YaK8;A;sHu?SFiEqTW<3AicwQ3F`MuThS;1cBYfv+JU z4y+oJ-$@WDP;e#b+?5R;CMxh&QTTpXqt!nSOX9&hG60v;bVcJYftin>zzO&Idj~Pz zPdEYhZtd)uH!m=qdht=1Qz<8gZHG?a+ICX3ZGfubqh7M@Pa2Nj9m(4^i)yyb%ixok zw*A0G3f6wGa;#mx3kBvy(pU2xAp#c;PR945`4tpfQDDxbdB{tsp)lbuJ_PX@xuYmK z5d5 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/shipment_weight_retrack_tracking_by_id_response.cpython-312.pyc b/tracking/models/__pycache__/shipment_weight_retrack_tracking_by_id_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a030b543834a99cf450cb5253342de1c6696163 GIT binary patch literal 2337 zcmb_e&5smC6tC*;>FJrB*#;5B4`A1om6qL|MNkomMzU&1a81}nlQx@9Gu5;7Zhu)- zBg|w2d%$G5$Z_%H9z00)!qGp#gNc{jtO=ymXrhVn298`f`Cj)hutW?bR%TwkdR4FL zz2AGUs=u#R%LLkfe`)rZM#yhCxZ4UjLp!H|Stg7y8jz6Mlp?PLimgDe25P9;T3E0P znOqC>uxJ-U!#2W_T?)%~Ig=NHzOZ6fC{f6Jgy|OvD|*_hnxA1;TZ(1;i35wKeQp%R z(v^N3iAhUIOUGQ{y&p3#NDJ@!Ucf9ZRo{+UsW#!)WvZR#*l*g%`|f<`^x zI;Y)pXlD+_%fur#WyDrafls!|6kB7eS76#vn1zwf3NX^MQH2#RYIc!Tm;t@Ps;mTk z$t$ydR=%jMc2BYUKw`4K`y>_cX-jHNo$-^-fh)@|jd?M!syDJz*n=T{)8$K6QhpSEpTbu`9yAj}Y29 z0n9Ryy}3CBr#Cl+ERZ?KkOv#1K3Sk&(a-5>SAU9JRVJ?zOHK78;eI63V$z6t=*qMl zVh|nH43n!$stJfvs?VQw`K%Cl=D@(6R_&DVxTu{A#u7KGO?YBn#z{@E`O#S~^0+Hw zUW=PDY0BEmuZ$n4B`tX-j%pdI0B9{cLexYTb?0mbyTfzboxAIt(=EqmAkMKLOIoQe zV+SB?k3Vt*#&V4vV7k}?WRd)2Zoho~()la#74~KPMZCWIwQD+%4fF7takzuvZ3+RF zSQdg|V3wgY0AyVBK)VO>6yaN75^~(Uhov(o;)rhtc^5^#6Zo_U*5OS1z+*XtDo^8H zxXB{9VGb?H>*mlp{zg|CK-P>={tQh1Pp;runGy9GZ_&LGyPn$;%fm zU065wt?U4@X6(z2zdy-)ao7h+50AqFZD6`9nC_6~bQ0pQEsq0~m(N`3Wr#!WtMx#n z24aah#h*fp@DhRo&!ban@HoulbMVpQ(^JB96BvX=@~b(#B(9so>*nyvxpni%wO4_x z8AtxZ%?B%ffyy2nt6h$7dsxkHhJg`C%0aLMye|8~kA!riy2tT)N&7dWW2t-y#cF(d z?xC1uL4RCKPzkpd7LY~q`=K|#5#LVyaOn7&If&>CuA74^kip|$LlTUy8B^a$AQ?pP z!su{4GD^7(-&gB7N&$3N5_RQGvUOTu(MlGvO@|PSgBIJjm)t zKO0Rz8T{l}3H%8lsgbmp8%e*;HI!i?!bRLl;40@jN-&MMfuw|UTk|=`J14zJ;1>eN zFPPk=&2HW?j^@C=$q&O4e4fOMKyIp((%Th6hkhj0Kgix+$jAm6`I$Wbx3Pmx(`%*M J1pCbRe*hc;T897t literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/shipment_weight_tracking.cpython-312.pyc b/tracking/models/__pycache__/shipment_weight_tracking.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d3ad44970a089e98a76b2da862a6024862a0712 GIT binary patch literal 2181 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 w591ShdQ~&?~ literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/tag_v1.cpython-312.pyc b/tracking/models/__pycache__/tag_v1.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..393d810f346699c50c77520253cbfe61122835ef GIT binary patch literal 824 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 Hw#q*M-Xr&p literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/tracking_response_get_multiple_v1.cpython-312.pyc b/tracking/models/__pycache__/tracking_response_get_multiple_v1.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ff00baa8093cf83559c40f3467992e0fefc462b GIT binary patch literal 2448 zcmb_e&2JM&6rWkI*K5b|CeQ+0!nFw)G8`MBB|5_R4qcQt!ERQ>{n;T zlvokuK&5ag$Iw%A=%FYVj{E^VRO-c1DuK2|ZPiv)Z%~&Dr@puTfJ6j1bY#DI^XARW zd%ySI%>K~bogvT;RhDOeQwjMU2kn+@GPF?xW`!`qs7pL*Qi{CdDy9N`!cBOpsd`B> z8Ov2y^HOHY(@ot=n`tj&W@35L?eel_Hs&?A+sm1`m`}Ne*JJijqL7n>=~oF$JL+1Z zdA8ZRpcFEHdH#!I%h}A zO-q`zWfpDB!FYu@#H5Uv${B#hOfbb%S;9#&bqr=*Lu>2gdCQahOu+NAj+EeCUbftf zRVQmbZD7td(KsKe9>7vN)R8|I8(6{szcOuEk6jA>U4+oaX<$}}?99z6IK8&g#hJH!cTI;9CO=a>XDI_8-40*+uQ7Q!IJX=N?4^zNmRWH1$M5=%oN80@7 zHlGy&&&=l^&6myyhl|oBw;0-fY1|R>G6+k8%@5ByzQb)9@KR8fVO5siJ~A>|3K!&s zz%R8SE5%2M&e&=LYyr5I*Gd-a;%G5kh%^~kLh{<1?QlFbuZm5rJz$`C1IQBj*?9T- zTBJlZckhiendx4KqU>(lX_CMDNRC^WIqbp0~t}(DI?-&E?_#0lG0aDk8`D-xw zKbg;W!Cp@{nL*vZfXS%VhbH4rXma1Oynf}{m38Cb>MkI4{b1AJCsVeA_d!^+J>H9S z29sC8C(5pfbi@zyg};Ip;SB?o+>Anch6i3V4hNnc zhmK-DZh|3PBEK4g%i@kPxNZ!tURpPf-#QAUt{;DfYg=n}k;)DPYb}oN+^%XjyUqwC z+yGbto@Oed;tOf}WryPh5#=@`Qb_RqC{6^Q&TWfB9NZVd0TppOQ2??;{y2Q%w)k%R z$HS-UMn59bzi#xeLUxXP3&9?#>r>xLATccPs%YGiRqjU#h)F@=!>~s!Hx65#1Hn)p z-k0+Qm1EKIA`(=1l$gr#@-a?S}fRtkua=c48W)SHPW|lX}q4<-aQBhx$fjv5d;r2}+B_7GD(pZ{XR3fRc*-&7`Aa||JzQY6FDqrPq6|w8 zuG57Oo-eMU1e1sBNYXgh+nlqUOVaTLeiv~3o{4t1FYaQTXQGHN8(hyEE=&>~-8zep znAH|;d$;o}o*Uz}8N)~VSTkxTIKK7xVhPNO`w2?v!z`f#KauXg$o^l*&;}X0NA~?m V-nvKFzuGQ3O;=AnB-qF3{0Bp^d!_&Y literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/tracking_response_v1.cpython-312.pyc b/tracking/models/__pycache__/tracking_response_v1.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41349a6bb50e9dd926292943325e87f49d318fe4 GIT binary patch literal 2298 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 O`_NbLc!2_q3jYJ7H5%6d literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/weight_estimated_delivery_date_request.cpython-312.pyc b/tracking/models/__pycache__/weight_estimated_delivery_date_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea6e3bf709944f8b405eabbd2a3ab5450b612b2a GIT binary patch literal 2279 zcmb_e&5smC6tC*;>FJrB*#;2=71(8ErD1mm4JsnRXa_S+yi>W*p^o1q6M2SM)CrrOeSl-i?)NBvC+)^y#PaIe@>2sqf zmag>UNQ_%bQh3)D-iI;sf+Y8z?*+`#67`*^m1tGJCKK(HFJxkT)W8XD01IdnUQn-P zOJ}sZ5A96Dc!7Atri|Fi8HmYNnPO{9^>R!*4q6!LEC(Y!9hF%As%Ga|i5buvtjr3~ z7rY|tXT_`9Qg;`-4UWfryHhb+@u&{+8ovl z8@H516OflgpSkGrDIsvrfr0f#<&5ySs9Xxh8g5jndSXV#jf!A1qf=hwaaYE?5;tX| zDJ!qOcKDS_qb1M9QAKjMHseQAm2?YHxtQYY0G=7p4s4tv?J$7a;ThIrjaH(|*a76) z*3%Im%S?BGt70#ZIr5Xa{rcr=mv6*3*jMqF@yebzZtFl+&7;f4(GG&O0dhPyIYY>e{fLHR$$z@LS+{@rf|M|ZP+qwS06H|7ET-ZL++U%7T=#XPXM z1IV&*AoKdsGVURN046;d`B_@Wf>yAgp^)h~Aipg`9uAP7)(+wZ)veY7kr+6@^5M^+ zM|iQo+0F7%sPj0?GBUD>jP$IrvIN3DM}9Sj=fxd!c*PuEytHB-yZt(lW#ia?#P|4N zo~5#f!%~;y+n#isH^$Eh)ZZX@0^t^Y;YUKcQO)Ccb0qy6VX;&`gkm*5JN-m3(ll=x z47A2Ig#~1e{C?!bH{#ps4@W*&HU|-w!4-3G5sLNjO-TFUWnU`d-jgE(@M26_8h;7Id;|#^toQfsO?))a0QYY1?1?unFqzKcqhMo| z6T@*LH}o7QDLM|I(+rR=InMc}8+0{!$6;~Jad;W#B&Op$^16YvAEX=)CEtw%OCjm2 z1+EaG2lpJ~`%!!l$yOv-CTX?t5^_jP_{1kbJ}37SC1bbA4&NSvi}z{vPwpNCj0(2cF@!G=C1n$`_%b=0Is}4 Au>b%7 literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/weight_estimated_delivery_date_response.cpython-312.pyc b/tracking/models/__pycache__/weight_estimated_delivery_date_response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8150f9941337ae1c025ab1eb79860d1b3af7d477 GIT binary patch literal 2287 zcmb_e&5smC6tC*;>FJrB*=9u$KY(3VRt9!<&>$ibjAYQ5;F`FgNt;clnd(`3x4)>W z0cNs+Jz%n2LSR!T*R;FLQdhb=e z_kQ)NYQ8U*iv-$!Z*k_3M#yhCc-V3oL%U~ySt5)u>XU$4lp?SAilsoW`f8wAT9C7H zsa*5*AaCUZ!!m+`RS1e!F_q{1fuLlSC{f7!gy~lZ%e&f&n)$HGZKY!TiGvDF2AnXA zq$9m36q6MtDI9l%`(eafKgqr4xjw6CiTZBXPPDq$kcoEE6EZPAigAMD!vflr>o*(O z(i!dfq1{;+FA3OjRKw`3i$0Q}lX-hKtsq4+0l_!Ms0!O;6?)u(&m$&OM_}CRO1eXr(e@A=t^(?6uGHP-Xs+@(c_qVp-l2|GvbhNQVek8Y}N|m zn@XYy*qKD1yWsE{A<*aW@Pl);)57JVcF~`Rov>DS#hi@dnqYI)88>vfBO_jmS~70Q z+Usu|c&!$<<=H5#N$xb}yl|$Lx)8MsDblw45NaD7r&!wzz_xi0?TNUZ=rXbay3W2$ zU_O!AZiisSZXgTfCv)4iOII&lkFK+?qA#PhU2opffvlT{SB=A6glhxnc#u-i$ADRa z0|2n1(G%?vtW$(<0VPzj`3OCGRzxA+2J#+md1{Xa6QsLF4Cf6`a06?wF&C z^0qm;hQI1^6UeGjg6?a@A7sa ztH$0e?8i&FkNsYl^mOd!X%mZD!J>v@rjvmE)(m?%L|$4y2pm+n+VDkU-~cO#KZgn z=D4V+09hcvA3XMr__qGT!4Fo=5yWL=%^X>VdOdIhHvYh>G4-7Ul7a*8h0a~s;$fn~ z{!|pcAJ*s$)?rD!Eysu9<(RH${1p)MaU^K)V6cCC;^Tn^=)1F{FW$JobUKSy!KPA9 z4BHN!z_sn9Xxji!%SXOs+vi%2-_zu6n?()V=4F_Zn6~}cD+kg+ka9eid?ymDg=C=N zJ3<65+;)ubLGeB$LrAbr(t6`1qt~)zN7EUa_ zv#yPFHJW>?tJB;Bk_s5N%;@5=NB@*PR4&GFaK?9r>E$R%6)=;8vH*8u}1p< literal 0 HcmV?d00001 diff --git a/tracking/models/__pycache__/weight_predict_request.cpython-312.pyc b/tracking/models/__pycache__/weight_predict_request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5a310e400369e093b83a9120877a738d56d6784 GIT binary patch literal 2165 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 literal 0 HcmV?d00001 diff --git a/tracking/models/additional_fields_v1.py b/tracking/models/additional_fields_v1.py new file mode 100644 index 0000000..05c7d0a --- /dev/null +++ b/tracking/models/additional_fields_v1.py @@ -0,0 +1,23 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from enum import Enum, unique + + +@unique +class AdditionalFieldsV1(Enum): + """ + All available additional fields + + allowed enum values + """ + + TRACKING_ACCOUNT_NUMBER = "tracking_account_number" + TRACKING_POSTAL_CODE = "tracking_postal_code" + TRACKING_SHIP_DATE = "tracking_ship_date" + TRACKING_KEY = "tracking_key" + TRACKING_ORIGIN_COUNTRY_REGION = "tracking_origin_country_region" + TRACKING_DESTINATION_COUNTRY_REGION = "tracking_destination_country_region" + TRACKING_STATE = "tracking_state" diff --git a/tracking/models/aftership_estimated_delivery_date_create_tracking_response.py b/tracking/models/aftership_estimated_delivery_date_create_tracking_response.py new file mode 100644 index 0000000..3bade42 --- /dev/null +++ b/tracking/models/aftership_estimated_delivery_date_create_tracking_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class AftershipEstimatedDeliveryDateCreateTrackingResponse(BaseModel): + """ + AftershipEstimatedDeliveryDateCreateTrackingResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/aftership_estimated_delivery_date_delete_tracking_by_id_response.py b/tracking/models/aftership_estimated_delivery_date_delete_tracking_by_id_response.py new file mode 100644 index 0000000..9ed259d --- /dev/null +++ b/tracking/models/aftership_estimated_delivery_date_delete_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class AftershipEstimatedDeliveryDateDeleteTrackingByIdResponse(BaseModel): + """ + AftershipEstimatedDeliveryDateDeleteTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/aftership_estimated_delivery_date_get_tracking_by_id_response.py b/tracking/models/aftership_estimated_delivery_date_get_tracking_by_id_response.py new file mode 100644 index 0000000..831eb04 --- /dev/null +++ b/tracking/models/aftership_estimated_delivery_date_get_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class AftershipEstimatedDeliveryDateGetTrackingByIdResponse(BaseModel): + """ + AftershipEstimatedDeliveryDateGetTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.py b/tracking/models/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..2c0cd31 --- /dev/null +++ b/tracking/models/aftership_estimated_delivery_date_mark_tracking_completed_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class AftershipEstimatedDeliveryDateMarkTrackingCompletedByIdResponse(BaseModel): + """ + AftershipEstimatedDeliveryDateMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/aftership_estimated_delivery_date_retrack_tracking_by_id_response.py b/tracking/models/aftership_estimated_delivery_date_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..0420e8e --- /dev/null +++ b/tracking/models/aftership_estimated_delivery_date_retrack_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class AftershipEstimatedDeliveryDateRetrackTrackingByIdResponse(BaseModel): + """ + AftershipEstimatedDeliveryDateRetrackTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/aftership_estimated_delivery_date_tracking.py b/tracking/models/aftership_estimated_delivery_date_tracking.py new file mode 100644 index 0000000..6e451e1 --- /dev/null +++ b/tracking/models/aftership_estimated_delivery_date_tracking.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class AftershipEstimatedDeliveryDateTracking(BaseModel): + """ + AftershipEstimatedDeliveryDateTracking + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/aftership_estimated_delivery_date_update_tracking_by_id_response.py b/tracking/models/aftership_estimated_delivery_date_update_tracking_by_id_response.py new file mode 100644 index 0000000..e2958d5 --- /dev/null +++ b/tracking/models/aftership_estimated_delivery_date_update_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class AftershipEstimatedDeliveryDateUpdateTrackingByIdResponse(BaseModel): + """ + AftershipEstimatedDeliveryDateUpdateTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/carbon_emissions_create_tracking_response.py b/tracking/models/carbon_emissions_create_tracking_response.py new file mode 100644 index 0000000..8d71b7d --- /dev/null +++ b/tracking/models/carbon_emissions_create_tracking_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CarbonEmissionsCreateTrackingResponse(BaseModel): + """ + CarbonEmissionsCreateTrackingResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/carbon_emissions_delete_tracking_by_id_response.py b/tracking/models/carbon_emissions_delete_tracking_by_id_response.py new file mode 100644 index 0000000..7a7313c --- /dev/null +++ b/tracking/models/carbon_emissions_delete_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CarbonEmissionsDeleteTrackingByIdResponse(BaseModel): + """ + CarbonEmissionsDeleteTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/carbon_emissions_get_tracking_by_id_response.py b/tracking/models/carbon_emissions_get_tracking_by_id_response.py new file mode 100644 index 0000000..1fa9a26 --- /dev/null +++ b/tracking/models/carbon_emissions_get_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CarbonEmissionsGetTrackingByIdResponse(BaseModel): + """ + CarbonEmissionsGetTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/carbon_emissions_mark_tracking_completed_by_id_response.py b/tracking/models/carbon_emissions_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..b0048d4 --- /dev/null +++ b/tracking/models/carbon_emissions_mark_tracking_completed_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CarbonEmissionsMarkTrackingCompletedByIdResponse(BaseModel): + """ + CarbonEmissionsMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/carbon_emissions_retrack_tracking_by_id_response.py b/tracking/models/carbon_emissions_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..7a5f8ae --- /dev/null +++ b/tracking/models/carbon_emissions_retrack_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CarbonEmissionsRetrackTrackingByIdResponse(BaseModel): + """ + CarbonEmissionsRetrackTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/carbon_emissions_tracking.py b/tracking/models/carbon_emissions_tracking.py new file mode 100644 index 0000000..fb98048 --- /dev/null +++ b/tracking/models/carbon_emissions_tracking.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CarbonEmissionsTracking(BaseModel): + """ + CarbonEmissionsTracking + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/carbon_emissions_update_tracking_by_id_response.py b/tracking/models/carbon_emissions_update_tracking_by_id_response.py new file mode 100644 index 0000000..6709557 --- /dev/null +++ b/tracking/models/carbon_emissions_update_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CarbonEmissionsUpdateTrackingByIdResponse(BaseModel): + """ + CarbonEmissionsUpdateTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/checkpoint.py b/tracking/models/checkpoint.py new file mode 100644 index 0000000..7b92fc8 --- /dev/null +++ b/tracking/models/checkpoint.py @@ -0,0 +1,56 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.coordinate_checkpoint import CoordinateCheckpoint +from tracking.models.tag_v1 import TagV1 +from tracking.models.events_checkpoint import EventsCheckpoint + + +class Checkpoint(BaseModel): + """ + Object describes checkpoint information. + """ # noqa: E501 + + created_at: Optional[str] = None + slug: Optional[str] = None + checkpoint_time: Optional[str] = None + location: Optional[str] = None + city: Optional[str] = None + state: Optional[str] = None + zip: Optional[str] = None + coordinate: Optional[CoordinateCheckpoint] = None + country_region: Optional[str] = None + country_region_name: Optional[str] = None + message: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + raw_tag: Optional[str] = None + events: Optional[List[EventsCheckpoint]] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/coordinate_checkpoint.py b/tracking/models/coordinate_checkpoint.py new file mode 100644 index 0000000..b3a8330 --- /dev/null +++ b/tracking/models/coordinate_checkpoint.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CoordinateCheckpoint(BaseModel): + """ + CoordinateCheckpoint + """ # noqa: E501 + + latitude: Optional[float] = None + longitude: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier.py b/tracking/models/courier.py new file mode 100644 index 0000000..f180583 --- /dev/null +++ b/tracking/models/courier.py @@ -0,0 +1,45 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + + +class Courier(BaseModel): + """ + Courier object + """ # noqa: E501 + + slug: Optional[str] = None + name: Optional[str] = None + phone: Optional[str] = None + other_name: Optional[str] = None + web_url: Optional[str] = None + required_fields: Optional[List[str]] = None + optional_fields: Optional[List[str]] = None + default_language: Optional[str] = None + support_languages: Optional[List[str]] = None + service_from_country_regions: Optional[List[str]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_estimated_delivery_date_create_tracking_response.py b/tracking/models/courier_estimated_delivery_date_create_tracking_response.py new file mode 100644 index 0000000..464e8cc --- /dev/null +++ b/tracking/models/courier_estimated_delivery_date_create_tracking_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CourierEstimatedDeliveryDateCreateTrackingResponse(BaseModel): + """ + CourierEstimatedDeliveryDateCreateTrackingResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_estimated_delivery_date_delete_tracking_by_id_response.py b/tracking/models/courier_estimated_delivery_date_delete_tracking_by_id_response.py new file mode 100644 index 0000000..979c62e --- /dev/null +++ b/tracking/models/courier_estimated_delivery_date_delete_tracking_by_id_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CourierEstimatedDeliveryDateDeleteTrackingByIdResponse(BaseModel): + """ + CourierEstimatedDeliveryDateDeleteTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_estimated_delivery_date_get_tracking_by_id_response.py b/tracking/models/courier_estimated_delivery_date_get_tracking_by_id_response.py new file mode 100644 index 0000000..ff14e21 --- /dev/null +++ b/tracking/models/courier_estimated_delivery_date_get_tracking_by_id_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CourierEstimatedDeliveryDateGetTrackingByIdResponse(BaseModel): + """ + CourierEstimatedDeliveryDateGetTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.py b/tracking/models/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..a9da337 --- /dev/null +++ b/tracking/models/courier_estimated_delivery_date_mark_tracking_completed_by_id_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CourierEstimatedDeliveryDateMarkTrackingCompletedByIdResponse(BaseModel): + """ + CourierEstimatedDeliveryDateMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_estimated_delivery_date_retrack_tracking_by_id_response.py b/tracking/models/courier_estimated_delivery_date_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..f248026 --- /dev/null +++ b/tracking/models/courier_estimated_delivery_date_retrack_tracking_by_id_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CourierEstimatedDeliveryDateRetrackTrackingByIdResponse(BaseModel): + """ + CourierEstimatedDeliveryDateRetrackTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_estimated_delivery_date_tracking.py b/tracking/models/courier_estimated_delivery_date_tracking.py new file mode 100644 index 0000000..0021ab3 --- /dev/null +++ b/tracking/models/courier_estimated_delivery_date_tracking.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CourierEstimatedDeliveryDateTracking(BaseModel): + """ + CourierEstimatedDeliveryDateTracking + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_estimated_delivery_date_update_tracking_by_id_response.py b/tracking/models/courier_estimated_delivery_date_update_tracking_by_id_response.py new file mode 100644 index 0000000..e7bfa3b --- /dev/null +++ b/tracking/models/courier_estimated_delivery_date_update_tracking_by_id_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CourierEstimatedDeliveryDateUpdateTrackingByIdResponse(BaseModel): + """ + CourierEstimatedDeliveryDateUpdateTrackingByIdResponse + """ # noqa: E501 + + estimated_delivery_date: Optional[str] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/courier_response_v1.py b/tracking/models/courier_response_v1.py new file mode 100644 index 0000000..c72a40d --- /dev/null +++ b/tracking/models/courier_response_v1.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.meta_v1 import MetaV1 +from tracking.models.data_courier_response_v1 import DataCourierResponseV1 + + +class CourierResponseV1(BaseModel): + """ + Model of all couriers endpoint response + """ # noqa: E501 + + meta: Optional[MetaV1] = None + data: Optional[DataCourierResponseV1] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/create_tracking_request.py b/tracking/models/create_tracking_request.py new file mode 100644 index 0000000..c6d2986 --- /dev/null +++ b/tracking/models/create_tracking_request.py @@ -0,0 +1,78 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.slug_group_v1 import SlugGroupV1 +from tracking.models.last_mile_create_tracking_request import LastMileCreateTrackingRequest +from tracking.models.customers_create_tracking_request import CustomersCreateTrackingRequest + + +class CreateTrackingRequest(BaseModel): + """ + CreateTrackingRequest + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + title: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + custom_fields: Optional[Any] = None + language: Optional[str] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + note: Optional[str] = None + slug_group: Optional[SlugGroupV1] = None + order_date: Optional[str] = None + order_number: Optional[str] = None + shipment_type: Optional[str] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + last_mile: Optional[LastMileCreateTrackingRequest] = None + customers: Optional[List[CustomersCreateTrackingRequest]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/create_tracking_response.py b/tracking/models/create_tracking_response.py new file mode 100644 index 0000000..e00a91f --- /dev/null +++ b/tracking/models/create_tracking_response.py @@ -0,0 +1,147 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier_estimated_delivery_date_create_tracking_response import ( + CourierEstimatedDeliveryDateCreateTrackingResponse, +) +from tracking.models.shipment_weight_create_tracking_response import ( + ShipmentWeightCreateTrackingResponse, +) +from tracking.models.tag_v1 import TagV1 +from tracking.models.checkpoint import Checkpoint +from tracking.models.aftership_estimated_delivery_date_create_tracking_response import ( + AftershipEstimatedDeliveryDateCreateTrackingResponse, +) +from tracking.models.custom_estimated_delivery_date_create_tracking_response import ( + CustomEstimatedDeliveryDateCreateTrackingResponse, +) +from tracking.models.first_estimated_delivery_create_tracking_response import ( + FirstEstimatedDeliveryCreateTrackingResponse, +) +from tracking.models.latest_estimated_delivery_create_tracking_response import ( + LatestEstimatedDeliveryCreateTrackingResponse, +) +from tracking.models.carbon_emissions_create_tracking_response import ( + CarbonEmissionsCreateTrackingResponse, +) +from tracking.models.first_mile_create_tracking_response import FirstMileCreateTrackingResponse +from tracking.models.last_mile_create_tracking_response import LastMileCreateTrackingResponse +from tracking.models.customers_create_tracking_response import CustomersCreateTrackingResponse + + +class CreateTrackingResponse(BaseModel): + """ + Object describes the tracking information.

+ """ # noqa: E501 + + id: Optional[str] = None + legacy_id: Optional[str] = None + created_at: Optional[str] = None + updated_at: Optional[str] = None + tracking_number: Optional[str] = None + slug: Optional[str] = None + active: Optional[bool] = None + custom_fields: Optional[Any] = None + transit_time: Optional[int] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + courier_destination_country_region: Optional[str] = None + courier_estimated_delivery_date: Optional[ + CourierEstimatedDeliveryDateCreateTrackingResponse + ] = None + note: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + order_date: Optional[str] = None + shipment_package_count: Optional[float] = None + shipment_pickup_date: Optional[str] = None + shipment_delivery_date: Optional[str] = None + shipment_type: Optional[str] = None + shipment_weight: Optional[ShipmentWeightCreateTrackingResponse] = None + signed_by: Optional[str] = None + source: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + title: Optional[str] = None + tracked_count: Optional[float] = None + last_mile_tracking_supported: Optional[bool] = None + language: Optional[str] = None + unique_token: Optional[str] = None + checkpoints: Optional[List[Checkpoint]] = None + subscribed_smses: Optional[List[str]] = None + subscribed_emails: Optional[List[str]] = None + return_to_sender: Optional[bool] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + courier_tracking_link: Optional[str] = None + first_attempted_at: Optional[str] = None + courier_redirect_link: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + on_time_status: Optional[str] = None + on_time_difference: Optional[float] = None + order_tags: Optional[List[str]] = None + aftership_estimated_delivery_date: Optional[ + AftershipEstimatedDeliveryDateCreateTrackingResponse + ] = None + custom_estimated_delivery_date: Optional[CustomEstimatedDeliveryDateCreateTrackingResponse] = ( + None + ) + order_number: Optional[str] = None + first_estimated_delivery: Optional[FirstEstimatedDeliveryCreateTrackingResponse] = None + latest_estimated_delivery: Optional[LatestEstimatedDeliveryCreateTrackingResponse] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + carbon_emissions: Optional[CarbonEmissionsCreateTrackingResponse] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + failed_delivery_attempts: Optional[int] = None + signature_requirement: Optional[str] = None + delivery_location_type: Optional[str] = None + aftership_tracking_url: Optional[str] = None + aftership_tracking_order_url: Optional[str] = None + first_mile: Optional[FirstMileCreateTrackingResponse] = None + last_mile: Optional[LastMileCreateTrackingResponse] = None + customers: Optional[List[CustomersCreateTrackingResponse]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/custom_estimated_delivery_date_create_tracking_response.py b/tracking/models/custom_estimated_delivery_date_create_tracking_response.py new file mode 100644 index 0000000..10bfc19 --- /dev/null +++ b/tracking/models/custom_estimated_delivery_date_create_tracking_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomEstimatedDeliveryDateCreateTrackingResponse(BaseModel): + """ + CustomEstimatedDeliveryDateCreateTrackingResponse + """ # noqa: E501 + + type: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/custom_estimated_delivery_date_delete_tracking_by_id_response.py b/tracking/models/custom_estimated_delivery_date_delete_tracking_by_id_response.py new file mode 100644 index 0000000..17e2ea1 --- /dev/null +++ b/tracking/models/custom_estimated_delivery_date_delete_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomEstimatedDeliveryDateDeleteTrackingByIdResponse(BaseModel): + """ + CustomEstimatedDeliveryDateDeleteTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/custom_estimated_delivery_date_get_tracking_by_id_response.py b/tracking/models/custom_estimated_delivery_date_get_tracking_by_id_response.py new file mode 100644 index 0000000..948ad09 --- /dev/null +++ b/tracking/models/custom_estimated_delivery_date_get_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomEstimatedDeliveryDateGetTrackingByIdResponse(BaseModel): + """ + CustomEstimatedDeliveryDateGetTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/custom_estimated_delivery_date_mark_tracking_completed_by_id_response.py b/tracking/models/custom_estimated_delivery_date_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..ac25651 --- /dev/null +++ b/tracking/models/custom_estimated_delivery_date_mark_tracking_completed_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomEstimatedDeliveryDateMarkTrackingCompletedByIdResponse(BaseModel): + """ + CustomEstimatedDeliveryDateMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/custom_estimated_delivery_date_retrack_tracking_by_id_response.py b/tracking/models/custom_estimated_delivery_date_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..5480d54 --- /dev/null +++ b/tracking/models/custom_estimated_delivery_date_retrack_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomEstimatedDeliveryDateRetrackTrackingByIdResponse(BaseModel): + """ + CustomEstimatedDeliveryDateRetrackTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/custom_estimated_delivery_date_tracking.py b/tracking/models/custom_estimated_delivery_date_tracking.py new file mode 100644 index 0000000..3b955e4 --- /dev/null +++ b/tracking/models/custom_estimated_delivery_date_tracking.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomEstimatedDeliveryDateTracking(BaseModel): + """ + CustomEstimatedDeliveryDateTracking + """ # noqa: E501 + + type: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/custom_estimated_delivery_date_update_tracking_by_id_response.py b/tracking/models/custom_estimated_delivery_date_update_tracking_by_id_response.py new file mode 100644 index 0000000..fc7f7cc --- /dev/null +++ b/tracking/models/custom_estimated_delivery_date_update_tracking_by_id_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomEstimatedDeliveryDateUpdateTrackingByIdResponse(BaseModel): + """ + CustomEstimatedDeliveryDateUpdateTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_create_tracking_request.py b/tracking/models/customers_create_tracking_request.py new file mode 100644 index 0000000..a616f95 --- /dev/null +++ b/tracking/models/customers_create_tracking_request.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersCreateTrackingRequest(BaseModel): + """ + CustomersCreateTrackingRequest + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_create_tracking_response.py b/tracking/models/customers_create_tracking_response.py new file mode 100644 index 0000000..5b68032 --- /dev/null +++ b/tracking/models/customers_create_tracking_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersCreateTrackingResponse(BaseModel): + """ + CustomersCreateTrackingResponse + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_delete_tracking_by_id_response.py b/tracking/models/customers_delete_tracking_by_id_response.py new file mode 100644 index 0000000..5f50177 --- /dev/null +++ b/tracking/models/customers_delete_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersDeleteTrackingByIdResponse(BaseModel): + """ + CustomersDeleteTrackingByIdResponse + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_get_tracking_by_id_response.py b/tracking/models/customers_get_tracking_by_id_response.py new file mode 100644 index 0000000..7157e1a --- /dev/null +++ b/tracking/models/customers_get_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersGetTrackingByIdResponse(BaseModel): + """ + CustomersGetTrackingByIdResponse + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_mark_tracking_completed_by_id_response.py b/tracking/models/customers_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..503b8d0 --- /dev/null +++ b/tracking/models/customers_mark_tracking_completed_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersMarkTrackingCompletedByIdResponse(BaseModel): + """ + CustomersMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_retrack_tracking_by_id_response.py b/tracking/models/customers_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..f2b6cb7 --- /dev/null +++ b/tracking/models/customers_retrack_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersRetrackTrackingByIdResponse(BaseModel): + """ + CustomersRetrackTrackingByIdResponse + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_tracking.py b/tracking/models/customers_tracking.py new file mode 100644 index 0000000..e16db7e --- /dev/null +++ b/tracking/models/customers_tracking.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersTracking(BaseModel): + """ + CustomersTracking + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_update_tracking_by_id_request.py b/tracking/models/customers_update_tracking_by_id_request.py new file mode 100644 index 0000000..742ad44 --- /dev/null +++ b/tracking/models/customers_update_tracking_by_id_request.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersUpdateTrackingByIdRequest(BaseModel): + """ + CustomersUpdateTrackingByIdRequest + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/customers_update_tracking_by_id_response.py b/tracking/models/customers_update_tracking_by_id_response.py new file mode 100644 index 0000000..249017b --- /dev/null +++ b/tracking/models/customers_update_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class CustomersUpdateTrackingByIdResponse(BaseModel): + """ + CustomersUpdateTrackingByIdResponse + """ # noqa: E501 + + role: Optional[str] = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + language: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/data_courier_response_v1.py b/tracking/models/data_courier_response_v1.py new file mode 100644 index 0000000..5fd3dd4 --- /dev/null +++ b/tracking/models/data_courier_response_v1.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier import Courier + + +class DataCourierResponseV1(BaseModel): + """ + DataCourierResponseV1 + """ # noqa: E501 + + total: Optional[int] = None + couriers: Optional[List[Courier]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/data_tracking_response_get_multiple_v1.py b/tracking/models/data_tracking_response_get_multiple_v1.py new file mode 100644 index 0000000..4904ab0 --- /dev/null +++ b/tracking/models/data_tracking_response_get_multiple_v1.py @@ -0,0 +1,42 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.pagination_data_tracking_response_get_multiple_v1 import ( + PaginationDataTrackingResponseGetMultipleV1, +) +from tracking.models.tracking import Tracking + + +class DataTrackingResponseGetMultipleV1(BaseModel): + """ + DataTrackingResponseGetMultipleV1 + """ # noqa: E501 + + pagination: Optional[PaginationDataTrackingResponseGetMultipleV1] = None + trackings: Optional[List[Tracking]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/delete_tracking_by_id_response.py b/tracking/models/delete_tracking_by_id_response.py new file mode 100644 index 0000000..055b8ac --- /dev/null +++ b/tracking/models/delete_tracking_by_id_response.py @@ -0,0 +1,153 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier_estimated_delivery_date_delete_tracking_by_id_response import ( + CourierEstimatedDeliveryDateDeleteTrackingByIdResponse, +) +from tracking.models.shipment_weight_delete_tracking_by_id_response import ( + ShipmentWeightDeleteTrackingByIdResponse, +) +from tracking.models.tag_v1 import TagV1 +from tracking.models.checkpoint import Checkpoint +from tracking.models.aftership_estimated_delivery_date_delete_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateDeleteTrackingByIdResponse, +) +from tracking.models.custom_estimated_delivery_date_delete_tracking_by_id_response import ( + CustomEstimatedDeliveryDateDeleteTrackingByIdResponse, +) +from tracking.models.first_estimated_delivery_delete_tracking_by_id_response import ( + FirstEstimatedDeliveryDeleteTrackingByIdResponse, +) +from tracking.models.latest_estimated_delivery_delete_tracking_by_id_response import ( + LatestEstimatedDeliveryDeleteTrackingByIdResponse, +) +from tracking.models.carbon_emissions_delete_tracking_by_id_response import ( + CarbonEmissionsDeleteTrackingByIdResponse, +) +from tracking.models.first_mile_delete_tracking_by_id_response import ( + FirstMileDeleteTrackingByIdResponse, +) +from tracking.models.last_mile_delete_tracking_by_id_response import ( + LastMileDeleteTrackingByIdResponse, +) +from tracking.models.customers_delete_tracking_by_id_response import ( + CustomersDeleteTrackingByIdResponse, +) + + +class DeleteTrackingByIdResponse(BaseModel): + """ + Object describes the tracking information.
+ """ # noqa: E501 + + id: Optional[str] = None + legacy_id: Optional[str] = None + created_at: Optional[str] = None + updated_at: Optional[str] = None + tracking_number: Optional[str] = None + slug: Optional[str] = None + active: Optional[bool] = None + custom_fields: Optional[Any] = None + transit_time: Optional[int] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + courier_destination_country_region: Optional[str] = None + courier_estimated_delivery_date: Optional[ + CourierEstimatedDeliveryDateDeleteTrackingByIdResponse + ] = None + note: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + order_date: Optional[str] = None + shipment_package_count: Optional[float] = None + shipment_pickup_date: Optional[str] = None + shipment_delivery_date: Optional[str] = None + shipment_type: Optional[str] = None + shipment_weight: Optional[ShipmentWeightDeleteTrackingByIdResponse] = None + signed_by: Optional[str] = None + source: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + title: Optional[str] = None + tracked_count: Optional[float] = None + last_mile_tracking_supported: Optional[bool] = None + language: Optional[str] = None + unique_token: Optional[str] = None + checkpoints: Optional[List[Checkpoint]] = None + subscribed_smses: Optional[List[str]] = None + subscribed_emails: Optional[List[str]] = None + return_to_sender: Optional[bool] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + courier_tracking_link: Optional[str] = None + first_attempted_at: Optional[str] = None + courier_redirect_link: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + on_time_status: Optional[str] = None + on_time_difference: Optional[float] = None + order_tags: Optional[List[str]] = None + aftership_estimated_delivery_date: Optional[ + AftershipEstimatedDeliveryDateDeleteTrackingByIdResponse + ] = None + custom_estimated_delivery_date: Optional[ + CustomEstimatedDeliveryDateDeleteTrackingByIdResponse + ] = None + order_number: Optional[str] = None + first_estimated_delivery: Optional[FirstEstimatedDeliveryDeleteTrackingByIdResponse] = None + latest_estimated_delivery: Optional[LatestEstimatedDeliveryDeleteTrackingByIdResponse] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + carbon_emissions: Optional[CarbonEmissionsDeleteTrackingByIdResponse] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + failed_delivery_attempts: Optional[int] = None + signature_requirement: Optional[str] = None + delivery_location_type: Optional[str] = None + aftership_tracking_url: Optional[str] = None + aftership_tracking_order_url: Optional[str] = None + first_mile: Optional[FirstMileDeleteTrackingByIdResponse] = None + last_mile: Optional[LastMileDeleteTrackingByIdResponse] = None + customers: Optional[List[CustomersDeleteTrackingByIdResponse]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/destination_address_estimated_delivery_date_request.py b/tracking/models/destination_address_estimated_delivery_date_request.py new file mode 100644 index 0000000..ea15673 --- /dev/null +++ b/tracking/models/destination_address_estimated_delivery_date_request.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class DestinationAddressEstimatedDeliveryDateRequest(BaseModel): + """ + DestinationAddressEstimatedDeliveryDateRequest + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/destination_address_estimated_delivery_date_response.py b/tracking/models/destination_address_estimated_delivery_date_response.py new file mode 100644 index 0000000..1720c95 --- /dev/null +++ b/tracking/models/destination_address_estimated_delivery_date_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class DestinationAddressEstimatedDeliveryDateResponse(BaseModel): + """ + DestinationAddressEstimatedDeliveryDateResponse + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/destination_address_predict_request.py b/tracking/models/destination_address_predict_request.py new file mode 100644 index 0000000..a0afc2e --- /dev/null +++ b/tracking/models/destination_address_predict_request.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class DestinationAddressPredictRequest(BaseModel): + """ + DestinationAddressPredictRequest + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/destination_address_predict_response.py b/tracking/models/destination_address_predict_response.py new file mode 100644 index 0000000..981d961 --- /dev/null +++ b/tracking/models/destination_address_predict_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class DestinationAddressPredictResponse(BaseModel): + """ + DestinationAddressPredictResponse + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/detect_courier_request.py b/tracking/models/detect_courier_request.py new file mode 100644 index 0000000..4bf6e1e --- /dev/null +++ b/tracking/models/detect_courier_request.py @@ -0,0 +1,49 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.slug_group_v1 import SlugGroupV1 + + +class DetectCourierRequest(BaseModel): + """ + DetectCourierRequest + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[List[str]] = None + tracking_postal_code: Optional[str] = None + tracking_ship_date: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_state: Optional[str] = None + slug_group: Optional[SlugGroupV1] = None + origin_country_region: Optional[str] = None + destination_country_region: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/detect_courier_response.py b/tracking/models/detect_courier_response.py new file mode 100644 index 0000000..71005bc --- /dev/null +++ b/tracking/models/detect_courier_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier import Courier + + +class DetectCourierResponse(BaseModel): + """ + DetectCourierResponse + """ # noqa: E501 + + total: Optional[int] = None + couriers: Optional[List[Courier]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/estimated_delivery_date_request.py b/tracking/models/estimated_delivery_date_request.py new file mode 100644 index 0000000..55fd84f --- /dev/null +++ b/tracking/models/estimated_delivery_date_request.py @@ -0,0 +1,56 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.origin_address_estimated_delivery_date_request import ( + OriginAddressEstimatedDeliveryDateRequest, +) +from tracking.models.destination_address_estimated_delivery_date_request import ( + DestinationAddressEstimatedDeliveryDateRequest, +) +from tracking.models.weight_estimated_delivery_date_request import ( + WeightEstimatedDeliveryDateRequest, +) +from tracking.models.estimated_pickup_estimated_delivery_date_request import ( + EstimatedPickupEstimatedDeliveryDateRequest, +) + + +class EstimatedDeliveryDateRequest(BaseModel): + """ + EstimatedDeliveryDateRequest + """ # noqa: E501 + + slug: Optional[str] = None + service_type_name: Optional[str] = None + origin_address: Optional[OriginAddressEstimatedDeliveryDateRequest] = None + destination_address: Optional[DestinationAddressEstimatedDeliveryDateRequest] = None + weight: Optional[WeightEstimatedDeliveryDateRequest] = None + package_count: Optional[int] = None + pickup_time: Optional[str] = None + estimated_pickup: Optional[EstimatedPickupEstimatedDeliveryDateRequest] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/estimated_delivery_date_response.py b/tracking/models/estimated_delivery_date_response.py new file mode 100644 index 0000000..81faf8f --- /dev/null +++ b/tracking/models/estimated_delivery_date_response.py @@ -0,0 +1,61 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.origin_address_estimated_delivery_date_response import ( + OriginAddressEstimatedDeliveryDateResponse, +) +from tracking.models.destination_address_estimated_delivery_date_response import ( + DestinationAddressEstimatedDeliveryDateResponse, +) +from tracking.models.weight_estimated_delivery_date_response import ( + WeightEstimatedDeliveryDateResponse, +) +from tracking.models.estimated_pickup_estimated_delivery_date_response import ( + EstimatedPickupEstimatedDeliveryDateResponse, +) + + +class EstimatedDeliveryDateResponse(BaseModel): + """ + EstimatedDeliveryDateResponse + """ # noqa: E501 + + id: Optional[str] = None + slug: Optional[str] = None + service_type_name: Optional[str] = None + origin_address: Optional[OriginAddressEstimatedDeliveryDateResponse] = None + destination_address: Optional[DestinationAddressEstimatedDeliveryDateResponse] = None + weight: Optional[WeightEstimatedDeliveryDateResponse] = None + package_count: Optional[int] = None + pickup_time: Optional[str] = None + estimated_pickup: Optional[EstimatedPickupEstimatedDeliveryDateResponse] = None + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/estimated_pickup_estimated_delivery_date_request.py b/tracking/models/estimated_pickup_estimated_delivery_date_request.py new file mode 100644 index 0000000..315c523 --- /dev/null +++ b/tracking/models/estimated_pickup_estimated_delivery_date_request.py @@ -0,0 +1,45 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.order_processing_time_estimated_pickup_estimated_delivery_date_request import ( + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateRequest, +) + + +class EstimatedPickupEstimatedDeliveryDateRequest(BaseModel): + """ + EstimatedPickupEstimatedDeliveryDateRequest + """ # noqa: E501 + + order_time: Optional[str] = None + order_cutoff_time: Optional[str] = None + business_days: Optional[List[int]] = None + order_processing_time: Optional[ + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateRequest + ] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/estimated_pickup_estimated_delivery_date_response.py b/tracking/models/estimated_pickup_estimated_delivery_date_response.py new file mode 100644 index 0000000..3882fba --- /dev/null +++ b/tracking/models/estimated_pickup_estimated_delivery_date_response.py @@ -0,0 +1,46 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.order_processing_time_estimated_pickup_estimated_delivery_date_response import ( + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateResponse, +) + + +class EstimatedPickupEstimatedDeliveryDateResponse(BaseModel): + """ + EstimatedPickupEstimatedDeliveryDateResponse + """ # noqa: E501 + + order_time: Optional[str] = None + order_cutoff_time: Optional[str] = None + business_days: Optional[List[int]] = None + order_processing_time: Optional[ + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateResponse + ] = None + pickup_time: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/estimated_pickup_predict_request.py b/tracking/models/estimated_pickup_predict_request.py new file mode 100644 index 0000000..b9cf041 --- /dev/null +++ b/tracking/models/estimated_pickup_predict_request.py @@ -0,0 +1,43 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.order_processing_time_estimated_pickup_predict_request import ( + OrderProcessingTimeEstimatedPickupPredictRequest, +) + + +class EstimatedPickupPredictRequest(BaseModel): + """ + EstimatedPickupPredictRequest + """ # noqa: E501 + + order_time: Optional[str] = None + order_cutoff_time: Optional[str] = None + business_days: Optional[List[int]] = None + order_processing_time: Optional[OrderProcessingTimeEstimatedPickupPredictRequest] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/estimated_pickup_predict_response.py b/tracking/models/estimated_pickup_predict_response.py new file mode 100644 index 0000000..edd9cb7 --- /dev/null +++ b/tracking/models/estimated_pickup_predict_response.py @@ -0,0 +1,44 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.order_processing_time_estimated_pickup_predict_response import ( + OrderProcessingTimeEstimatedPickupPredictResponse, +) + + +class EstimatedPickupPredictResponse(BaseModel): + """ + EstimatedPickupPredictResponse + """ # noqa: E501 + + order_time: Optional[str] = None + order_cutoff_time: Optional[str] = None + business_days: Optional[List[int]] = None + order_processing_time: Optional[OrderProcessingTimeEstimatedPickupPredictResponse] = None + pickup_time: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/events_checkpoint.py b/tracking/models/events_checkpoint.py new file mode 100644 index 0000000..dab60e7 --- /dev/null +++ b/tracking/models/events_checkpoint.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.reason_events_checkpoint import ReasonEventsCheckpoint + + +class EventsCheckpoint(BaseModel): + """ + EventsCheckpoint + """ # noqa: E501 + + code: Optional[str] = None + reason: Optional[ReasonEventsCheckpoint] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_estimated_delivery_create_tracking_response.py b/tracking/models/first_estimated_delivery_create_tracking_response.py new file mode 100644 index 0000000..f297493 --- /dev/null +++ b/tracking/models/first_estimated_delivery_create_tracking_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstEstimatedDeliveryCreateTrackingResponse(BaseModel): + """ + FirstEstimatedDeliveryCreateTrackingResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_estimated_delivery_delete_tracking_by_id_response.py b/tracking/models/first_estimated_delivery_delete_tracking_by_id_response.py new file mode 100644 index 0000000..fd34db8 --- /dev/null +++ b/tracking/models/first_estimated_delivery_delete_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstEstimatedDeliveryDeleteTrackingByIdResponse(BaseModel): + """ + FirstEstimatedDeliveryDeleteTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_estimated_delivery_get_tracking_by_id_response.py b/tracking/models/first_estimated_delivery_get_tracking_by_id_response.py new file mode 100644 index 0000000..026516a --- /dev/null +++ b/tracking/models/first_estimated_delivery_get_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstEstimatedDeliveryGetTrackingByIdResponse(BaseModel): + """ + FirstEstimatedDeliveryGetTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_estimated_delivery_mark_tracking_completed_by_id_response.py b/tracking/models/first_estimated_delivery_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..ec00ce6 --- /dev/null +++ b/tracking/models/first_estimated_delivery_mark_tracking_completed_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstEstimatedDeliveryMarkTrackingCompletedByIdResponse(BaseModel): + """ + FirstEstimatedDeliveryMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_estimated_delivery_retrack_tracking_by_id_response.py b/tracking/models/first_estimated_delivery_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..a611089 --- /dev/null +++ b/tracking/models/first_estimated_delivery_retrack_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstEstimatedDeliveryRetrackTrackingByIdResponse(BaseModel): + """ + FirstEstimatedDeliveryRetrackTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_estimated_delivery_tracking.py b/tracking/models/first_estimated_delivery_tracking.py new file mode 100644 index 0000000..490234f --- /dev/null +++ b/tracking/models/first_estimated_delivery_tracking.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstEstimatedDeliveryTracking(BaseModel): + """ + FirstEstimatedDeliveryTracking + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_estimated_delivery_update_tracking_by_id_response.py b/tracking/models/first_estimated_delivery_update_tracking_by_id_response.py new file mode 100644 index 0000000..c046d89 --- /dev/null +++ b/tracking/models/first_estimated_delivery_update_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstEstimatedDeliveryUpdateTrackingByIdResponse(BaseModel): + """ + FirstEstimatedDeliveryUpdateTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_mile_create_tracking_response.py b/tracking/models/first_mile_create_tracking_response.py new file mode 100644 index 0000000..5333d89 --- /dev/null +++ b/tracking/models/first_mile_create_tracking_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstMileCreateTrackingResponse(BaseModel): + """ + FirstMileCreateTrackingResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_redirect_link: Optional[str] = None + courier_tracking_link: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_mile_delete_tracking_by_id_response.py b/tracking/models/first_mile_delete_tracking_by_id_response.py new file mode 100644 index 0000000..ca85c51 --- /dev/null +++ b/tracking/models/first_mile_delete_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstMileDeleteTrackingByIdResponse(BaseModel): + """ + FirstMileDeleteTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_redirect_link: Optional[str] = None + courier_tracking_link: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_mile_get_tracking_by_id_response.py b/tracking/models/first_mile_get_tracking_by_id_response.py new file mode 100644 index 0000000..77829dd --- /dev/null +++ b/tracking/models/first_mile_get_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstMileGetTrackingByIdResponse(BaseModel): + """ + FirstMileGetTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_redirect_link: Optional[str] = None + courier_tracking_link: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_mile_mark_tracking_completed_by_id_response.py b/tracking/models/first_mile_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..e147552 --- /dev/null +++ b/tracking/models/first_mile_mark_tracking_completed_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstMileMarkTrackingCompletedByIdResponse(BaseModel): + """ + FirstMileMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_redirect_link: Optional[str] = None + courier_tracking_link: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_mile_retrack_tracking_by_id_response.py b/tracking/models/first_mile_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..e74c59b --- /dev/null +++ b/tracking/models/first_mile_retrack_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstMileRetrackTrackingByIdResponse(BaseModel): + """ + FirstMileRetrackTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_redirect_link: Optional[str] = None + courier_tracking_link: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_mile_tracking.py b/tracking/models/first_mile_tracking.py new file mode 100644 index 0000000..76af8b9 --- /dev/null +++ b/tracking/models/first_mile_tracking.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstMileTracking(BaseModel): + """ + FirstMileTracking + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_redirect_link: Optional[str] = None + courier_tracking_link: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/first_mile_update_tracking_by_id_response.py b/tracking/models/first_mile_update_tracking_by_id_response.py new file mode 100644 index 0000000..955b3d3 --- /dev/null +++ b/tracking/models/first_mile_update_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class FirstMileUpdateTrackingByIdResponse(BaseModel): + """ + FirstMileUpdateTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_redirect_link: Optional[str] = None + courier_tracking_link: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/get_all_couriers_response.py b/tracking/models/get_all_couriers_response.py new file mode 100644 index 0000000..2277b26 --- /dev/null +++ b/tracking/models/get_all_couriers_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier import Courier + + +class GetAllCouriersResponse(BaseModel): + """ + GetAllCouriersResponse + """ # noqa: E501 + + total: Optional[int] = None + couriers: Optional[List[Courier]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/get_tracking_by_id_response.py b/tracking/models/get_tracking_by_id_response.py new file mode 100644 index 0000000..076744e --- /dev/null +++ b/tracking/models/get_tracking_by_id_response.py @@ -0,0 +1,147 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier_estimated_delivery_date_get_tracking_by_id_response import ( + CourierEstimatedDeliveryDateGetTrackingByIdResponse, +) +from tracking.models.shipment_weight_get_tracking_by_id_response import ( + ShipmentWeightGetTrackingByIdResponse, +) +from tracking.models.tag_v1 import TagV1 +from tracking.models.checkpoint import Checkpoint +from tracking.models.aftership_estimated_delivery_date_get_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateGetTrackingByIdResponse, +) +from tracking.models.custom_estimated_delivery_date_get_tracking_by_id_response import ( + CustomEstimatedDeliveryDateGetTrackingByIdResponse, +) +from tracking.models.first_estimated_delivery_get_tracking_by_id_response import ( + FirstEstimatedDeliveryGetTrackingByIdResponse, +) +from tracking.models.latest_estimated_delivery_get_tracking_by_id_response import ( + LatestEstimatedDeliveryGetTrackingByIdResponse, +) +from tracking.models.carbon_emissions_get_tracking_by_id_response import ( + CarbonEmissionsGetTrackingByIdResponse, +) +from tracking.models.first_mile_get_tracking_by_id_response import FirstMileGetTrackingByIdResponse +from tracking.models.last_mile_get_tracking_by_id_response import LastMileGetTrackingByIdResponse +from tracking.models.customers_get_tracking_by_id_response import CustomersGetTrackingByIdResponse + + +class GetTrackingByIdResponse(BaseModel): + """ + Object describes the tracking information.
+ """ # noqa: E501 + + id: Optional[str] = None + legacy_id: Optional[str] = None + created_at: Optional[str] = None + updated_at: Optional[str] = None + tracking_number: Optional[str] = None + slug: Optional[str] = None + active: Optional[bool] = None + custom_fields: Optional[Any] = None + transit_time: Optional[int] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + courier_destination_country_region: Optional[str] = None + courier_estimated_delivery_date: Optional[ + CourierEstimatedDeliveryDateGetTrackingByIdResponse + ] = None + note: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + order_date: Optional[str] = None + shipment_package_count: Optional[float] = None + shipment_pickup_date: Optional[str] = None + shipment_delivery_date: Optional[str] = None + shipment_type: Optional[str] = None + shipment_weight: Optional[ShipmentWeightGetTrackingByIdResponse] = None + signed_by: Optional[str] = None + source: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + title: Optional[str] = None + tracked_count: Optional[float] = None + last_mile_tracking_supported: Optional[bool] = None + language: Optional[str] = None + unique_token: Optional[str] = None + checkpoints: Optional[List[Checkpoint]] = None + subscribed_smses: Optional[List[str]] = None + subscribed_emails: Optional[List[str]] = None + return_to_sender: Optional[bool] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + courier_tracking_link: Optional[str] = None + first_attempted_at: Optional[str] = None + courier_redirect_link: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + on_time_status: Optional[str] = None + on_time_difference: Optional[float] = None + order_tags: Optional[List[str]] = None + aftership_estimated_delivery_date: Optional[ + AftershipEstimatedDeliveryDateGetTrackingByIdResponse + ] = None + custom_estimated_delivery_date: Optional[CustomEstimatedDeliveryDateGetTrackingByIdResponse] = ( + None + ) + order_number: Optional[str] = None + first_estimated_delivery: Optional[FirstEstimatedDeliveryGetTrackingByIdResponse] = None + latest_estimated_delivery: Optional[LatestEstimatedDeliveryGetTrackingByIdResponse] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + carbon_emissions: Optional[CarbonEmissionsGetTrackingByIdResponse] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + failed_delivery_attempts: Optional[int] = None + signature_requirement: Optional[str] = None + delivery_location_type: Optional[str] = None + aftership_tracking_url: Optional[str] = None + aftership_tracking_order_url: Optional[str] = None + first_mile: Optional[FirstMileGetTrackingByIdResponse] = None + last_mile: Optional[LastMileGetTrackingByIdResponse] = None + customers: Optional[List[CustomersGetTrackingByIdResponse]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/get_trackings_response.py b/tracking/models/get_trackings_response.py new file mode 100644 index 0000000..2d245c0 --- /dev/null +++ b/tracking/models/get_trackings_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.tracking import Tracking +from tracking.models.pagination import Pagination + + +class GetTrackingsResponse(BaseModel): + """ + GetTrackingsResponse + """ # noqa: E501 + + pagination: Optional[Pagination] = None + trackings: Optional[List[Tracking]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/get_user_couriers_response.py b/tracking/models/get_user_couriers_response.py new file mode 100644 index 0000000..110efbe --- /dev/null +++ b/tracking/models/get_user_couriers_response.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier import Courier + + +class GetUserCouriersResponse(BaseModel): + """ + GetUserCouriersResponse + """ # noqa: E501 + + total: Optional[int] = None + couriers: Optional[List[Courier]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_create_tracking_request.py b/tracking/models/last_mile_create_tracking_request.py new file mode 100644 index 0000000..0fb1a18 --- /dev/null +++ b/tracking/models/last_mile_create_tracking_request.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileCreateTrackingRequest(BaseModel): + """ + LastMileCreateTrackingRequest + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_create_tracking_response.py b/tracking/models/last_mile_create_tracking_response.py new file mode 100644 index 0000000..8d3a67a --- /dev/null +++ b/tracking/models/last_mile_create_tracking_response.py @@ -0,0 +1,41 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileCreateTrackingResponse(BaseModel): + """ + LastMileCreateTrackingResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_tracking_link: Optional[str] = None + courier_redirect_link: Optional[str] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_delete_tracking_by_id_response.py b/tracking/models/last_mile_delete_tracking_by_id_response.py new file mode 100644 index 0000000..9155636 --- /dev/null +++ b/tracking/models/last_mile_delete_tracking_by_id_response.py @@ -0,0 +1,41 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileDeleteTrackingByIdResponse(BaseModel): + """ + LastMileDeleteTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_tracking_link: Optional[str] = None + courier_redirect_link: Optional[str] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_get_tracking_by_id_response.py b/tracking/models/last_mile_get_tracking_by_id_response.py new file mode 100644 index 0000000..2908daa --- /dev/null +++ b/tracking/models/last_mile_get_tracking_by_id_response.py @@ -0,0 +1,41 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileGetTrackingByIdResponse(BaseModel): + """ + LastMileGetTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_tracking_link: Optional[str] = None + courier_redirect_link: Optional[str] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_mark_tracking_completed_by_id_response.py b/tracking/models/last_mile_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..0b4afd6 --- /dev/null +++ b/tracking/models/last_mile_mark_tracking_completed_by_id_response.py @@ -0,0 +1,41 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileMarkTrackingCompletedByIdResponse(BaseModel): + """ + LastMileMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_tracking_link: Optional[str] = None + courier_redirect_link: Optional[str] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_retrack_tracking_by_id_response.py b/tracking/models/last_mile_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..579f18b --- /dev/null +++ b/tracking/models/last_mile_retrack_tracking_by_id_response.py @@ -0,0 +1,41 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileRetrackTrackingByIdResponse(BaseModel): + """ + LastMileRetrackTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_tracking_link: Optional[str] = None + courier_redirect_link: Optional[str] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_tracking.py b/tracking/models/last_mile_tracking.py new file mode 100644 index 0000000..c2e4604 --- /dev/null +++ b/tracking/models/last_mile_tracking.py @@ -0,0 +1,41 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileTracking(BaseModel): + """ + LastMileTracking + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_tracking_link: Optional[str] = None + courier_redirect_link: Optional[str] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/last_mile_update_tracking_by_id_response.py b/tracking/models/last_mile_update_tracking_by_id_response.py new file mode 100644 index 0000000..8d89ae3 --- /dev/null +++ b/tracking/models/last_mile_update_tracking_by_id_response.py @@ -0,0 +1,41 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LastMileUpdateTrackingByIdResponse(BaseModel): + """ + LastMileUpdateTrackingByIdResponse + """ # noqa: E501 + + tracking_number: Optional[str] = None + slug: Optional[str] = None + transit_time: Optional[str] = None + courier_tracking_link: Optional[str] = None + courier_redirect_link: Optional[str] = None + source: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/latest_estimated_delivery_create_tracking_response.py b/tracking/models/latest_estimated_delivery_create_tracking_response.py new file mode 100644 index 0000000..ef87f88 --- /dev/null +++ b/tracking/models/latest_estimated_delivery_create_tracking_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LatestEstimatedDeliveryCreateTrackingResponse(BaseModel): + """ + LatestEstimatedDeliveryCreateTrackingResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/latest_estimated_delivery_delete_tracking_by_id_response.py b/tracking/models/latest_estimated_delivery_delete_tracking_by_id_response.py new file mode 100644 index 0000000..34ce107 --- /dev/null +++ b/tracking/models/latest_estimated_delivery_delete_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LatestEstimatedDeliveryDeleteTrackingByIdResponse(BaseModel): + """ + LatestEstimatedDeliveryDeleteTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/latest_estimated_delivery_get_tracking_by_id_response.py b/tracking/models/latest_estimated_delivery_get_tracking_by_id_response.py new file mode 100644 index 0000000..537ead3 --- /dev/null +++ b/tracking/models/latest_estimated_delivery_get_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LatestEstimatedDeliveryGetTrackingByIdResponse(BaseModel): + """ + LatestEstimatedDeliveryGetTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/latest_estimated_delivery_mark_tracking_completed_by_id_response.py b/tracking/models/latest_estimated_delivery_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..5eea126 --- /dev/null +++ b/tracking/models/latest_estimated_delivery_mark_tracking_completed_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LatestEstimatedDeliveryMarkTrackingCompletedByIdResponse(BaseModel): + """ + LatestEstimatedDeliveryMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/latest_estimated_delivery_retrack_tracking_by_id_response.py b/tracking/models/latest_estimated_delivery_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..f105808 --- /dev/null +++ b/tracking/models/latest_estimated_delivery_retrack_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LatestEstimatedDeliveryRetrackTrackingByIdResponse(BaseModel): + """ + LatestEstimatedDeliveryRetrackTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/latest_estimated_delivery_tracking.py b/tracking/models/latest_estimated_delivery_tracking.py new file mode 100644 index 0000000..8eaff43 --- /dev/null +++ b/tracking/models/latest_estimated_delivery_tracking.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LatestEstimatedDeliveryTracking(BaseModel): + """ + LatestEstimatedDeliveryTracking + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/latest_estimated_delivery_update_tracking_by_id_response.py b/tracking/models/latest_estimated_delivery_update_tracking_by_id_response.py new file mode 100644 index 0000000..dacfde6 --- /dev/null +++ b/tracking/models/latest_estimated_delivery_update_tracking_by_id_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class LatestEstimatedDeliveryUpdateTrackingByIdResponse(BaseModel): + """ + LatestEstimatedDeliveryUpdateTrackingByIdResponse + """ # noqa: E501 + + type: Optional[str] = None + source: Optional[str] = None + datetime: Optional[str] = None + datetime_min: Optional[str] = None + datetime_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/mark_tracking_completed_by_id_request.py b/tracking/models/mark_tracking_completed_by_id_request.py new file mode 100644 index 0000000..c68879d --- /dev/null +++ b/tracking/models/mark_tracking_completed_by_id_request.py @@ -0,0 +1,36 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class MarkTrackingCompletedByIdRequest(BaseModel): + """ + MarkTrackingCompletedByIdRequest + """ # noqa: E501 + + reason: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/mark_tracking_completed_by_id_response.py b/tracking/models/mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..7696211 --- /dev/null +++ b/tracking/models/mark_tracking_completed_by_id_response.py @@ -0,0 +1,157 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier_estimated_delivery_date_mark_tracking_completed_by_id_response import ( + CourierEstimatedDeliveryDateMarkTrackingCompletedByIdResponse, +) +from tracking.models.shipment_weight_mark_tracking_completed_by_id_response import ( + ShipmentWeightMarkTrackingCompletedByIdResponse, +) +from tracking.models.tag_v1 import TagV1 +from tracking.models.checkpoint import Checkpoint +from tracking.models.aftership_estimated_delivery_date_mark_tracking_completed_by_id_response import ( + AftershipEstimatedDeliveryDateMarkTrackingCompletedByIdResponse, +) +from tracking.models.custom_estimated_delivery_date_mark_tracking_completed_by_id_response import ( + CustomEstimatedDeliveryDateMarkTrackingCompletedByIdResponse, +) +from tracking.models.first_estimated_delivery_mark_tracking_completed_by_id_response import ( + FirstEstimatedDeliveryMarkTrackingCompletedByIdResponse, +) +from tracking.models.latest_estimated_delivery_mark_tracking_completed_by_id_response import ( + LatestEstimatedDeliveryMarkTrackingCompletedByIdResponse, +) +from tracking.models.carbon_emissions_mark_tracking_completed_by_id_response import ( + CarbonEmissionsMarkTrackingCompletedByIdResponse, +) +from tracking.models.first_mile_mark_tracking_completed_by_id_response import ( + FirstMileMarkTrackingCompletedByIdResponse, +) +from tracking.models.last_mile_mark_tracking_completed_by_id_response import ( + LastMileMarkTrackingCompletedByIdResponse, +) +from tracking.models.customers_mark_tracking_completed_by_id_response import ( + CustomersMarkTrackingCompletedByIdResponse, +) + + +class MarkTrackingCompletedByIdResponse(BaseModel): + """ + Object describes the tracking information.
+ """ # noqa: E501 + + id: Optional[str] = None + legacy_id: Optional[str] = None + created_at: Optional[str] = None + updated_at: Optional[str] = None + tracking_number: Optional[str] = None + slug: Optional[str] = None + active: Optional[bool] = None + custom_fields: Optional[Any] = None + transit_time: Optional[int] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + courier_destination_country_region: Optional[str] = None + courier_estimated_delivery_date: Optional[ + CourierEstimatedDeliveryDateMarkTrackingCompletedByIdResponse + ] = None + note: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + order_date: Optional[str] = None + shipment_package_count: Optional[float] = None + shipment_pickup_date: Optional[str] = None + shipment_delivery_date: Optional[str] = None + shipment_type: Optional[str] = None + shipment_weight: Optional[ShipmentWeightMarkTrackingCompletedByIdResponse] = None + signed_by: Optional[str] = None + source: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + title: Optional[str] = None + tracked_count: Optional[float] = None + last_mile_tracking_supported: Optional[bool] = None + language: Optional[str] = None + unique_token: Optional[str] = None + checkpoints: Optional[List[Checkpoint]] = None + subscribed_smses: Optional[List[str]] = None + subscribed_emails: Optional[List[str]] = None + return_to_sender: Optional[bool] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + courier_tracking_link: Optional[str] = None + first_attempted_at: Optional[str] = None + courier_redirect_link: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + on_time_status: Optional[str] = None + on_time_difference: Optional[float] = None + order_tags: Optional[List[str]] = None + aftership_estimated_delivery_date: Optional[ + AftershipEstimatedDeliveryDateMarkTrackingCompletedByIdResponse + ] = None + custom_estimated_delivery_date: Optional[ + CustomEstimatedDeliveryDateMarkTrackingCompletedByIdResponse + ] = None + order_number: Optional[str] = None + first_estimated_delivery: Optional[FirstEstimatedDeliveryMarkTrackingCompletedByIdResponse] = ( + None + ) + latest_estimated_delivery: Optional[ + LatestEstimatedDeliveryMarkTrackingCompletedByIdResponse + ] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + carbon_emissions: Optional[CarbonEmissionsMarkTrackingCompletedByIdResponse] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + failed_delivery_attempts: Optional[int] = None + signature_requirement: Optional[str] = None + delivery_location_type: Optional[str] = None + aftership_tracking_url: Optional[str] = None + aftership_tracking_order_url: Optional[str] = None + first_mile: Optional[FirstMileMarkTrackingCompletedByIdResponse] = None + last_mile: Optional[LastMileMarkTrackingCompletedByIdResponse] = None + customers: Optional[List[CustomersMarkTrackingCompletedByIdResponse]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/meta_v1.py b/tracking/models/meta_v1.py new file mode 100644 index 0000000..f40b4b1 --- /dev/null +++ b/tracking/models/meta_v1.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class MetaV1(BaseModel): + """ + Meta data + """ # noqa: E501 + + code: Optional[int] = None + message: Optional[str] = None + type: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_request.py b/tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_request.py new file mode 100644 index 0000000..e0302bb --- /dev/null +++ b/tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_request.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateRequest(BaseModel): + """ + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateRequest + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_response.py b/tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_response.py new file mode 100644 index 0000000..8f81f62 --- /dev/null +++ b/tracking/models/order_processing_time_estimated_pickup_estimated_delivery_date_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateResponse(BaseModel): + """ + OrderProcessingTimeEstimatedPickupEstimatedDeliveryDateResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/order_processing_time_estimated_pickup_predict_request.py b/tracking/models/order_processing_time_estimated_pickup_predict_request.py new file mode 100644 index 0000000..6c55f23 --- /dev/null +++ b/tracking/models/order_processing_time_estimated_pickup_predict_request.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OrderProcessingTimeEstimatedPickupPredictRequest(BaseModel): + """ + OrderProcessingTimeEstimatedPickupPredictRequest + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/order_processing_time_estimated_pickup_predict_response.py b/tracking/models/order_processing_time_estimated_pickup_predict_response.py new file mode 100644 index 0000000..c5b3da4 --- /dev/null +++ b/tracking/models/order_processing_time_estimated_pickup_predict_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OrderProcessingTimeEstimatedPickupPredictResponse(BaseModel): + """ + OrderProcessingTimeEstimatedPickupPredictResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/origin_address_estimated_delivery_date_request.py b/tracking/models/origin_address_estimated_delivery_date_request.py new file mode 100644 index 0000000..fb45a6a --- /dev/null +++ b/tracking/models/origin_address_estimated_delivery_date_request.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OriginAddressEstimatedDeliveryDateRequest(BaseModel): + """ + OriginAddressEstimatedDeliveryDateRequest + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/origin_address_estimated_delivery_date_response.py b/tracking/models/origin_address_estimated_delivery_date_response.py new file mode 100644 index 0000000..a2dff68 --- /dev/null +++ b/tracking/models/origin_address_estimated_delivery_date_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OriginAddressEstimatedDeliveryDateResponse(BaseModel): + """ + OriginAddressEstimatedDeliveryDateResponse + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/origin_address_predict_request.py b/tracking/models/origin_address_predict_request.py new file mode 100644 index 0000000..522fa70 --- /dev/null +++ b/tracking/models/origin_address_predict_request.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OriginAddressPredictRequest(BaseModel): + """ + OriginAddressPredictRequest + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/origin_address_predict_response.py b/tracking/models/origin_address_predict_response.py new file mode 100644 index 0000000..10842f5 --- /dev/null +++ b/tracking/models/origin_address_predict_response.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class OriginAddressPredictResponse(BaseModel): + """ + OriginAddressPredictResponse + """ # noqa: E501 + + country_region: Optional[str] = None + state: Optional[str] = None + city: Optional[str] = None + postal_code: Optional[str] = None + raw_location: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/pagination.py b/tracking/models/pagination.py new file mode 100644 index 0000000..f599559 --- /dev/null +++ b/tracking/models/pagination.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class Pagination(BaseModel): + """ + Pagination + """ # noqa: E501 + + total: Optional[int] = None + next_cursor: Optional[str] = None + has_next_page: Optional[bool] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/pagination_data_tracking_response_get_multiple_v1.py b/tracking/models/pagination_data_tracking_response_get_multiple_v1.py new file mode 100644 index 0000000..4af2175 --- /dev/null +++ b/tracking/models/pagination_data_tracking_response_get_multiple_v1.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class PaginationDataTrackingResponseGetMultipleV1(BaseModel): + """ + PaginationDataTrackingResponseGetMultipleV1 + """ # noqa: E501 + + total: Optional[int] = None + next_cursor: Optional[str] = None + has_next_page: Optional[bool] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/pagination_get_trackings_response.py b/tracking/models/pagination_get_trackings_response.py new file mode 100644 index 0000000..fc6139f --- /dev/null +++ b/tracking/models/pagination_get_trackings_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class PaginationGetTrackingsResponse(BaseModel): + """ + PaginationGetTrackingsResponse + """ # noqa: E501 + + total: Optional[int] = None + next_cursor: Optional[str] = None + has_next_page: Optional[bool] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/predict_batch_request.py b/tracking/models/predict_batch_request.py new file mode 100644 index 0000000..2812707 --- /dev/null +++ b/tracking/models/predict_batch_request.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.estimated_delivery_date_request import EstimatedDeliveryDateRequest + + +class PredictBatchRequest(BaseModel): + """ + PredictBatchRequest + """ # noqa: E501 + + estimated_delivery_dates: Optional[List[EstimatedDeliveryDateRequest]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/predict_batch_response.py b/tracking/models/predict_batch_response.py new file mode 100644 index 0000000..a41efa5 --- /dev/null +++ b/tracking/models/predict_batch_response.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.estimated_delivery_date_response import EstimatedDeliveryDateResponse + + +class PredictBatchResponse(BaseModel): + """ + PredictBatchResponse + """ # noqa: E501 + + estimated_delivery_dates: Optional[List[EstimatedDeliveryDateResponse]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/predict_request.py b/tracking/models/predict_request.py new file mode 100644 index 0000000..9ac4039 --- /dev/null +++ b/tracking/models/predict_request.py @@ -0,0 +1,48 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.origin_address_predict_request import OriginAddressPredictRequest +from tracking.models.destination_address_predict_request import DestinationAddressPredictRequest +from tracking.models.weight_predict_request import WeightPredictRequest +from tracking.models.estimated_pickup_predict_request import EstimatedPickupPredictRequest + + +class PredictRequest(BaseModel): + """ + PredictRequest + """ # noqa: E501 + + slug: Optional[str] = None + service_type_name: Optional[str] = None + origin_address: Optional[OriginAddressPredictRequest] = None + destination_address: Optional[DestinationAddressPredictRequest] = None + weight: Optional[WeightPredictRequest] = None + package_count: Optional[int] = None + pickup_time: Optional[str] = None + estimated_pickup: Optional[EstimatedPickupPredictRequest] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/predict_response.py b/tracking/models/predict_response.py new file mode 100644 index 0000000..ad05f2d --- /dev/null +++ b/tracking/models/predict_response.py @@ -0,0 +1,53 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.origin_address_predict_response import OriginAddressPredictResponse +from tracking.models.destination_address_predict_response import DestinationAddressPredictResponse +from tracking.models.weight_predict_response import WeightPredictResponse +from tracking.models.estimated_pickup_predict_response import EstimatedPickupPredictResponse + + +class PredictResponse(BaseModel): + """ + PredictResponse + """ # noqa: E501 + + id: Optional[str] = None + slug: Optional[str] = None + service_type_name: Optional[str] = None + origin_address: Optional[OriginAddressPredictResponse] = None + destination_address: Optional[DestinationAddressPredictResponse] = None + weight: Optional[WeightPredictResponse] = None + package_count: Optional[int] = None + pickup_time: Optional[str] = None + estimated_pickup: Optional[EstimatedPickupPredictResponse] = None + estimated_delivery_date: Optional[str] = None + confidence_code: Optional[float] = None + estimated_delivery_date_min: Optional[str] = None + estimated_delivery_date_max: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/reason_events_checkpoint.py b/tracking/models/reason_events_checkpoint.py new file mode 100644 index 0000000..b5a799a --- /dev/null +++ b/tracking/models/reason_events_checkpoint.py @@ -0,0 +1,36 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ReasonEventsCheckpoint(BaseModel): + """ + ReasonEventsCheckpoint + """ # noqa: E501 + + code: Optional[str] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/retrack_tracking_by_id_response.py b/tracking/models/retrack_tracking_by_id_response.py new file mode 100644 index 0000000..9364532 --- /dev/null +++ b/tracking/models/retrack_tracking_by_id_response.py @@ -0,0 +1,153 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier_estimated_delivery_date_retrack_tracking_by_id_response import ( + CourierEstimatedDeliveryDateRetrackTrackingByIdResponse, +) +from tracking.models.shipment_weight_retrack_tracking_by_id_response import ( + ShipmentWeightRetrackTrackingByIdResponse, +) +from tracking.models.tag_v1 import TagV1 +from tracking.models.checkpoint import Checkpoint +from tracking.models.aftership_estimated_delivery_date_retrack_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateRetrackTrackingByIdResponse, +) +from tracking.models.custom_estimated_delivery_date_retrack_tracking_by_id_response import ( + CustomEstimatedDeliveryDateRetrackTrackingByIdResponse, +) +from tracking.models.first_estimated_delivery_retrack_tracking_by_id_response import ( + FirstEstimatedDeliveryRetrackTrackingByIdResponse, +) +from tracking.models.latest_estimated_delivery_retrack_tracking_by_id_response import ( + LatestEstimatedDeliveryRetrackTrackingByIdResponse, +) +from tracking.models.carbon_emissions_retrack_tracking_by_id_response import ( + CarbonEmissionsRetrackTrackingByIdResponse, +) +from tracking.models.first_mile_retrack_tracking_by_id_response import ( + FirstMileRetrackTrackingByIdResponse, +) +from tracking.models.last_mile_retrack_tracking_by_id_response import ( + LastMileRetrackTrackingByIdResponse, +) +from tracking.models.customers_retrack_tracking_by_id_response import ( + CustomersRetrackTrackingByIdResponse, +) + + +class RetrackTrackingByIdResponse(BaseModel): + """ + Object describes the tracking information.
+ """ # noqa: E501 + + id: Optional[str] = None + legacy_id: Optional[str] = None + created_at: Optional[str] = None + updated_at: Optional[str] = None + tracking_number: Optional[str] = None + slug: Optional[str] = None + active: Optional[bool] = None + custom_fields: Optional[Any] = None + transit_time: Optional[int] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + courier_destination_country_region: Optional[str] = None + courier_estimated_delivery_date: Optional[ + CourierEstimatedDeliveryDateRetrackTrackingByIdResponse + ] = None + note: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + order_date: Optional[str] = None + shipment_package_count: Optional[float] = None + shipment_pickup_date: Optional[str] = None + shipment_delivery_date: Optional[str] = None + shipment_type: Optional[str] = None + shipment_weight: Optional[ShipmentWeightRetrackTrackingByIdResponse] = None + signed_by: Optional[str] = None + source: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + title: Optional[str] = None + tracked_count: Optional[float] = None + last_mile_tracking_supported: Optional[bool] = None + language: Optional[str] = None + unique_token: Optional[str] = None + checkpoints: Optional[List[Checkpoint]] = None + subscribed_smses: Optional[List[str]] = None + subscribed_emails: Optional[List[str]] = None + return_to_sender: Optional[bool] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + courier_tracking_link: Optional[str] = None + first_attempted_at: Optional[str] = None + courier_redirect_link: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + on_time_status: Optional[str] = None + on_time_difference: Optional[float] = None + order_tags: Optional[List[str]] = None + aftership_estimated_delivery_date: Optional[ + AftershipEstimatedDeliveryDateRetrackTrackingByIdResponse + ] = None + custom_estimated_delivery_date: Optional[ + CustomEstimatedDeliveryDateRetrackTrackingByIdResponse + ] = None + order_number: Optional[str] = None + first_estimated_delivery: Optional[FirstEstimatedDeliveryRetrackTrackingByIdResponse] = None + latest_estimated_delivery: Optional[LatestEstimatedDeliveryRetrackTrackingByIdResponse] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + carbon_emissions: Optional[CarbonEmissionsRetrackTrackingByIdResponse] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + failed_delivery_attempts: Optional[int] = None + signature_requirement: Optional[str] = None + delivery_location_type: Optional[str] = None + aftership_tracking_url: Optional[str] = None + aftership_tracking_order_url: Optional[str] = None + first_mile: Optional[FirstMileRetrackTrackingByIdResponse] = None + last_mile: Optional[LastMileRetrackTrackingByIdResponse] = None + customers: Optional[List[CustomersRetrackTrackingByIdResponse]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/shipment_weight_create_tracking_response.py b/tracking/models/shipment_weight_create_tracking_response.py new file mode 100644 index 0000000..0f5b4b4 --- /dev/null +++ b/tracking/models/shipment_weight_create_tracking_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ShipmentWeightCreateTrackingResponse(BaseModel): + """ + ShipmentWeightCreateTrackingResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/shipment_weight_delete_tracking_by_id_response.py b/tracking/models/shipment_weight_delete_tracking_by_id_response.py new file mode 100644 index 0000000..606979a --- /dev/null +++ b/tracking/models/shipment_weight_delete_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ShipmentWeightDeleteTrackingByIdResponse(BaseModel): + """ + ShipmentWeightDeleteTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/shipment_weight_get_tracking_by_id_response.py b/tracking/models/shipment_weight_get_tracking_by_id_response.py new file mode 100644 index 0000000..e561435 --- /dev/null +++ b/tracking/models/shipment_weight_get_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ShipmentWeightGetTrackingByIdResponse(BaseModel): + """ + ShipmentWeightGetTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/shipment_weight_mark_tracking_completed_by_id_response.py b/tracking/models/shipment_weight_mark_tracking_completed_by_id_response.py new file mode 100644 index 0000000..53a778a --- /dev/null +++ b/tracking/models/shipment_weight_mark_tracking_completed_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ShipmentWeightMarkTrackingCompletedByIdResponse(BaseModel): + """ + ShipmentWeightMarkTrackingCompletedByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/shipment_weight_retrack_tracking_by_id_response.py b/tracking/models/shipment_weight_retrack_tracking_by_id_response.py new file mode 100644 index 0000000..5bdfaa8 --- /dev/null +++ b/tracking/models/shipment_weight_retrack_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ShipmentWeightRetrackTrackingByIdResponse(BaseModel): + """ + ShipmentWeightRetrackTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/shipment_weight_tracking.py b/tracking/models/shipment_weight_tracking.py new file mode 100644 index 0000000..158daf1 --- /dev/null +++ b/tracking/models/shipment_weight_tracking.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ShipmentWeightTracking(BaseModel): + """ + ShipmentWeightTracking + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/shipment_weight_update_tracking_by_id_response.py b/tracking/models/shipment_weight_update_tracking_by_id_response.py new file mode 100644 index 0000000..b8da315 --- /dev/null +++ b/tracking/models/shipment_weight_update_tracking_by_id_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class ShipmentWeightUpdateTrackingByIdResponse(BaseModel): + """ + ShipmentWeightUpdateTrackingByIdResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/slug_group_v1.py b/tracking/models/slug_group_v1.py new file mode 100644 index 0000000..593d5f6 --- /dev/null +++ b/tracking/models/slug_group_v1.py @@ -0,0 +1,28 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from enum import Enum, unique + + +@unique +class SlugGroupV1(Enum): + """ + Slug group is a group of slugs which belong to same courier. For example, when you inpit "fedex-group" as slug_group, AfterShip will detect the tracking with "fedex-uk", "fedex-fims", and other slugs which belong to "fedex". It cannot be used with slug at the same time. ( + + allowed enum values + """ + + AMAZON_GROUP = "amazon-group" + FEDEX_GROUP = "fedex-group" + TOLL_GROUP = "toll-group" + TAQBIN_GROUP = "taqbin-group" + TNT_GROUP = "tnt-group" + CJ_GROUP = "cj-group" + HERMES_GROUP = "hermes-group" + DPD_GROUP = "dpd-group" + GLS_GROUP = "gls-group" + DHL_GROUP = "dhl-group" + FASTWAY_GROUP = "fastway-group" + ASENDIA_GROUP = "asendia-group" diff --git a/tracking/models/tag_v1.py b/tracking/models/tag_v1.py new file mode 100644 index 0000000..25e0fb6 --- /dev/null +++ b/tracking/models/tag_v1.py @@ -0,0 +1,25 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from enum import Enum, unique + + +@unique +class TagV1(Enum): + """ + Current status of tracking. ( + + allowed enum values + """ + + PENDING = "Pending" + INFORECEIVED = "InfoReceived" + INTRANSIT = "InTransit" + OUTFORDELIVERY = "OutForDelivery" + ATTEMPTFAIL = "AttemptFail" + DELIVERED = "Delivered" + AVAILABLEFORPICKUP = "AvailableForPickup" + EXCEPTION = "Exception" + EXPIRED = "Expired" diff --git a/tracking/models/tracking.py b/tracking/models/tracking.py new file mode 100644 index 0000000..9f069db --- /dev/null +++ b/tracking/models/tracking.py @@ -0,0 +1,133 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier_estimated_delivery_date_tracking import ( + CourierEstimatedDeliveryDateTracking, +) +from tracking.models.shipment_weight_tracking import ShipmentWeightTracking +from tracking.models.tag_v1 import TagV1 +from tracking.models.checkpoint import Checkpoint +from tracking.models.aftership_estimated_delivery_date_tracking import ( + AftershipEstimatedDeliveryDateTracking, +) +from tracking.models.custom_estimated_delivery_date_tracking import ( + CustomEstimatedDeliveryDateTracking, +) +from tracking.models.first_estimated_delivery_tracking import FirstEstimatedDeliveryTracking +from tracking.models.latest_estimated_delivery_tracking import LatestEstimatedDeliveryTracking +from tracking.models.carbon_emissions_tracking import CarbonEmissionsTracking +from tracking.models.first_mile_tracking import FirstMileTracking +from tracking.models.last_mile_tracking import LastMileTracking +from tracking.models.customers_tracking import CustomersTracking + + +class Tracking(BaseModel): + """ + Object describes the tracking information.
+ """ # noqa: E501 + + id: Optional[str] = None + legacy_id: Optional[str] = None + created_at: Optional[str] = None + updated_at: Optional[str] = None + tracking_number: Optional[str] = None + slug: Optional[str] = None + active: Optional[bool] = None + custom_fields: Optional[Any] = None + transit_time: Optional[int] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + courier_destination_country_region: Optional[str] = None + courier_estimated_delivery_date: Optional[CourierEstimatedDeliveryDateTracking] = None + note: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + order_date: Optional[str] = None + shipment_package_count: Optional[float] = None + shipment_pickup_date: Optional[str] = None + shipment_delivery_date: Optional[str] = None + shipment_type: Optional[str] = None + shipment_weight: Optional[ShipmentWeightTracking] = None + signed_by: Optional[str] = None + source: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + title: Optional[str] = None + tracked_count: Optional[float] = None + last_mile_tracking_supported: Optional[bool] = None + language: Optional[str] = None + unique_token: Optional[str] = None + checkpoints: Optional[List[Checkpoint]] = None + subscribed_smses: Optional[List[str]] = None + subscribed_emails: Optional[List[str]] = None + return_to_sender: Optional[bool] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + courier_tracking_link: Optional[str] = None + first_attempted_at: Optional[str] = None + courier_redirect_link: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + on_time_status: Optional[str] = None + on_time_difference: Optional[float] = None + order_tags: Optional[List[str]] = None + aftership_estimated_delivery_date: Optional[AftershipEstimatedDeliveryDateTracking] = None + custom_estimated_delivery_date: Optional[CustomEstimatedDeliveryDateTracking] = None + order_number: Optional[str] = None + first_estimated_delivery: Optional[FirstEstimatedDeliveryTracking] = None + latest_estimated_delivery: Optional[LatestEstimatedDeliveryTracking] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + carbon_emissions: Optional[CarbonEmissionsTracking] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + failed_delivery_attempts: Optional[int] = None + signature_requirement: Optional[str] = None + delivery_location_type: Optional[str] = None + aftership_tracking_url: Optional[str] = None + aftership_tracking_order_url: Optional[str] = None + first_mile: Optional[FirstMileTracking] = None + last_mile: Optional[LastMileTracking] = None + customers: Optional[List[CustomersTracking]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/tracking_response_get_multiple_v1.py b/tracking/models/tracking_response_get_multiple_v1.py new file mode 100644 index 0000000..642ca1f --- /dev/null +++ b/tracking/models/tracking_response_get_multiple_v1.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.meta_v1 import MetaV1 +from tracking.models.data_tracking_response_get_multiple_v1 import DataTrackingResponseGetMultipleV1 + + +class TrackingResponseGetMultipleV1(BaseModel): + """ + Tracking response for getting tracking + """ # noqa: E501 + + meta: Optional[MetaV1] = None + data: Optional[DataTrackingResponseGetMultipleV1] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/tracking_response_v1.py b/tracking/models/tracking_response_v1.py new file mode 100644 index 0000000..95ccd57 --- /dev/null +++ b/tracking/models/tracking_response_v1.py @@ -0,0 +1,40 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + +from tracking.models.meta_v1 import MetaV1 +from tracking.models.tracking import Tracking + + +class TrackingResponseV1(BaseModel): + """ + Tracking response for returning single tracking + """ # noqa: E501 + + meta: Optional[MetaV1] = None + data: Optional[Tracking] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/update_tracking_by_id_request.py b/tracking/models/update_tracking_by_id_request.py new file mode 100644 index 0000000..391b1ac --- /dev/null +++ b/tracking/models/update_tracking_by_id_request.py @@ -0,0 +1,73 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.customers_update_tracking_by_id_request import ( + CustomersUpdateTrackingByIdRequest, +) + + +class UpdateTrackingByIdRequest(BaseModel): + """ + UpdateTrackingByIdRequest + """ # noqa: E501 + + title: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + custom_fields: Optional[Any] = None + note: Optional[str] = None + language: Optional[str] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + slug: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + order_number: Optional[str] = None + order_date: Optional[str] = None + shipment_type: Optional[str] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + customers: Optional[List[CustomersUpdateTrackingByIdRequest]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/update_tracking_by_id_response.py b/tracking/models/update_tracking_by_id_response.py new file mode 100644 index 0000000..84fc75a --- /dev/null +++ b/tracking/models/update_tracking_by_id_response.py @@ -0,0 +1,153 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, List, Optional +from typing_extensions import Self + +from tracking.models.courier_estimated_delivery_date_update_tracking_by_id_response import ( + CourierEstimatedDeliveryDateUpdateTrackingByIdResponse, +) +from tracking.models.shipment_weight_update_tracking_by_id_response import ( + ShipmentWeightUpdateTrackingByIdResponse, +) +from tracking.models.tag_v1 import TagV1 +from tracking.models.checkpoint import Checkpoint +from tracking.models.aftership_estimated_delivery_date_update_tracking_by_id_response import ( + AftershipEstimatedDeliveryDateUpdateTrackingByIdResponse, +) +from tracking.models.custom_estimated_delivery_date_update_tracking_by_id_response import ( + CustomEstimatedDeliveryDateUpdateTrackingByIdResponse, +) +from tracking.models.first_estimated_delivery_update_tracking_by_id_response import ( + FirstEstimatedDeliveryUpdateTrackingByIdResponse, +) +from tracking.models.latest_estimated_delivery_update_tracking_by_id_response import ( + LatestEstimatedDeliveryUpdateTrackingByIdResponse, +) +from tracking.models.carbon_emissions_update_tracking_by_id_response import ( + CarbonEmissionsUpdateTrackingByIdResponse, +) +from tracking.models.first_mile_update_tracking_by_id_response import ( + FirstMileUpdateTrackingByIdResponse, +) +from tracking.models.last_mile_update_tracking_by_id_response import ( + LastMileUpdateTrackingByIdResponse, +) +from tracking.models.customers_update_tracking_by_id_response import ( + CustomersUpdateTrackingByIdResponse, +) + + +class UpdateTrackingByIdResponse(BaseModel): + """ + Object describes the tracking information.
+ """ # noqa: E501 + + id: Optional[str] = None + legacy_id: Optional[str] = None + created_at: Optional[str] = None + updated_at: Optional[str] = None + tracking_number: Optional[str] = None + slug: Optional[str] = None + active: Optional[bool] = None + custom_fields: Optional[Any] = None + transit_time: Optional[int] = None + origin_country_region: Optional[str] = None + origin_state: Optional[str] = None + origin_city: Optional[str] = None + origin_postal_code: Optional[str] = None + origin_raw_location: Optional[str] = None + destination_country_region: Optional[str] = None + destination_state: Optional[str] = None + destination_city: Optional[str] = None + destination_postal_code: Optional[str] = None + destination_raw_location: Optional[str] = None + courier_destination_country_region: Optional[str] = None + courier_estimated_delivery_date: Optional[ + CourierEstimatedDeliveryDateUpdateTrackingByIdResponse + ] = None + note: Optional[str] = None + order_id: Optional[str] = None + order_id_path: Optional[str] = None + order_date: Optional[str] = None + shipment_package_count: Optional[float] = None + shipment_pickup_date: Optional[str] = None + shipment_delivery_date: Optional[str] = None + shipment_type: Optional[str] = None + shipment_weight: Optional[ShipmentWeightUpdateTrackingByIdResponse] = None + signed_by: Optional[str] = None + source: Optional[str] = None + tag: Optional[TagV1] = None + subtag: Optional[str] = None + subtag_message: Optional[str] = None + title: Optional[str] = None + tracked_count: Optional[float] = None + last_mile_tracking_supported: Optional[bool] = None + language: Optional[str] = None + unique_token: Optional[str] = None + checkpoints: Optional[List[Checkpoint]] = None + subscribed_smses: Optional[List[str]] = None + subscribed_emails: Optional[List[str]] = None + return_to_sender: Optional[bool] = None + order_promised_delivery_date: Optional[str] = None + delivery_type: Optional[str] = None + pickup_location: Optional[str] = None + pickup_note: Optional[str] = None + courier_tracking_link: Optional[str] = None + first_attempted_at: Optional[str] = None + courier_redirect_link: Optional[str] = None + tracking_account_number: Optional[str] = None + tracking_key: Optional[str] = None + tracking_ship_date: Optional[str] = None + on_time_status: Optional[str] = None + on_time_difference: Optional[float] = None + order_tags: Optional[List[str]] = None + aftership_estimated_delivery_date: Optional[ + AftershipEstimatedDeliveryDateUpdateTrackingByIdResponse + ] = None + custom_estimated_delivery_date: Optional[ + CustomEstimatedDeliveryDateUpdateTrackingByIdResponse + ] = None + order_number: Optional[str] = None + first_estimated_delivery: Optional[FirstEstimatedDeliveryUpdateTrackingByIdResponse] = None + latest_estimated_delivery: Optional[LatestEstimatedDeliveryUpdateTrackingByIdResponse] = None + shipment_tags: Optional[List[str]] = None + courier_connection_id: Optional[str] = None + tracking_origin_country_region: Optional[str] = None + tracking_destination_country_region: Optional[str] = None + tracking_postal_code: Optional[str] = None + tracking_state: Optional[str] = None + carbon_emissions: Optional[CarbonEmissionsUpdateTrackingByIdResponse] = None + location_id: Optional[str] = None + shipping_method: Optional[str] = None + failed_delivery_attempts: Optional[int] = None + signature_requirement: Optional[str] = None + delivery_location_type: Optional[str] = None + aftership_tracking_url: Optional[str] = None + aftership_tracking_order_url: Optional[str] = None + first_mile: Optional[FirstMileUpdateTrackingByIdResponse] = None + last_mile: Optional[LastMileUpdateTrackingByIdResponse] = None + customers: Optional[List[CustomersUpdateTrackingByIdResponse]] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/weight_estimated_delivery_date_request.py b/tracking/models/weight_estimated_delivery_date_request.py new file mode 100644 index 0000000..f3937f8 --- /dev/null +++ b/tracking/models/weight_estimated_delivery_date_request.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class WeightEstimatedDeliveryDateRequest(BaseModel): + """ + WeightEstimatedDeliveryDateRequest + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/weight_estimated_delivery_date_response.py b/tracking/models/weight_estimated_delivery_date_response.py new file mode 100644 index 0000000..c84f770 --- /dev/null +++ b/tracking/models/weight_estimated_delivery_date_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class WeightEstimatedDeliveryDateResponse(BaseModel): + """ + WeightEstimatedDeliveryDateResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/weight_predict_request.py b/tracking/models/weight_predict_request.py new file mode 100644 index 0000000..baf0b93 --- /dev/null +++ b/tracking/models/weight_predict_request.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class WeightPredictRequest(BaseModel): + """ + WeightPredictRequest + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/models/weight_predict_response.py b/tracking/models/weight_predict_response.py new file mode 100644 index 0000000..c0205e3 --- /dev/null +++ b/tracking/models/weight_predict_response.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +from __future__ import annotations +import pprint + +from pydantic import BaseModel +from typing import Any, Dict, Optional +from typing_extensions import Self + + +class WeightPredictResponse(BaseModel): + """ + WeightPredictResponse + """ # noqa: E501 + + unit: Optional[str] = None + value: Optional[float] = None + + def to_str(self, **kwargs) -> str: + return pprint.pformat(self.model_dump(**kwargs)) + + def to_json(self, **kwargs) -> str: + return self.model_dump_json(**kwargs) + + def to_dict(self, **kwargs) -> Dict[str, Any]: + return self.model_dump(**kwargs) + + @classmethod + def from_json(cls, json_str: str, **kwargs) -> Optional[Self]: + return cls.model_validate_json(json_str, **kwargs) + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]], **kwargs) -> Optional[Self]: + return cls.model_validate(obj, **kwargs) if isinstance(obj, Dict) else None diff --git a/tracking/request.py b/tracking/request.py new file mode 100644 index 0000000..511f04c --- /dev/null +++ b/tracking/request.py @@ -0,0 +1,140 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +import random +from functools import partial, wraps +from typing import Union, Optional +from urllib.parse import urljoin + +import httpx +from pydantic import validate_call, ValidationError +from retrying import retry + +from tracking.auth import Authenticator +from tracking.configuration import Configuration +from tracking.response import parse_response +from tracking.exceptions import ApiException, TimedOutError, BadRequestError, ErrorCodeEnum + +_default_user_agent = "aftership-sdk-python/5.0.0 (https://www.aftership.com) httpx/0.19.0" + + +def validate_params(func): + @wraps(func) + def wrapper(*args, **kwargs): + try: + funcx = validate_call(func) + return funcx(*args, **kwargs) + except ValidationError as e: + raise BadRequestError(code=ErrorCodeEnum.INVALID_OPTION, message=e) + + return wrapper + + +class ApiClient: + """Generic API client for OpenAPI client library builds. + + :param configuration: .Configuration object for this client + """ + + _client = httpx.Client() + + def __init__(self, configuration: Optional[Configuration] = None) -> None: + self._config = configuration + + if self._config.proxy is not None: + self._client = httpx.Client(proxy=self._config.proxy) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self._client is not None: + self._client.close() + + def _request(self, method, url, params=None, body=None, **kwargs) -> Union[dict, None]: + url = urljoin(self._config.domain, url) + user_headers = self._build_headers(body, kwargs.pop("headers", dict())) + ssl_ctx = kwargs.pop("verify", None) + + timeout = kwargs.pop("timeout", 0) + if timeout <= 0: + kwargs["timeout"] = self._config.timeout / 1000.0 + + request = self._client.build_request( + method=method, url=url, params=params, data=body, headers=user_headers, **kwargs + ) + request.headers = Authenticator( + api_key=self._config.api_key, + api_secret=self._config.api_secret, + auth_type=self._config.authentication_type, + ).sign( + method=request.method, + uri=request.url.raw.raw_path.decode("utf-8"), + headers=request.headers, + body=body, + ) + return self._send_request_with_retry(ssl_ctx, request) + + def _build_headers(self, body, user_headers) -> dict: + _headers = { + "aftership-client": _default_user_agent, + "user-agent": _default_user_agent, + } + if self._config.user_agent is not None: + _headers["user-agent"] = self._config.user_agent + + if body is not None: + _headers["content-type"] = "application/json" + + if "User-Agent" in user_headers: + user_headers["user-agent"] = user_headers.pop("User-Agent") + + _headers.update(user_headers) + return _headers + + @staticmethod + def _retry_if_error(exception): + if isinstance(exception, TimedOutError): + return True + + if isinstance(exception, ApiException): + if exception.status_code >= 500: + return True + return False + + @staticmethod + def _retry_wait(attempts, delay): + delay_base = 3000 + _delay = delay_base * pow(2, attempts - 1) + jitter = delay_base * (random.random() - 0.5) + return max(1.0, _delay + jitter) + + def _send_request_with_retry(self, ssl_context, request: httpx.Request) -> Union[dict, None]: + retry_backoff = partial( + retry, + wait_func=self._retry_wait, + stop_max_attempt_number=self._config.max_retry + 1, + retry_on_exception=self._retry_if_error, + ) + + @retry_backoff() + def wrap(ssl_ctx, req): + try: + if ssl_ctx is None: + response = self._client.send(req) + else: + with httpx.Client(proxy=self._config.proxy, verify=ssl_ctx) as client: + response = client.send(req) + except httpx.TimeoutException as e: + raise TimedOutError( + code=ErrorCodeEnum.UNKNOW_ERROR, + meta_code=500, + status_code=500, + message=f"{e.__module__}.{e.__class__.__name__}: {e}", + response_body="", + ) + return parse_response(response) + + return wrap(ssl_context, request) diff --git a/tracking/response.py b/tracking/response.py new file mode 100644 index 0000000..6cf1500 --- /dev/null +++ b/tracking/response.py @@ -0,0 +1,96 @@ +# coding: utf-8 +# +# This code was auto generated by AfterShip SDK Generator. +# Do not edit the class manually. + +import json +from typing import Union + +import httpx + +from tracking.exceptions import ( + ErrorCodeEnum, + UnknownError, + BadRequestError, + UnauthorizedError, + ForbiddenError, + NotFoundError, + InternalError, + TooManyRequestsError, + TimedOutError, +) + +error_mapping = { + "BadRequest": BadRequestError, + "Unauthorized": UnauthorizedError, + "Forbidden": ForbiddenError, + "NotFound": NotFoundError, + "TooManyRequests": TooManyRequestsError, + "InternalError": InternalError, + "TimedOutError": TimedOutError, +} + +_error_meta_code_mapping = { + "400": ErrorCodeEnum.INTERNAL_ERROR, + "4001": ErrorCodeEnum.INVALID_JSON, + "4003": ErrorCodeEnum.TRACKING_ALREADY_EXIST, + "4004": ErrorCodeEnum.TRACKING_DOES_NOT_EXIST, + "4005": ErrorCodeEnum.TRACKING_NUMBER_INVALID, + "4006": ErrorCodeEnum.TRACKING_REQUIRED, + "4007": ErrorCodeEnum.TRACKING_NUMBER_REQUIRED, + "4008": ErrorCodeEnum.VALUE_INVALID, + "4009": ErrorCodeEnum.VALUE_REQUIRED, + "4010": ErrorCodeEnum.SLUG_INVALID, + "4011": ErrorCodeEnum.MISSING_OR_INVALID_REQUIRED_FIELD, + "4012": ErrorCodeEnum.BAD_COURIER, + "4013": ErrorCodeEnum.INACTIVE_RETRACK_NOT_ALLOWED, + "4014": ErrorCodeEnum.NOTIFICATION_REUQIRED, + "4015": ErrorCodeEnum.ID_INVALID, + "4016": ErrorCodeEnum.RETRACK_ONCE_ALLOWED, + "4017": ErrorCodeEnum.TRACKING_NUMBER_FORMAT_INVALID, + "401": ErrorCodeEnum.API_KEY_INVALID, + "403": ErrorCodeEnum.REQUEST_NOT_ALLOWED, + "404": ErrorCodeEnum.NOT_FOUND, + "429": ErrorCodeEnum.TOO_MANY_REQUEST, + "500": ErrorCodeEnum.INTERNAL_ERROR, + "502": ErrorCodeEnum.INTERNAL_ERROR, + "504": ErrorCodeEnum.INTERNAL_ERROR, +} + + +def get_error_code(meta_code: int) -> str: + if _error_meta_code_mapping.get(str(meta_code)): + return str(_error_meta_code_mapping[str(meta_code)]) + return str(ErrorCodeEnum.INTERNAL_ERROR) + + +def parse_response(response: httpx.Response) -> Union[dict, None]: + try: + json_data = response.json() + + if response.status_code < 300: + return json_data["data"] + + error_type = json_data["meta"]["type"] + if error_type in error_mapping: + error_cls = error_mapping[error_type] + else: + error_cls = UnknownError + + raise error_cls( + code=get_error_code(json_data["meta"]["code"]), + meta_code=json_data["meta"]["code"], + status_code=response.status_code, + message=json_data["meta"]["message"], + response_body=response.text, + response_header=response.headers, + ) + except (json.JSONDecodeError, KeyError) as e: + raise UnknownError( + code=ErrorCodeEnum.UNKNOW_ERROR, + meta_code=500, + status_code=response.status_code, + message=f"{e.__module__}.{e.__class__.__name__}: {e}", + response_body=response.text, + response_header=response.headers, + )