88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
from django.contrib.auth.mixins import UserPassesTestMixin
|
|
from django.forms.models import modelformset_factory
|
|
from django.urls import reverse
|
|
|
|
from aircox.forms import EpisodeForm
|
|
from aircox.models import Episode, Program, StaticPage, Track
|
|
from ..filters import EpisodeFilters
|
|
from .page import PageListView
|
|
from .program import ProgramPageDetailView, BaseProgramMixin
|
|
from .page import PageUpdateView
|
|
|
|
|
|
__all__ = (
|
|
"EpisodeDetailView",
|
|
"EpisodeListView",
|
|
"PodcastListView",
|
|
"EpisodeUpdateView",
|
|
)
|
|
|
|
|
|
class EpisodeDetailView(ProgramPageDetailView):
|
|
model = Episode
|
|
|
|
def get_context_data(self, **kwargs):
|
|
if "tracks" not in kwargs:
|
|
kwargs["tracks"] = self.object.track_set.order_by("position")
|
|
return super().get_context_data(**kwargs)
|
|
|
|
def get_related_queryset(self):
|
|
return (
|
|
self.get_queryset().parent(self.object.parent).exclude(pk=self.object.pk).published().order_by("-pub_date")
|
|
)
|
|
|
|
def get_related_url(self):
|
|
return reverse("episode-list", kwargs={"parent_slug": self.object.parent.slug})
|
|
|
|
|
|
class EpisodeListView(PageListView):
|
|
model = Episode
|
|
filterset_class = EpisodeFilters
|
|
parent_model = Program
|
|
attach_to_value = StaticPage.Target.EPISODES
|
|
|
|
|
|
class PodcastListView(EpisodeListView):
|
|
attach_to_value = StaticPage.Target.PODCASTS
|
|
queryset = Episode.objects.published().with_podcasts().order_by("-pub_date")
|
|
|
|
|
|
class EpisodeUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView):
|
|
model = Episode
|
|
form_class = EpisodeForm
|
|
template_name = "aircox/episode_form.html"
|
|
|
|
def get_sidebar_queryset(self):
|
|
return super().get_sidebar_queryset().filter(parent=self.program)
|
|
|
|
def test_func(self):
|
|
program = self.get_object().program
|
|
return self.request.user.has_perm("aircox.%s" % program.change_permission_codename)
|
|
|
|
def get_success_url(self):
|
|
return reverse("episode-detail", kwargs={"slug": self.get_object().slug})
|
|
|
|
def get_object(self, queryset=None):
|
|
obj = Episode.objects.get(pk=self.kwargs["pk"])
|
|
return obj
|
|
|
|
def get_formset(self, *args, **kwargs):
|
|
fields = ("position", "artist", "title", "tags", "album", "year", "info")
|
|
TrackFormSet = modelformset_factory(Track, fields=fields, extra=0)
|
|
return TrackFormSet(*args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context["fields"] = ("position", "artist", "title", "tags", "album", "year", "info")
|
|
context["formset"] = self.get_formset(queryset=Track.objects.filter(episode=self.object))
|
|
return context
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
super().post(request, *args, **kwargs)
|
|
formset = self.get_formset(request.POST)
|
|
if formset.is_valid():
|
|
formset.save()
|
|
return super().form_valid(formset)
|
|
else:
|
|
return super().form_valid(formset) # form_invalid(formset)
|