diff --git a/apps/common/drf/metadata.py b/apps/common/drf/metadata.py index afd7389bb..853efa390 100644 --- a/apps/common/drf/metadata.py +++ b/apps/common/drf/metadata.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals from collections import OrderedDict import datetime +from itertools import chain from django.core.exceptions import PermissionDenied from django.http import Http404 @@ -101,7 +102,13 @@ class SimpleMetadataWithFilters(SimpleMetadata): elif hasattr(view, 'get_filterset_fields'): fields = view.get_filterset_fields(request) elif hasattr(view, 'filterset_class'): - fields = view.filterset_class.Meta.fields + fields = view.filterset_class.Meta.fields + \ + list(view.filterset_class.declared_filters.keys()) + + if hasattr(view, 'custom_filter_fields'): + # 不能写 fields += view.custom_filter_fields + # 会改变 view 的 filter_fields + fields = list(fields) + view.custom_filter_fields if isinstance(fields, dict): fields = list(fields.keys()) diff --git a/apps/common/mixins/api.py b/apps/common/mixins/api.py index f7eb35dc2..caef88127 100644 --- a/apps/common/mixins/api.py +++ b/apps/common/mixins/api.py @@ -112,7 +112,8 @@ class ExtraFilterFieldsMixin: backends = list(chain( self.filter_backends, self.default_added_filters, - self.extra_filter_backends)) + self.extra_filter_backends + )) return backends def filter_queryset(self, queryset): diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index f5128dcda..fe3cb332b 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -2491,7 +2491,7 @@ msgstr "账户是否有效" #: perms/serializers/asset/permission.py:67 users/serializers/user.py:29 #: users/serializers/user.py:79 msgid "Is expired" -msgstr "是否过期" +msgstr "已过期" #: perms/serializers/application/permission.py:40 #: perms/serializers/asset/permission.py:70 users/serializers/group.py:34 @@ -5285,15 +5285,15 @@ msgstr "密码策略" #: users/serializers/user.py:25 msgid "MFA enabled" -msgstr "是否开启多因子认证" +msgstr "MFA" #: users/serializers/user.py:26 msgid "MFA force enabled" -msgstr "强制启用多因子认证" +msgstr "强制 MFA" #: users/serializers/user.py:27 msgid "MFA level display" -msgstr "多因子认证等级名称" +msgstr "MFA 等级名称" #: users/serializers/user.py:28 msgid "Login blocked" diff --git a/apps/terminal/api/terminal.py b/apps/terminal/api/terminal.py index a5ccf8001..9767cb951 100644 --- a/apps/terminal/api/terminal.py +++ b/apps/terminal/api/terminal.py @@ -8,6 +8,7 @@ from rest_framework import generics from rest_framework.views import APIView, Response from rest_framework import status from django.conf import settings +from django_filters import rest_framework as filters from django.utils.translation import gettext_lazy as _ from common.exceptions import JMSException @@ -30,6 +31,7 @@ class TerminalViewSet(JMSBulkModelViewSet): serializer_class = serializers.TerminalSerializer permission_classes = (IsSuperUser,) filterset_fields = ['name', 'remote_addr', 'type'] + custom_filter_fields = ['status'] def destroy(self, request, *args, **kwargs): instance = self.get_object() @@ -75,10 +77,10 @@ class TerminalViewSet(JMSBulkModelViewSet): def filter_queryset(self, queryset): queryset = super().filter_queryset(queryset) - status = self.request.query_params.get('status') - if not status: + s = self.request.query_params.get('status') + if not s: return queryset - filtered_queryset_id = [str(q.id) for q in queryset if q.status == status] + filtered_queryset_id = [str(q.id) for q in queryset if q.latest_status == s] queryset = queryset.filter(id__in=filtered_queryset_id) return queryset diff --git a/apps/terminal/serializers/terminal.py b/apps/terminal/serializers/terminal.py index 073bceec0..301001739 100644 --- a/apps/terminal/serializers/terminal.py +++ b/apps/terminal/serializers/terminal.py @@ -5,6 +5,7 @@ from common.drf.serializers import BulkModelSerializer, AdaptedBulkListSerialize from common.utils import is_uuid from users.serializers import ServiceAccountSerializer from common.utils import get_request_ip +from .. import const from ..models import ( Terminal, Status, Session, Task, CommandStorage, ReplayStorage @@ -37,7 +38,8 @@ class StatusSerializer(serializers.ModelSerializer): class TerminalSerializer(BulkModelSerializer): session_online = serializers.ReadOnlyField(source='get_online_session_count') is_alive = serializers.BooleanField(read_only=True) - status = serializers.CharField(read_only=True, source='latest_status') + is_active = serializers.BooleanField(read_only=True, label='Is active') + status = serializers.ChoiceField(read_only=True, choices=const.ComponentStatusChoices.choices, source='latest_status') status_display = serializers.CharField(read_only=True, source='latest_status_display') stat = StatusSerializer(read_only=True, source='latest_stat')