from rest_framework import serializers class PublicShowImageMixin(serializers.Serializer): image_url = serializers.SerializerMethodField() def get_image_url(self, obj): request = self.context.get("request") return obj.image_url(request=request) class PublicShowListSerializer(PublicShowImageMixin, serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField() slug = serializers.SlugField() summary = serializers.CharField() poster_image = serializers.URLField(allow_blank=True) class PublicVenueSummarySerializer(serializers.Serializer): name = serializers.CharField() city = serializers.CharField() class PublicVenueDetailSerializer(PublicVenueSummarySerializer): address = serializers.CharField() class PublicShowSummarySerializer(PublicShowImageMixin, serializers.Serializer): title = serializers.CharField() slug = serializers.SlugField() summary = serializers.CharField() class PublicPerformanceListSerializer(serializers.Serializer): id = serializers.IntegerField() show = PublicShowSummarySerializer() venue = PublicVenueSummarySerializer() starts_at = serializers.DateTimeField() booking_enabled = serializers.BooleanField(source="is_booking_enabled") available_seats = serializers.IntegerField() class PublicShowPerformanceSerializer(serializers.Serializer): id = serializers.IntegerField() starts_at = serializers.DateTimeField() venue = PublicVenueSummarySerializer() booking_enabled = serializers.BooleanField(source="is_booking_enabled") available_seats = serializers.IntegerField() class PublicShowDetailSerializer(PublicShowListSerializer): description = serializers.CharField() performances = PublicShowPerformanceSerializer(many=True, source="public_performances") class PublicPerformanceDetailSerializer(serializers.Serializer): id = serializers.IntegerField() show = PublicShowSummarySerializer() venue = PublicVenueDetailSerializer() starts_at = serializers.DateTimeField() booking_enabled = serializers.BooleanField(source="is_booking_enabled") available_seats = serializers.IntegerField()