feat(terminal): 终端管理添加批量更新接口

pull/4426/head
xinwen 2020-07-29 14:57:44 +08:00 committed by 老广
parent 34b188bbe7
commit 1b052a8729
10 changed files with 72 additions and 35 deletions

View File

@ -1,4 +1,5 @@
from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.viewsets import GenericViewSet, ModelViewSet
from rest_framework_bulk import BulkModelViewSet
from ..mixins.api import ( from ..mixins.api import (
SerializerMixin2, QuerySetMixin, ExtraFilterFieldsMixin, PaginatedResponseMixin SerializerMixin2, QuerySetMixin, ExtraFilterFieldsMixin, PaginatedResponseMixin
@ -19,3 +20,11 @@ class JMSModelViewSet(SerializerMixin2,
PaginatedResponseMixin, PaginatedResponseMixin,
ModelViewSet): ModelViewSet):
pass pass
class JMSBulkModelViewSet(SerializerMixin2,
QuerySetMixin,
ExtraFilterFieldsMixin,
PaginatedResponseMixin,
BulkModelViewSet):
pass

View File

@ -1,5 +1,25 @@
from rest_framework.serializers import Serializer 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): class EmptySerializer(Serializer):
pass pass
class BulkModelSerializer(BulkSerializerMixin, ModelSerializer):
pass
class AdaptedBulkListSerializer(BulkListSerializerMixin, BulkListSerializer):
pass
class CeleryTaskSerializer(serializers.Serializer):
task = serializers.CharField(read_only=True)

View File

@ -1,7 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from rest_framework import status
class JMSException(APIException): class JMSException(APIException):
pass status_code = status.HTTP_400_BAD_REQUEST

View File

