diff --git a/apps/rbac/api/role.py b/apps/rbac/api/role.py index a11edc409..ceb2e9c19 100644 --- a/apps/rbac/api/role.py +++ b/apps/rbac/api/role.py @@ -4,6 +4,7 @@ from rest_framework.exceptions import PermissionDenied from rest_framework.decorators import action from common.drf.api import JMSModelViewSet +from ..filters import RoleFilter from ..serializers import RoleSerializer, RoleUserSerializer from ..models import Role, SystemRole, OrgRole from .permission import PermissionViewSet @@ -20,8 +21,8 @@ class RoleViewSet(JMSModelViewSet): 'default': RoleSerializer, 'users': RoleUserSerializer, } - filterset_fields = ['name', 'scope', 'builtin'] - search_fields = filterset_fields + filterset_class = RoleFilter + search_fields = ('name', 'scope', 'builtin') rbac_perms = { 'users': 'rbac.view_rolebinding' } diff --git a/apps/rbac/filters.py b/apps/rbac/filters.py new file mode 100644 index 000000000..f9a936b66 --- /dev/null +++ b/apps/rbac/filters.py @@ -0,0 +1,25 @@ +from django_filters import rest_framework as filters + +from common.drf.filters import BaseFilterSet +from rbac.models import Role + + +class RoleFilter(BaseFilterSet): + name = filters.CharFilter(method='filter_name') + + class Meta: + model = Role + fields = ('name', 'scope', 'builtin') + + @staticmethod + def filter_name(queryset, name, value): + builtin_ids = [] + for role in queryset.filter(builtin=True): + if value in role.display_name: + builtin_ids.append(role.id) + if builtin_ids: + builtin_qs = queryset.model.objects.filter(id__in=builtin_ids) + else: + builtin_qs = queryset.model.objects.none() + queryset = queryset.filter(name__icontains=value) + return queryset | builtin_qs