feat: 作业中心根据当前选择的资产提示用户名

pull/10425/head
Aaron3S 2023-05-10 15:31:43 +08:00 committed by Jiangjie.Bai
parent 24fd87f7bc
commit ebb0e796ce
3 changed files with 34 additions and 22 deletions

View File

@ -5,6 +5,7 @@ from django.shortcuts import get_object_or_404
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from assets.models import Asset
from common.permissions import IsValidUser from common.permissions import IsValidUser
from ops.const import Types from ops.const import Types
from ops.models import Job, JobExecution from ops.models import Job, JobExecution
@ -12,7 +13,7 @@ from ops.serializers.job import JobSerializer, JobExecutionSerializer
__all__ = [ __all__ = [
'JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView',
'JobAssetDetail', 'JobExecutionTaskDetail', 'FrequentUsernames' 'JobAssetDetail', 'JobExecutionTaskDetail', 'UsernameHintsAPI'
] ]
from ops.tasks import run_ops_job_execution 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.mixins.api import OrgBulkModelViewSet
from orgs.utils import tmp_to_org, get_current_org from orgs.utils import tmp_to_org, get_current_org
from accounts.models import Account from accounts.models import Account
from perms.models import PermNode
from perms.utils import UserPermAssetUtil
def set_task_to_serializer_data(serializer, task): def set_task_to_serializer_data(serializer, task):
@ -28,6 +31,20 @@ def set_task_to_serializer_data(serializer, task):
setattr(serializer, "_data", data) 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): class JobViewSet(OrgBulkModelViewSet):
serializer_class = JobSerializer serializer_class = JobSerializer
search_fields = ('name', 'comment') search_fields = ('name', 'comment')
@ -50,6 +67,10 @@ class JobViewSet(OrgBulkModelViewSet):
def perform_create(self, serializer): def perform_create(self, serializer):
run_after_save = serializer.validated_data.pop('run_after_save', False) 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() instance = serializer.save()
if instance.instant or run_after_save: if instance.instant or run_after_save:
self.run_job(instance, serializer) self.run_job(instance, serializer)
@ -105,7 +126,7 @@ class JobAssetDetail(APIView):
class JobExecutionTaskDetail(APIView): class JobExecutionTaskDetail(APIView):
rbac_perms = { rbac_perms = {
'get': ['ops.view_jobexecution'], 'GET': ['ops.view_jobexecution'],
} }
def get(self, request, **kwargs): def get(self, request, **kwargs):
@ -131,13 +152,20 @@ class JobRunVariableHelpAPIView(APIView):
return Response(data=JMS_JOB_VARIABLE_HELP) return Response(data=JMS_JOB_VARIABLE_HELP)
class FrequentUsernames(APIView): class UsernameHintsAPI(APIView):
permission_classes = [IsValidUser] 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') \ top_accounts = Account.objects.exclude(username='root') \
.exclude(username__startswith='jms_') \ .exclude(username__startswith='jms_') \
.filter(asset__in=assets) \
.values('username') \ .values('username') \
.annotate(total=Count('username')) \ .annotate(total=Count('username')) \
.order_by('total')[:5] .order_by('total')[:10]
return Response(data=top_accounts) return Response(data=top_accounts)

View File

@ -33,22 +33,6 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin):
user = request.user if request else None user = request.user if request else None
return user 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: class Meta:
model = Job model = Job
read_only_fields = [ read_only_fields = [

View File

@ -27,7 +27,7 @@ urlpatterns = [
path('variables/help/', api.JobRunVariableHelpAPIView.as_view(), name='variable-help'), 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/asset-detail/', api.JobAssetDetail.as_view(), name='asset-detail'),
path('job-execution/task-detail/<uuid:task_id>/', api.JobExecutionTaskDetail.as_view(), name='task-detail'), path('job-execution/task-detail/<uuid:task_id>/', 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/<uuid:pk>/log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'), path('ansible/job-execution/<uuid:pk>/log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'),
path('celery/task/<uuid:name>/task-execution/<uuid:pk>/log/', api.CeleryTaskExecutionLogApi.as_view(), path('celery/task/<uuid:name>/task-execution/<uuid:pk>/log/', api.CeleryTaskExecutionLogApi.as_view(),