from rest_framework import serializers from .models import Comment, Rating, Like, Favorite class CommentSerializer(serializers.ModelSerializer): """Serializer for Comment model.""" target_type_display = serializers.CharField(source='get_target_type_display', read_only=True) ai_status_display = serializers.CharField(source='get_ai_status_display', read_only=True) author_username = serializers.CharField(source='author.username', read_only=True) class Meta: model = Comment fields = ('id', 'content', 'target_type', 'target_type_display', 'target_id', 'author', 'author_username', 'ai_status', 'ai_status_display', 'ai_rejection_reason', 'created_at') read_only_fields = ('id', 'author', 'ai_status', 'ai_rejection_reason', 'created_at') def create(self, validated_data): validated_data['author'] = self.context['request'].user return super().create(validated_data) class CommentCreateSerializer(serializers.ModelSerializer): """Serializer for creating comments.""" class Meta: model = Comment fields = ('content', 'target_type', 'target_id') def create(self, validated_data): validated_data['author'] = self.context['request'].user return super().create(validated_data) class RatingSerializer(serializers.ModelSerializer): """Serializer for Rating model.""" target_type_display = serializers.CharField(source='get_target_type_display', read_only=True) user_username = serializers.CharField(source='user.username', read_only=True) class Meta: model = Rating fields = ('id', 'user', 'user_username', 'target_type', 'target_type_display', 'target_id', 'score', 'created_at') read_only_fields = ('id', 'user', 'created_at') def create(self, validated_data): validated_data['user'] = self.context['request'].user return super().create(validated_data) class RatingCreateSerializer(serializers.ModelSerializer): """Serializer for creating/updating ratings.""" class Meta: model = Rating fields = ('target_type', 'target_id', 'score') def create(self, validated_data): validated_data['user'] = self.context['request'].user # Check if rating already exists Rating.objects.filter( user=validated_data['user'], target_type=validated_data['target_type'], target_id=validated_data['target_id'] ).delete() return super().create(validated_data) class LikeSerializer(serializers.ModelSerializer): """Serializer for Like model.""" target_type_display = serializers.CharField(source='get_target_type_display', read_only=True) user_username = serializers.CharField(source='user.username', read_only=True) class Meta: model = Like fields = ('id', 'user', 'user_username', 'target_type', 'target_type_display', 'target_id', 'created_at') read_only_fields = ('id', 'user', 'created_at') class FavoriteSerializer(serializers.ModelSerializer): """Serializer for Favorite model.""" target_type_display = serializers.CharField(source='get_target_type_display', read_only=True) user_username = serializers.CharField(source='user.username', read_only=True) class Meta: model = Favorite fields = ('id', 'user', 'user_username', 'target_type', 'target_type_display', 'target_id', 'created_at') read_only_fields = ('id', 'user', 'created_at') class FavoriteCreateSerializer(serializers.ModelSerializer): """Serializer for creating/removing favorites.""" class Meta: model = Favorite fields = ('target_type', 'target_id') def create(self, validated_data): validated_data['user'] = self.context['request'].user # Check if favorite already exists existing = Favorite.objects.filter( user=validated_data['user'], target_type=validated_data['target_type'], target_id=validated_data['target_id'] ).first() if existing: existing.delete() return None # Return None to indicate removal return super().create(validated_data)