Skip to content
Snippets Groups Projects
serializers.py 1.72 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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