87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
import random
|
|
|
|
from django.urls import reverse
|
|
|
|
from ..models import Article, Page, Program, StaticPage, Episode
|
|
from .mixins import ParentMixin
|
|
from .page import PageDetailView, PageListView
|
|
|
|
__all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"]
|
|
|
|
|
|
class BaseProgramMixin:
|
|
def get_program(self):
|
|
return self.object
|
|
|
|
def get_sidebar_url(self):
|
|
return reverse("program-page-list", kwargs={"parent_slug": self.program.slug})
|
|
|
|
def get_context_data(self, **kwargs):
|
|
self.program = self.get_program()
|
|
kwargs["program"] = self.program
|
|
return super().get_context_data(**kwargs)
|
|
|
|
|
|
class ProgramDetailView(BaseProgramMixin, PageDetailView):
|
|
model = Program
|
|
|
|
def get_related_queryset(self):
|
|
queryset = (
|
|
self.get_queryset()
|
|
.filter(category_id=self.object.category_id)
|
|
.exclude(pk=self.object.pk)
|
|
.published()
|
|
.order_by("-pub_date")[:50]
|
|
)
|
|
return random.sample(list(queryset), min(len(queryset), self.related_count))
|
|
|
|
def get_related_url(self):
|
|
return reverse("program-list") + f"?category__id={self.object.category_id}"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
episodes = Episode.objects.program(self.object).published().order_by("-pub_date")
|
|
podcasts = episodes.with_podcasts()
|
|
articles = Article.objects.parent(self.object).published().order_by("-pub_date")
|
|
return super().get_context_data(
|
|
articles=articles[: self.related_count],
|
|
episodes=episodes[: self.related_count],
|
|
podcasts=podcasts[: self.related_count],
|
|
**kwargs,
|
|
)
|
|
|
|
|
|
class ProgramListView(PageListView):
|
|
model = Program
|
|
attach_to_value = StaticPage.Target.PROGRAMS
|
|
|
|
def get_queryset(self):
|
|
return super().get_queryset().order_by("title")
|
|
|
|
|
|
# FIXME: not used
|
|
class ProgramPageDetailView(BaseProgramMixin, ParentMixin, PageDetailView):
|
|
"""Base view class for a page that is displayed as a program's child
|
|
page."""
|
|
|
|
parent_model = Program
|
|
|
|
def get_program(self):
|
|
self.parent = self.object.program
|
|
return self.object.program
|
|
|
|
def get_sidebar_queryset(self):
|
|
return super().get_sidebar_queryset().filter(parent=self.program)
|
|
|
|
|
|
class ProgramPageListView(BaseProgramMixin, PageListView):
|
|
model = Page
|
|
parent_model = Program
|
|
queryset = Page.objects.select_subclasses()
|
|
|
|
def get_program(self):
|
|
return self.parent
|
|
|
|
def get_context_data(self, **kwargs):
|
|
kwargs.setdefault("sidebar_url_parent", None)
|
|
return super().get_context_data(**kwargs)
|