72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
|
|
from rest_framework.viewsets import ModelViewSet, GenericViewSet
|
|
from rest_framework.decorators import action
|
|
from apps.utils.mixins import CustomCreateModelMixin, CustomDestoryModelMixin, CustomUpdateModelMixin, OptimizationMixin
|
|
from apps.utils.permission import RbacDataMixin, RbacPermission
|
|
from apps.utils.serializers import PkSerializer
|
|
from rest_framework.response import Response
|
|
from rest_framework.mixins import DestroyModelMixin, RetrieveModelMixin, ListModelMixin
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.exceptions import ValidationError
|
|
|
|
|
|
class CustomGenericViewSet(GenericViewSet):
|
|
"""
|
|
增强的GenericViewSet
|
|
"""
|
|
perms_map = {}
|
|
ordering_fields = '__all__'
|
|
filter_fields = '__all__'
|
|
ordering = '-create_time'
|
|
filterset_fields = '__all__'
|
|
create_serializer_class = None
|
|
update_serializer_class = None
|
|
list_serializer_class = None
|
|
retrieve_serializer_class = None
|
|
permission_classes = [IsAuthenticated & RbacPermission]
|
|
|
|
def get_serializer_class(self):
|
|
action_serializer_name = f"{self.action}_serializer_class"
|
|
action_serializer_class = getattr(self, action_serializer_name, None)
|
|
if action_serializer_class:
|
|
return action_serializer_class
|
|
return super().get_serializer_class()
|
|
|
|
class CustomDataGenericViewSet(RbacDataMixin, CustomGenericViewSet):
|
|
"""
|
|
增强的GenericViewSet, 带数据权限过滤
|
|
"""
|
|
|
|
class CustomModelViewSet(OptimizationMixin, CustomCreateModelMixin
|
|
, CustomUpdateModelMixin, ListModelMixin, RetrieveModelMixin
|
|
, CustomDestoryModelMixin, CustomGenericViewSet):
|
|
"""
|
|
增强的ModelViewSet
|
|
"""
|
|
def __init__(self, **kwargs) -> None:
|
|
super().__init__(**kwargs)
|
|
# 增加默认权限标识
|
|
if not self.perms_map:
|
|
basename = self.basename
|
|
self.perms_map = {'get':'*', 'post':'{}_create'.format(basename)
|
|
,'put':'{}_update'.format(basename)
|
|
,'patch':'{}_update'.format(basename)
|
|
,'delete':'{}_delete'.format(basename)
|
|
,'deletes':'{}_delete'.format(basename)}
|
|
|
|
@action(methods=['post'], detail=False, serializer_class=PkSerializer)
|
|
def deletes(self,request,*args,**kwargs):
|
|
request_data = request.data
|
|
pks = request_data.get('pks',None)
|
|
if pks:
|
|
self.get_queryset().filter(id__in=pks).delete(update_by=request.user)
|
|
return Response()
|
|
else:
|
|
raise ValidationError("未获取到pks字段")
|
|
|
|
|
|
|
|
class CustomDataModelViewSet(RbacDataMixin, CustomModelViewSet):
|
|
"""
|
|
增强的ModelViewSet,带数据权限过滤
|
|
""" |