forked from rc/aircox
cfr #121 Co-authored-by: Christophe Siraut <d@tobald.eu.org> Co-authored-by: bkfox <thomas bkfox net> Co-authored-by: Thomas Kairos <thomas@bkfox.net> Reviewed-on: rc/aircox#131 Co-authored-by: Chris Tactic <ctactic@noreply.git.radiocampus.be> Co-committed-by: Chris Tactic <ctactic@noreply.git.radiocampus.be>
This commit is contained in:
@ -1,60 +1,76 @@
|
||||
import random
|
||||
|
||||
from django.contrib.auth.mixins import PermissionRequiredMixin, UserPassesTestMixin
|
||||
from django.urls import reverse
|
||||
|
||||
from ..models import Page, Program, StaticPage
|
||||
from .mixins import ParentMixin
|
||||
from .page import PageDetailView, PageListView
|
||||
|
||||
__all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"]
|
||||
from aircox import models, forms, permissions
|
||||
from . import page
|
||||
from .mixins import VueFormDataMixin
|
||||
|
||||
|
||||
class BaseProgramMixin:
|
||||
def get_program(self):
|
||||
return self.object
|
||||
__all__ = (
|
||||
"ProgramDetailView",
|
||||
"ProgramDetailView",
|
||||
"ProgramCreateView",
|
||||
"ProgramUpdateView",
|
||||
)
|
||||
|
||||
def get_sidebar_url(self):
|
||||
return reverse("program-page-list", kwargs={"parent_slug": self.program.slug})
|
||||
|
||||
class ProgramDetailView(page.PageDetailView):
|
||||
model = models.Program
|
||||
|
||||
def can_edit(self, obj):
|
||||
return permissions.program.can(self.request.user, "update", obj)
|
||||
|
||||
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):
|
||||
self.program = self.get_program()
|
||||
kwargs["program"] = self.program
|
||||
return super().get_context_data(**kwargs)
|
||||
episodes = models.Episode.objects.program(self.object).published().order_by("-pub_date")
|
||||
podcasts = episodes.with_podcasts()
|
||||
articles = models.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,
|
||||
)
|
||||
|
||||
def get_template_names(self):
|
||||
return super().get_template_names() + ["aircox/program_detail.html"]
|
||||
|
||||
|
||||
class ProgramDetailView(BaseProgramMixin, PageDetailView):
|
||||
model = Program
|
||||
@page.attach
|
||||
class ProgramListView(page.PageListView):
|
||||
model = models.Program
|
||||
attach_to_value = models.StaticPage.Target.PROGRAMS
|
||||
|
||||
def get_sidebar_queryset(self):
|
||||
return super().get_sidebar_queryset().filter(parent=self.program)
|
||||
def get_queryset(self):
|
||||
return super().get_queryset().order_by("title")
|
||||
|
||||
|
||||
class ProgramListView(PageListView):
|
||||
model = Program
|
||||
attach_to_value = StaticPage.ATTACH_TO_PROGRAMS
|
||||
class ProgramEditMixin(VueFormDataMixin):
|
||||
model = models.Program
|
||||
form_class = forms.ProgramForm
|
||||
queryset = models.Program.objects.select_related("editors_group")
|
||||
|
||||
|
||||
# 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)
|
||||
# FIXME: not used as long there is no complete administration mgt (schedule, etc.)
|
||||
class ProgramCreateView(PermissionRequiredMixin, ProgramEditMixin, page.PageCreateView):
|
||||
permission_required = "aircox.add_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)
|
||||
class ProgramUpdateView(UserPassesTestMixin, ProgramEditMixin, page.PageUpdateView):
|
||||
def test_func(self):
|
||||
obj = self.get_object()
|
||||
return permissions.program.can(self.request.user, "update", obj)
|
||||
|
Reference in New Issue
Block a user