resource_mapping_serializers.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: workspace_user_resource_permission.py
  6. @date:2025/4/28 17:17
  7. @desc:
  8. """
  9. import json
  10. import os
  11. from django.db import models
  12. from django.db.models import QuerySet
  13. from django.utils.translation import gettext_lazy as _
  14. from rest_framework import serializers
  15. from common.database_model_manage.database_model_manage import DatabaseModelManage
  16. from common.db.search import native_page_search, get_dynamics_model
  17. from common.result import Page
  18. from common.utils.common import get_file_content
  19. from maxkb.conf import PROJECT_DIR
  20. from system_manage.models.resource_mapping import ResourceMapping
  21. class ResourceMappingSerializer(serializers.Serializer):
  22. resource = serializers.CharField(required=True, label=_('resource'))
  23. resource_id = serializers.UUIDField(required=True, label=_('resource Id'))
  24. resource_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('resource Name'))
  25. source_type = serializers.ListField(
  26. label=_('source Type'),
  27. child=serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('source Type')))
  28. user_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('creator'))
  29. workspace_ids = serializers.CharField(required=False, label=_('workspace_ids'))
  30. def get_query_set(self):
  31. queryset = QuerySet(model=get_dynamics_model({
  32. 'sdc.name': models.CharField(),
  33. 'target_id': models.CharField(),
  34. "target_type": models.CharField(),
  35. "u.username": models.CharField(),
  36. 'rm.source_type': models.CharField(),
  37. 'workspace_id': models.CharField(),
  38. }))
  39. queryset = queryset.filter(target_id=self.data.get('resource_id'),
  40. target_type=self.data.get('resource'))
  41. if self.data.get('resource_name'):
  42. queryset = queryset.filter(**{'sdc.name__icontains': self.data.get('resource_name')})
  43. if self.data.get('user_name'):
  44. queryset = queryset.filter(**{'u.username__icontains': self.data.get('user_name')})
  45. if self.data.get("source_type"):
  46. queryset = queryset.filter(**{'rm.source_type__in': self.data.get('source_type')})
  47. if self.data.get('workspace_ids') is not None and len(self.data.get('workspace_ids')) > 0:
  48. workspace_ids = json.loads(self.data.get('workspace_ids'))
  49. queryset = queryset.filter(**{'workspace_id__in': workspace_ids})
  50. return queryset
  51. @staticmethod
  52. def is_x_pack_ee():
  53. workspace_model = DatabaseModelManage.get_model("workspace_model")
  54. return workspace_model is not None
  55. def page(self, current_page, page_size):
  56. is_x_pack_ee = self.is_x_pack_ee()
  57. return native_page_search(current_page, page_size, self.get_query_set(), get_file_content(
  58. os.path.join(PROJECT_DIR, "apps", "system_manage",
  59. 'sql', 'list_resource_mapping_ee.sql' if is_x_pack_ee else 'list_resource_mapping.sql')),
  60. with_table_name=False)
  61. def get_resource_count(self, result_list):
  62. """
  63. 获取资源映射计数
  64. """
  65. if not result_list:
  66. return result_list
  67. is_paginated = isinstance(result_list, Page)
  68. data_to_process = result_list.get('records') if is_paginated else result_list
  69. if isinstance(data_to_process, list) and data_to_process:
  70. # 提取ID列表,确保每个项目都是字典且包含'id'键
  71. ids = [item['id'] for item in data_to_process
  72. if isinstance(item, dict) and 'id' in item and item['id']]
  73. if ids: # 只有在ids非空时才执行查询
  74. mapping_counts = ResourceMapping.objects.filter(
  75. target_id__in=ids
  76. ).values('target_id').annotate(
  77. count=models.Count('id')
  78. )
  79. # 构建目标ID到计数的映射
  80. count_dict = {str(item['target_id']): item['count'] for item in mapping_counts}
  81. # 为每个结果项添加资源计数
  82. for model in data_to_process:
  83. if isinstance(model, dict) and 'id' in model:
  84. model_id = str(model['id'])
  85. model['resource_count'] = count_dict.get(model_id, 0)
  86. return result_list