Skip to content

Commit 65f6da9

Browse files
authored
feat: Huge performance improvement for admin_manager (#318)
1 parent 906d501 commit 65f6da9

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

djangocms_versioning/managers.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import warnings
22
from copy import copy
3-
from itertools import groupby
43

54
from django.contrib.auth import get_user_model
65
from django.db import models
@@ -64,15 +63,20 @@ def _chain(self):
6463
def current_content_iterator(self, **kwargs):
6564
"""Returns generator (not a queryset) over current content versions. Current versions are either draft
6665
versions or published versions (in that order)"""
67-
qs = self.filter(versions__state__in=("draft", "published"))\
68-
.order_by(*self._group_by_key)\
69-
.prefetch_related("versions")
70-
for grp, version_content in groupby(
71-
qs,
72-
lambda x: tuple(map(lambda key: getattr(x, key), self._group_by_key)) # get group key fields
73-
):
74-
first, second = next(version_content), next(version_content, None) # Max 2 results per group possible
75-
yield first if second is None or first.versions.first().state == constants.DRAFT else second
66+
warnings.warn("current_content_iterator is deprecated in favour of current_conent",
67+
DeprecationWarning, stacklevel=2)
68+
return iter(self.current_content(**kwargs))
69+
70+
def current_content(self, **kwargs):
71+
"""Returns a queryset current content versions. Current versions are either draft
72+
versions or published versions (in that order). This optimized query assumes that
73+
draft versions always have a higher pk than any other version type. This is true as long as
74+
no other version type can be converted to draft without creating a new version."""
75+
qs = self.filter(versions__state__in=(constants.DRAFT, constants.PUBLISHED), **kwargs)
76+
pk_filter = qs.values(*self._group_by_key)\
77+
.annotate(vers_pk=models.Max("versions__pk"))\
78+
.values_list("vers_pk", flat=True)
79+
return qs.filter(versions__pk__in=pk_filter)
7680

7781

7882
class AdminManagerMixin:

tests/test_extensions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ def setUp(self):
3838
translations=False,
3939
permissions=False,
4040
extensions=False,
41+
user=self.get_superuser(),
4142
)
4243
new_page_content = PageContentFactory(page=self.new_page, language='de')
4344
self.new_page.page_content_cache[de_pagecontent.language] = new_page_content

0 commit comments

Comments
 (0)