from rest_framework import serializers from ..models.rate import Rate class RateSerializer(serializers.ModelSerializer): """ Serializer for the Rate model. """ class Meta: model = Rate fields = ('id', 'service', 'content_id', 'rate', 'status', 'created_at', 'updated_at') read_only_fields = ('id', 'created_at', 'updated_at') def validate(self, data): """ Validate that the content exists in the specified service. """ service = data.get('service') content_id = data.get('content_id') if not Rate.validate_content_exists(service, content_id): raise serializers.ValidationError(f"Content with ID {content_id} does not exist in {service} service.") return data def create(self, validated_data): """ Create or update a rate. If a rate already exists for the user, service, and content_id, update it. """ user = self.context['request'].user service = validated_data.get('service') content_id = validated_data.get('content_id') # Try to get an existing rate try: rate_obj = Rate.objects.get( user=user, service=service, content_id=content_id ) # Update existing rate for attr, value in validated_data.items(): setattr(rate_obj, attr, value) rate_obj.save() return rate_obj except Rate.DoesNotExist: # Create new rate return Rate.objects.create(user=user, **validated_data) class RateStatusSerializer(serializers.Serializer): """ Serializer for checking if a user has rated a content and getting the rate value. """ service = serializers.ChoiceField(choices=Rate.ServiceChoices.choices) content_id = serializers.IntegerField(min_value=1) def validate(self, data): """ Validate that the content exists in the specified service. """ service = data.get('service') content_id = data.get('content_id') if not Rate.validate_content_exists(service, content_id): raise serializers.ValidationError(f"Content with ID {content_id} does not exist in {service} service.") return data class AverageRateSerializer(serializers.Serializer): """ Serializer for getting the average rate of a content. """ service = serializers.ChoiceField(choices=Rate.ServiceChoices.choices) content_id = serializers.IntegerField(min_value=1) def validate(self, data): """ Validate that the content exists in the specified service. """ service = data.get('service') content_id = data.get('content_id') if not Rate.validate_content_exists(service, content_id): raise serializers.ValidationError(f"Content with ID {content_id} does not exist in {service} service.") return data