From 865522953a4b26978b924b637f107afe51a9a27e Mon Sep 17 00:00:00 2001 From: xinwen Date: Tue, 9 Jun 2020 20:26:23 +0800 Subject: [PATCH] =?UTF-8?q?[Feature]=20=20=E4=BD=9C=E4=B8=9A=E4=B8=AD?= =?UTF-8?q?=E5=BF=83/=E4=BB=BB=E5=8A=A1=E5=88=97=E8=A1=A8/=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E8=AF=A6=E6=83=85=20=E6=9C=80=E5=90=8E=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=88=90=E5=8A=9F=E6=88=96=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E4=B8=BB=E6=9C=BA=20(#4090)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/api/adhoc.py | 7 ++++++- apps/ops/models/adhoc.py | 18 ++++++++++++++++++ apps/ops/serializers/adhoc.py | 14 ++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py index 5f7c8318e..ee81f869f 100644 --- a/apps/ops/api/adhoc.py +++ b/apps/ops/api/adhoc.py @@ -11,7 +11,7 @@ from common.serializers import CeleryTaskSerializer from orgs.utils import current_org from ..models import Task, AdHoc, AdHocExecution from ..serializers import TaskSerializer, AdHocSerializer, \ - AdHocExecutionSerializer + AdHocExecutionSerializer, TaskDetailSerializer from ..tasks import run_ansible_task __all__ = [ @@ -26,6 +26,11 @@ class TaskViewSet(viewsets.ModelViewSet): serializer_class = TaskSerializer permission_classes = (IsOrgAdmin,) + def get_serializer_class(self): + if self.action == 'retrieve': + return TaskDetailSerializer + return super().get_serializer_class() + def get_queryset(self): queryset = super().get_queryset() queryset = queryset.select_related('latest_execution') diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index 013fdc628..433d1c498 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -118,6 +118,24 @@ class Task(PeriodTaskModelMixin, OrgModelMixin): kwargs = {"callback": self.callback} return name, task, args, kwargs + @lazyproperty + def last_success(self): + return self._last_adhocexecution(True, 'contacted') + + @lazyproperty + def last_failure(self): + return self._last_adhocexecution(False, 'dark') + + def _last_adhocexecution(self, is_success, key): + obj = AdHocExecution.objects.filter(task_id=self.id, is_success=is_success).order_by('-date_finished').first() + body = obj.summary.get(key) + if body: + asset, body = body.popitem() + action, body = body.popitem() + return asset, action, body.get('msg', '') + else: + return '', '', '' + def __str__(self): return self.name + '@' + str(self.org_id) diff --git a/apps/ops/serializers/adhoc.py b/apps/ops/serializers/adhoc.py index 8d9e18e24..0d284cb48 100644 --- a/apps/ops/serializers/adhoc.py +++ b/apps/ops/serializers/adhoc.py @@ -59,6 +59,20 @@ class TaskSerializer(serializers.ModelSerializer): ] +class TaskDetailSerializer(TaskSerializer): + last_success = serializers.SerializerMethodField() + last_failure = serializers.SerializerMethodField() + + def get_last_success(self, obj): + return obj.last_success[0], '' + + def get_last_failure(self, obj): + return obj.last_failure[0], ' => '.join(obj.last_failure[1:]) + + class Meta(TaskSerializer.Meta): + fields = TaskSerializer.Meta.fields + ['last_success', 'last_failure'] + + class AdHocSerializer(serializers.ModelSerializer): become_display = serializers.ReadOnlyField() -- GitLab