Skip to content

Commit d90d771

Browse files
committed
feat: Get resource user permission detail
1 parent ce52ee3 commit d90d771

File tree

5 files changed

+254
-4
lines changed

5 files changed

+254
-4
lines changed

apps/system_manage/api/user_resource_permission.py

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
"""
99
from drf_spectacular.types import OpenApiTypes
1010
from drf_spectacular.utils import OpenApiParameter
11+
from rest_framework import serializers
12+
from django.utils.translation import gettext_lazy as _
1113

1214
from common.mixins.api_mixin import APIMixin
13-
from common.result import ResultSerializer
15+
from common.result import ResultSerializer, ResultPageSerializer
1416
from system_manage.serializers.user_resource_permission import UserResourcePermissionResponse, \
1517
UpdateUserResourcePermissionRequest
1618

@@ -49,3 +51,126 @@ class EditUserResourcePermissionAPI(APIMixin):
4951
@staticmethod
5052
def get_request():
5153
return UpdateUserResourcePermissionRequest()
54+
55+
56+
class ResourceUserPermissionResponse(serializers.Serializer):
57+
id = serializers.CharField(required=True, label=_('user id'))
58+
nick_name = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('nick_name'))
59+
username = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('username'))
60+
permission = serializers.CharField(required=True, label=_('permission'))
61+
62+
63+
class APIResourceUserPermissionResponse(ResultSerializer):
64+
def get_data(self):
65+
return ResourceUserPermissionResponse(many=True)
66+
67+
68+
class ResourceUserPermissionAPI(APIMixin):
69+
@staticmethod
70+
def get_parameters():
71+
return [
72+
OpenApiParameter(
73+
name="workspace_id",
74+
description="工作空间id",
75+
type=OpenApiTypes.STR,
76+
location='path',
77+
required=True
78+
),
79+
OpenApiParameter(
80+
name="target",
81+
description="资源id",
82+
type=OpenApiTypes.STR,
83+
location='path',
84+
required=True
85+
),
86+
OpenApiParameter(
87+
name="resource",
88+
description="资源类型",
89+
type=OpenApiTypes.STR,
90+
location='path',
91+
required=True
92+
),
93+
OpenApiParameter(
94+
name="username",
95+
description="用户名",
96+
type=OpenApiTypes.STR,
97+
location='query',
98+
required=False
99+
),
100+
OpenApiParameter(
101+
name="nick_name",
102+
description="姓名",
103+
type=OpenApiTypes.STR,
104+
location='query',
105+
required=False
106+
),
107+
]
108+
109+
@staticmethod
110+
def get_response():
111+
return APIResourceUserPermissionResponse
112+
113+
114+
class APIResourceUserPermissionPageResponse(ResultPageSerializer):
115+
def get_data(self):
116+
return ResourceUserPermissionResponse(many=True)
117+
118+
119+
class ResourceUserPermissionPageAPI(APIMixin):
120+
@staticmethod
121+
def get_parameters():
122+
return [
123+
OpenApiParameter(
124+
name="workspace_id",
125+
description="工作空间id",
126+
type=OpenApiTypes.STR,
127+
location='path',
128+
required=True
129+
),
130+
OpenApiParameter(
131+
name="target",
132+
description="资源id",
133+
type=OpenApiTypes.STR,
134+
location='path',
135+
required=True
136+
),
137+
OpenApiParameter(
138+
name="resource",
139+
description="资源类型",
140+
type=OpenApiTypes.STR,
141+
location='path',
142+
required=True
143+
),
144+
OpenApiParameter(
145+
name="current_page",
146+
description=_("Current page"),
147+
type=OpenApiTypes.INT,
148+
location='path',
149+
required=True,
150+
),
151+
OpenApiParameter(
152+
name="page_size",
153+
description=_("Page size"),
154+
type=OpenApiTypes.INT,
155+
location='path',
156+
required=True,
157+
),
158+
OpenApiParameter(
159+
name="username",
160+
description="用户名",
161+
type=OpenApiTypes.STR,
162+
location='query',
163+
required=False
164+
),
165+
OpenApiParameter(
166+
name="nick_name",
167+
description="姓名",
168+
type=OpenApiTypes.STR,
169+
location='query',
170+
required=False
171+
),
172+
]
173+
174+
@staticmethod
175+
def get_response():
176+
return APIResourceUserPermissionPageResponse

apps/system_manage/serializers/user_resource_permission.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from common.constants.permission_constants import get_default_workspace_user_role_mapping_list, RoleConstants, \
2020
ResourcePermission, ResourcePermissionRole, ResourceAuthType
2121
from common.database_model_manage.database_model_manage import DatabaseModelManage
22-
from common.db.search import native_search
22+
from common.db.search import native_search, native_page_search
2323
from common.db.sql_execute import select_list
2424
from common.exception.app_exception import AppApiException
2525
from common.utils.common import get_file_content
@@ -30,6 +30,7 @@
3030
from models_provider.models import Model
3131
from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType
3232
from tools.models import Tool
33+
from users.models import User
3334
from users.serializers.user import is_workspace_manage
3435

3536

@@ -260,3 +261,59 @@ def edit(self, instance, user, with_valid=True):
260261
key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
261262
cache.delete(key, version=version)
262263
return True
264+
265+
266+
class ResourceUserPermissionUserListRequest(serializers.Serializer):
267+
nick_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('workspace id'))
268+
username = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('workspace id'))
269+
270+
class ResourceUserPermissionSerializer(serializers.Serializer):
271+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
272+
target = serializers.CharField(required=True, label=_('resource id'))
273+
auth_target_type = serializers.CharField(required=True, label=_('resource'))
274+
275+
def get_queryset(self, instance):
276+
user_query_set = QuerySet(User)
277+
nick_name = instance.get('nick_name')
278+
username = instance.get('username')
279+
280+
if nick_name:
281+
user_query_set = user_query_set.filter(nick_name__contains=nick_name)
282+
if username:
283+
user_query_set = user_query_set.filter(username__contains=username)
284+
285+
return {
286+
'workspace_user_resource_permission_query_set': QuerySet(WorkspaceUserResourcePermission).filter(
287+
workspace_id=self.data.get('workspace_id'),
288+
auth_target_type=self.data.get('auth_target_type'),
289+
target=self.data.get('target')),
290+
'user_query_set': user_query_set
291+
}
292+
293+
def list(self, instance, with_valid=True):
294+
if with_valid:
295+
self.is_valid(raise_exception=True)
296+
ResourceUserPermissionUserListRequest(data=instance).is_valid(raise_exception=True)
297+
# 资源的用户授权列表
298+
resource_user_permission_list = native_search(self.get_queryset(instance), get_file_content(
299+
os.path.join(PROJECT_DIR, "apps", "system_manage", 'sql', 'get_resource_user_permission_detail.sql')
300+
))
301+
return resource_user_permission_list
302+
303+
def page(self, instance, current_page: int, page_size: int, with_valid=True):
304+
if with_valid:
305+
self.is_valid(raise_exception=True)
306+
ResourceUserPermissionUserListRequest(data=instance).is_valid(raise_exception=True)
307+
# 分页列表
308+
resource_user_permission_page_list = native_page_search(current_page, page_size, self.get_queryset(instance),
309+
get_file_content(
310+
os.path.join(PROJECT_DIR, "apps", "system_manage",
311+
'sql',
312+
'get_resource_user_permission_detail.sql')
313+
))
314+
return resource_user_permission_page_list
315+
316+
def edit(self, instance, with_valid=True):
317+
if with_valid:
318+
self.is_valid(raise_exception=True)
319+
ResourceUserPermissionUserListRequest(data=instance).is_valid(raise_exception=True)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
SELECT
2+
u.id,
3+
u.nick_name,
4+
u.username,
5+
(case
6+
when wurp.auth_type = 'ROLE'
7+
and 'ROLE' = any(wurp.permission_list) then 'ROLE'
8+
when wurp.auth_type = 'RESOURCE_PERMISSION_GROUP'
9+
and 'MANAGE'= any(wurp.permission_list) then 'MANAGE'
10+
when wurp.auth_type = 'RESOURCE_PERMISSION_GROUP'
11+
and 'VIEW' = any(wurp.permission_list) then 'VIEW'
12+
else 'NOT_AUTH'
13+
end) as "permission_list"
14+
FROM
15+
public."user" u
16+
LEFT JOIN (
17+
SELECT
18+
*
19+
FROM
20+
workspace_user_resource_permission
21+
${workspace_user_resource_permission_query_set}
22+
) wurp
23+
ON
24+
u.id = wurp.user_id
25+
${user_query_set}

apps/system_manage/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
# @formatter:off
77
urlpatterns = [
88
path('workspace/<str:workspace_id>/user_resource_permission/user/<str:user_id>/resource/<str:resource>', views.WorkSpaceUserResourcePermissionView.as_view()),
9+
path('workspace/<str:workspace_id>/resource_user_permission/resource/<str:target>/resource/<str:resource>', views.WorkspaceResourceUserPermissionView.as_view()),
10+
path('workspace/<str:workspace_id>/resource_user_permission/resource/<str:target>/resource/<str:resource>/<int:current_page>/<int:page_size>', views.WorkspaceResourceUserPermissionView.Page.as_view()),
911
path('email_setting', views.SystemSetting.Email.as_view()),
1012
path('profile', views.SystemProfile.as_view()),
1113
path('valid/<str:valid_type>/<int:valid_count>', views.Valid.as_view())

apps/system_manage/views/user_resource_permission.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
from common.constants.permission_constants import PermissionConstants, RoleConstants, Permission, Group, Operate
1919
from common.log.log import log
2020
from common.result import DefaultResultSerializer
21-
from system_manage.api.user_resource_permission import UserResourcePermissionAPI, EditUserResourcePermissionAPI
22-
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
21+
from system_manage.api.user_resource_permission import UserResourcePermissionAPI, EditUserResourcePermissionAPI, \
22+
ResourceUserPermissionAPI, ResourceUserPermissionPageAPI
23+
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer, \
24+
ResourceUserPermissionSerializer
2325
from users.models import User
2426

2527

@@ -72,3 +74,42 @@ def put(self, request: Request, workspace_id: str, user_id: str, resource: str):
7274
return result.success(UserResourcePermissionSerializer(
7375
data={'workspace_id': workspace_id, 'user_id': user_id, 'auth_target_type': resource}
7476
).edit(request.data, request.user))
77+
78+
79+
class WorkspaceResourceUserPermissionView(APIView):
80+
authentication_classes = [TokenAuth]
81+
82+
@extend_schema(
83+
methods=['GET'],
84+
description=_('Get user authorization status of resource'),
85+
summary=_('Get user authorization status of resource'),
86+
operation_id=_('Get user authorization status of resource'), # type: ignore
87+
parameters=ResourceUserPermissionAPI.get_parameters(),
88+
responses=ResourceUserPermissionAPI.get_response(),
89+
tags=[_('Resources authorization')] # type: ignore
90+
)
91+
def get(self, request: Request, workspace_id: str, target: str, resource: str):
92+
return result.success(ResourceUserPermissionSerializer(
93+
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource,
94+
}).list(
95+
{'username': request.query_params.get("username"), 'nick_name': request.query_params.get("nick_name")}))
96+
97+
class Page(APIView):
98+
authentication_classes = [TokenAuth]
99+
100+
@extend_schema(
101+
methods=['GET'],
102+
description=_('Get user authorization status of resource by page'),
103+
summary=_('Get user authorization status of resource by page'),
104+
operation_id=_('Get user authorization status of resource by page'), # type: ignore
105+
parameters=ResourceUserPermissionPageAPI.get_parameters(),
106+
responses=ResourceUserPermissionPageAPI.get_response(),
107+
tags=[_('Resources authorization')] # type: ignore
108+
)
109+
def get(self, request: Request, workspace_id: str, target: str, resource: str, current_page: int,
110+
page_size: int):
111+
return result.success(ResourceUserPermissionSerializer(
112+
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource, }
113+
).page({'username': request.query_params.get("username"),
114+
'nick_name': request.query_params.get("nick_name")}, current_page, page_size,
115+
))

0 commit comments

Comments
 (0)