92 lines
3.1 KiB
Python
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
|