Fix performance regression for report views

pull/11234/head
Alex Tomkins 2023-11-11 21:23:24 +00:00 zatwierdzone przez Matt Westcott
rodzic 5452d62feb
commit 136bf4adc0
2 zmienionych plików z 25 dodań i 1 usunięć

Wyświetl plik

@ -1,5 +1,6 @@
import datetime import datetime
from io import BytesIO from io import BytesIO
from unittest import mock
from django.conf import settings from django.conf import settings
from django.conf.locale import LANG_INFO from django.conf.locale import LANG_INFO
@ -12,6 +13,7 @@ from django.utils import timezone, translation
from openpyxl import load_workbook from openpyxl import load_workbook
from wagtail.admin.views.mixins import ExcelDateFormatter from wagtail.admin.views.mixins import ExcelDateFormatter
from wagtail.admin.views.reports.audit_logging import LogEntriesView
from wagtail.models import GroupPagePermission, ModelLogEntry, Page, PageLogEntry from wagtail.models import GroupPagePermission, ModelLogEntry, Page, PageLogEntry
from wagtail.test.testapp.models import Advert from wagtail.test.testapp.models import Advert
from wagtail.test.utils import WagtailTestUtils from wagtail.test.utils import WagtailTestUtils
@ -445,6 +447,24 @@ class TestFilteredLogEntriesView(WagtailTestUtils, TestCase):
response = self.get() response = self.get()
self.assertContains(response, "Unknown content type") self.assertContains(response, "Unknown content type")
def test_decorated_queryset(self):
# Ensure that decorate_paginated_queryset is only called with the queryset for the current
# page, instead of all objects over all pages.
with mock.patch.object(
LogEntriesView,
"decorate_paginated_queryset",
side_effect=LogEntriesView.decorate_paginated_queryset,
autospec=True,
) as decorate_paginated_queryset, mock.patch.object(
LogEntriesView, "paginate_by", return_value=1
):
response = self.get()
decorate_paginated_queryset.assert_called_once()
queryset = decorate_paginated_queryset.call_args.args[1]
self.assertEqual(queryset.count(), 1)
self.assertEqual(response.status_code, 200)
@override_settings( @override_settings(
USE_L10N=True, USE_L10N=True,

Wyświetl plik

@ -17,8 +17,12 @@ class ReportView(IndexView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.filters, self.object_list = self.get_filtered_queryset() self.filters, self.object_list = self.get_filtered_queryset()
self.object_list = self.decorate_paginated_queryset(self.object_list)
context = self.get_context_data() context = self.get_context_data()
# Decorate the queryset *after* Django's BaseListView has returned a paginated/reduced
# list of objects
context["object_list"] = self.decorate_paginated_queryset(
context["object_list"]
)
return self.render_to_response(context) return self.render_to_response(context)
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):