Skip to content
Snippets Groups Projects
serializers.py 1.72 KiB
Newer Older
from rest_framework import serializers
from common.serializers import CurrentUserProfileDefault
from . import models

Bodor Máté's avatar
Bodor Máté committed
_max_count = 1
Bodor Máté's avatar
Bodor Máté committed


class DocumentSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.HiddenField(default=CurrentUserProfileDefault())
    uploaded_by_name = serializers.SerializerMethodField()
Bodor Máté's avatar
Bodor Máté committed
    file_url = serializers.SerializerMethodField()

    class Meta:
        model = models.Document
Bodor Máté's avatar
Bodor Máté committed
        fields = [
Rafael László's avatar
Rafael László committed
            'uploaded_by',
            'uploaded_at',
            'name',
            'description',
Bodor Máté's avatar
Bodor Máté committed
            'file_url',
Rafael László's avatar
Rafael László committed
            'file',
            'uploaded_by_name',
            'solution',
Bodor Máté's avatar
Bodor Máté committed
        ]
        
        read_only_fields = [
            'uploaded_by',
            'uploaded_at',
            'file_url',
            'uploaded_by_name',
        ]

        extra_kwargs = {
            'file': {'write_only': True},
        }
    def to_representation(self, instance):
        data = super().to_representation(instance)
Bodor Máté's avatar
Bodor Máté committed
        if not data['file_url']:
            data['file_url'] = ""
        return data

    def get_uploaded_by_name(self, obj):
        return obj.uploaded_by.full_name
Bodor Máté's avatar
Bodor Máté committed
    def get_file_url(self, obj):
        return f"/api/v1/documents/{obj.id}/download/"

Bodor Máté's avatar
Bodor Máté committed
    def validate_solution(self, value):
        profile = self.context['request'].user.profile
Bodor Máté's avatar
Bodor Máté committed
        if value not in profile.solution.all():
            raise serializers.ValidationError('You dont have permission!')
Rafael László's avatar
Rafael László committed
        count = models.Document.objects.filter(
            uploaded_by=profile, solution=value).count()
Bodor Máté's avatar
Bodor Máté committed
        if count >= _max_count:
Rafael László's avatar
Rafael László committed
            raise serializers.ValidationError(
Bodor Máté's avatar
Bodor Máté committed
                f'You cant upload more than {_max_count} document to one solution!')
Bodor Máté's avatar
Bodor Máté committed
        return value