diff --git a/package_tracking/http.py b/package_tracking/http.py index 7611cc4..73d2ec5 100644 --- a/package_tracking/http.py +++ b/package_tracking/http.py @@ -1,5 +1,6 @@ import bottle +import datetime from . import database, parcelsapp PARCELSAPP_CLIENT: parcelsapp.ParcelsAppClient | None = None @@ -57,6 +58,10 @@ a { background: #AEABFB; } +.tracking-item.unknown { + background: red; +} + h1 { text-align: center; } @@ -98,13 +103,17 @@ footer {
+% if error_message is not None: +
{{error_message}}
+% end +
% for entry, tracking_data in tracking_results: - -
+ +
{{ entry.name }}
-
{{ tracking_data.latest_state().status }}
-
{{ tracking_data.latest_state().date.date() }}
+
{{ tracking_data.latest_state().status if tracking_data else 'unknown' }}
+
{{ tracking_data.latest_state().date.date() if tracking_data else '???' }}
% end @@ -131,21 +140,27 @@ footer { """ +TODAY = datetime.datetime.now(tz=datetime.UTC).date() def render_tracking(with_form: bool): tracking_entries = database.get_tracking_numbers() tracking_numbers = [e.number for e in tracking_entries] - tracking_results = PARCELSAPP_CLIENT.get_tracking_status(tracking_numbers) + try: + tracking_results = list(PARCELSAPP_CLIENT.get_tracking_status(tracking_numbers)) + error_message = None + except parcelsapp.ParcelsApiError as ex: + tracking_results = [] + error_message = str(ex) tracking_results_by_id = { result.tracking_number: result for result in tracking_results } tracking_results_with_name = [(e, tracking_results_by_id.get(e.number)) for e in tracking_entries] - tracking_results_with_name.sort(key=lambda x: x[1].latest_state().date, reverse=True) + tracking_results_with_name.sort(key=lambda x: x[1].latest_state().date if x[1] else TODAY, reverse=True) - return bottle.template(TEMPLATE, tracking_results=tracking_results_with_name, with_form=with_form) + return bottle.template(TEMPLATE, error_message=error_message, tracking_results=tracking_results_with_name, with_form=with_form) @bottle.route('/') def index(): diff --git a/package_tracking/parcelsapp.py b/package_tracking/parcelsapp.py index 9f0628b..a55c8cf 100644 --- a/package_tracking/parcelsapp.py +++ b/package_tracking/parcelsapp.py @@ -35,6 +35,8 @@ class ParcelInfo: def latest_state(self) -> ParcelState: return max(self.states, key=lambda state: state.date) +class ParcelsApiError(RuntimeError): + pass class ParcelsAppClient: def __init__(self, api_key: str): @@ -50,7 +52,7 @@ class ParcelsAppClient: json_data = response.json() if 'error' in json_data: msg = 'Error from endpoint: {}'.format(json_data['error']) - raise RuntimeError(msg) + raise ParcelsApiError(msg) return json_data def check_tracking_status(self, uuid: str) -> dict: