From c5a9a85818fe6f24ee29321d5eed99c3d7cbf47a Mon Sep 17 00:00:00 2001 From: xinwen Date: Mon, 15 Jun 2020 19:42:36 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[Update]=20=E5=AE=8C=E5=96=84=20=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B8=AD=E5=BF=83/=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8=20(#4105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/api/adhoc.py | 16 ++++++++--- apps/ops/models/adhoc.py | 4 +++ apps/ops/serializers/adhoc.py | 53 ++++++++++++++++++++++++++--------- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py index ee81f869f..aef4c9b06 100644 --- a/apps/ops/api/adhoc.py +++ b/apps/ops/api/adhoc.py @@ -4,14 +4,17 @@ from django.shortcuts import get_object_or_404 from rest_framework import viewsets, generics from rest_framework.views import Response -from django.db.models import Count, Q from common.permissions import IsOrgAdmin from common.serializers import CeleryTaskSerializer -from orgs.utils import current_org from ..models import Task, AdHoc, AdHocExecution -from ..serializers import TaskSerializer, AdHocSerializer, \ - AdHocExecutionSerializer, TaskDetailSerializer +from ..serializers import ( + TaskSerializer, + AdHocSerializer, + AdHocExecutionSerializer, + TaskDetailSerializer, + AdHocDetailSerializer, +) from ..tasks import run_ansible_task __all__ = [ @@ -53,6 +56,11 @@ class AdHocViewSet(viewsets.ModelViewSet): serializer_class = AdHocSerializer permission_classes = (IsOrgAdmin,) + def get_serializer_class(self): + if self.action == 'retrieve': + return AdHocDetailSerializer + return super().get_serializer_class() + def get_queryset(self): task_id = self.request.query_params.get('task') if task_id: diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index 013fdc628..36ebd77e0 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -150,6 +150,10 @@ class AdHoc(OrgModelMixin): created_by = models.CharField(max_length=64, default='', blank=True, null=True, verbose_name=_('Create by')) date_created = models.DateTimeField(auto_now_add=True, db_index=True) + @lazyproperty + def run_times(self): + return self.execution.count() + @property def inventory(self): if self.become: diff --git a/apps/ops/serializers/adhoc.py b/apps/ops/serializers/adhoc.py index d4e67371a..f07c1ca47 100644 --- a/apps/ops/serializers/adhoc.py +++ b/apps/ops/serializers/adhoc.py @@ -8,10 +8,16 @@ from ..models import Task, AdHoc, AdHocExecution, CommandExecution class AdHocExecutionSerializer(serializers.ModelSerializer): stat = serializers.SerializerMethodField() + last_success = serializers.ListField(source='success_hosts') + last_failure = serializers.DictField(source='failed_hosts') class Meta: model = AdHocExecution - fields = '__all__' + fields = [ + 'id', 'task', 'task_display', 'hosts_amount', 'adhoc', 'date_start', 'stat', + 'date_finished', 'timedelta', 'is_finished', 'is_success', 'result', 'summary', + 'short_id', 'adhoc_short_id', 'last_success', 'last_failure' + ] @staticmethod def get_task(obj): @@ -28,17 +34,15 @@ class AdHocExecutionSerializer(serializers.ModelSerializer): "failed": count_failed_hosts } - def get_field_names(self, declared_fields, info): - fields = super().get_field_names(declared_fields, info) - fields.extend(['short_id', 'adhoc_short_id']) - return fields - class AdHocExecutionExcludeResultSerializer(AdHocExecutionSerializer): - def get_field_names(self, declared_fields, info): - fields = super().get_field_names(declared_fields, info) - fields = [i for i in fields if i not in ['result', 'summary']] - return fields + class Meta: + model = AdHocExecution + fields = [ + 'id', 'task', 'task_display', 'hosts_amount', 'adhoc', 'date_start', 'stat', + 'date_finished', 'timedelta', 'is_finished', 'is_success', + 'short_id', 'adhoc_short_id', 'last_success', 'last_failure' + ] class TaskSerializer(serializers.ModelSerializer): @@ -60,15 +64,15 @@ class TaskSerializer(serializers.ModelSerializer): class TaskDetailSerializer(TaskSerializer): - last_success = serializers.ListField(source='latest_execution.success_hosts') - last_failure = serializers.DictField(source='latest_execution.failed_hosts') + contents = serializers.ListField(source='latest_adhoc.tasks') class Meta(TaskSerializer.Meta): - fields = TaskSerializer.Meta.fields + ['last_success', 'last_failure'] + fields = TaskSerializer.Meta.fields + ['contents'] class AdHocSerializer(serializers.ModelSerializer): become_display = serializers.ReadOnlyField() + tasks = serializers.ListField() class Meta: model = AdHoc @@ -86,6 +90,29 @@ class AdHocSerializer(serializers.ModelSerializer): } +class AdHocExecutionNestSerializer(serializers.ModelSerializer): + last_success = serializers.ListField(source='success_hosts') + last_failure = serializers.DictField(source='failed_hosts') + last_run = serializers.CharField(source='short_id') + + class Meta: + model = AdHocExecution + fields = ( + 'last_success', 'last_failure', 'last_run', 'timedelta', 'is_finished', + 'is_success' + ) + + +class AdHocDetailSerializer(AdHocSerializer): + latest_execution = AdHocExecutionNestSerializer(allow_null=True) + task_name = serializers.CharField(source='task.name') + + class Meta(AdHocSerializer.Meta): + fields = AdHocSerializer.Meta.fields + [ + 'latest_execution', 'created_by', 'run_times', 'task_name' + ] + + class CommandExecutionSerializer(serializers.ModelSerializer): result = serializers.JSONField(read_only=True) log_url = serializers.SerializerMethodField() From f4fa011714221334857932d98fc8756da34aa2a1 Mon Sep 17 00:00:00 2001 From: Bai Date: Mon, 15 Jun 2020 20:31:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9mfa=E6=A0=A1?= =?UTF-8?q?=E9=AA=8Ccode=E6=97=A0=E6=95=88=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/authentication/api/mfa.py | 3 ++- apps/locale/zh/LC_MESSAGES/django.mo | Bin 53698 -> 53741 bytes apps/locale/zh/LC_MESSAGES/django.po | 28 +++++++++++++++------------ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/apps/authentication/api/mfa.py b/apps/authentication/api/mfa.py index cc4f2ab6b..f95593bbe 100644 --- a/apps/authentication/api/mfa.py +++ b/apps/authentication/api/mfa.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # import time +from django.utils.translation import ugettext as _ from rest_framework.permissions import AllowAny from rest_framework.generics import CreateAPIView from rest_framework.serializers import ValidationError @@ -56,4 +57,4 @@ class UserOtpVerifyApi(CreateAPIView): request.session["MFA_VERIFY_TIME"] = int(time.time()) return Response({"ok": "1"}) else: - return Response({"error": "Code not valid"}, status=400) + return Response({"error": _("Code is invalid")}, status=400) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 331ae38c750c151330b40dbb1e6442977b146203..7889bc373db0089146fd70ffa3c08747b233e0a0 100644 GIT binary patch delta 15987 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 delta 15946 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\n" "Language-Team: JumpServer team\n" @@ -986,7 +986,7 @@ msgstr "状态" msgid "Date login" msgstr "登录日期" -#: audits/serializers.py:61 audits/serializers.py:73 ops/models/adhoc.py:240 +#: audits/serializers.py:61 audits/serializers.py:73 ops/models/adhoc.py:244 msgid "Is success" msgstr "是否成功" @@ -1003,6 +1003,10 @@ msgstr "主机" msgid "Run as" msgstr "运行用户" +#: authentication/api/mfa.py:60 +msgid "Code is invalid" +msgstr "Code无效" + #: authentication/backends/api.py:53 msgid "Invalid signature header. No credentials provided." msgstr "" @@ -1500,46 +1504,46 @@ msgstr "Become" msgid "Create by" msgstr "创建者" -#: ops/models/adhoc.py:233 +#: ops/models/adhoc.py:237 msgid "Task display" msgstr "任务展示" -#: ops/models/adhoc.py:234 +#: ops/models/adhoc.py:238 msgid "Host amount" msgstr "主机数量" -#: ops/models/adhoc.py:236 +#: ops/models/adhoc.py:240 msgid "Start time" msgstr "开始时间" -#: ops/models/adhoc.py:237 +#: ops/models/adhoc.py:241 msgid "End time" msgstr "完成时间" -#: ops/models/adhoc.py:238 xpack/plugins/change_auth_plan/models.py:179 +#: ops/models/adhoc.py:242 xpack/plugins/change_auth_plan/models.py:179 #: xpack/plugins/change_auth_plan/models.py:310 #: xpack/plugins/gathered_user/models.py:79 msgid "Time" msgstr "时间" -#: ops/models/adhoc.py:239 ops/models/command.py:26 +#: ops/models/adhoc.py:243 ops/models/command.py:26 #: terminal/serializers/session.py:30 msgid "Is finished" msgstr "是否完成" -#: ops/models/adhoc.py:241 +#: ops/models/adhoc.py:245 msgid "Adhoc raw result" msgstr "结果" -#: ops/models/adhoc.py:242 +#: ops/models/adhoc.py:246 msgid "Adhoc result summary" msgstr "汇总" -#: ops/models/adhoc.py:282 xpack/plugins/change_auth_plan/utils.py:137 +#: ops/models/adhoc.py:286 xpack/plugins/change_auth_plan/utils.py:137 msgid "{} Start task: {}" msgstr "{} 任务开始: {}" -#: ops/models/adhoc.py:291 xpack/plugins/change_auth_plan/utils.py:149 +#: ops/models/adhoc.py:295 xpack/plugins/change_auth_plan/utils.py:149 msgid "{} Task finish" msgstr "{} 任务结束"