import logging import traceback from django.db.models import Q from rest_framework.decorators import action from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.permissions import IsAuthenticated from rest_framework_jwt.authentication import JSONWebTokenAuthentication from ChaCeRndTrans.basic import CCAIResponse from ChaCeRndTrans.code import * from utils.custom import CommonPagination, RbacPermission, CustomViewBase, req_operate_by_user from ..models import Role, Company from ..serializers.role_serializer import RoleListSerializer, FrontRoleModifySerializer logger = logging.getLogger('error') class FrontRoleViewSet(CustomViewBase): """ 前台角色管理:增删改查 (提供前台用户管理自己的公司的角色,所有数据需要绑定公司mid) """ perms_map = ( {"*": "admin"}, {"*": "frontRole_all"}, {"get": "frontRole_list"}, {"post": "frontRole_create"}, {"put": "frontRole_edit"}, {"delete": "frontRole_delete"} ) queryset = Role.objects.all().order_by('id') serializer_class = RoleListSerializer pagination_class = CommonPagination filter_backends = (SearchFilter, OrderingFilter) search_fields = ("name",) ordering_fields = ("id",) authentication_classes = (JSONWebTokenAuthentication,) permission_classes = (RbacPermission,) def get_queryset(self): companyMid = self.request.query_params.get('companyMid', None) queryset = Role.objects.all() if companyMid: # 查询该公司自定义角色及默认的前台角色 queryset = queryset.filter(Q(companyMid=companyMid) | (Q(companyMid__isnull=True) & Q(label=1))) return queryset def get_serializer_class(self): if self.action == "list": return RoleListSerializer return FrontRoleModifySerializer def create(self, request, *args, **kwargs): """ 前台用户自定义角色,绑定公司,label=1(默认为前台角色) """ try: data = req_operate_by_user(request) companyMid = request.query_params.get('companyMid', None) if not companyMid: return CCAIResponse("Missing company information", BAD) is_com_exist = Company.objects.filter(MainId=companyMid).exists() if is_com_exist: data['companyMid'] = companyMid data['label'] = 1 # 前台角色 serializer = self.get_serializer(data=data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) # headers = self.get_success_headers(serializer.data) return CCAIResponse(data="success") else: return CCAIResponse("Company information error", BAD) except Exception: logger.error("user: %s, aigc create failed: \n%s" % (request.user.id, traceback.format_exc())) return CCAIResponse("create failed", SERVER_ERROR) @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated], url_path="rolelist", url_name="rolelist") def rolelist(self, request): """ 获取对应公司的角色,及前台默认角色 """ try: companyMid = request.GET.get('companyMid') if companyMid: rolelist = Role.objects.filter( Q(companyMid=companyMid) | (Q(companyMid__isnull=True) & Q(label=1))).values('name', 'id').all() # serializer = RoleListSerializer(rolelist, many=True) return CCAIResponse(rolelist) else: return CCAIResponse(BAD, msg='公司数据缺失') except Exception as e: logger.error( "user: %s get rolelist failed: \n%s" % (request.user.id, traceback.format_exc())) return CCAIResponse(msg='获取公司角色列表失败', status=SERVER_ERROR)