Source code for pizzas.api.serializers
from typing import Any
from django.db.models import Model
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from payments.api.fields import PaymentTypeField
from payments.models import Payment
from pizzas.models import Product, PizzaEvent, Order
from pizzas.services import can_change_order
[docs]class PizzaSerializer(serializers.ModelSerializer):
[docs]class PizzaEventSerializer(serializers.ModelSerializer):
event = serializers.PrimaryKeyRelatedField(read_only=True)
is_admin = serializers.SerializerMethodField("_is_admin")
def _is_admin(self, instance):
member = self.context["request"].member
return can_change_order(member, instance)
[docs]class OrderSerializer(serializers.ModelSerializer):
payment = PaymentTypeField(
source="payment.type", choices=Payment.PAYMENT_TYPE, read_only=True
)
[docs]class AdminOrderSerializer(serializers.ModelSerializer):
payment = PaymentTypeField(
source="payment.type", choices=Payment.PAYMENT_TYPE, required=False
)
display_name = serializers.SerializerMethodField("_display_name")
def _display_name(self, instance):
if instance.member:
return instance.member.get_full_name()
return instance.name
[docs] def validate(self, attrs):
if attrs.get("member") and attrs.get("name"):
raise ValidationError(
{
"member": _("Either specify a member or a name"),
"name": _("Either specify a member or a name"),
}
)
if not (attrs.get("member") or attrs.get("name")) and not self.partial:
attrs["member"] = self.context["request"].member
return super().validate(attrs)
[docs] def create(self, validated_data: Any) -> Any:
if "payment" in validated_data:
del validated_data["payment"]
return super().create(validated_data)
[docs] def update(self, instance: Model, validated_data: Any) -> Any:
if "payment" in validated_data:
del validated_data["payment"]
return super().update(instance, validated_data)