1111
1212from django .core .cache import cache
1313from django .db import models
14- from django .db .models import QuerySet
14+ from django .db .models import QuerySet , Q
1515from django .utils .translation import gettext_lazy as _
1616from rest_framework import serializers
1717
2424from common .db .sql_execute import select_list
2525from common .exception .app_exception import AppApiException
2626from common .utils .common import get_file_content
27- from common .utils .split_model import group_by
2827from knowledge .models import Knowledge
2928from maxkb .conf import PROJECT_DIR
3029from maxkb .settings import edition
3130from models_provider .models import Model
32- from system_manage .models import WorkspaceUserResourcePermission , AuthTargetType
31+ from system_manage .models import WorkspaceUserResourcePermission
3332from tools .models import Tool
34- from users .models import User
3533from users .serializers .user import is_workspace_manage
3634
3735
@@ -94,11 +92,14 @@ def is_valid(self, *, auth_target_type=None, workspace_id=None, raise_exception=
9492 'APPLICATION' : 'get_application_user_resource_permission.sql'
9593}
9694
95+
9796class UserResourcePermissionUserListRequest (serializers .Serializer ):
9897 name = serializers .CharField (required = False , allow_null = True , allow_blank = True , label = _ ('resource name' ))
99- permission = serializers .ChoiceField (required = False , allow_null = True , allow_blank = True ,choices = ['NOT_AUTH' , 'MANAGE' , 'VIEW' , 'ROLE' ],
98+ permission = serializers .MultipleChoiceField (required = False , allow_null = True , allow_blank = True ,
99+ choices = ['NOT_AUTH' , 'MANAGE' , 'VIEW' , 'ROLE' ],
100100 label = _ ('permission' ))
101101
102+
102103class UserResourcePermissionSerializer (serializers .Serializer ):
103104 workspace_id = serializers .CharField (required = True , label = _ ('workspace id' ))
104105 user_id = serializers .CharField (required = True , label = _ ('user id' ))
@@ -112,13 +113,20 @@ def get_queryset(self, instance):
112113 }))
113114 name = instance .get ('name' )
114115 permission = instance .get ('permission' )
116+ query_p_list = [None if p == "NOT_AUTH" else p for p in permission ]
115117
116118 if name :
117119 resource_query_set = resource_query_set .filter (name__contains = name )
118120 if permission :
119- resource_query_set = resource_query_set .filter (
120- permission = None if instance .get ('permission' ) == 'NOT_AUTH' else instance .get ('permission' ))
121-
121+ if all ([p is None for p in query_p_list ]):
122+ resource_query_set = resource_query_set .filter (permission = None )
123+ else :
124+ if any ([p is None for p in query_p_list ]):
125+ resource_query_set = resource_query_set .filter (
126+ Q (permission__in = query_p_list ) | Q (permission = None ))
127+ else :
128+ resource_query_set = resource_query_set .filter (
129+ permission__in = query_p_list )
122130 return {
123131 'query_set' : QuerySet (m_map .get (self .data .get ('auth_target_type' ))).filter (
124132 workspace_id = self .data .get ('workspace_id' )),
@@ -218,35 +226,37 @@ def list(self, instance, user, with_valid=True):
218226 os .path .join (PROJECT_DIR , "apps" , "system_manage" , 'sql' , sql_map .get (self .data .get ('auth_target_type' )))))
219227
220228 return [{** user_resource_permission }
221- for user_resource_permission in user_resource_permission_list ]
222-
229+ for user_resource_permission in user_resource_permission_list ]
223230
224- def page (self , instance , current_page : int , page_size : int ,user , with_valid = True ):
231+ def page (self , instance , current_page : int , page_size : int , user , with_valid = True ):
225232 if with_valid :
226233 self .is_valid (raise_exception = True )
227234 UserResourcePermissionUserListRequest (data = instance ).is_valid (raise_exception = True )
228235 workspace_id = self .data .get ("workspace_id" )
229236 user_id = self .data .get ("user_id" )
230237 # 用户对应的资源权限分页列表
231- user_resource_permission_page_list = native_page_search (current_page ,page_size ,self .get_queryset (instance ),get_file_content (
232- os .path .join (PROJECT_DIR , "apps" , "system_manage" , 'sql' , sql_map .get (self .data .get ('auth_target_type' )))
233- ))
238+ user_resource_permission_page_list = native_page_search (current_page , page_size , self .get_queryset (instance ),
239+ get_file_content (
240+ os .path .join (PROJECT_DIR , "apps" , "system_manage" ,
241+ 'sql' , sql_map .get (
242+ self .data .get ('auth_target_type' )))
243+ ))
234244
235245 return user_resource_permission_page_list
236246
237-
238247 def edit (self , instance , user , with_valid = True ):
239248 if with_valid :
240249 self .is_valid (raise_exception = True )
241- UpdateUserResourcePermissionRequest (data = {'user_resource_permission_list' :instance }).is_valid (raise_exception = True ,
242- auth_target_type = self .data .get (
243- 'auth_target_type' ),
244- workspace_id = self .data .get ('workspace_id' ))
250+ UpdateUserResourcePermissionRequest (data = {'user_resource_permission_list' : instance }).is_valid (
251+ raise_exception = True ,
252+ auth_target_type = self .data .get (
253+ 'auth_target_type' ),
254+ workspace_id = self .data .get ('workspace_id' ))
245255 workspace_id = self .data .get ("workspace_id" )
246256 user_id = self .data .get ("user_id" )
247257 update_list = []
248258 save_list = []
249- targets = [ item ['target_id' ] for item in instance ]
259+ targets = [item ['target_id' ] for item in instance ]
250260 QuerySet (WorkspaceUserResourcePermission ).filter (
251261 workspace_id = workspace_id ,
252262 user_id = user_id ,
@@ -286,14 +296,15 @@ def edit(self, instance, user, with_valid=True):
286296class ResourceUserPermissionUserListRequest (serializers .Serializer ):
287297 nick_name = serializers .CharField (required = False , allow_null = True , allow_blank = True , label = _ ('workspace id' ))
288298 username = serializers .CharField (required = False , allow_null = True , allow_blank = True , label = _ ('workspace id' ))
289- permission = serializers .ChoiceField (required = False , allow_null = True , allow_blank = True , choices = ['NOT_AUTH' , 'MANAGE' , 'VIEW' , 'ROLE' ],
290- label = _ ('permission' ))
299+ permission = serializers .MultipleChoiceField (required = False , allow_null = True , allow_blank = True ,
300+ choices = ['NOT_AUTH' , 'MANAGE' , 'VIEW' , 'ROLE' ],
301+ label = _ ('permission' ))
291302
292303
293304class ResourceUserPermissionEditRequest (serializers .Serializer ):
294305 user_id = serializers .CharField (required = True , label = _ ('workspace id' ))
295306 permission = serializers .ChoiceField (required = True , choices = ['NOT_AUTH' , 'MANAGE' , 'VIEW' , 'ROLE' ],
296- label = _ ('permission' ))
307+ label = _ ('permission' ))
297308
298309
299310permission_map = {
@@ -315,11 +326,13 @@ def get_queryset(self, instance):
315326 user_query_set = QuerySet (model = get_dynamics_model ({
316327 'nick_name' : models .CharField (),
317328 'username' : models .CharField (),
318- "permission" : models .CharField (),
329+ "permission" : models .CharField ()
319330 }))
320331 nick_name = instance .get ('nick_name' )
321332 username = instance .get ('username' )
322333 permission = instance .get ('permission' )
334+ query_p_list = [None if p == "NOT_AUTH" else p for p in permission ]
335+
323336 workspace_user_resource_permission_query_set = QuerySet (WorkspaceUserResourcePermission ).filter (
324337 workspace_id = self .data .get ('workspace_id' ),
325338 auth_target_type = self .data .get ('auth_target_type' ),
@@ -329,8 +342,16 @@ def get_queryset(self, instance):
329342 if username :
330343 user_query_set = user_query_set .filter (username__contains = username )
331344 if permission :
332- user_query_set = user_query_set .filter (
333- permission = None if instance .get ('permission' ) == 'NOT_AUTH' else instance .get ('permission' ))
345+ if all ([p is None for p in query_p_list ]):
346+ user_query_set = user_query_set .filter (
347+ permission = None )
348+ else :
349+ if any ([p is None for p in query_p_list ]):
350+ user_query_set = user_query_set .filter (
351+ Q (permission__in = query_p_list ) | Q (permission = None ))
352+ else :
353+ user_query_set = user_query_set .filter (
354+ permission__in = query_p_list )
334355
335356 return {
336357 'workspace_user_resource_permission_query_set' : workspace_user_resource_permission_query_set ,
0 commit comments