From ebb0e796cecc2cb977fe19ad37a89b42c7484d6a Mon Sep 17 00:00:00 2001 From: Aaron3S Date: Wed, 10 May 2023 15:31:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=9C=E4=B8=9A=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=BD=93=E5=89=8D=E9=80=89=E6=8B=A9=E7=9A=84?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E6=8F=90=E7=A4=BA=E7=94=A8=E6=88=B7=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/api/job.py | 38 ++++++++++++++++++++++++++++++++----- apps/ops/serializers/job.py | 16 ---------------- apps/ops/urls/api_urls.py | 2 +- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/apps/ops/api/job.py b/apps/ops/api/job.py index 308998f09..bb427999b 100644 --- a/apps/ops/api/job.py +++ b/apps/ops/api/job.py @@ -5,6 +5,7 @@ from django.shortcuts import get_object_or_404 from rest_framework.response import Response from rest_framework.views import APIView +from assets.models import Asset from common.permissions import IsValidUser from ops.const import Types from ops.models import Job, JobExecution @@ -12,7 +13,7 @@ from ops.serializers.job import JobSerializer, JobExecutionSerializer __all__ = [ 'JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', - 'JobAssetDetail', 'JobExecutionTaskDetail', 'FrequentUsernames' + 'JobAssetDetail', 'JobExecutionTaskDetail', 'UsernameHintsAPI' ] from ops.tasks import run_ops_job_execution @@ -20,6 +21,8 @@ from ops.variables import JMS_JOB_VARIABLE_HELP from orgs.mixins.api import OrgBulkModelViewSet from orgs.utils import tmp_to_org, get_current_org from accounts.models import Account +from perms.models import PermNode +from perms.utils import UserPermAssetUtil def set_task_to_serializer_data(serializer, task): @@ -28,6 +31,20 @@ def set_task_to_serializer_data(serializer, task): setattr(serializer, "_data", data) +def merge_nodes_and_assets(nodes, assets, user): + if nodes: + perm_util = UserPermAssetUtil(user=user) + for node_id in nodes: + if node_id == PermNode.FAVORITE_NODE_KEY: + node_assets = perm_util.get_favorite_assets() + elif node_id == PermNode.UNGROUPED_NODE_KEY: + node_assets = perm_util.get_ungroup_assets() + else: + node, node_assets = perm_util.get_node_all_assets(node_id) + assets.extend(node_assets.exclude(id__in=[asset.id for asset in assets])) + return assets + + class JobViewSet(OrgBulkModelViewSet): serializer_class = JobSerializer search_fields = ('name', 'comment') @@ -50,6 +67,10 @@ class JobViewSet(OrgBulkModelViewSet): def perform_create(self, serializer): run_after_save = serializer.validated_data.pop('run_after_save', False) + node_ids = serializer.validated_data.pop('nodes', []) + assets = serializer.validated_data.__getitem__('assets') + assets = merge_nodes_and_assets(node_ids, assets, self.request.user) + serializer.validated_data.__setitem__('assets', assets) instance = serializer.save() if instance.instant or run_after_save: self.run_job(instance, serializer) @@ -105,7 +126,7 @@ class JobAssetDetail(APIView): class JobExecutionTaskDetail(APIView): rbac_perms = { - 'get': ['ops.view_jobexecution'], + 'GET': ['ops.view_jobexecution'], } def get(self, request, **kwargs): @@ -131,13 +152,20 @@ class JobRunVariableHelpAPIView(APIView): return Response(data=JMS_JOB_VARIABLE_HELP) -class FrequentUsernames(APIView): +class UsernameHintsAPI(APIView): permission_classes = [IsValidUser] - def get(self, request, **kwargs): + def post(self, request, **kwargs): + node_ids = request.data.get('nodes', None) + asset_ids = request.data.get('assets', []) + assets = list(Asset.objects.filter(id__in=asset_ids).all()) + + assets = merge_nodes_and_assets(node_ids, assets, request.user) + top_accounts = Account.objects.exclude(username='root') \ .exclude(username__startswith='jms_') \ + .filter(asset__in=assets) \ .values('username') \ .annotate(total=Count('username')) \ - .order_by('total')[:5] + .order_by('total')[:10] return Response(data=top_accounts) diff --git a/apps/ops/serializers/job.py b/apps/ops/serializers/job.py index 8b157b66f..011bea4e2 100644 --- a/apps/ops/serializers/job.py +++ b/apps/ops/serializers/job.py @@ -33,22 +33,6 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin): user = request.user if request else None return user - def create(self, validated_data): - assets = validated_data.__getitem__('assets') - node_ids = validated_data.pop('nodes', None) - if node_ids: - user = self.get_request_user() - perm_util = UserPermAssetUtil(user=user) - for node_id in node_ids: - if node_id == PermNode.FAVORITE_NODE_KEY: - node_assets = perm_util.get_favorite_assets() - elif node_id == PermNode.UNGROUPED_NODE_KEY: - node_assets = perm_util.get_ungroup_assets() - else: - node, node_assets = perm_util.get_node_all_assets(node_id) - assets.extend(node_assets.exclude(id__in=[asset.id for asset in assets])) - return super().create(validated_data) - class Meta: model = Job read_only_fields = [ diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py index 051ca7894..905f0ed0a 100644 --- a/apps/ops/urls/api_urls.py +++ b/apps/ops/urls/api_urls.py @@ -27,7 +27,7 @@ urlpatterns = [ path('variables/help/', api.JobRunVariableHelpAPIView.as_view(), name='variable-help'), path('job-execution/asset-detail/', api.JobAssetDetail.as_view(), name='asset-detail'), path('job-execution/task-detail//', api.JobExecutionTaskDetail.as_view(), name='task-detail'), - path('frequent-username/', api.FrequentUsernames.as_view(), name='frequent-usernames'), + path('username-hints/', api.UsernameHintsAPI.as_view(), name='username-hints'), path('ansible/job-execution//log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'), path('celery/task//task-execution//log/', api.CeleryTaskExecutionLogApi.as_view(),