mirror of https://github.com/jumpserver/jumpserver
perf: Ticket filter org
parent
da083fffa3
commit
51c5294fb4
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue