factory/apps/utils/viewsets.py

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,带数据权限过滤
"""