Files
goodtimes/manage_events/api/serializers.py
2024-03-01 18:00:42 +05:30

177 lines
4.8 KiB
Python

from rest_framework import serializers
from accounts.models import IAmPrincipalLocation
from accounts.api.serializers import ProfileSerializer
from manage_events.models import (
EventMaster,
Event,
EventCategory,
EventImage,
Venue,
PrincipalPreference,
)
class EventImageSerializer(serializers.ModelSerializer):
class Meta:
model = EventImage
fields = ["image"]
def get_image(self, obj):
request = self.context.get("request")
if obj.image and hasattr(obj.image, "url"):
return request.build_absolute_uri(obj.image.url)
return None
class VenueSerializer(serializers.ModelSerializer):
created_by = ProfileSerializer(read_only=True)
class Meta:
model = Venue
fields = "__all__"
read_only_fields = ("created_by",)
class EventCategorySerializer(serializers.ModelSerializer):
class Meta:
model = EventCategory
fields = ["id", "title", "image", "description", "video_url"]
class EventDetailSerializer(serializers.ModelSerializer):
images = serializers.SerializerMethodField()
venue = VenueSerializer(read_only=True) # Use VenueSerializer for the venue field
category = EventCategorySerializer(read_only=True)
class Meta:
model = Event
fields = [
"id",
"title",
"description",
"start_date",
"end_date",
"from_time",
"to_time",
"category",
"venue",
"venue_capacity",
"image",
"video_url",
"entry_type",
"entry_fee",
"key_guest",
"age_group",
"images",
]
def get_images(self, obj):
images = (
obj.event_images.all()
) # Ensure this uses the correct related_name from your model
return EventImageSerializer(images, many=True, context=self.context).data
class CreateEventSerializer(serializers.ModelSerializer):
images = serializers.ListField(
child=serializers.ImageField(), write_only=True, required=False
)
class Meta:
model = Event
fields = [
"id",
"images",
"title",
"description",
"image",
"start_date",
"end_date",
"from_time",
"to_time",
"category",
"venue_capacity",
"video_url",
"entry_type",
"entry_fee",
"key_guest",
"age_group",
"draft",
"venue",
]
def create(self, validated_data):
images_data = validated_data.pop("images", None)
event = Event.objects.create(**validated_data)
if images_data:
for image_data in images_data:
EventImage.objects.create(event=event, image=image_data)
return event
class CreateVenueSerializer(serializers.ModelSerializer):
class Meta:
model = Venue
fields = [
"title",
"description",
"address",
"image",
"url",
"latitude",
"longitude",
]
class IAmPrincipalLocationSerializer(serializers.ModelSerializer):
class Meta:
model = IAmPrincipalLocation
fields = ["latitude", "longitude"]
def create(self, validated_data):
principal = self.context["request"].user
return IAmPrincipalLocation.objects.create(
principal=principal, **validated_data
)
class PrincipalPreferenceSerializer(serializers.ModelSerializer):
preferred_categories = serializers.PrimaryKeyRelatedField(
many=True, queryset=EventCategory.objects.all()
)
class Meta:
model = PrincipalPreference
fields = ["preferred_categories"] # Removed 'principal' from fields
def create(self, validated_data):
# Accessing the principal from the context
user = self.context["request"].user
preferred_categories = validated_data.pop("preferred_categories")
principal_preference, created = PrincipalPreference.objects.update_or_create(
principal=user, defaults={}
)
principal_preference.preferred_categories.set(preferred_categories)
return principal_preference
def update(self, instance, validated_data):
instance.preferred_categories.set(
validated_data.get(
"preferred_categories", instance.preferred_categories.all()
)
)
instance.save()
return instance
class EventMasterSearchSerializer(serializers.Serializer):
title = serializers.CharField(max_length=255)
class EventMasterSerializer(serializers.ModelSerializer):
class Meta:
model = EventMaster
fields = "__all__"