@@ -236,9 +236,16 @@ class CSEClient:
|
||||
class CSEProvider(DeliveryProvider):
|
||||
name = CSE_PROVIDER_NAME
|
||||
|
||||
def __init__(self, client: CSEClient, *, cache_ttl_seconds: int = 900) -> None:
|
||||
def __init__(
|
||||
self,
|
||||
client: CSEClient,
|
||||
*,
|
||||
cache_ttl_seconds: int = 900,
|
||||
delivery_service_guids: tuple[str, ...] = (),
|
||||
) -> None:
|
||||
self._client = client
|
||||
self.cache_ttl_seconds = cache_ttl_seconds
|
||||
self._delivery_service_guids = delivery_service_guids
|
||||
self._delivery_types: list[tuple[str, str]] | None = None
|
||||
|
||||
@classmethod
|
||||
@@ -262,7 +269,11 @@ class CSEProvider(DeliveryProvider):
|
||||
retry_attempts=config.retry_attempts,
|
||||
retry_backoff_seconds=config.retry_backoff_seconds,
|
||||
)
|
||||
return cls(client=client, cache_ttl_seconds=config.cache_ttl_seconds)
|
||||
return cls(
|
||||
client=client,
|
||||
cache_ttl_seconds=config.cache_ttl_seconds,
|
||||
delivery_service_guids=tuple(config.delivery_service_guids),
|
||||
)
|
||||
|
||||
async def get_prices(
|
||||
self, request: DeliveryCalculationRequest
|
||||
@@ -271,8 +282,9 @@ class CSEProvider(DeliveryProvider):
|
||||
|
||||
results = await asyncio.gather(
|
||||
*(
|
||||
self._prices_for_delivery_type(request, name, label)
|
||||
self._prices_for_delivery_type(request, name, label, service_guid)
|
||||
for name, label in delivery_types
|
||||
for service_guid in self._service_guids_for_price_calculation()
|
||||
),
|
||||
return_exceptions=True,
|
||||
)
|
||||
@@ -294,18 +306,25 @@ class CSEProvider(DeliveryProvider):
|
||||
request: DeliveryCalculationRequest,
|
||||
delivery_type: str,
|
||||
delivery_type_label: str,
|
||||
service_guid: str | None,
|
||||
) -> list[DeliveryPrice]:
|
||||
body = build_calc_body_for_calculation(request, delivery_type)
|
||||
body = build_calc_body_for_calculation(request, delivery_type, service_guid)
|
||||
root = await self._client.calc(body)
|
||||
try:
|
||||
return map_cse_calc_response(
|
||||
root,
|
||||
delivery_type=delivery_type,
|
||||
delivery_type_label=delivery_type_label,
|
||||
service_guid=service_guid,
|
||||
)
|
||||
except CSEMappingError as exc:
|
||||
raise CSEClientError("CSE calc response payload is invalid.") from exc
|
||||
|
||||
def _service_guids_for_price_calculation(self) -> tuple[str, ...]:
|
||||
if not self._delivery_service_guids:
|
||||
raise CSERequestError("CSE delivery service GUIDs are not configured.")
|
||||
return self._delivery_service_guids
|
||||
|
||||
async def _resolve_delivery_types(self) -> list[tuple[str, str]]:
|
||||
if self._delivery_types is None:
|
||||
self._delivery_types = await self._client.get_delivery_types()
|
||||
@@ -325,14 +344,16 @@ class CSEProvider(DeliveryProvider):
|
||||
request: InitPaymentRequest,
|
||||
) -> DeliveryPrice | None:
|
||||
tariff_code = request.system_data.tariff.tariff_code
|
||||
delivery_type, _ = split_tariff_code(tariff_code)
|
||||
body = build_calc_body_for_payment(request, delivery_type)
|
||||
root = await self._client.calc(body)
|
||||
try:
|
||||
delivery_type, service_guid, _ = split_tariff_code(tariff_code)
|
||||
body = build_calc_body_for_payment(request, delivery_type, service_guid)
|
||||
root = await self._client.calc(body)
|
||||
return map_cse_calc_response_for_tariff_code(
|
||||
root,
|
||||
tariff_code=tariff_code,
|
||||
)
|
||||
except CSERequestError:
|
||||
raise
|
||||
except CSEMappingError as exc:
|
||||
raise CSEClientError(
|
||||
"CSE payment price validation response payload is invalid."
|
||||
|
||||
Reference in New Issue
Block a user