from rest_framework import serializers from adventrues.models import AdventureOffering from equipment.models import EquipmentItem from .models import ListingClick class ListingClickSerializer(serializers.ModelSerializer): class Meta: model = ListingClick fields = ( "id", "listing_type", "traffic_type", "utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "gclid", "fbclid", "equipment_item", "adventure_offering", "created_at", ) read_only_fields = fields class TrackListingClickSerializer(serializers.Serializer): listing_type = serializers.ChoiceField(choices=ListingClick.ListingType.choices) public_id = serializers.CharField(max_length=64) utm_source = serializers.CharField(required=False, allow_blank=True, default="", max_length=255) utm_medium = serializers.CharField(required=False, allow_blank=True, default="", max_length=255) utm_campaign = serializers.CharField(required=False, allow_blank=True, default="", max_length=255) utm_term = serializers.CharField(required=False, allow_blank=True, default="", max_length=255) utm_content = serializers.CharField(required=False, allow_blank=True, default="", max_length=255) gclid = serializers.CharField(required=False, allow_blank=True, default="", max_length=255) fbclid = serializers.CharField(required=False, allow_blank=True, default="", max_length=255) referrer = serializers.CharField(required=False, allow_blank=True, default="", max_length=2048) def validate(self, attrs): listing_type = attrs["listing_type"] public_id = attrs["public_id"] if listing_type == ListingClick.ListingType.EQUIPMENT: item = EquipmentItem.objects.filter(public_id=public_id, is_active=True).select_related("vendor").first() if not item: raise serializers.ValidationError({"public_id": "No active equipment listing with this public_id."}) attrs["_equipment_item"] = item else: offering = AdventureOffering.objects.filter(public_id=public_id, is_active=True).select_related("vendor").first() if not offering: raise serializers.ValidationError({"public_id": "No active adventure offering with this public_id."}) attrs["_adventure_offering"] = offering return attrs