Files
JiriUhlir 0e05fef335 first
2026-07-16 11:56:15 +02:00

127 lines
4.9 KiB
Python

"""Vyhledávací metody: výdejní místa, našeptávač adres, routing, tisková data."""
from typing import Any
from fastapi import APIRouter, Depends, Query
from ..cpl_client import cpl_request, relay_binary, relay_json
from ..credentials import Credentials, get_credentials
router = APIRouter(tags=["lookups"])
@router.get("/access-points", summary="Seznam výdejních míst (ParcelShop/ParcelBox/AlzaBox)")
async def access_points(
country_code: str = Query(..., alias="countryCode", description="Kód země, např. CZ."),
limit: int = Query(default=100, ge=1, le=1000),
offset: int = Query(default=0, ge=0),
access_point_code: str | None = Query(default=None, alias="accessPointCode"),
zip_code: str | None = Query(default=None, alias="zipCode"),
city: str | None = Query(default=None),
access_point_types: list[str] | None = Query(
default=None,
alias="accessPointTypes",
description="ParcelShop, ParcelBox, AlzaBox.",
),
latitude: float | None = Query(default=None),
longitude: float | None = Query(default=None),
radius: float | None = Query(default=None, description="Poloměr hledání v km."),
pickup_enabled: bool | None = Query(default=None, alias="pickupEnabled"),
active_card_payment: bool | None = Query(default=None, alias="activeCardPayment"),
active_cash_payment: bool | None = Query(default=None, alias="activeCashPayment"),
sizes: list[str] | None = Query(default=None, description="S, M, L, XL."),
creds: Credentials = Depends(get_credentials),
):
"""`GET accessPoint` — výdejní místa vč. otevírací doby, GPS a kapacit."""
params: dict[str, Any] = {
"CountryCode": country_code,
"Limit": limit,
"Offset": offset,
}
if access_point_code:
params["AccessPointCode"] = access_point_code
if zip_code:
params["ZipCode"] = zip_code
if city:
params["City"] = city
if access_point_types:
params["AccessPointTypes"] = access_point_types
if latitude is not None:
params["Latitude"] = latitude
if longitude is not None:
params["Longitude"] = longitude
if radius is not None:
params["Radius"] = radius
if pickup_enabled is not None:
params["PickupEnabled"] = pickup_enabled
if active_card_payment is not None:
params["ActiveCardPayment"] = active_card_payment
if active_cash_payment is not None:
params["ActiveCashPayment"] = active_cash_payment
if sizes:
params["Sizes"] = sizes
resp = await cpl_request(creds, "GET", "/accessPoint", params=params)
return relay_json(resp)
@router.get("/address-whisper", summary="Našeptávač adres")
async def address_whisper(
street: str | None = Query(default=None),
zip_code: str | None = Query(default=None, alias="zipCode"),
city: str | None = Query(default=None),
called_from: str | None = Query(
default=None,
alias="calledFrom",
description="Které pole vyvolalo dotaz: Street, ZipCode nebo City.",
),
creds: Credentials = Depends(get_credentials),
):
"""`GET addressWhisper` — validace/doplnění adresy (vrací i pole `valid`)."""
params: dict[str, Any] = {}
if street:
params["Street"] = street
if zip_code:
params["ZipCode"] = zip_code
if city:
params["City"] = city
if called_from:
params["CalledFrom"] = called_from
resp = await cpl_request(creds, "GET", "/addressWhisper", params=params or None)
return relay_json(resp)
@router.get("/routing", summary="Směrovací informace pro etiketu")
async def routing(
country: str = Query(..., description="Kód země (povinný), např. CZ."),
street: str | None = Query(default=None),
city: str | None = Query(default=None),
zip_code: str | None = Query(default=None, alias="zipCode"),
product_type: str | None = Query(default=None, alias="productType"),
parcel_shop_code: str | None = Query(default=None, alias="parcelShopCode"),
creds: Credentials = Depends(get_credentials),
):
"""`GET routing` — kód trasy, depo a pozice v depu pro danou adresu."""
params: dict[str, Any] = {"Country": country}
if street:
params["Street"] = street
if city:
params["City"] = city
if zip_code:
params["ZipCode"] = zip_code
if product_type:
params["ProductType"] = product_type
if parcel_shop_code:
params["ParcelShopCode"] = parcel_shop_code
resp = await cpl_request(creds, "GET", "/routing", params=params)
return relay_json(resp)
@router.get("/data/{data_guid}", summary="Tisková data etikety (binární)")
async def get_data(
data_guid: str,
creds: Credentials = Depends(get_credentials),
):
"""`GET data/{dataGuid}` — stažení jednotlivé etikety přes labelUrl guid
(používá se hlavně po změně formátu Pdf -> Zpl)."""
resp = await cpl_request(creds, "GET", f"/data/{data_guid}")
return relay_binary(resp)