Skip to content

Commit 919c4e3

Browse files
committed
feat: Modify the authorization information of resources for users
1 parent 154fd5e commit 919c4e3

File tree

5 files changed

+393
-5
lines changed

5 files changed

+393
-5
lines changed

apps/system_manage/api/user_resource_permission.py

Lines changed: 177 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
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, \
15-
UpdateUserResourcePermissionRequest
17+
UpdateUserResourcePermissionRequest, ResourceUserPermissionEditRequest
1618

1719

1820
class APIUserResourcePermissionResponse(ResultSerializer):
@@ -49,3 +51,176 @@ 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+
OpenApiParameter(
108+
name="permission",
109+
description="权限",
110+
type=OpenApiTypes.STR,
111+
location='query',
112+
required=False
113+
),
114+
]
115+
116+
@staticmethod
117+
def get_response():
118+
return APIResourceUserPermissionResponse
119+
120+
121+
class APIResourceUserPermissionPageResponse(ResultPageSerializer):
122+
def get_data(self):
123+
return ResourceUserPermissionResponse(many=True)
124+
125+
126+
class ResourceUserPermissionPageAPI(APIMixin):
127+
@staticmethod
128+
def get_parameters():
129+
return [
130+
OpenApiParameter(
131+
name="workspace_id",
132+
description="工作空间id",
133+
type=OpenApiTypes.STR,
134+
location='path',
135+
required=True
136+
),
137+
OpenApiParameter(
138+
name="target",
139+
description="资源id",
140+
type=OpenApiTypes.STR,
141+
location='path',
142+
required=True
143+
),
144+
OpenApiParameter(
145+
name="resource",
146+
description="资源类型",
147+
type=OpenApiTypes.STR,
148+
location='path',
149+
required=True
150+
),
151+
OpenApiParameter(
152+
name="current_page",
153+
description=_("Current page"),
154+
type=OpenApiTypes.INT,
155+
location='path',
156+
required=True,
157+
),
158+
OpenApiParameter(
159+
name="page_size",
160+
description=_("Page size"),
161+
type=OpenApiTypes.INT,
162+
location='path',
163+
required=True,
164+
),
165+
OpenApiParameter(
166+
name="username",
167+
description="用户名",
168+
type=OpenApiTypes.STR,
169+
location='query',
170+
required=False
171+
),
172+
OpenApiParameter(
173+
name="nick_name",
174+
description="姓名",
175+
type=OpenApiTypes.STR,
176+
location='query',
177+
required=False
178+
),
179+
OpenApiParameter(
180+
name="permission",
181+
description="权限",
182+
type=OpenApiTypes.STR,
183+
location='query',
184+
required=False
185+
),
186+
]
187+
188+
@staticmethod
189+
def get_response():
190+
return APIResourceUserPermissionPageResponse
191+
192+
193+
194+
class ResourceUserPermissionEditAPI(APIMixin):
195+
@staticmethod
196+
def get_parameters():
197+
return [
198+
OpenApiParameter(
199+
name="workspace_id",
200+
description="工作空间id",
201+
type=OpenApiTypes.STR,
202+
location='path',
203+
required=True
204+
),
205+
OpenApiParameter(
206+
name="target",
207+
description="资源id",
208+
type=OpenApiTypes.STR,
209+
location='path',
210+
required=True
211+
),
212+
OpenApiParameter(
213+
name="resource",
214+
description="资源类型",
215+
type=OpenApiTypes.STR,
216+
location='path',
217+
required=True
218+
),
219+
]
220+
@staticmethod
221+
def get_request():
222+
return ResourceUserPermissionEditRequest(required=True, many=True, label=_('users_permission'))
223+
224+
@staticmethod
225+
def get_response():
226+
return APIResourceUserPermissionResponse()

apps/system_manage/serializers/user_resource_permission.py

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import os
1111

1212
from django.core.cache import cache
13+
from django.db import models
1314
from django.db.models import QuerySet
1415
from django.utils.translation import gettext_lazy as _
1516
from rest_framework import serializers
@@ -19,7 +20,7 @@
1920
from common.constants.permission_constants import get_default_workspace_user_role_mapping_list, RoleConstants, \
2021
ResourcePermission, ResourcePermissionRole, ResourceAuthType
2122
from common.database_model_manage.database_model_manage import DatabaseModelManage
22-
from common.db.search import native_search
23+
from common.db.search import native_search, native_page_search, get_dynamics_model
2324
from common.db.sql_execute import select_list
2425
from common.exception.app_exception import AppApiException
2526
from common.utils.common import get_file_content
@@ -30,6 +31,7 @@
3031
from models_provider.models import Model
3132
from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType
3233
from tools.models import Tool
34+
from users.models import User
3335
from users.serializers.user import is_workspace_manage
3436

3537