@ -1,14 +1,6 @@
# -*- coding: utf-8 -*- """
# 老的代码统一到 `apps/common/drf/serializers.py`
之后此文件废弃
"""
from rest_framework_bulk.serializers import BulkListSerializer from common.drf.serializers import AdaptedBulkListSerializer, CeleryTaskSerializer
from rest_framework import serializers
from .mixins import BulkListSerializerMixin
class AdaptedBulkListSerializer(BulkListSerializerMixin, BulkListSerializer):
pass
class CeleryTaskSerializer(serializers.Serializer):
task = serializers.CharField(read_only=True)

Binary file not shown.

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -2419,6 +2419,10 @@ msgstr "会话"
msgid "Risk level" msgid "Risk level"
msgstr "风险等级" msgstr "风险等级"
#: terminal/exceptions.py:8
msgid "Bulk create not support"
msgstr "不支持批量创建"
#: terminal/models.py:27 #: terminal/models.py:27
msgid "Remote Address" msgid "Remote Address"
msgstr "远端地址" msgstr "远端地址"
@ -2479,40 +2483,40 @@ msgstr "结束日期"
msgid "Args" msgid "Args"
msgstr "参数" msgstr "参数"
#: tickets/api/request_asset_perm.py:43 #: tickets/api/request_asset_perm.py:42
msgid "Ticket closed" msgid "Ticket closed"
msgstr "工单已关闭" msgstr "工单已关闭"
#: tickets/api/request_asset_perm.py:46 #: tickets/api/request_asset_perm.py:45
#, python-format #, python-format
msgid "Ticket has %s" msgid "Ticket has %s"
msgstr "工单已%s" msgstr "工单已%s"
#: tickets/api/request_asset_perm.py:93 #: tickets/api/request_asset_perm.py:90
msgid "Confirm assets first" msgid "Confirm assets first"
msgstr "请先确认资产" msgstr "请先确认资产"
#: tickets/api/request_asset_perm.py:96 #: tickets/api/request_asset_perm.py:93
msgid "Confirmed assets changed" msgid "Confirmed assets changed"
msgstr "确认的资产变更了" msgstr "确认的资产变更了"
#: tickets/api/request_asset_perm.py:100 #: tickets/api/request_asset_perm.py:97
msgid "Confirm system-user first" msgid "Confirm system-user first"
msgstr "请先确认系统用户" msgstr "请先确认系统用户"
#: tickets/api/request_asset_perm.py:104 #: tickets/api/request_asset_perm.py:101
msgid "Confirmed system-user changed" msgid "Confirmed system-user changed"
msgstr "确认的系统用户变更了" 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" msgid "Succeed"
msgstr "成功" msgstr "成功"
#: tickets/api/request_asset_perm.py:114 #: tickets/api/request_asset_perm.py:111
msgid "From request ticket: {} {}" msgid "From request ticket: {} {}"
msgstr "来自工单申请: {} {}" msgstr "来自工单申请: {} {}"
#: tickets/api/request_asset_perm.py:116 #: tickets/api/request_asset_perm.py:113
msgid "{} request assets, approved by {}" msgid "{} request assets, approved by {}"
msgstr "{} 申请资产,通过人 {}" msgstr "{} 申请资产,通过人 {}"
@ -2592,11 +2596,11 @@ msgstr "确认的系统用户"
msgid "Invalid `org_id`" msgid "Invalid `org_id`"
msgstr "无效的 `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" msgid "Field `assignees` must be organization admin or superuser"
msgstr "字段 assignees 必须是组织管理员或者超级管理员" msgstr "字段 assignees 必须是组织管理员或者超级管理员"
#: tickets/serializers/request_asset_perm.py:143 #: tickets/serializers/request_asset_perm.py:142
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"\n" "\n"

View File

@ -5,17 +5,17 @@ import logging
import uuid import uuid
from django.core.cache import cache from django.core.cache import cache
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404
from django.utils import timezone
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.views import APIView, Response from rest_framework.views import APIView, Response
from rest_framework.permissions import AllowAny from rest_framework.permissions import AllowAny
from common.drf.api import JMSBulkModelViewSet
from common.utils import get_object_or_none from common.utils import get_object_or_none
from common.permissions import IsAppUser, IsOrgAdminOrAppUser, IsSuperUser from common.permissions import IsAppUser, IsOrgAdminOrAppUser, IsSuperUser
from ..models import Terminal, Status, Session from ..models import Terminal, Status, Session
from .. import serializers from .. import serializers
from .. import exceptions
__all__ = [ __all__ = [
'TerminalViewSet', 'TerminalTokenApi', 'StatusViewSet', 'TerminalConfig', 'TerminalViewSet', 'TerminalTokenApi', 'StatusViewSet', 'TerminalConfig',
@ -23,13 +23,16 @@ __all__ = [
logger = logging.getLogger(__file__) logger = logging.getLogger(__file__)
class TerminalViewSet(viewsets.ModelViewSet): class TerminalViewSet(JMSBulkModelViewSet):
queryset = Terminal.objects.filter(is_deleted=False) queryset = Terminal.objects.filter(is_deleted=False)
serializer_class = serializers.TerminalSerializer serializer_class = serializers.TerminalSerializer
permission_classes = (IsSuperUser,) permission_classes = (IsSuperUser,)
filter_fields = ['name', 'remote_addr'] filter_fields = ['name', 'remote_addr']
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
if isinstance(request.data, list):
raise exceptions.BulkCreateNotSupport()
name = request.data.get('name') name = request.data.get('name')
remote_ip = request.META.get('REMOTE_ADDR') remote_ip = request.META.get('REMOTE_ADDR')
x_real_ip = request.META.get('X-Real-IP') x_real_ip = request.META.get('X-Real-IP')

View File

@ -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')

View File

@ -1,18 +1,18 @@
from rest_framework import serializers from rest_framework import serializers
from common.mixins import BulkSerializerMixin from common.drf.serializers import BulkModelSerializer, AdaptedBulkListSerializer
from common.serializers import AdaptedBulkListSerializer
from ..models import ( from ..models import (
Terminal, Status, Session, Task Terminal, Status, Session, Task
) )
class TerminalSerializer(serializers.ModelSerializer): class TerminalSerializer(BulkModelSerializer):
session_online = serializers.SerializerMethodField() session_online = serializers.SerializerMethodField()
is_alive = serializers.BooleanField(read_only=True) is_alive = serializers.BooleanField(read_only=True)
class Meta: class Meta:
model = Terminal model = Terminal
list_serializer_class = AdaptedBulkListSerializer
fields = [ fields = [
'id', 'name', 'remote_addr', 'http_port', 'ssh_port', 'id', 'name', 'remote_addr', 'http_port', 'ssh_port',
'comment', 'is_accepted', "is_active", 'session_online', 'comment', 'is_accepted', "is_active", 'session_online',
@ -30,7 +30,7 @@ class StatusSerializer(serializers.ModelSerializer):
model = Status model = Status
class TaskSerializer(BulkSerializerMixin, serializers.ModelSerializer): class TaskSerializer(BulkModelSerializer):
class Meta: class Meta:
fields = '__all__' fields = '__all__'

View File

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- 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 rest_framework_bulk.routes import BulkRouter
from common import api as capi from common import api as capi