2024-09-27 20:35:03 +00:00
|
|
|
from typing import Annotated
|
|
|
|
|
2024-07-27 22:09:39 +00:00
|
|
|
from ninja import ModelSchema, Schema
|
|
|
|
from pydantic import Field, NonNegativeInt, PositiveInt, TypeAdapter
|
2024-09-27 20:35:03 +00:00
|
|
|
from pydantic_extra_types.phone_numbers import PhoneNumber, PhoneNumberValidator
|
|
|
|
|
2024-07-27 22:09:39 +00:00
|
|
|
from counter.models import BillingInfo
|
|
|
|
|
|
|
|
|
|
|
|
class PurchaseItemSchema(Schema):
|
|
|
|
product_id: NonNegativeInt = Field(alias="id")
|
|
|
|
name: str
|
|
|
|
unit_price: float
|
|
|
|
quantity: PositiveInt
|
|
|
|
|
|
|
|
|
|
|
|
# The eboutic deals with data that is dict mixed with JSON.
|
|
|
|
# Hence it would be a hassle to manage it with a proper Schema class,
|
|
|
|
# and we use a TypeAdapter instead
|
|
|
|
PurchaseItemList = TypeAdapter(list[PurchaseItemSchema])
|
|
|
|
|
|
|
|
|
|
|
|
class BillingInfoSchema(ModelSchema):
|
|
|
|
class Meta:
|
|
|
|
model = BillingInfo
|
|
|
|
fields = [
|
|
|
|
"customer",
|
|
|
|
"first_name",
|
|
|
|
"last_name",
|
|
|
|
"address_1",
|
|
|
|
"address_2",
|
|
|
|
"zip_code",
|
|
|
|
"city",
|
|
|
|
"country",
|
|
|
|
]
|
|
|
|
fields_optional = ["customer"]
|
2024-09-26 15:55:53 +00:00
|
|
|
|
|
|
|
# for reasons described in the model, BillingInfo.phone_number
|
|
|
|
# in nullable, but null values shouldn't be actually allowed,
|
|
|
|
# so we force the field to be required
|
2024-09-27 20:35:03 +00:00
|
|
|
phone_number: Annotated[PhoneNumber, PhoneNumberValidator(default_region="FR")]
|