From 1b052a8729c68c213117eb529397640e652ecc6e Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 29 Jul 2020 14:57:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(terminal):=20=E7=BB=88=E7=AB=AF=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/drf/api.py | 9 +++++++++ apps/common/drf/serializers.py | 20 ++++++++++++++++++ apps/common/exceptions.py | 3 ++- apps/common/serializers.py | 18 +++++------------ apps/locale/zh/LC_MESSAGES/django.mo | Bin 55837 -> 55907 bytes apps/locale/zh/LC_MESSAGES/django.po | 28 +++++++++++++++----------- apps/terminal/api/terminal.py | 11 ++++++---- apps/terminal/exceptions.py | 8 ++++++++ apps/terminal/serializers/terminal.py | 8 ++++---- apps/terminal/urls/api_urls.py | 2 +- 10 files changed, 72 insertions(+), 35 deletions(-) create mode 100644 apps/terminal/exceptions.py diff --git a/apps/common/drf/api.py b/apps/common/drf/api.py index 3d5b67b34..692d567f5 100644 --- a/apps/common/drf/api.py +++ b/apps/common/drf/api.py @@ -1,4 +1,5 @@ from rest_framework.viewsets import GenericViewSet, ModelViewSet +from rest_framework_bulk import BulkModelViewSet from ..mixins.api import ( SerializerMixin2, QuerySetMixin, ExtraFilterFieldsMixin, PaginatedResponseMixin @@ -19,3 +20,11 @@ class JMSModelViewSet(SerializerMixin2, PaginatedResponseMixin, ModelViewSet): pass + + +class JMSBulkModelViewSet(SerializerMixin2, + QuerySetMixin, + ExtraFilterFieldsMixin, + PaginatedResponseMixin, + BulkModelViewSet): + pass diff --git a/apps/common/drf/serializers.py b/apps/common/drf/serializers.py index bd92415a1..e767c32aa 100644 --- a/apps/common/drf/serializers.py +++ b/apps/common/drf/serializers.py @@ -1,5 +1,25 @@ from rest_framework.serializers import Serializer +from rest_framework.serializers import ModelSerializer +from rest_framework import serializers +from rest_framework_bulk.serializers import BulkListSerializer + +from common.mixins.serializers import BulkSerializerMixin +from common.mixins import BulkListSerializerMixin + +__all__ = ['EmptySerializer', 'BulkModelSerializer'] class EmptySerializer(Serializer): pass + + +class BulkModelSerializer(BulkSerializerMixin, ModelSerializer): + pass + + +class AdaptedBulkListSerializer(BulkListSerializerMixin, BulkListSerializer): + pass + + +class CeleryTaskSerializer(serializers.Serializer): + task = serializers.CharField(read_only=True) diff --git a/apps/common/exceptions.py b/apps/common/exceptions.py index e95cc2801..4b3718837 100644 --- a/apps/common/exceptions.py +++ b/apps/common/exceptions.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- # from rest_framework.exceptions import APIException +from rest_framework import status class JMSException(APIException): - pass + status_code = status.HTTP_400_BAD_REQUEST diff --git a/apps/common/serializers.py b/apps/common/serializers.py index eb657b4cc..971060641 100644 --- a/apps/common/serializers.py +++ b/apps/common/serializers.py @@ -1,14 +1,6 @@ -# -*- coding: utf-8 -*- -# +""" +老的代码统一到 `apps/common/drf/serializers.py` 中, +之后此文件废弃 +""" -from rest_framework_bulk.serializers import BulkListSerializer -from rest_framework import serializers -from .mixins import BulkListSerializerMixin - - -class AdaptedBulkListSerializer(BulkListSerializerMixin, BulkListSerializer): - pass - - -class CeleryTaskSerializer(serializers.Serializer): - task = serializers.CharField(read_only=True) +from common.drf.serializers import AdaptedBulkListSerializer, CeleryTaskSerializer diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 6469256430141bfb82a02a2689a1564796fd76c6..8599cd7c5784765fb2b455e74722b25e66e3775c 100644 GIT binary patch delta 16686 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 WZ4XCJx;JL-y&c;(u2~jY@c#fbz3KV@ delta 16670 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 JF6~z2e*i6C$-n>r diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 03a50defd..eb34c4400 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-28 11:25+0800\n" +"POT-Creation-Date: 2020-07-29 15:03+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -2419,6 +2419,10 @@ msgstr "会话" msgid "Risk level" msgstr "风险等级" +#: terminal/exceptions.py:8 +msgid "Bulk create not support" +msgstr "不支持批量创建" + #: terminal/models.py:27 msgid "Remote Address" msgstr "远端地址" @@ -2479,40 +2483,40 @@ msgstr "结束日期" msgid "Args" msgstr "参数" -#: tickets/api/request_asset_perm.py:43 +#: tickets/api/request_asset_perm.py:42 msgid "Ticket closed" msgstr "工单已关闭" -#: tickets/api/request_asset_perm.py:46 +#: tickets/api/request_asset_perm.py:45 #, python-format msgid "Ticket has %s" msgstr "工单已%s" -#: tickets/api/request_asset_perm.py:93 +#: tickets/api/request_asset_perm.py:90 msgid "Confirm assets first" msgstr "请先确认资产" -#: tickets/api/request_asset_perm.py:96 +#: tickets/api/request_asset_perm.py:93 msgid "Confirmed assets changed" msgstr "确认的资产变更了" -#: tickets/api/request_asset_perm.py:100 +#: tickets/api/request_asset_perm.py:97 msgid "Confirm system-user first" msgstr "请先确认系统用户" -#: tickets/api/request_asset_perm.py:104 +#: tickets/api/request_asset_perm.py:101 msgid "Confirmed system-user changed" msgstr "确认的系统用户变更了" -#: tickets/api/request_asset_perm.py:107 xpack/plugins/cloud/models.py:202 +#: tickets/api/request_asset_perm.py:104 xpack/plugins/cloud/models.py:202 msgid "Succeed" msgstr "成功" -#: tickets/api/request_asset_perm.py:114 +#: tickets/api/request_asset_perm.py:111 msgid "From request ticket: {} {}" msgstr "来自工单申请: {} {}" -#: tickets/api/request_asset_perm.py:116 +#: tickets/api/request_asset_perm.py:113 msgid "{} request assets, approved by {}" msgstr "{} 申请资产,通过人 {}" @@ -2592,11 +2596,11 @@ msgstr "确认的系统用户" msgid "Invalid `org_id`" msgstr "无效的 `org_id`" -#: tickets/serializers/request_asset_perm.py:93 +#: tickets/serializers/request_asset_perm.py:92 msgid "Field `assignees` must be organization admin or superuser" msgstr "字段 assignees 必须是组织管理员或者超级管理员" -#: tickets/serializers/request_asset_perm.py:143 +#: tickets/serializers/request_asset_perm.py:142 #, python-brace-format msgid "" "\n" diff --git a/apps/terminal/api/terminal.py b/apps/terminal/api/terminal.py index 705848fe0..2ee353e3e 100644 --- a/apps/terminal/api/terminal.py +++ b/apps/terminal/api/terminal.py @@ -5,17 +5,17 @@ import logging import uuid from django.core.cache import cache -from django.shortcuts import get_object_or_404, redirect -from django.utils import timezone +from django.shortcuts import get_object_or_404 from rest_framework import viewsets from rest_framework.views import APIView, Response from rest_framework.permissions import AllowAny - +from common.drf.api import JMSBulkModelViewSet from common.utils import get_object_or_none from common.permissions import IsAppUser, IsOrgAdminOrAppUser, IsSuperUser from ..models import Terminal, Status, Session from .. import serializers +from .. import exceptions __all__ = [ 'TerminalViewSet', 'TerminalTokenApi', 'StatusViewSet', 'TerminalConfig', @@ -23,13 +23,16 @@ __all__ = [ logger = logging.getLogger(__file__) -class TerminalViewSet(viewsets.ModelViewSet): +class TerminalViewSet(JMSBulkModelViewSet): queryset = Terminal.objects.filter(is_deleted=False) serializer_class = serializers.TerminalSerializer permission_classes = (IsSuperUser,) filter_fields = ['name', 'remote_addr'] def create(self, request, *args, **kwargs): + if isinstance(request.data, list): + raise exceptions.BulkCreateNotSupport() + name = request.data.get('name') remote_ip = request.META.get('REMOTE_ADDR') x_real_ip = request.META.get('X-Real-IP') diff --git a/apps/terminal/exceptions.py b/apps/terminal/exceptions.py new file mode 100644 index 000000000..a3b63a3e9 --- /dev/null +++ b/apps/terminal/exceptions.py @@ -0,0 +1,8 @@ +from django.utils.translation import ugettext_lazy as _ + +from common.exceptions import JMSException + + +class BulkCreateNotSupport(JMSException): + default_code = 'bulk_create_not_support' + default_detail = _('Bulk create not support') diff --git a/apps/terminal/serializers/terminal.py b/apps/terminal/serializers/terminal.py index c7a91d009..bfe992b19 100644 --- a/apps/terminal/serializers/terminal.py +++ b/apps/terminal/serializers/terminal.py @@ -1,18 +1,18 @@ from rest_framework import serializers -from common.mixins import BulkSerializerMixin -from common.serializers import AdaptedBulkListSerializer +from common.drf.serializers import BulkModelSerializer, AdaptedBulkListSerializer from ..models import ( Terminal, Status, Session, Task ) -class TerminalSerializer(serializers.ModelSerializer): +class TerminalSerializer(BulkModelSerializer): session_online = serializers.SerializerMethodField() is_alive = serializers.BooleanField(read_only=True) class Meta: model = Terminal + list_serializer_class = AdaptedBulkListSerializer fields = [ 'id', 'name', 'remote_addr', 'http_port', 'ssh_port', 'comment', 'is_accepted', "is_active", 'session_online', @@ -30,7 +30,7 @@ class StatusSerializer(serializers.ModelSerializer): model = Status -class TaskSerializer(BulkSerializerMixin, serializers.ModelSerializer): +class TaskSerializer(BulkModelSerializer): class Meta: fields = '__all__' diff --git a/apps/terminal/urls/api_urls.py b/apps/terminal/urls/api_urls.py index d82a5ca5a..c60f97603 100644 --- a/apps/terminal/urls/api_urls.py +++ b/apps/terminal/urls/api_urls.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # -from django.urls import path, include, re_path +from django.urls import path, re_path from rest_framework_bulk.routes import BulkRouter from common import api as capi