@@ -260,3 +262,123 @@ def edit(self, instance, user, with_valid=True):
260262
key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
261263
cache.delete(key, version=version)
262264
return True
265+
266+
267+
class ResourceUserPermissionUserListRequest(serializers.Serializer):
268+
nick_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('workspace id'))
269+
username = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('workspace id'))
270+
permission = serializers.ChoiceField(required=True, choices=['NOT_AUTH', 'MANAGE', 'VIEW', 'ROLE'],
271+
label=_('permission'))
272+
273+
274+
class ResourceUserPermissionEditRequest(serializers.Serializer):
275+
user_id = serializers.CharField(required=True, label=_('workspace id'))
276+
permission = serializers.ChoiceField(required=True, choices=['NOT_AUTH', 'MANAGE', 'VIEW', 'ROLE'],
277+
label=_('permission'))
278+
279+
280+
permission_map = {
281+
"ROLE": ("ROLE", ["ROLE"]),
282+
"MANAGE": ("RESOURCE_PERMISSION_GROUP", ["MANAGE", "VIEW"]),
283+
"VIEW": ("RESOURCE_PERMISSION_GROUP", ["VIEW"]),
284+
"NOT_AUTH": ("RESOURCE_PERMISSION_GROUP", []),
285+
}
286+
287+
288+
class ResourceUserPermissionSerializer(serializers.Serializer):
289+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
290+
target = serializers.CharField(required=True, label=_('resource id'))
291+
auth_target_type = serializers.CharField(required=True, label=_('resource'))
292+
users_permission = ResourceUserPermissionEditRequest(required=False, many=True, label=_('users_permission'))
293+
294+
def get_queryset(self, instance):
295+
296+
user_query_set = QuerySet(model=get_dynamics_model({
297+
'nick_name': models.CharField(),
298+
'username': models.CharField(),
299+
"permission": models.CharField(),
300+
}))
301+
nick_name = instance.get('nick_name')
302+
username = instance.get('username')
303+
permission = instance.get('permission')
304+
workspace_user_resource_permission_query_set = QuerySet(WorkspaceUserResourcePermission).filter(
305+
workspace_id=self.data.get('workspace_id'),
306+
auth_target_type=self.data.get('auth_target_type'),
307+
target=self.data.get('target'))
308+
if nick_name:
309+
user_query_set = user_query_set.filter(nick_name__contains=nick_name)
310+
if username:
311+
user_query_set = user_query_set.filter(username__contains=username)
312+
if permission:
313+
user_query_set = user_query_set.filter(
314+
permission=None if instance.get('permission') == 'NOT_AUTH' else instance.get('permission'))
315+
316+
return {
317+
'workspace_user_resource_permission_query_set': workspace_user_resource_permission_query_set,
318+
'user_query_set': user_query_set
319+
}
320+
321+
def list(self, instance, with_valid=True):
322+
if with_valid:
323+
self.is_valid(raise_exception=True)
324+
ResourceUserPermissionUserListRequest(data=instance).is_valid(raise_exception=True)
325+
# 资源的用户授权列表
326+
resource_user_permission_list = native_search(self.get_queryset(instance), get_file_content(
327+
os.path.join(PROJECT_DIR, "apps", "system_manage", 'sql', 'get_resource_user_permission_detail.sql')
328+
))
329+
return resource_user_permission_list
330+
331+
def page(self, instance, current_page: int, page_size: int, with_valid=True):
332+
if with_valid:
333+
self.is_valid(raise_exception=True)
334+
ResourceUserPermissionUserListRequest(data=instance).is_valid(raise_exception=True)
335+
# 分页列表
336+
resource_user_permission_page_list = native_page_search(current_page, page_size, self.get_queryset(instance),
337+
get_file_content(
338+
os.path.join(PROJECT_DIR, "apps", "system_manage",
339+
'sql',
340+
'get_resource_user_permission_detail.sql')
341+
))
342+
return resource_user_permission_page_list
343+
344+
def edit(self, instance, with_valid=True):
345+
if with_valid:
346+
self.is_valid(raise_exception=True)
347+
ResourceUserPermissionEditRequest(data=instance, many=True).is_valid(
348+
raise_exception=True)
349+
350+
workspace_id = self.data.get("workspace_id")
351+
target = self.data.get("target")
352+
auth_target_type = self.data.get("auth_target_type")
353+
users_permission = instance
354+
355+
users_id = [item["user_id"] for item in users_permission]
356+
# 删除已存在的对应的用户在该资源下的权限
357+
QuerySet(WorkspaceUserResourcePermission).filter(
358+
workspace_id=workspace_id,
359+
target=target,
360+
auth_target_type=auth_target_type,
361+
user_id__in=users_id
362+
).delete()
363+
364+
save_list = []
365+
for item in users_permission:
366+
permission = item['permission']
367+
auth_type, permission_list = permission_map[permission]
368+
369+
save_list.append(WorkspaceUserResourcePermission(
370+
target=target,
371+
auth_target_type=auth_target_type,
372+
workspace_id=workspace_id,
373+
auth_type=auth_type,
374+
user_id=item["user_id"],
375+
permission_list=permission_list
376+
))
377+
if save_list:
378+
QuerySet(WorkspaceUserResourcePermission).bulk_create(save_list)
379+
380+
version = Cache_Version.PERMISSION_LIST.get_version()
381+
for user_id in users_id:
382+
key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
383+
cache.delete(key, version=version)
384+
return True
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
SELECT
2+
u.id,
3+
u.nick_name,
4+
u.username,
5+
case
6+
when
7+
wurp."permission" is null then 'NOT_AUTH'
8+
else wurp."permission"
9+
end
10+
FROM
11+
public."user" u
12+
LEFT JOIN (
13+
SELECT
14+
user_id ,
15+
(case
16+
when auth_type = 'ROLE'
17+
and 'ROLE' = any( permission_list) then 'ROLE'
18+
when auth_type = 'RESOURCE_PERMISSION_GROUP'
19+
and 'MANAGE'= any(permission_list) then 'MANAGE'
20+
when auth_type = 'RESOURCE_PERMISSION_GROUP'
21+
and 'VIEW' = any( permission_list) then 'VIEW'
22+
else 'NO_AUTH'
23+
end) as "permission"
24+
FROM
25+
workspace_user_resource_permission
26+
${workspace_user_resource_permission_query_set}
27+
) wurp
28+
ON
29+
u.id = wurp.user_id
30+
${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())

0 commit comments

Comments
 (0)