1
0

Added form to add stuff
All checks were successful
Run Python tests (through Pytest) / Test (push) Successful in 25s
Verify Python project can be installed, loaded and have version checked / Test (push) Successful in 22s

This commit is contained in:
Jon Michael Aanes 2025-01-22 18:19:05 +01:00
parent 96440c225a
commit 76006f39a0
4 changed files with 44 additions and 15 deletions

View File

@ -7,4 +7,4 @@ Use the [Parcels API](https://parcelsapp.com/).
__all__ = ['__version__'] __all__ = ['__version__']
from _version import __version__ from ._version import __version__

View File

@ -10,7 +10,6 @@ class TrackingNumberEntry:
assert ' ' not in self.number assert ' ' not in self.number
assert '\t' not in self.number assert '\t' not in self.number
assert '\n' not in self.number assert '\n' not in self.number
assert ' ' not in self.name
assert '\t' not in self.name assert '\t' not in self.name
assert '\n' not in self.name assert '\n' not in self.name
@ -23,7 +22,7 @@ def get_tracking_numbers() -> list[TrackingNumberEntry]:
lines = f.read().split('\n') lines = f.read().split('\n')
lines = [line.split(' ') for line in lines if len(line) > 0] lines = [line.split(' ') for line in lines if len(line) > 0]
return [TrackingNumberEntry(line[0], line[1]) for line in lines] return [TrackingNumberEntry(line[0], ' '.join(line[1:])) for line in lines]
def add_tracking_number(tracking_number: TrackingNumberEntry) -> None: def add_tracking_number(tracking_number: TrackingNumberEntry) -> None:

View File

@ -1,4 +1,4 @@
from bottle import route, run, template import bottle
from . import database, parcelsapp from . import database, parcelsapp
@ -72,6 +72,18 @@ body {
a { a {
color:black; color:black;
} }
.add-number-form {
display: grid;
grid-template: auto 1fr;
max-width: 300px;
grid-gap: 2px;
margin: auto;
}
.add-number-form .add {
grid-column: 1 / 3;
}
</style> </style>
</head> </head>
<body> <body>
@ -94,12 +106,22 @@ a {
</main> </main>
<footer>
<form action="/add" method="POST" class="add-number-form">
<label for="name">Name</label>
<input type="text" name="name" id="name" required />
<label for="tracking-number">Number</label>
<input type="text" name="tracking-number" id="tracking-number" required />
<input class="add" type="submit" value="Add Tracking Number!" />
</form>
</footer>
</body> </body>
</html> </html>
""" """
@route('/') @bottle.route('/')
def index(): def index():
tracking_entries = database.get_tracking_numbers() tracking_entries = database.get_tracking_numbers()
tracking_numbers = [e.number for e in tracking_entries] tracking_numbers = [e.number for e in tracking_entries]
@ -110,13 +132,21 @@ def index():
result.tracking_number: result for result in tracking_results result.tracking_number: result for result in tracking_results
} }
derps = [(e, tracking_results_by_id.get(e.number)) for e in tracking_entries] tracking_results_with_name = [(e, tracking_results_by_id.get(e.number)) for e in tracking_entries]
derps.sort(key=lambda x: x[1].latest_state().date, reverse=True) tracking_results_with_name.sort(key=lambda x: x[1].latest_state().date, reverse=True)
return template(TEMPLATE, tracking_results=derps) return bottle.template(TEMPLATE, tracking_results=tracking_results_with_name)
@bottle.route('/add', method='POST')
def add():
number: str = bottle.request.forms['tracking-number']
name: str = bottle.request.forms['name']
database.add_tracking_number(database.TrackingNumberEntry(number, name))
return bottle.redirect('/')
def initialize_server(parcelsapp_client: parcelsapp.ParcelsAppClient): def initialize_server(parcelsapp_client: parcelsapp.ParcelsAppClient):
global PARCELSAPP_CLIENT global PARCELSAPP_CLIENT
PARCELSAPP_CLIENT = parcelsapp_client PARCELSAPP_CLIENT = parcelsapp_client
run(host='localhost', port=8080, debug=True) bottle.run(host='localhost', port=8080, debug=True)

View File

@ -38,12 +38,13 @@ class ParcelInfo:
class ParcelsAppClient: class ParcelsAppClient:
def __init__(self, api_key: str): def __init__(self, api_key: str):
assert api_key is not None, 'Missing API Key'
self.api_key = api_key self.api_key = api_key
def _request_json(self, method: str, url: str, **kwargs) -> dict: def _request_json(self, method: str, url: str, **kwargs) -> dict:
request_json_data = {'apiKey': self.api_key, **kwargs} request_json_data = {'apiKey': self.api_key, 'language': 'en', **kwargs}
response = requests.request( response = requests.request(
method=method, url=URL_TRACKING, json=request_json_data, method=method, url=url, json=request_json_data,
) )
response.raise_for_status() response.raise_for_status()
json_data = response.json() json_data = response.json()
@ -53,7 +54,7 @@ class ParcelsAppClient:
return json_data return json_data
def check_tracking_status(self, uuid: str) -> dict: def check_tracking_status(self, uuid: str) -> dict:
"""Function to check tracking status with UUID""" """Function to check tracking status with UUID."""
json_data = self._request_json('GET', URL_TRACKING, uuid=uuid) json_data = self._request_json('GET', URL_TRACKING, uuid=uuid)
if json_data['done']: if json_data['done']:
logger.info('Tracking complete') logger.info('Tracking complete')
@ -65,12 +66,11 @@ class ParcelsAppClient:
def _get_tracking_status_to_json(self, tracking_ids: list[str]) -> dict: def _get_tracking_status_to_json(self, tracking_ids: list[str]) -> dict:
shipments = [ shipments = [
{'trackingId': id, 'language': 'en', 'country': target_country} {'trackingId': tracking_id, 'country': target_country}
for id in tracking_ids for tracking_id in tracking_ids
] ]
# Initiate tracking request # Initiate tracking request
json_data = self._request_json('POST', URL_TRACKING, shipments=shipments) json_data = self._request_json('POST', URL_TRACKING, shipments=shipments)
if json_data.get('done'): if json_data.get('done'):
return json_data return json_data