| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # coding=utf-8
- """
- @project: MaxKB
- @Author:虎虎
- @file: workspace_user_resource_permission.py
- @date:2025/4/28 17:17
- @desc:
- """
- import json
- import os
- from django.db import models
- from django.db.models import QuerySet
- from django.utils.translation import gettext_lazy as _
- from rest_framework import serializers
- from common.database_model_manage.database_model_manage import DatabaseModelManage
- from common.db.search import native_page_search, get_dynamics_model
- from common.result import Page
- from common.utils.common import get_file_content
- from maxkb.conf import PROJECT_DIR
- from system_manage.models.resource_mapping import ResourceMapping
- class ResourceMappingSerializer(serializers.Serializer):
- resource = serializers.CharField(required=True, label=_('resource'))
- resource_id = serializers.UUIDField(required=True, label=_('resource Id'))
- resource_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('resource Name'))
- source_type = serializers.ListField(
- label=_('source Type'),
- child=serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('source Type')))
- user_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('creator'))
- workspace_ids = serializers.CharField(required=False, label=_('workspace_ids'))
- def get_query_set(self):
- queryset = QuerySet(model=get_dynamics_model({
- 'sdc.name': models.CharField(),
- 'target_id': models.CharField(),
- "target_type": models.CharField(),
- "u.username": models.CharField(),
- 'rm.source_type': models.CharField(),
- 'workspace_id': models.CharField(),
- }))
- queryset = queryset.filter(target_id=self.data.get('resource_id'),
- target_type=self.data.get('resource'))
- if self.data.get('resource_name'):
- queryset = queryset.filter(**{'sdc.name__icontains': self.data.get('resource_name')})
- if self.data.get('user_name'):
- queryset = queryset.filter(**{'u.username__icontains': self.data.get('user_name')})
- if self.data.get("source_type"):
- queryset = queryset.filter(**{'rm.source_type__in': self.data.get('source_type')})
- if self.data.get('workspace_ids') is not None and len(self.data.get('workspace_ids')) > 0:
- workspace_ids = json.loads(self.data.get('workspace_ids'))
- queryset = queryset.filter(**{'workspace_id__in': workspace_ids})
- return queryset
- @staticmethod
- def is_x_pack_ee():
- workspace_model = DatabaseModelManage.get_model("workspace_model")
- return workspace_model is not None
- def page(self, current_page, page_size):
- is_x_pack_ee = self.is_x_pack_ee()
- return native_page_search(current_page, page_size, self.get_query_set(), get_file_content(
- os.path.join(PROJECT_DIR, "apps", "system_manage",
- 'sql', 'list_resource_mapping_ee.sql' if is_x_pack_ee else 'list_resource_mapping.sql')),
- with_table_name=False)
- def get_resource_count(self, result_list):
- """
- 获取资源映射计数
- """
- if not result_list:
- return result_list
- is_paginated = isinstance(result_list, Page)
- data_to_process = result_list.get('records') if is_paginated else result_list
- if isinstance(data_to_process, list) and data_to_process:
- # 提取ID列表,确保每个项目都是字典且包含'id'键
- ids = [item['id'] for item in data_to_process
- if isinstance(item, dict) and 'id' in item and item['id']]
- if ids: # 只有在ids非空时才执行查询
- mapping_counts = ResourceMapping.objects.filter(
- target_id__in=ids
- ).values('target_id').annotate(
- count=models.Count('id')
- )
- # 构建目标ID到计数的映射
- count_dict = {str(item['target_id']): item['count'] for item in mapping_counts}
- # 为每个结果项添加资源计数
- for model in data_to_process:
- if isinstance(model, dict) and 'id' in model:
- model_id = str(model['id'])
- model['resource_count'] = count_dict.get(model_id, 0)
- return result_list
|