From 841228eb95360a251b37e76e0387f106b1017454 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 10 May 2018 15:45:05 +0100 Subject: [PATCH] REST: Resolve performance issues with '/events' web view The dropdown select-based filters in the web view of the REST API have stung us a few times. In this case, populating these filters for the '/events' endpoint results in a huge query that hammers the database and results in seriously laggy responses. The root cause of this performance issues was erroneously identified as an issue with the JSON renderer so that particular patch can now be reverted. This will be done separately. Signed-off-by: Stephen Finucane Cc: Daniel Axtens Tested-by: Daniel Axtens Signed-off-by: Daniel Axtens --- patchwork/api/filters.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/patchwork/api/filters.py b/patchwork/api/filters.py index f6fff792..7e818954 100644 --- a/patchwork/api/filters.py +++ b/patchwork/api/filters.py @@ -24,6 +24,7 @@ from django_filters.rest_framework import FilterSet from django_filters import IsoDateTimeFilter from django_filters import ModelMultipleChoiceFilter from django.forms import ModelMultipleChoiceField as BaseMultipleChoiceField +from django.forms.widgets import MultipleHiddenInput from patchwork.models import Bundle from patchwork.models import Check @@ -200,10 +201,17 @@ class CheckFilterSet(TimestampMixin, FilterSet): class EventFilterSet(TimestampMixin, FilterSet): - project = ProjectFilter(queryset=Project.objects.all()) - series = BaseFilter(queryset=Series.objects.all()) - patch = BaseFilter(queryset=Patch.objects.all()) - cover = BaseFilter(queryset=CoverLetter.objects.all()) + # NOTE(stephenfin): We disable the select-based HTML widgets for these + # filters as the resulting query is _huge_ + # TODO(stephenfin): We should really use an AJAX widget of some form here + project = ProjectFilter(queryset=Project.objects.all(), + widget=MultipleHiddenInput) + series = BaseFilter(queryset=Series.objects.all(), + widget=MultipleHiddenInput) + patch = BaseFilter(queryset=Patch.objects.all(), + widget=MultipleHiddenInput) + cover = BaseFilter(queryset=CoverLetter.objects.all(), + widget=MultipleHiddenInput) class Meta: model = Event -- 2.47.3