diff --git a/cms/topics/mixins.py b/cms/topics/mixins.py new file mode 100644 index 00000000..8c8e9480 --- /dev/null +++ b/cms/topics/mixins.py @@ -0,0 +1,72 @@ +from typing import TYPE_CHECKING + +from django.utils.translation import gettext_lazy as _ +from wagtail.admin.ui.tables import Column, DateColumn +from wagtail.admin.ui.tables.pages import PageStatusColumn +from wagtail.coreutils import resolve_model_string + +from cms.articles.models import ArticleSeriesPage, StatisticalArticlePage +from cms.methodology.models import MethodologyPage + +if TYPE_CHECKING: + from wagtail.models import Page + from wagtail.query import PageQuerySet + + +class FeaturedSeriesPageChooseViewMixin: + model_class: ArticleSeriesPage + + def get_object_list(self) -> "PageQuerySet[ArticleSeriesPage]": + return ArticleSeriesPage.objects.all().order_by("path") + + @property + def columns(self) -> list["Column"]: + return [ + self.title_column, # type: ignore[attr-defined] + Column("parent", label=_("Topic"), accessor="get_parent"), + DateColumn( + "updated", + label=_("Updated"), + width="12%", + accessor="latest_revision_created_at", + ), + PageStatusColumn("status", label=_("Status"), width="12%"), + ] + + +class HighlightedChildPageChooseViewMixin: + def get_object_list(self) -> "PageQuerySet[Page]": + model_class: StatisticalArticlePage | MethodologyPage = self.model_class # type: ignore[attr-defined] + pages: PageQuerySet[Page] = model_class.objects.all().defer_streamfields() + if topic_page_id := self.request.GET.get("topic_page_id"): # type: ignore[attr-defined] + # using this rather than inline import to placate pyright complaining about cyclic imports + topic_page_model = resolve_model_string("topics.TopicPage") + try: + pages = pages.descendant_of(topic_page_model.objects.get(pk=topic_page_id)) + except topic_page_model.DoesNotExist: + pages = pages.none() + else: + # when adding new pages. + pages = pages.none() + + if model_class == StatisticalArticlePage: + pages = pages.order_by("-release_date") + + if model_class == MethodologyPage: + pages = pages.order_by("-publication_date") + return pages + + @property + def columns(self) -> list["Column"]: + title_column = self.title_column # type: ignore[attr-defined] + title_column.accessor = "get_admin_display_title" + return [ + title_column, + Column( + "release_date", + label=_("Release date"), + width="12%", + accessor="release_date", + ), + PageStatusColumn("status", label=_("Status"), width="12%"), + ] diff --git a/cms/topics/viewsets.py b/cms/topics/viewsets.py index 2f1c1ba6..be0eaf54 100644 --- a/cms/topics/viewsets.py +++ b/cms/topics/viewsets.py @@ -1,45 +1,19 @@ -from typing import TYPE_CHECKING, ClassVar +from typing import ClassVar from django.utils.translation import gettext_lazy as _ -from wagtail.admin.ui.tables import Column, DateColumn -from wagtail.admin.ui.tables.pages import PageStatusColumn from wagtail.admin.views.generic.chooser import ChooseResultsView, ChooseView from wagtail.admin.viewsets.chooser import ChooserViewSet -from wagtail.coreutils import resolve_model_string from cms.articles.models import ArticleSeriesPage, StatisticalArticlePage from cms.methodology.models import MethodologyPage -if TYPE_CHECKING: - from wagtail.models import Page - from wagtail.query import PageQuerySet +from .mixins import FeaturedSeriesPageChooseViewMixin, HighlightedChildPageChooseViewMixin -class FeaturedSeriesPageMixin: - model_class: ArticleSeriesPage +class FeaturedSeriesPageChooseView(FeaturedSeriesPageChooseViewMixin, ChooseView): ... - def get_object_list(self) -> "PageQuerySet[ArticleSeriesPage]": - return ArticleSeriesPage.objects.all().order_by("path") - @property - def columns(self) -> list["Column"]: - return [ - self.title_column, # type: ignore[attr-defined] - Column("parent", label=_("Topic"), accessor="get_parent"), - DateColumn( - "updated", - label=_("Updated"), - width="12%", - accessor="latest_revision_created_at", - ), - PageStatusColumn("status", label=_("Status"), width="12%"), - ] - - -class FeaturedSeriesPageChooseView(FeaturedSeriesPageMixin, ChooseView): ... - - -class FeaturedSeriesPageChooseResultsView(FeaturedSeriesPageMixin, ChooseResultsView): ... +class FeaturedSeriesPageChooseResultsView(FeaturedSeriesPageChooseViewMixin, ChooseResultsView): ... class FeaturedSeriesPageChooserViewSet(ChooserViewSet): @@ -52,48 +26,10 @@ class FeaturedSeriesPageChooserViewSet(ChooserViewSet): edit_item_text = _("Edit Article Series page") -class HighlightedChildPageMixin: - def get_object_list(self) -> "PageQuerySet[StatisticalArticlePage | MethodologyPage]": - model_class: StatisticalArticlePage | MethodologyPage = self.model_class # type: ignore[attr-defined] - pages: PageQuerySet[Page] = model_class.objects.all().defer_streamfields() - if topic_page_id := self.request.GET.get("topic_page_id"): # type: ignore[attr-defined] - # using this rather than inline import to placate pyright complaining about cyclic imports - topic_page_model = resolve_model_string("topics.TopicPage") - try: - pages = pages.descendant_of(topic_page_model.objects.get(pk=topic_page_id)) - except topic_page_model.DoesNotExist: - pages = pages.none() - else: - # when adding new pages. - pages = pages.none() - - if model_class == StatisticalArticlePage: - pages = pages.order_by("-release_date") - - if model_class == MethodologyPage: - pages = pages.order_by("-publication_date") - return pages - - @property - def columns(self) -> list["Column"]: - title_column = self.title_column # type: ignore[attr-defined] - title_column.accessor = "get_admin_display_title" - return [ - title_column, - Column( - "release_date", - label=_("Release date"), - width="12%", - accessor="release_date", - ), - PageStatusColumn("status", label=_("Status"), width="12%"), - ] - - -class HighlightedPagePageChooseView(HighlightedChildPageMixin, ChooseView): ... - - -class HighlightedPagePageChooseResultsView(HighlightedChildPageMixin, ChooseResultsView): ... +class HighlightedPagePageChooseView(HighlightedChildPageChooseViewMixin, ChooseView): ... + + +class HighlightedPagePageChooseResultsView(HighlightedChildPageChooseViewMixin, ChooseResultsView): ... class BaseHighlightedChildrenViewSet(ChooserViewSet):