From 51c5294fb4b966e1d13b152670fea77b180ffb59 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Tue, 22 Jul 2025 16:46:46 +0800 Subject: [PATCH] perf: Ticket filter org --- apps/tickets/filters.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/apps/tickets/filters.py b/apps/tickets/filters.py index 8d4c8a824..4b5f27b0e 100644 --- a/apps/tickets/filters.py +++ b/apps/tickets/filters.py @@ -3,6 +3,7 @@ from django.db.models.functions import Concat from django_filters import rest_framework as filters from common.drf.filters import BaseFilterSet +from orgs.models import Organization from tickets.models import ( Ticket, ApplyAssetTicket, ApplyLoginTicket, ApplyLoginAssetTicket, ApplyCommandTicket @@ -15,20 +16,36 @@ class TicketFilter(BaseFilterSet): relevant_command = filters.CharFilter(method='filter_relevant_command') applicant_username_name = filters.CharFilter(method='filter_applicant_username_name') state = filters.CharFilter(method='filter_state') + org_name = filters.CharFilter(method='filter_org_name', label='Organization Name') class Meta: model = Ticket fields = ( - 'id', 'title', 'type', 'status', 'state', 'applicant', 'assignees__id' + 'id', 'title', 'type', 'status', 'state', + 'applicant', 'assignees__id', 'org_name', 'org_id' ) - def filter_assignees_id(self, queryset, name, value): + @staticmethod + def filter_org_name(queryset, name, value): + matched_org_ids = Organization.objects.filter( + name__icontains=value + ).values_list('id', flat=True) + + matched_org_ids = [str(_id) for _id in matched_org_ids] + if not matched_org_ids: + return queryset.none() + + return queryset.filter(org_id__in=matched_org_ids) + + @staticmethod + def filter_assignees_id(queryset, name, value): return queryset.filter( ticket_steps__level=F('approval_step'), ticket_steps__ticket_assignees__assignee_id=value ) - def filter_relevant_asset(self, queryset, name, value): + @staticmethod + def filter_relevant_asset(queryset, name, value): asset_ids = ApplyAssetTicket.objects.annotate( asset_str=Concat( F('apply_assets__name'), Value('('), @@ -54,19 +71,22 @@ class TicketFilter(BaseFilterSet): ticket_ids = list(set(list(asset_ids) + list(login_asset_ids) + list(command_ids))) return queryset.filter(id__in=ticket_ids) - def filter_relevant_command(self, queryset, name, value): + @staticmethod + def filter_relevant_command(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)) - def filter_applicant_username_name(self, queryset, name, value): + @staticmethod + def filter_applicant_username_name(queryset, name, value): return queryset.filter( Q(applicant__name__icontains=value) | Q(applicant__username__icontains=value) ) - def filter_state(self, queryset, name, value): + @staticmethod + def filter_state(queryset, name, value): if value == 'all': return queryset return queryset.filter(state=value)