From 44fe6a28a2231ecc857a95e19e170139870a8016 Mon Sep 17 00:00:00 2001 From: Kumi Date: Tue, 29 Aug 2023 10:47:52 +0200 Subject: [PATCH] feat: Add DHL configuration and implementation This commit adds the DHL configuration and implementation to the project. - Added DHL configuration to the config file. - Updated the project version to 0.2.1 in the pyproject.toml file. - Created a new file for the DHL tracker implementation. - Implemented the DHL tracker functionality to get shipment events. - Added DHL to the list of supported carriers. --- config.dist.ini | 4 +++ pyproject.toml | 3 +- src/trackbert/trackers/dhl.py | 53 +++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/trackbert/trackers/dhl.py diff --git a/config.dist.ini b/config.dist.ini index 540451d..8d78ae8 100644 --- a/config.dist.ini +++ b/config.dist.ini @@ -5,3 +5,7 @@ secret = api_secret [FedEx] key = api_key secret = api_secret + +[DHL] +key = api_key +secret = api_secret diff --git a/pyproject.toml b/pyproject.toml index e5880af..5b316ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "trackbert" -version = "0.2.0" +version = "0.2.1" authors = [ { name="Kumi Mitterer", email="trackbert@kumi.email" }, ] @@ -22,6 +22,7 @@ dependencies = [ "postat", "glsapi", "fedextrack", + "dhltrack", "sqlalchemy", "alembic", "python-dateutil", diff --git a/src/trackbert/trackers/dhl.py b/src/trackbert/trackers/dhl.py new file mode 100644 index 0000000..9a225d1 --- /dev/null +++ b/src/trackbert/trackers/dhl.py @@ -0,0 +1,53 @@ +from .base import BaseTracker +from ..classes.database import Event + +from dhltrack import DHL as DHLAPI +from dateutil.parser import parse + +import json +import logging + + +class DHL(BaseTracker): + def __init__(self, *args, **kwargs): + self.api = DHLAPI.from_config("config.ini") + + def get_status(self, tracking_number, carrier): + response = self.api.track(tracking_number) + + try: + all_events = response["shipments"][0]["events"] + logging.debug(f"Got events for {tracking_number}: {len(all_events)}") + + except KeyError: + logging.error(f"Error getting events for {tracking_number}: {all_events}") + return + + events = sorted( + all_events, key=lambda x: x["timestamp"], reverse=True + ) + + for event in events: + event_time = parse(event["timestamp"]).strftime("%Y-%m-%d %H:%M:%S") + + try: + event_locality = f"[{event['location']['address']['addressLocality']}] " + except KeyError: + event_locality = "" + + event_description = f"{event_locality}{event['description']}" + + yield Event( + shipment_id=0, + event_time=event_time, + event_description=event_description, + raw_event=json.dumps(event), + ) + + def supported_carriers(self): + return [ + ("dhl", 100), + ] + + +tracker = DHL