diff --git a/apps/terminal/api/component/terminal.py b/apps/terminal/api/component/terminal.py index 541bd5ea3..6d41cec90 100644 --- a/apps/terminal/api/component/terminal.py +++ b/apps/terminal/api/component/terminal.py @@ -2,6 +2,7 @@ # import logging +from django.core.cache import cache from django.db.models import Q from django.utils.translation import gettext_lazy as _ from django_filters import rest_framework as filters @@ -27,11 +28,23 @@ logger = logging.getLogger(__file__) class TerminalFilterSet(BaseFilterSet): name = filters.CharFilter(field_name='name', lookup_expr='icontains') remote_addr = filters.CharFilter(field_name='remote_addr', lookup_expr='icontains') + is_alive = filters.BooleanFilter(method='filter_is_alive') class Meta: model = Terminal 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): queryset = super().filter_queryset(queryset) search = self.request.query_params.get('search')