127 lines
4.7 KiB
Python
127 lines
4.7 KiB
Python
import hashlib
|
|
import mimetypes
|
|
|
|
import django_filters
|
|
from django.conf import settings
|
|
from django.db import connection
|
|
from rest_framework import serializers
|
|
from rest_framework.decorators import action
|
|
|
|
from application import dispatch
|
|
from dvadmin.system.models import FileList
|
|
from dvadmin.utils.json_response import DetailResponse, SuccessResponse
|
|
from dvadmin.utils.serializers import CustomModelSerializer
|
|
from dvadmin.utils.viewset import CustomModelViewSet
|
|
|
|
|
|
class FileSerializer(CustomModelSerializer):
|
|
url = serializers.SerializerMethodField(read_only=True)
|
|
|
|
def get_url(self, instance):
|
|
if self.request.query_params.get('prefix'):
|
|
if settings.ENVIRONMENT in ['local']:
|
|
prefix = 'http://127.0.0.1:8000'
|
|
elif settings.ENVIRONMENT in ['test']:
|
|
prefix = 'http://{host}/api'.format(host=self.request.get_host())
|
|
else:
|
|
prefix = 'https://{host}/api'.format(host=self.request.get_host())
|
|
if instance.file_url:
|
|
return instance.file_url if instance.file_url.startswith('http') else f"{prefix}/{instance.file_url}"
|
|
return (f'{prefix}/media/{str(instance.url)}')
|
|
return instance.file_url or (f'media/{str(instance.url)}')
|
|
|
|
class Meta:
|
|
model = FileList
|
|
fields = "__all__"
|
|
|
|
def create(self, validated_data):
|
|
file_engine = dispatch.get_system_config_values("file_storage.file_engine") or 'local'
|
|
file_backup = dispatch.get_system_config_values("file_storage.file_backup")
|
|
file = self.initial_data.get('file')
|
|
file_size = file.size
|
|
validated_data['name'] = str(file)
|
|
validated_data['size'] = file_size
|
|
md5 = hashlib.md5()
|
|
for chunk in file.chunks():
|
|
md5.update(chunk)
|
|
validated_data['md5sum'] = md5.hexdigest()
|
|
validated_data['engine'] = file_engine
|
|
validated_data['mime_type'] = file.content_type
|
|
ft = {'image':0,'video':1,'audio':2}.get(file.content_type.split('/')[0], None)
|
|
validated_data['file_type'] = 3 if ft is None else ft
|
|
if file_backup:
|
|
validated_data['url'] = file
|
|
if file_engine == 'oss':
|
|
from dvadmin.utils.aliyunoss import ali_oss_upload
|
|
file_path = ali_oss_upload(file, file_name=validated_data['name'])
|
|
if file_path:
|
|
validated_data['file_url'] = file_path
|
|
else:
|
|
raise ValueError("上传失败")
|
|
elif file_engine == 'cos':
|
|
from dvadmin.utils.tencentcos import tencent_cos_upload
|
|
file_path = tencent_cos_upload(file, file_name=validated_data['name'])
|
|
if file_path:
|
|
validated_data['file_url'] = file_path
|
|
else:
|
|
raise ValueError("上传失败")
|
|
else:
|
|
validated_data['url'] = file
|
|
# 审计字段
|
|
try:
|
|
request_user = self.request.user
|
|
validated_data['dept_belong_id'] = request_user.dept.id
|
|
validated_data['creator'] = request_user.id
|
|
validated_data['modifier'] = request_user.id
|
|
except:
|
|
pass
|
|
return super().create(validated_data)
|
|
|
|
|
|
class FileAllSerializer(CustomModelSerializer):
|
|
|
|
class Meta:
|
|
model = FileList
|
|
fields = ['id', 'name']
|
|
|
|
|
|
class FileFilter(django_filters.FilterSet):
|
|
name = django_filters.CharFilter(field_name="name", lookup_expr="icontains", help_text="文件名")
|
|
mime_type = django_filters.CharFilter(field_name="mime_type", lookup_expr="icontains", help_text="文件类型")
|
|
|
|
class Meta:
|
|
model = FileList
|
|
fields = ['name', 'mime_type', 'upload_method', 'file_type']
|
|
|
|
|
|
class FileViewSet(CustomModelViewSet):
|
|
"""
|
|
文件管理接口
|
|
list:查询
|
|
create:新增
|
|
update:修改
|
|
retrieve:单例
|
|
destroy:删除
|
|
"""
|
|
queryset = FileList.objects.all()
|
|
serializer_class = FileSerializer
|
|
filter_class = FileFilter
|
|
permission_classes = []
|
|
|
|
@action(methods=['GET'], detail=False)
|
|
def get_all(self, request):
|
|
data1 = self.get_serializer(self.get_queryset(), many=True).data
|
|
data2 = []
|
|
if dispatch.is_tenants_mode():
|
|
from django_tenants.utils import schema_context
|
|
with schema_context('public'):
|
|
data2 = self.get_serializer(FileList.objects.all(), many=True).data
|
|
return DetailResponse(data=data2+data1)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
if self.request.query_params.get('system', 'False') == 'True' and dispatch.is_tenants_mode():
|
|
from django_tenants.utils import schema_context
|
|
with schema_context('public'):
|
|
return super().list(request, *args, **kwargs)
|
|
return super().list(request, *args, **kwargs)
|