You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.5 KiB
75 lines
2.5 KiB
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)
|
|
|