From: Stephen Finucane Date: Thu, 10 May 2018 14:45:05 +0000 (+0100) Subject: REST: Resolve performance issues with '/events' web view X-Git-Tag: v2.1.0-rc2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=841228eb95360a251b37e76e0387f106b1017454;p=thirdparty%2Fpatchwork.git 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 --- 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