This commit is contained in:
18
backend/competition/migrations/0013_projectfile_file_size.py
Normal file
18
backend/competition/migrations/0013_projectfile_file_size.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 6.0.1 on 2026-03-22 16:15
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('competition', '0012_alter_competition_cover_image_url_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='projectfile',
|
||||||
|
name='file_size',
|
||||||
|
field=models.BigIntegerField(blank=True, null=True, verbose_name='文件大小(字节)'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -297,6 +297,7 @@ class ProjectFile(models.Model):
|
|||||||
|
|
||||||
file = models.FileField(upload_to='competitions/projects/files/', verbose_name="文件", null=True, blank=True)
|
file = models.FileField(upload_to='competitions/projects/files/', verbose_name="文件", null=True, blank=True)
|
||||||
file_url = models.TextField(verbose_name="文件链接", null=True, blank=True, help_text="OSS URL或外部链接")
|
file_url = models.TextField(verbose_name="文件链接", null=True, blank=True, help_text="OSS URL或外部链接")
|
||||||
|
file_size = models.BigIntegerField(verbose_name="文件大小(字节)", null=True, blank=True)
|
||||||
|
|
||||||
name = models.CharField(max_length=100, verbose_name="文件名称", blank=True)
|
name = models.CharField(max_length=100, verbose_name="文件名称", blank=True)
|
||||||
|
|
||||||
|
|||||||
@@ -39,15 +39,29 @@ class CompetitionEnrollmentSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
class ProjectFileSerializer(serializers.ModelSerializer):
|
class ProjectFileSerializer(serializers.ModelSerializer):
|
||||||
file_url_display = serializers.SerializerMethodField()
|
file_url_display = serializers.SerializerMethodField()
|
||||||
|
file_size_display = serializers.SerializerMethodField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ProjectFile
|
model = ProjectFile
|
||||||
fields = ['id', 'project', 'file_type', 'file', 'file_url', 'name', 'created_at', 'file_url_display']
|
fields = ['id', 'project', 'file_type', 'file', 'file_url', 'file_size', 'name', 'created_at', 'file_url_display', 'file_size_display']
|
||||||
|
|
||||||
def get_file_url_display(self, obj):
|
def get_file_url_display(self, obj):
|
||||||
if obj.file:
|
if obj.file:
|
||||||
return obj.file.url
|
return obj.file.url
|
||||||
return obj.file_url
|
return obj.file_url
|
||||||
|
|
||||||
|
def get_file_size_display(self, obj):
|
||||||
|
if not obj.file_size:
|
||||||
|
return None
|
||||||
|
size = obj.file_size
|
||||||
|
if size < 1024:
|
||||||
|
return f"{size} B"
|
||||||
|
elif size < 1024 * 1024:
|
||||||
|
return f"{size / 1024:.1f} KB"
|
||||||
|
elif size < 1024 * 1024 * 1024:
|
||||||
|
return f"{size / (1024 * 1024):.1f} MB"
|
||||||
|
else:
|
||||||
|
return f"{size / (1024 * 1024 * 1024):.2f} GB"
|
||||||
|
|
||||||
def validate_file(self, value):
|
def validate_file(self, value):
|
||||||
if not value:
|
if not value:
|
||||||
@@ -87,6 +101,8 @@ class ProjectFileSerializer(serializers.ModelSerializer):
|
|||||||
if not validated_data.get('name'):
|
if not validated_data.get('name'):
|
||||||
validated_data['name'] = file_obj.name
|
validated_data['name'] = file_obj.name
|
||||||
|
|
||||||
|
validated_data['file_size'] = file_obj.size
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from ai_services.services import AliyunTingwuService
|
from ai_services.services import AliyunTingwuService
|
||||||
service = AliyunTingwuService()
|
service = AliyunTingwuService()
|
||||||
|
|||||||
Reference in New Issue
Block a user