fix order form
This commit is contained in:
@@ -2,7 +2,12 @@
|
||||
|
||||
from typing import Any
|
||||
|
||||
from app.schemas.order import OrderCreateRequest, OrderCreateResponse
|
||||
from app.schemas.order import (
|
||||
OrderCreateRequest,
|
||||
OrderCreateResponse,
|
||||
OrderPackage,
|
||||
OrderParty,
|
||||
)
|
||||
|
||||
|
||||
class CDEKOrderMappingError(ValueError):
|
||||
@@ -10,7 +15,22 @@ class CDEKOrderMappingError(ValueError):
|
||||
|
||||
|
||||
def map_cdek_order_request(request: OrderCreateRequest) -> dict[str, Any]:
|
||||
return request.model_dump(mode="python", exclude_none=True)
|
||||
payload: dict[str, Any] = {
|
||||
"type": request.type,
|
||||
"tariff_code": request.tariff_code,
|
||||
"sender": _map_order_party(request.sender),
|
||||
"recipient": _map_order_party(request.recipient),
|
||||
"from_location": request.from_location.model_dump(mode="python"),
|
||||
"to_location": request.to_location.model_dump(mode="python"),
|
||||
"packages": [_map_order_package(package) for package in request.packages],
|
||||
}
|
||||
if request.comment is not None:
|
||||
payload["comment"] = request.comment
|
||||
if request.services is not None:
|
||||
payload["services"] = [
|
||||
service.model_dump(mode="python") for service in request.services
|
||||
]
|
||||
return payload
|
||||
|
||||
|
||||
def map_cdek_order_response(payload: dict[str, Any]) -> OrderCreateResponse:
|
||||
@@ -23,3 +43,17 @@ def map_cdek_order_response(payload: dict[str, Any]) -> OrderCreateResponse:
|
||||
raise CDEKOrderMappingError("CDEK order response must include entity.uuid.")
|
||||
|
||||
return OrderCreateResponse(provider="cdek", order_uuid=order_uuid)
|
||||
|
||||
|
||||
def _map_order_party(party: OrderParty) -> dict[str, Any]:
|
||||
return {
|
||||
"name": party.name,
|
||||
"email": party.email,
|
||||
"phones": [party.phone.model_dump(mode="python")],
|
||||
}
|
||||
|
||||
|
||||
def _map_order_package(package: OrderPackage) -> dict[str, Any]:
|
||||
payload = package.model_dump(mode="python", exclude_none=True)
|
||||
payload["weight"] = package.weight * 1000
|
||||
return payload
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, Field, model_validator
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
|
||||
|
||||
class OrderPhone(BaseModel):
|
||||
@@ -10,9 +10,11 @@ class OrderPhone(BaseModel):
|
||||
|
||||
|
||||
class OrderParty(BaseModel):
|
||||
model_config = ConfigDict(extra="forbid")
|
||||
|
||||
name: str = Field(min_length=1)
|
||||
email: str = Field(min_length=1)
|
||||
phones: list[OrderPhone] = Field(min_length=1)
|
||||
phone: OrderPhone
|
||||
|
||||
@model_validator(mode="before")
|
||||
@classmethod
|
||||
@@ -50,7 +52,7 @@ class OrderCreateRequest(BaseModel):
|
||||
recipient: OrderParty
|
||||
from_location: OrderLocation
|
||||
to_location: OrderLocation
|
||||
services: list[OrderService] = Field(min_length=1)
|
||||
services: list[OrderService] | None = Field(default=None, min_length=1)
|
||||
packages: list[OrderPackage] = Field(min_length=1)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user