|
1 | 1 | import warnings |
2 | 2 | from copy import copy |
3 | | -from itertools import groupby |
4 | 3 |
|
5 | 4 | from django.contrib.auth import get_user_model |
6 | 5 | from django.db import models |
@@ -64,15 +63,20 @@ def _chain(self): |
64 | 63 | def current_content_iterator(self, **kwargs): |
65 | 64 | """Returns generator (not a queryset) over current content versions. Current versions are either draft |
66 | 65 | 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) |
76 | 80 |
|
77 | 81 |
|
78 | 82 | class AdminManagerMixin: |
|
0 commit comments