This commit is contained in:
@@ -33,19 +33,44 @@ class CompetitionEnrollmentSerializer(serializers.ModelSerializer):
|
||||
read_only_fields = ['status']
|
||||
|
||||
class ProjectFileSerializer(serializers.ModelSerializer):
|
||||
file_url_display = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = ProjectFile
|
||||
fields = ['id', 'project', 'file_type', 'file', 'file_url', 'name', 'created_at']
|
||||
fields = ['id', 'project', 'file_type', 'file', 'file_url', 'name', 'created_at', 'file_url_display']
|
||||
|
||||
def get_file_url_display(self, obj):
|
||||
if obj.file:
|
||||
return obj.file.url
|
||||
return obj.file_url
|
||||
|
||||
def validate_file(self, value):
|
||||
if not value:
|
||||
return value
|
||||
# 50MB limit
|
||||
limit_mb = 50
|
||||
if value.size > limit_mb * 1024 * 1024:
|
||||
raise serializers.ValidationError(f"文件大小不能超过 {limit_mb}MB")
|
||||
return value
|
||||
|
||||
def create(self, validated_data):
|
||||
file_obj = validated_data.get('file')
|
||||
if file_obj:
|
||||
ext = file_obj.name.split('.')[-1].lower() if '.' in file_obj.name else ''
|
||||
if ext in ['ppt', 'pptx']:
|
||||
validated_data['file_type'] = 'ppt'
|
||||
elif ext == 'pdf':
|
||||
validated_data['file_type'] = 'pdf'
|
||||
elif ext in ['jpg', 'jpeg', 'png', 'gif', 'webp']:
|
||||
validated_data['file_type'] = 'image'
|
||||
elif ext in ['mp4', 'mov', 'avi', 'webm']:
|
||||
validated_data['file_type'] = 'video'
|
||||
elif ext in ['doc', 'docx']:
|
||||
validated_data['file_type'] = 'doc'
|
||||
|
||||
if not validated_data.get('name'):
|
||||
validated_data['name'] = file_obj.name
|
||||
return super().create(validated_data)
|
||||
|
||||
class ProjectSerializer(serializers.ModelSerializer):
|
||||
files = ProjectFileSerializer(many=True, read_only=True)
|
||||
contestant_info = serializers.SerializerMethodField()
|
||||
|
||||
Reference in New Issue
Block a user