|
10 | 10 | import os |
11 | 11 |
|
12 | 12 | from django.core.cache import cache |
| 13 | +from django.db import models |
13 | 14 | from django.db.models import QuerySet |
14 | 15 | from django.utils.translation import gettext_lazy as _ |
15 | 16 | from rest_framework import serializers |
|
19 | 20 | from common.constants.permission_constants import get_default_workspace_user_role_mapping_list, RoleConstants, \ |
20 | 21 | ResourcePermission, ResourcePermissionRole, ResourceAuthType |
21 | 22 | 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 |
23 | 24 | from common.db.sql_execute import select_list |
24 | 25 | from common.exception.app_exception import AppApiException |
25 | 26 | from common.utils.common import get_file_content |
|
30 | 31 | from models_provider.models import Model |
31 | 32 | from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType |
32 | 33 | from tools.models import Tool |
| 34 | +from users.models import User |
33 | 35 | from users.serializers.user import is_workspace_manage |
34 | 36 |
|
35 | 37 |
|
@@ -260,3 +262,123 @@ def edit(self, instance, user, with_valid=True): |
260 | 262 | key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id) |
261 | 263 | cache.delete(key, version=version) |
262 | 264 | 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 |
0 commit comments