From 8d1fb84aaf4c576058302ecf6b4ca1332ee9fc21 Mon Sep 17 00:00:00 2001 From: feng626 <1304903146@qq.com> Date: Fri, 9 Sep 2022 15:38:59 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=B7=A5=E5=8D=95=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/tickets/filters.py | 73 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/apps/tickets/filters.py b/apps/tickets/filters.py index bf20014cc..659556c12 100644 --- a/apps/tickets/filters.py +++ b/apps/tickets/filters.py @@ -1,5 +1,6 @@ from django_filters import rest_framework as filters -from django.db.models import Subquery, OuterRef +from django.db.models.functions import Concat +from django.db.models import Subquery, OuterRef, Value, F, Q from common.drf.filters import BaseFilterSet @@ -11,6 +12,10 @@ from tickets.models import ( class TicketFilter(BaseFilterSet): assignees__id = filters.UUIDFilter(method='filter_assignees_id') + relevant_app = filters.CharFilter(method='filter_relevant_app') + relevant_asset = filters.CharFilter(method='filter_relevant_asset') + relevant_system_user = filters.CharFilter(method='filter_relevant_system_user') + relevant_command = filters.CharFilter(method='filter_relevant_command') class Meta: model = Ticket @@ -27,6 +32,72 @@ class TicketFilter(BaseFilterSet): ticket_steps__ticket_assignees__assignee__id=value ) + def filter_relevant_asset(self, queryset, name, value): + asset_ids = ApplyAssetTicket.objects.annotate( + asset_str=Concat( + F('apply_assets__hostname'), Value('('), + F('apply_assets__ip'), Value(')') + ) + ).filter( + asset_str__icontains=value + ).values_list('id', flat=True) + + login_asset_ids = ApplyLoginAssetTicket.objects.annotate( + asset_str=Concat( + F('apply_login_asset__hostname'), Value('('), + F('apply_login_asset__ip'), Value(')') + ) + ).filter( + asset_str__icontains=value + ).values_list('id', flat=True) + + command_ids = ApplyCommandTicket.objects.filter( + apply_run_asset__icontains=value + ).values_list('id', flat=True) + + ticket_ids = list(set(list(asset_ids) + list(login_asset_ids) + list(command_ids))) + return queryset.filter(id__in=ticket_ids) + + def filter_relevant_app(self, queryset, name, value): + app_ids = ApplyApplicationTicket.objects.filter( + apply_applications__name__icontains=value + ).values_list('id', flat=True) + + command_ids = ApplyCommandTicket.objects.filter( + apply_run_asset__icontains=value + ).values_list('id', flat=True) + + ticket_ids = list(set(list(app_ids) + list(command_ids))) + return queryset.filter(id__in=ticket_ids) + + def filter_relevant_system_user(self, queryset, name, value): + system_user_query = Q(apply_system_users__name__icontains=value) + asset_ids = ApplyAssetTicket.objects.filter( + system_user_query + ).values_list('id', flat=True) + + app_ids = ApplyApplicationTicket.objects.filter( + system_user_query + ).values_list('id', flat=True) + + login_asset_ids = ApplyLoginAssetTicket.objects.filter( + apply_login_system_user__name__icontains=value + ).values_list('id', flat=True) + + command_ids = ApplyCommandTicket.objects.filter( + apply_run_system_user__name__icontains=value + ).values_list('id', flat=True) + ticket_ids = list( + set(list(asset_ids) + list(app_ids) + list(login_asset_ids) + list(command_ids)) + ) + return queryset.filter(id__in=ticket_ids) + + def filter_relevant_command(self, queryset, name, value): + command_ids = ApplyCommandTicket.objects.filter( + apply_run_command__icontains=value + ).values_list('id', flat=True) + return queryset.filter(id__in=list(command_ids)) + class ApplyAssetTicketFilter(BaseFilterSet): class Meta: