Skip to content

Commit

Permalink
Move viewset mixins to own module
Browse files Browse the repository at this point in the history
  • Loading branch information
zerolab committed Feb 13, 2025
1 parent fd7c23b commit 03cb09e
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 72 deletions.
72 changes: 72 additions & 0 deletions cms/topics/mixins.py
Original file line number Diff line number Diff line change
@@ -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%"),
]
80 changes: 8 additions & 72 deletions cms/topics/viewsets.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -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):
Expand Down

0 comments on commit 03cb09e

Please sign in to comment.