177 lines
4.8 KiB
Python
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__"
|