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