mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-25 14:50:24 +00:00
perf: Add is_alive filter to TerminalFilterSet
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from django.core.cache import cache
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django_filters import rest_framework as filters
|
from django_filters import rest_framework as filters
|
||||||
@@ -27,11 +28,23 @@ logger = logging.getLogger(__file__)
|
|||||||
class TerminalFilterSet(BaseFilterSet):
|
class TerminalFilterSet(BaseFilterSet):
|
||||||
name = filters.CharFilter(field_name='name', lookup_expr='icontains')
|
name = filters.CharFilter(field_name='name', lookup_expr='icontains')
|
||||||
remote_addr = filters.CharFilter(field_name='remote_addr', lookup_expr='icontains')
|
remote_addr = filters.CharFilter(field_name='remote_addr', lookup_expr='icontains')
|
||||||
|
is_alive = filters.BooleanFilter(method='filter_is_alive')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Terminal
|
model = Terminal
|
||||||
fields = ['name', 'remote_addr', 'type']
|
fields = ['name', 'remote_addr', 'type']
|
||||||
|
|
||||||
|
def filter_is_alive(self, queryset, name, value):
|
||||||
|
ids = list(queryset.values_list('id', flat=True))
|
||||||
|
if not ids:
|
||||||
|
return queryset.none() if value else queryset
|
||||||
|
|
||||||
|
alive_ids = [pk for pk in ids if cache.get(Terminal.ALIVE_KEY.format(pk))]
|
||||||
|
if value:
|
||||||
|
return queryset.filter(id__in=alive_ids)
|
||||||
|
else:
|
||||||
|
return queryset.exclude(id__in=alive_ids)
|
||||||
|
|
||||||
def filter_queryset(self, queryset):
|
def filter_queryset(self, queryset):
|
||||||
queryset = super().filter_queryset(queryset)
|
queryset = super().filter_queryset(queryset)
|
||||||
search = self.request.query_params.get('search')
|
search = self.request.query_params.get('search')
|
||||||
|
Reference in New Issue
Block a user