schon/engine/core/serializers/utility.py

196 lines
6.5 KiB
Python

from typing import Any
from django.utils.translation import gettext_lazy as _
from rest_framework.exceptions import ValidationError
from rest_framework.fields import (
BooleanField,
CharField,
DictField,
Field,
FloatField,
IntegerField,
JSONField,
ListField,
UUIDField,
)
from rest_framework.serializers import ListSerializer, ModelSerializer, Serializer
from engine.core.models import Address
class AddressAutocompleteInputSerializer(Serializer): # type: ignore [type-arg]
q = CharField(required=True)
limit = IntegerField(required=False, min_value=1, max_value=10, default=5)
class AddressSuggestionSerializer(Serializer): # type: ignore [type-arg]
display_name = CharField()
lat = FloatField()
lon = FloatField()
address = DictField(child=CharField())
class AddressSerializer(ModelSerializer): # type: ignore [type-arg]
latitude = FloatField(source="location.y", read_only=True)
longitude = FloatField(source="location.x", read_only=True)
class Meta:
model = Address
fields = [
"uuid",
"street",
"address_line",
"district",
"city",
"region",
"postal_code",
"country",
"latitude",
"longitude",
"raw_data",
"api_response",
"user",
]
read_only_fields = [
"latitude",
"longitude",
"raw_data",
"api_response",
]
class AddressCreateSerializer(ModelSerializer): # type: ignore [type-arg]
raw_data = CharField(
write_only=True,
max_length=512,
)
address_line_1 = CharField(write_only=True, max_length=128, required=True)
address_line_2 = CharField(write_only=True, max_length=128, required=False)
class Meta:
model = Address
fields = ["raw_data", "address_line_1", "address_line_2"]
def create(self, validated_data: dict[str, Any]) -> Address:
raw = validated_data.pop("raw_data")
user = None
if self.context["request"].user.is_authenticated:
user = self.context["request"].user
return Address.objects.create(raw_data=raw, user=user, **validated_data) # type: ignore [no-untyped-call]
class DoFeedbackSerializer(Serializer): # type: ignore [type-arg]
comment = CharField(required=True)
rating = IntegerField(min_value=1, max_value=10, default=10)
action = CharField(default="add")
def validate(self, data: dict[str, Any]) -> dict[str, Any]:
if data["action"] == "add" and not all([data["comment"], data["rating"]]):
raise ValidationError(
_(
"you must provide a comment, rating, and order product uuid to add feedback."
)
)
return data
class CacheOperatorSerializer(Serializer): # type: ignore [type-arg]
key = CharField(required=True)
data = JSONField(required=False) # type: ignore [assignment]
timeout = IntegerField(required=False)
class ContactUsSerializer(Serializer): # type: ignore [type-arg]
email = CharField(required=True)
name = CharField(required=True)
subject = CharField(required=True)
phone_number = CharField(required=False)
message = CharField(required=True)
class LanguageSerializer(Serializer): # type: ignore [type-arg]
code = CharField(required=True)
name = CharField(required=True)
flag = CharField()
class RecursiveField(Field): # type: ignore [type-arg]
def to_representation(self, value: Any) -> Any:
parent = self.parent
if isinstance(parent, ListSerializer):
parent = parent.parent
serializer_class = parent.__class__
return serializer_class(value, context=self.context).data
def to_internal_value(self, data: Any) -> Any:
return data
class AddOrderProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
attributes = ListField(required=False, child=DictField(), default=list)
class BulkAddOrderProductsSerializer(Serializer): # type: ignore [type-arg]
products = ListField(child=AddOrderProductSerializer(), required=True)
class RemoveOrderProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
attributes = JSONField(required=False, default=dict)
class BulkRemoveOrderProductsSerializer(Serializer): # type: ignore [type-arg]
products = ListField(child=RemoveOrderProductSerializer(), required=True)
class AddWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
class RemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
class BulkAddWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuids = ListField(
child=CharField(required=True), allow_empty=False, max_length=64
)
class BulkRemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuids = ListField(
child=CharField(required=True), allow_empty=False, max_length=64
)
class BuyOrderSerializer(Serializer): # type: ignore [type-arg]
force_balance = BooleanField(required=False, default=False)
force_payment = BooleanField(required=False, default=False)
promocode_uuid = CharField(required=False)
shipping_address_uuid = CharField(required=False)
billing_address_uuid = CharField(required=False)
chosen_products = AddOrderProductSerializer(many=True, required=False)
class BuyUnregisteredOrderSerializer(Serializer): # type: ignore [type-arg]
products = AddOrderProductSerializer(many=True, required=True)
promocode_uuid = UUIDField(required=False)
customer_name = CharField(required=True)
customer_email = CharField(required=True)
customer_phone_number = CharField(required=True)
billing_customer_address_uuid = CharField(required=False)
shipping_customer_address_uuid = CharField(required=False)
payment_method = CharField(required=True)
class BuyAsBusinessOrderSerializer(Serializer): # type: ignore [type-arg]
products = AddOrderProductSerializer(many=True, required=True)
business_identificator = CharField(required=True)
promocode_uuid = UUIDField(required=False)
business_email = CharField(required=True)
business_phone_number = CharField(required=True)
billing_business_address_uuid = CharField(required=False)
shipping_business_address_uuid = CharField(required=False)
payment_method = CharField(required=True)