Add FedEx tracking functionality and configuration to the code

- Add FedEx configuration to config.ini
- Add FedEx tracking module to dependencies
- Implement FedEx tracking functionality
- Add FedEx as a supported carrier in the tracker
This commit is contained in:
Kumi 2023-08-27 10:36:30 +02:00
parent 07619ff4a8
commit 01a0d1dc35
Signed by: kumi
GPG key ID: ECBCC9082395383F
4 changed files with 59 additions and 2 deletions

View file

@ -1,3 +1,7 @@
[KeyDelivery] [KeyDelivery]
key = api_key key = api_key
secret = api_secret secret = api_secret
[FedEx]
key = api_key
secret = api_secret

View file

@ -21,6 +21,7 @@ dependencies = [
"pykeydelivery", "pykeydelivery",
"postat", "postat",
"glsapi", "glsapi",
"fedextrack",
"sqlalchemy", "sqlalchemy",
"python-dateutil", "python-dateutil",
] ]

View file

@ -9,8 +9,6 @@ from typing import Optional, Tuple, Never
from .database import Database from .database import Database
from ..trackers.base import BaseTracker from ..trackers.base import BaseTracker
from pykeydelivery import KeyDelivery
class Tracker: class Tracker:
loop_interval = 60 loop_interval = 60

View file

@ -0,0 +1,54 @@
from .base import BaseTracker
from ..classes.database import Event
from fedextrack import FedEx as FedExAPI
from dateutil.parser import parse
import json
import logging
class FedEx(BaseTracker):
def __init__(self, *args, **kwargs):
self.api = FedExAPI.from_config("config.ini")
def get_status(self, tracking_number, carrier):
response = self.api.track_by_tracking_number(tracking_number)
try:
all_results = response["output"]["completeTrackResults"][0]["trackResults"]
all_events = []
for result in all_results:
events = result["scanEvents"]
for event in events:
all_events.append(event)
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["date"], reverse=True
)
for event in events:
event_time = parse(event["date"]).strftime("%Y-%m-%d %H:%M:%S")
event_description = f"{event['scanLocation']['city'], event['scanLocation']['countryCode']} {event['eventDescription']}"
yield Event(
shipment_id=0,
event_time=event_time,
event_description=event_description,
raw_event=json.dumps(event),
)
def supported_carriers(self):
return [
("fedex", 100),
]
tracker = FedEx