mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 13:11:08 -05:00
150 lines
5.0 KiB
Python
150 lines
5.0 KiB
Python
"""
|
|
Companies and ride models domain serializers for ThrillWiki API v1.
|
|
|
|
This module contains all serializers related to companies that operate parks
|
|
or manufacture rides, as well as ride model serializers.
|
|
"""
|
|
|
|
from rest_framework import serializers
|
|
from drf_spectacular.utils import (
|
|
extend_schema_serializer,
|
|
extend_schema_field,
|
|
OpenApiExample,
|
|
)
|
|
|
|
from .shared import CATEGORY_CHOICES, ModelChoices
|
|
|
|
|
|
# === COMPANY SERIALIZERS ===
|
|
|
|
|
|
@extend_schema_serializer(
|
|
examples=[
|
|
OpenApiExample(
|
|
"Company Example",
|
|
summary="Example company response",
|
|
description="A company that operates parks or manufactures rides",
|
|
value={
|
|
"id": 1,
|
|
"name": "Cedar Fair",
|
|
"slug": "cedar-fair",
|
|
"roles": ["OPERATOR", "PROPERTY_OWNER"],
|
|
"description": "Theme park operator based in Ohio",
|
|
"website": "https://cedarfair.com",
|
|
"founded_date": "1983-01-01",
|
|
"rides_count": 0,
|
|
"coasters_count": 0,
|
|
},
|
|
)
|
|
]
|
|
)
|
|
class CompanyDetailOutputSerializer(serializers.Serializer):
|
|
"""Output serializer for company details."""
|
|
|
|
id = serializers.IntegerField()
|
|
name = serializers.CharField()
|
|
slug = serializers.CharField()
|
|
roles = serializers.ListField(child=serializers.CharField())
|
|
description = serializers.CharField()
|
|
website = serializers.URLField()
|
|
founded_date = serializers.DateField(allow_null=True)
|
|
rides_count = serializers.IntegerField()
|
|
coasters_count = serializers.IntegerField()
|
|
|
|
# Metadata
|
|
created_at = serializers.DateTimeField()
|
|
updated_at = serializers.DateTimeField()
|
|
|
|
|
|
class CompanyCreateInputSerializer(serializers.Serializer):
|
|
"""Input serializer for creating companies."""
|
|
|
|
name = serializers.CharField(max_length=255)
|
|
roles = serializers.ListField(
|
|
child=serializers.ChoiceField(choices=ModelChoices.get_company_role_choices()),
|
|
allow_empty=False,
|
|
)
|
|
description = serializers.CharField(allow_blank=True, default="")
|
|
website = serializers.URLField(required=False, allow_blank=True)
|
|
founded_date = serializers.DateField(required=False, allow_null=True)
|
|
|
|
|
|
class CompanyUpdateInputSerializer(serializers.Serializer):
|
|
"""Input serializer for updating companies."""
|
|
|
|
name = serializers.CharField(max_length=255, required=False)
|
|
roles = serializers.ListField(
|
|
child=serializers.ChoiceField(choices=ModelChoices.get_company_role_choices()),
|
|
required=False,
|
|
)
|
|
description = serializers.CharField(allow_blank=True, required=False)
|
|
website = serializers.URLField(required=False, allow_blank=True)
|
|
founded_date = serializers.DateField(required=False, allow_null=True)
|
|
|
|
|
|
# === RIDE MODEL SERIALIZERS ===
|
|
|
|
|
|
@extend_schema_serializer(
|
|
examples=[
|
|
OpenApiExample(
|
|
"Ride Model Example",
|
|
summary="Example ride model response",
|
|
description="A specific model/type of ride manufactured by a company",
|
|
value={
|
|
"id": 1,
|
|
"name": "Dive Coaster",
|
|
"description": "A roller coaster featuring a near-vertical drop",
|
|
"category": "RC",
|
|
"manufacturer": {
|
|
"id": 1,
|
|
"name": "Bolliger & Mabillard",
|
|
"slug": "bolliger-mabillard",
|
|
},
|
|
},
|
|
)
|
|
]
|
|
)
|
|
class RideModelDetailOutputSerializer(serializers.Serializer):
|
|
"""Output serializer for ride model details."""
|
|
|
|
id = serializers.IntegerField()
|
|
name = serializers.CharField()
|
|
description = serializers.CharField()
|
|
category = serializers.CharField()
|
|
|
|
# Manufacturer info
|
|
manufacturer = serializers.SerializerMethodField()
|
|
|
|
# Metadata
|
|
created_at = serializers.DateTimeField()
|
|
updated_at = serializers.DateTimeField()
|
|
|
|
@extend_schema_field(serializers.DictField(allow_null=True))
|
|
def get_manufacturer(self, obj) -> dict | None:
|
|
if obj.manufacturer:
|
|
return {
|
|
"id": obj.manufacturer.id,
|
|
"name": obj.manufacturer.name,
|
|
"slug": obj.manufacturer.slug,
|
|
}
|
|
return None
|
|
|
|
|
|
class RideModelCreateInputSerializer(serializers.Serializer):
|
|
"""Input serializer for creating ride models."""
|
|
|
|
name = serializers.CharField(max_length=255)
|
|
description = serializers.CharField(allow_blank=True, default="")
|
|
category = serializers.ChoiceField(choices=CATEGORY_CHOICES, required=False)
|
|
manufacturer_id = serializers.IntegerField(required=False, allow_null=True)
|
|
|
|
|
|
class RideModelUpdateInputSerializer(serializers.Serializer):
|
|
"""Input serializer for updating ride models."""
|
|
|
|
name = serializers.CharField(max_length=255, required=False)
|
|
description = serializers.CharField(allow_blank=True, required=False)
|
|
category = serializers.ChoiceField(choices=CATEGORY_CHOICES, required=False)
|
|
manufacturer_id = serializers.IntegerField(required=False, allow_null=True)
|