aircox/aircox/views/program.py
2024-04-19 15:06:23 +02:00

92 lines
3.1 KiB
Python

import random
from django.contrib.auth.models import User
from django.contrib.auth.mixins import UserPassesTestMixin
from django.urls import reverse
from aircox import models, forms, permissions
from .mixins import VueFormDataMixin
from .page import PageDetailView, PageListView, PageUpdateView
__all__ = (
"ProgramDetailView",
"ProgramDetailView",
)
class ProgramDetailView(PageDetailView):
model = models.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 = 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 ProgramListView(PageListView):
model = models.Program
attach_to_value = models.StaticPage.Target.PROGRAMS
def get_queryset(self):
return super().get_queryset().order_by("title")
class ProgramUpdateView(UserPassesTestMixin, VueFormDataMixin, PageUpdateView):
model = models.Program
form_class = forms.ProgramForm
queryset = models.Program.objects.select_related("editors_group")
def test_func(self):
obj = self.get_object()
return permissions.program.can(self.request.user, "update", obj)
def get_editors_queryset(self, program):
# TODO: provide username in formset initials
return User.groups.through.objects.filter(group_id=program.editors_group_id).order_by("user__username")
def get_editors_formset(self, program, **kwargs):
return forms.UserGroupFormSet(
**{
**kwargs,
"prefix": "editors",
"queryset": self.get_editors_queryset(program),
"initial": {
"group": program.editors_group_id,
},
}
)
def get_context_data(self, editors_formset=None, **kwargs):
# TODO: use group and permission system
if self.request.user.is_superuser:
if editors_formset is None:
editors_formset = self.get_editors_formset(self.object)
kwargs["editors_formset_data"] = self.get_formset_data(
editors_formset, {"group": self.object.editors_group_id}
)
context = super().get_context_data(editors_formset=editors_formset, **kwargs)
return context