2023-05-20 16:47:08 +03:00
|
|
|
from rest_framework import serializers
|
2023-05-23 18:14:06 +03:00
|
|
|
from rest_framework.generics import get_object_or_404
|
2023-05-20 16:47:08 +03:00
|
|
|
|
2023-05-23 00:33:04 +03:00
|
|
|
from passfinder.events.models import Hotel, HotelPhone, City, Event, BasePoint, Region
|
2023-05-20 16:47:08 +03:00
|
|
|
|
|
|
|
|
|
|
|
class HotelPhoneSerializer(serializers.ModelSerializer):
|
|
|
|
class Meta:
|
|
|
|
model = HotelPhone
|
|
|
|
exclude = "hotel"
|
|
|
|
|
|
|
|
|
|
|
|
class HotelSerializer(serializers.ModelSerializer):
|
|
|
|
phones = HotelPhoneSerializer(many=True)
|
|
|
|
source = serializers.CharField(source="parser_source")
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Hotel
|
|
|
|
exclude = ("oid", "parser_source")
|
|
|
|
|
|
|
|
|
|
|
|
class MuseumSerializer(serializers.ModelSerializer):
|
|
|
|
phones = HotelPhoneSerializer(many=True)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Hotel
|
|
|
|
exclude = "oid"
|
2023-05-21 13:37:21 +03:00
|
|
|
|
|
|
|
|
|
|
|
class EventSerializer(serializers.ModelSerializer):
|
|
|
|
class Meta:
|
|
|
|
model = Event
|
2023-05-21 20:46:07 +03:00
|
|
|
fields = ("type", "title", "description", "city", "oid")
|
|
|
|
|
|
|
|
|
|
|
|
class PointSerializer(serializers.ModelSerializer):
|
|
|
|
class Meta:
|
|
|
|
model = BasePoint
|
2023-05-23 23:36:45 +03:00
|
|
|
fields = ["oid", "title", "description", "location", "icon"]
|
2023-05-22 22:29:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
class RouteSerializer(serializers.Serializer):
|
|
|
|
name = serializers.CharField()
|
2023-05-23 23:36:45 +03:00
|
|
|
date = serializers.DateField(allow_null=True)
|
2023-05-22 22:29:46 +03:00
|
|
|
description = serializers.CharField()
|
|
|
|
points = serializers.ListSerializer(child=PointSerializer())
|
2023-05-23 00:33:04 +03:00
|
|
|
|
|
|
|
|
2023-05-23 18:14:06 +03:00
|
|
|
class RouteInputSerializer(serializers.Serializer):
|
|
|
|
date_from = serializers.DateField(required=False, allow_null=True)
|
|
|
|
date_to = serializers.DateField(required=False, allow_null=True)
|
|
|
|
region = serializers.CharField(
|
2023-05-23 23:36:45 +03:00
|
|
|
min_length=24, max_length=24, required=False, allow_blank=True, allow_null=True
|
2023-05-23 18:14:06 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2023-05-23 23:36:45 +03:00
|
|
|
class CitySerializer(serializers.ModelSerializer):
|
|
|
|
class Meta:
|
|
|
|
model = City
|
|
|
|
fields = ["oid", "title"]
|
|
|
|
|
|
|
|
|
2023-05-23 00:33:04 +03:00
|
|
|
class RegionSerializer(serializers.ModelSerializer):
|
2023-05-23 23:36:45 +03:00
|
|
|
cities = CitySerializer(many=True)
|
|
|
|
|
2023-05-23 00:33:04 +03:00
|
|
|
class Meta:
|
|
|
|
model = Region
|
2023-05-23 23:36:45 +03:00
|
|
|
fields = ["oid", "title", "description_short", "cities"]
|
|
|
|
|
|
|
|
|
|
|
|
class InputRoutePointSerializer(serializers.Serializer):
|
|
|
|
type = serializers.ChoiceField(choices=["point", "transition"])
|
|
|
|
time = serializers.IntegerField(min_value=0, required=True)
|
|
|
|
|
|
|
|
# point
|
|
|
|
point = serializers.CharField(
|
|
|
|
min_length=24, max_length=24, required=False, allow_blank=True, allow_null=True
|
|
|
|
)
|
|
|
|
|
|
|
|
# transition
|
|
|
|
point_from = serializers.CharField(
|
|
|
|
min_length=24, max_length=24, required=False, allow_blank=True, allow_null=True
|
|
|
|
)
|
|
|
|
point_to = serializers.CharField(
|
|
|
|
min_length=24, max_length=24, required=False, allow_blank=True, allow_null=True
|
|
|
|
)
|
|
|
|
distance = serializers.FloatField(min_value=0, required=False, allow_null=True)
|
|
|
|
|
|
|
|
def validate(self, data):
|
|
|
|
if data["type"] == "point":
|
|
|
|
if "point" not in data or not data["point"]:
|
|
|
|
raise serializers.ValidationError("Point id is required")
|
|
|
|
get_object_or_404(BasePoint, oid=data["point"])
|
|
|
|
else:
|
|
|
|
if "point_to" not in data or not data["point_to"]:
|
|
|
|
raise serializers.ValidationError("Point to id is required")
|
|
|
|
get_object_or_404(BasePoint, oid=data["point_to"])
|
|
|
|
if "point_from" not in data or not data["point_from"]:
|
|
|
|
raise serializers.ValidationError("Point from id is required")
|
|
|
|
get_object_or_404(BasePoint, oid=data["point_from"])
|
|
|
|
if "distance" not in data or not data["distance"]:
|
|
|
|
raise serializers.ValidationError("Distance is required")
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
class InputRouteSerializer(serializers.Serializer):
|
|
|
|
points = serializers.ListSerializer(child=InputRoutePointSerializer())
|