306 lines
8.9 KiB
Python
306 lines
8.9 KiB
Python
from rest_framework import serializers
|
|
from taggit_serializer.serializers import TagListSerializerField
|
|
from accounts.models import IAmPrincipalLocation
|
|
from manage_cms.api.serializers import TagSerializer
|
|
from taggit.models import Tag
|
|
from manage_events.utils import get_location_info
|
|
from accounts.api.serializers import ProfileSerializer
|
|
from manage_events.models import (
|
|
EventMaster,
|
|
Event,
|
|
EventCategory,
|
|
EventImage,
|
|
EventPrincipalInteraction,
|
|
EventReview,
|
|
Favorites,
|
|
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 EventListSerializer(serializers.ModelSerializer):
|
|
# category = EventCategorySerializer(read_only=True)
|
|
# venue = VenueSerializer(read_only=True)
|
|
# draft = serializers.BooleanField(read_only=True)
|
|
# tags = TagSerializer(many=True, 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",
|
|
# "is_favorited",
|
|
# "reviews",
|
|
# "tags",
|
|
# "principal_interaction",
|
|
# "draft",
|
|
]
|
|
|
|
|
|
class EventDetailSerializer(serializers.ModelSerializer):
|
|
tags = TagSerializer(many=True, read_only=True)
|
|
images = serializers.SerializerMethodField()
|
|
venue = VenueSerializer(read_only=True) # Use VenueSerializer for the venue field
|
|
category = EventCategorySerializer(read_only=True)
|
|
is_favorited = serializers.SerializerMethodField()
|
|
reviews = serializers.SerializerMethodField()
|
|
principal_interaction = serializers.SerializerMethodField()
|
|
draft = serializers.BooleanField(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",
|
|
"coupon_code",
|
|
"coupon_description",
|
|
"age_group",
|
|
"images",
|
|
"is_favorited",
|
|
"reviews",
|
|
"tags",
|
|
"principal_interaction",
|
|
"draft",
|
|
]
|
|
|
|
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
|
|
|
|
def get_is_favorited(self, obj):
|
|
request = self.context.get("request")
|
|
if request and hasattr(request, "user"):
|
|
user = request.user
|
|
return Favorites.objects.filter(event=obj, principal=user).exists()
|
|
return False
|
|
|
|
def get_reviews(self, obj):
|
|
# related_name is 'reviews' as defined in EventReview model
|
|
reviews = obj.reviews.all()
|
|
return EventReviewSerializer(reviews, many=True, context=self.context).data
|
|
|
|
def get_principal_interaction(self, obj):
|
|
request = self.context.get("request")
|
|
if request and hasattr(request, "user") and not request.user.is_anonymous:
|
|
user = request.user
|
|
interaction = EventPrincipalInteraction.objects.filter(
|
|
event=obj, principal=user
|
|
).first()
|
|
if interaction:
|
|
return {
|
|
"status": interaction.status,
|
|
"status_display": interaction.get_status_display(),
|
|
}
|
|
return None
|
|
|
|
|
|
class CreateEventSerializer(serializers.ModelSerializer):
|
|
tags = TagListSerializerField(required=False)
|
|
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",
|
|
"tags",
|
|
"coupon_code",
|
|
"coupon_description",
|
|
]
|
|
|
|
def create(self, validated_data):
|
|
tags = validated_data.pop("tags", None)
|
|
images_data = validated_data.pop("images", None)
|
|
event = Event.objects.create(**validated_data)
|
|
|
|
if tags:
|
|
event.tags.add(*tags)
|
|
|
|
if images_data:
|
|
for image_data in images_data:
|
|
EventImage.objects.create(event=event, image=image_data)
|
|
|
|
return event
|
|
|
|
def update(self, instance, validated_data):
|
|
tags = validated_data.pop("tags", None)
|
|
images_data = validated_data.pop("images", None)
|
|
|
|
# Update fields if there is any change.
|
|
if tags is not None:
|
|
# Clear existing tags and add the new ones
|
|
instance.tags.clear()
|
|
instance.tags.add(*tags)
|
|
|
|
if images_data is not None:
|
|
EventImage.objects.filter(event=instance).delete()
|
|
for image_data in images_data:
|
|
EventImage.objects.create(event=instance, image=image_data)
|
|
|
|
# Update other fields
|
|
for attr, value in validated_data.items():
|
|
setattr(instance, attr, value)
|
|
instance.save()
|
|
|
|
return instance
|
|
|
|
|
|
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"]
|
|
|
|
|
|
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__"
|
|
|
|
|
|
class EventDateRangeSerializer(serializers.Serializer):
|
|
start_date = serializers.DateField(format="%Y-%m-%d", input_formats=["%Y-%m-%d"])
|
|
end_date = serializers.DateField(format="%Y-%m-%d", input_formats=["%Y-%m-%d"])
|
|
|
|
|
|
class EventReviewSerializer(serializers.ModelSerializer):
|
|
principal = ProfileSerializer(read_only=True)
|
|
|
|
class Meta:
|
|
model = EventReview
|
|
fields = ["id", "event", "principal", "review_text", "rating"]
|
|
extra_kwargs = {
|
|
"principal": {"read_only": True},
|
|
}
|
|
|
|
def create(self, validated_data):
|
|
validated_data["principal"] = self.context["request"].user
|
|
return super().create(validated_data)
|
|
|
|
|
|
class TagSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Tag
|
|
fields = ["name"]
|