mirror of https://github.com/jumpserver/jumpserver
perf: Add is_alive filter to TerminalFilterSet
parent
7f7a354b2d
commit
953b515817
|
@ -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')
|
||||||
|
|
Loading…
Reference in New Issue