from django.contrib.auth import get_user_model from rest_framework import serializers from api.v1.serializers.content import ContentSerializer, ContentCreateSerializer, ImageObjectSerializer from api.v1.serializers.mixins import DispatchContentMixin from apps.content.models import (Contest, ContestWork) User = get_user_model() class ContestSerializer(serializers.ModelSerializer): cover = ImageObjectSerializer() content = ContentSerializer(many=True) class Meta: model = Contest fields = ['title', 'description', 'slug', 'cover', 'date_start', 'date_end', 'active', 'content', 'finished'] class ContestCreateSerializer(DispatchContentMixin, serializers.ModelSerializer): content = serializers.ListSerializer( child=ContentCreateSerializer(), required=False, ) class Meta: model = Contest fields = '__all__' def create(self, validated_data): content = validated_data.pop('content', []) contest = super().create(validated_data) self.dispatch_content(contest, content) return contest def update(self, instance, validated_data): content = validated_data.pop('content', []) contest = super().update(instance, validated_data) self.dispatch_content(contest, content) return contest def to_representation(self, instance): return ContestSerializer(instance=instance, context=self.context).to_representation(instance) class ContestWorkSerializer(serializers.ModelSerializer): image = ImageObjectSerializer() likes = serializers.SerializerMethodField() user_liked = serializers.SerializerMethodField() class Meta: model = ContestWork fields = ['id', 'user', 'contest', 'image', 'child_full_name', 'age', 'created_at', 'likes', 'user_liked', 'img_width', 'img_height'] def get_likes(self, instance): return instance.likes.filter(user__is_active=True).count() def get_user_liked(self, instance): # FIXME user = self.context['request'].query_params.get('current_user') if user: user = User.objects.get(pk=user) return instance.likes.filter(user=user).exists() if user else False class ContestWorkCreateSerializer(serializers.ModelSerializer): class Meta: model = ContestWork fields = '__all__' def to_representation(self, instance): return ContestWorkSerializer(instance=instance, context=self.context).to_representation(instance)