aircox/aircox/views/program.py
2023-11-28 01:04:39 +01:00

78 lines
2.3 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")
articles = Article.objects.parent(self.object).published().order_by("-pub_date")
return super().get_context_data(articles=articles, episodes=episodes, **kwargs)
class ProgramListView(PageListView):
model = Program
attach_to_value = StaticPage.ATTACH_TO_PROGRAMS
# 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)