from django.db import IntegrityError from rest_framework import serializers from rest_framework.exceptions import ValidationError from .models import Document, UserResponse class UserResponseSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(read_only=True) question = serializers.PrimaryKeyRelatedField(read_only=True) class Meta: model = UserResponse fields = ('user', 'question', 'value') def create(self, validated_data): response = UserResponse(**validated_data) response.save() return response def update(self, instance, validated_data): instance.value = validated_data['value'] instance.save() def valid_file_extension(file): extension = file.name.split('.')[-1] if extension.lower() not in ['pdf', 'png', 'gif', 'jpg', 'jpe', 'jpeg']: raise ValidationError(f'File type not supported: {extension}') def valid_doc_type(value): valid_codes = ['AAI', 'AFDO', 'AFTL', 'CSA', 'EFSS', 'MC', 'NCV', 'OFI', 'RDP'] if value.upper() not in valid_codes: raise ValidationError(f'Doc type not supported: {value}. Valid codes: {", ".join(valid_codes)}') class CreateDocumentSerializer(serializers.ModelSerializer): doc_type = serializers.CharField(required=True, validators=[valid_doc_type]) party_code = serializers.IntegerField(min_value=0, max_value=2, required=True) file = serializers.FileField(required=True, validators=[valid_file_extension]) filename = serializers.CharField(read_only=True) size = serializers.IntegerField(read_only=True) rotation = serializers.IntegerField(read_only=True) sort_order = serializers.IntegerField(read_only=True) file_url = serializers.URLField(source='get_file_url', read_only=True) class Meta: model = Document fields = ('file', 'doc_type', 'party_code', 'filename', 'size', 'rotation', 'sort_order', 'file_url') def create(self, validated_data): filename = validated_data['file'].name size = validated_data['file'].size user = self.context['request'].user order = Document.objects.filter(bceid_user=user, doc_type=validated_data['doc_type'], party_code=validated_data['party_code']).count() + 1 response = Document(bceid_user=user, filename=filename, size=size, sort_order=order, **validated_data) try: response.save() except IntegrityError: raise ValidationError("This file appears to have already been uploaded for this document. Duplicate filename: " + filename) return response def valid_rotation(value): if value % 90 != 0: raise serializers.ValidationError('Rotation must be 0, 90, 180, or 270') class DocumentMetadataSerializer(serializers.ModelSerializer): doc_type = serializers.CharField(read_only=True) party_code = serializers.IntegerField(read_only=True) filename = serializers.CharField(read_only=True) size = serializers.IntegerField(read_only=True) rotation = serializers.IntegerField(min_value=0, max_value=270, validators=[valid_rotation]) sort_order = serializers.IntegerField(read_only=True) file_url = serializers.URLField(source='get_file_url', read_only=True) class Meta: model = Document fields = ('doc_type', 'party_code', 'filename', 'size', 'rotation', 'sort_order', 'file_url')