code quality

This commit is contained in:
bkfox
2023-03-13 17:47:00 +01:00
parent 934817da8a
commit 112770eddf
162 changed files with 4798 additions and 4069 deletions

View File

@ -1,12 +1,40 @@
from . import admin
from .base import BaseView, BaseAPIView
from .home import HomeView
from .article import ArticleDetailView, ArticleListView
from .episode import EpisodeDetailView, EpisodeListView, DiffusionListView
from .log import LogListView, LogListAPIView
from .page import BasePageListView, BasePageDetailView, PageListView, PageDetailView
from .program import ProgramDetailView, ProgramListView, \
ProgramPageDetailView, ProgramPageListView
from .base import BaseAPIView, BaseView
from .episode import DiffusionListView, EpisodeDetailView, EpisodeListView
from .home import HomeView
from .log import LogListAPIView, LogListView
from .page import (
BasePageDetailView,
BasePageListView,
PageDetailView,
PageListView,
)
from .program import (
ProgramDetailView,
ProgramListView,
ProgramPageDetailView,
ProgramPageListView,
)
__all__ = (
"admin",
"ArticleDetailView",
"ArticleListView",
"BaseAPIView",
"BaseView",
"DiffusionListView",
"EpisodeDetailView",
"EpisodeListView",
"HomeView",
"LogListAPIView",
"LogListView",
"BasePageDetailView",
"BasePageListView",
"PageDetailView",
"PageListView",
"ProgramDetailView",
"ProgramListView",
"ProgramPageDetailView",
"ProgramPageListView",
)

View File

@ -3,17 +3,16 @@ from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.utils.translation import gettext_lazy as _
from django.views.generic import ListView
from .log import LogListView
from ..models.log import LogArchiver
from .log import LogListView
__all__ = ['AdminMixin', 'StatisticsView']
__all__ = ["AdminMixin", "StatisticsView"]
class AdminMixin(LoginRequiredMixin, UserPassesTestMixin):
title = ''
title = ""
init_app = True
""" If true, create vue app. """
"""If true, create vue app."""
@property
def station(self):
@ -24,19 +23,23 @@ class AdminMixin(LoginRequiredMixin, UserPassesTestMixin):
def get_context_data(self, **kwargs):
kwargs.update(admin.site.each_context(self.request))
kwargs.setdefault('title', self.title)
kwargs.setdefault('station', self.station)
kwargs.setdefault('init_app', self.init_app)
kwargs.setdefault("title", self.title)
kwargs.setdefault("station", self.station)
kwargs.setdefault("init_app", self.init_app)
return super().get_context_data(**kwargs)
class StatisticsView(AdminMixin, LogListView, ListView):
template_name = 'admin/aircox/statistics.html'
redirect_date_url = 'admin:tools-stats'
title = _('Statistics')
template_name = "admin/aircox/statistics.html"
redirect_date_url = "admin:tools-stats"
title = _("Statistics")
date = None
def get_object_list(self, logs, full=False):
if not logs.exists():
logs = LogArchiver().load(self.station, self.date) if self.date else []
logs = (
LogArchiver().load(self.station, self.date)
if self.date
else []
)
return super().get_object_list(logs, True)

View File

@ -1,8 +1,7 @@
from ..models import Article, Program, StaticPage
from .page import PageDetailView, PageListView
__all__ = ['ArticleDetailView', 'ArticleListView']
__all__ = ["ArticleDetailView", "ArticleListView"]
class ArticleDetailView(PageDetailView):
@ -10,8 +9,11 @@ class ArticleDetailView(PageDetailView):
model = Article
def get_sidebar_queryset(self):
qs = Article.objects.published().select_related('cover') \
.order_by('-pub_date')
qs = (
Article.objects.published()
.select_related("cover")
.order_by("-pub_date")
)
return qs
@ -20,5 +22,3 @@ class ArticleListView(PageListView):
has_headline = True
parent_model = Program
attach_to_value = StaticPage.ATTACH_TO_ARTICLES

View File

@ -1,19 +1,18 @@
from django.views.generic.base import TemplateResponseMixin, ContextMixin
from django.urls import reverse
from django.views.generic.base import ContextMixin, TemplateResponseMixin
from ..models import Page
__all__ = ('BaseView', 'BaseAPIView')
__all__ = ("BaseView", "BaseAPIView")
class BaseView(TemplateResponseMixin, ContextMixin):
has_sidebar = True
""" Show side navigation """
"""Show side navigation."""
has_filters = False
""" Show filters nav """
"""Show filters nav."""
list_count = 5
""" Item count for small lists displayed on page. """
"""Item count for small lists displayed on page."""
@property
def station(self):
@ -23,37 +22,43 @@ class BaseView(TemplateResponseMixin, ContextMixin):
# return super().get_queryset().station(self.station)
def get_sidebar_queryset(self):
""" Return a queryset of items to render on the side nav. """
return Page.objects.select_subclasses().published() \
.order_by('-pub_date')
"""Return a queryset of items to render on the side nav."""
return (
Page.objects.select_subclasses().published().order_by("-pub_date")
)
def get_sidebar_url(self):
return reverse('page-list')
return reverse("page-list")
def get_page(self):
return None
def get_context_data(self, **kwargs):
kwargs.setdefault('station', self.station)
kwargs.setdefault('page', self.get_page())
kwargs.setdefault('has_filters', self.has_filters)
kwargs.setdefault("station", self.station)
kwargs.setdefault("page", self.get_page())
kwargs.setdefault("has_filters", self.has_filters)
has_sidebar = kwargs.setdefault('has_sidebar', self.has_sidebar)
if has_sidebar and 'sidebar_object_list' not in kwargs:
has_sidebar = kwargs.setdefault("has_sidebar", self.has_sidebar)
if has_sidebar and "sidebar_object_list" not in kwargs:
sidebar_object_list = self.get_sidebar_queryset()
if sidebar_object_list is not None:
kwargs['sidebar_object_list'] = sidebar_object_list[:self.list_count]
kwargs['sidebar_list_url'] = self.get_sidebar_url()
kwargs["sidebar_object_list"] = sidebar_object_list[
: self.list_count
]
kwargs["sidebar_list_url"] = self.get_sidebar_url()
if 'audio_streams' not in kwargs:
if "audio_streams" not in kwargs:
streams = self.station.audio_streams
streams = streams and streams.split('\n')
kwargs['audio_streams'] = streams
streams = streams and streams.split("\n")
kwargs["audio_streams"] = streams
if 'model' not in kwargs:
model = getattr(self, 'model', None) or \
hasattr(self, 'object') and type(self.object)
kwargs['model'] = model
if "model" not in kwargs:
model = (
getattr(self, "model", None)
or hasattr(self, "object")
and type(self.object)
)
kwargs["model"] = model
return super().get_context_data(**kwargs)
@ -66,5 +71,3 @@ class BaseAPIView:
def get_queryset(self):
return super().get_queryset().station(self.station)

View File

@ -1,43 +1,45 @@
from collections import OrderedDict
import datetime
from django.utils.translation import gettext_lazy as _
from django.views.generic import ListView
from ..filters import EpisodeFilters
from ..models import Diffusion, Episode, Program, StaticPage, Sound
from ..models import Diffusion, Episode, Program, StaticPage
from .base import BaseView
from .program import ProgramPageDetailView
from .mixins import AttachedToMixin, GetDateMixin
from .page import PageListView
from .mixins import AttachedToMixin, GetDateMixin, ParentMixin
from .program import ProgramPageDetailView
__all__ = ['EpisodeDetailView', 'EpisodeListView', 'DiffusionListView', 'SoundListView']
__all__ = (
"EpisodeDetailView",
"EpisodeListView",
"DiffusionListView",
)
class EpisodeDetailView(ProgramPageDetailView):
model = Episode
def get_context_data(self, **kwargs):
if not 'tracks' in kwargs:
kwargs['tracks'] = self.object.track_set.order_by('position')
if "tracks" not in kwargs:
kwargs["tracks"] = self.object.track_set.order_by("position")
return super().get_context_data(**kwargs)
class EpisodeListView(PageListView):
model = Episode
filterset_class = EpisodeFilters
item_template_name = 'aircox/widgets/episode_item.html'
item_template_name = "aircox/widgets/episode_item.html"
has_headline = True
parent_model = Program
attach_to_value = StaticPage.ATTACH_TO_EPISODES
class DiffusionListView(GetDateMixin, AttachedToMixin, BaseView, ListView):
""" View for timetables """
"""View for timetables."""
model = Diffusion
has_filters = True
redirect_date_url = 'diffusion-list'
redirect_date_url = "diffusion-list"
attach_to_value = StaticPage.ATTACH_TO_DIFFUSIONS
def get_date(self):
@ -45,10 +47,9 @@ class DiffusionListView(GetDateMixin, AttachedToMixin, BaseView, ListView):
return date if date is not None else datetime.date.today()
def get_queryset(self):
return super().get_queryset().date(self.date).order_by('start')
return super().get_queryset().date(self.date).order_by("start")
def get_context_data(self, **kwargs):
start = self.date - datetime.timedelta(days=self.date.weekday())
dates = [start + datetime.timedelta(days=i) for i in range(0, 7)]
return super().get_context_data(date=self.date, dates=dates, **kwargs)

View File

@ -1,19 +1,17 @@
from datetime import date
from django.utils.translation import gettext as _
from django.utils import timezone as tz
from django.views.generic import ListView
from ..models import Diffusion, Log, Page, StaticPage
from .base import BaseView
from .page import PageListView
class HomeView(BaseView, ListView):
template_name = 'aircox/home.html'
template_name = "aircox/home.html"
model = Diffusion
attach_to_value = StaticPage.ATTACH_TO_HOME
queryset = Diffusion.objects.on_air().select_related('episode')
queryset = Diffusion.objects.on_air().select_related("episode")
logs_count = 5
publications_count = 5
has_filters = False
@ -32,15 +30,16 @@ class HomeView(BaseView, ListView):
current_diff = Diffusion.objects.on_air().now(now).first()
next_diffs = Diffusion.objects.on_air().after(now)
if current_diff:
diffs = [current_diff] + list(next_diffs.exclude(pk=current_diff.pk)[:2])
diffs = [current_diff] + list(
next_diffs.exclude(pk=current_diff.pk)[:2]
)
else:
diffs = next_diffs[:3]
return diffs
def get_last_publications(self):
# note: with postgres db, possible to use distinct()
qs = Page.objects.select_subclasses().published() \
.order_by('-pub_date')
qs = Page.objects.select_subclasses().published().order_by("-pub_date")
parents = set()
items = []
for publication in qs:
@ -54,8 +53,7 @@ class HomeView(BaseView, ListView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['logs'] = self.get_logs(context['object_list'])
context['next_diffs'] = self.get_next_diffs()
context['last_publications'] = self.get_last_publications()[:5]
context["logs"] = self.get_logs(context["object_list"])
context["next_diffs"] = self.get_next_diffs()
context["last_publications"] = self.get_last_publications()[:5]
return context

View File

@ -1,22 +1,17 @@
from collections import deque
import datetime
from django.utils import timezone as tz
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import ListView
from django.utils import timezone as tz
from rest_framework.generics import ListAPIView
from rest_framework import viewsets
from rest_framework.decorators import action
from ..models import Diffusion, Log, StaticPage
from ..serializers import LogInfo, LogInfoSerializer
from .base import BaseView, BaseAPIView
from .mixins import GetDateMixin, AttachedToMixin
from .base import BaseAPIView, BaseView
from .mixins import AttachedToMixin, GetDateMixin
__all__ = ['LogListMixin', 'LogListView']
__all__ = ["LogListMixin", "LogListView"]
class LogListMixin(GetDateMixin):
@ -32,21 +27,39 @@ class LogListMixin(GetDateMixin):
def get_queryset(self):
# only get logs for tracks: log for diffusion will be retrieved
# by the diffusions' queryset.
qs = super().get_queryset().on_air().filter(track__isnull=False) \
.filter(date__lte=tz.now())
return qs.date(self.date) if self.date is not None else \
qs.after(self.min_date) if self.min_date is not None else qs
qs = (
super()
.get_queryset()
.on_air()
.filter(track__isnull=False)
.filter(date__lte=tz.now())
)
return (
qs.date(self.date)
if self.date is not None
else qs.after(self.min_date)
if self.min_date is not None
else qs
)
def get_diffusions_queryset(self):
qs = Diffusion.objects.station(self.station).on_air() \
.filter(start__lte=tz.now())
return qs.date(self.date) if self.date is not None else \
qs.after(self.min_date) if self.min_date is not None else qs
qs = (
Diffusion.objects.station(self.station)
.on_air()
.filter(start__lte=tz.now())
)
return (
qs.date(self.date)
if self.date is not None
else qs.after(self.min_date)
if self.min_date is not None
else qs
)
def get_object_list(self, logs, full=False):
"""
Return diffusions merged to the provided logs iterable. If
`full`, sort items by date without merging.
"""Return diffusions merged to the provided logs iterable.
If `full`, sort items by date without merging.
"""
diffs = self.get_diffusions_queryset()
if self.request.user.is_staff and full:
@ -55,11 +68,10 @@ class LogListMixin(GetDateMixin):
class LogListView(AttachedToMixin, BaseView, LogListMixin, ListView):
"""
Return list of logs for the provided date (from `kwargs` or
`request.GET`, defaults to today).
"""
redirect_date_url = 'log-list'
"""Return list of logs for the provided date (from `kwargs` or
`request.GET`, defaults to today)."""
redirect_date_url = "log-list"
has_filters = True
attach_to_value = StaticPage.ATTACH_TO_LOGS
@ -72,24 +84,28 @@ class LogListView(AttachedToMixin, BaseView, LogListMixin, ListView):
# `super()...` must be called before updating kwargs, in order
# to get `self.object_list`
kwargs = super().get_context_data(**kwargs)
kwargs.update({
'date': self.date,
'dates': (today - datetime.timedelta(days=i) for i in range(0, 7)),
'object_list': self.get_object_list(self.object_list),
})
kwargs.update(
{
"date": self.date,
"dates": (
today - datetime.timedelta(days=i) for i in range(0, 7)
),
"object_list": self.get_object_list(self.object_list),
}
)
return kwargs
# Logs are accessible through API only with this list view
class LogListAPIView(LogListMixin, BaseAPIView, ListAPIView):
"""
Return logs list, including diffusions. By default return logs of
the last 30 minutes.
"""Return logs list, including diffusions. By default return logs of the
last 30 minutes.
Available GET parameters:
- "date": return logs for a specified date (
- "full": (staff user only) don't merge diffusion and logs
"""
serializer_class = LogInfoSerializer
queryset = Log.objects.all()
@ -107,7 +123,7 @@ class LogListAPIView(LogListMixin, BaseAPIView, ListAPIView):
return [LogInfo(obj) for obj in super().get_object_list(logs, full)]
def get_serializer(self, queryset, *args, **kwargs):
full = bool(self.request.GET.get('full'))
return super().get_serializer(self.get_object_list(queryset, full),
*args, **kwargs)
full = bool(self.request.GET.get("full"))
return super().get_serializer(
self.get_object_list(queryset, full), *args, **kwargs
)

View File

@ -1,49 +1,54 @@
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse
from ..utils import str_to_date
from ..models import StaticPage
from ..utils import str_to_date
__all__ = ['GetDateMixin', 'ParentMixin', 'AttachedToMixin']
__all__ = ["GetDateMixin", "ParentMixin", "AttachedToMixin"]
class GetDateMixin:
"""
Mixin offering utils to get date by `request.GET` or
`kwargs['date']`
"""
"""Mixin offering utils to get date by `request.GET` or `kwargs['date']`"""
date = None
redirect_date_url = None
def get_date(self):
date = self.request.GET.get('date')
return str_to_date(date, '-') if date is not None else \
self.kwargs['date'] if 'date' in self.kwargs else None
date = self.request.GET.get("date")
return (
str_to_date(date, "-")
if date is not None
else self.kwargs["date"]
if "date" in self.kwargs
else None
)
def get(self, *args, **kwargs):
if self.redirect_date_url and self.request.GET.get('date'):
return redirect(self.redirect_date_url,
date=self.request.GET['date'].replace('-', '/'))
if self.redirect_date_url and self.request.GET.get("date"):
return redirect(
self.redirect_date_url,
date=self.request.GET["date"].replace("-", "/"),
)
self.date = self.get_date()
return super().get(*args, **kwargs)
class ParentMixin:
"""Optional parent page for a list view.
Parent is fetched and passed to the template context when
`parent_model` is provided (queryset is filtered by parent page in
such case).
"""
Optional parent page for a list view. Parent is fetched and passed to the
template context when `parent_model` is provided (queryset is filtered by
parent page in such case).
"""
parent_model = None
""" Parent model """
parent_url_kwarg = 'parent_slug'
""" Url lookup argument """
parent_field = 'slug'
""" Parent field for url lookup """
"""Parent model."""
parent_url_kwarg = "parent_slug"
"""Url lookup argument."""
parent_field = "slug"
"""Parent field for url lookup."""
parent = None
""" Parent page object """
"""Parent page object."""
def get_parent(self, request, *args, **kwargs):
if self.parent_model is None or self.parent_url_kwarg not in kwargs:
@ -51,7 +56,8 @@ class ParentMixin:
lookup = {self.parent_field: kwargs[self.parent_url_kwarg]}
return get_object_or_404(
self.parent_model.objects.select_related('cover'), **lookup)
self.parent_model.objects.select_related("cover"), **lookup
)
def get(self, request, *args, **kwargs):
self.parent = self.get_parent(request, *args, **kwargs)
@ -63,32 +69,37 @@ class ParentMixin:
return super().get_queryset()
def get_context_data(self, **kwargs):
self.parent = kwargs.setdefault('parent', self.parent)
self.parent = kwargs.setdefault("parent", self.parent)
if self.parent is not None:
kwargs.setdefault('cover', self.parent.cover)
kwargs.setdefault("cover", self.parent.cover)
return super().get_context_data(**kwargs)
class AttachedToMixin:
""" Mixin for views that can have a static page attached to it. """
"""Mixin for views that can have a static page attached to it."""
attach_to_value = None
""" Value of StaticPage.attach_to """
"""Value of StaticPage.attach_to."""
def get_page(self):
if self.attach_to_value is not None:
return StaticPage.objects.filter(attach_to=self.attach_to_value) \
.published().first()
return (
StaticPage.objects.filter(attach_to=self.attach_to_value)
.published()
.first()
)
return super().get_page()
class FiltersMixin:
""" Mixin integrating Django filters' filter set """
"""Mixin integrating Django filters' filter set."""
filterset = None
filterset_class = None
def get_filterset(self, data, query):
return self.filterset_class(data, query)
def get_queryset(self):
query = super().get_queryset()
if self.filterset_class:
@ -97,13 +108,12 @@ class FiltersMixin:
return query
def get_context_data(self, **kwargs):
filterset = kwargs.setdefault('filterset', self.filterset)
filterset = kwargs.setdefault("filterset", self.filterset)
if filterset.is_valid():
kwargs['filterset_data'] = filterset.form.cleaned_data
kwargs["filterset_data"] = filterset.form.cleaned_data
else:
kwargs['filterset_data'] = {}
kwargs["filterset_data"] = {}
params = self.request.GET.copy()
kwargs['get_params'] = params.pop('page', True) and params
kwargs["get_params"] = params.pop("page", True) and params
return super().get_context_data(**kwargs)

View File

@ -1,25 +1,28 @@
from django.http import Http404, HttpResponse
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, ListView
from honeypot.decorators import check_honeypot
from ..filters import PageFilters
from ..forms import CommentForm
from ..models import Category, Comment
from ..models import Comment
from ..utils import Redirect
from .base import BaseView
from .mixins import AttachedToMixin, FiltersMixin, ParentMixin
__all__ = ['BasePageListView', 'BasePageDetailView', 'PageDetailView', 'PageListView']
__all__ = [
"BasePageListView",
"BasePageDetailView",
"PageDetailView",
"PageListView",
]
class BasePageListView(AttachedToMixin, ParentMixin, BaseView, ListView):
""" Base view class for BasePage list. """
template_name = 'aircox/basepage_list.html'
item_template_name = 'aircox/widgets/page_item.html'
"""Base view class for BasePage list."""
template_name = "aircox/basepage_list.html"
item_template_name = "aircox/widgets/page_item.html"
has_sidebar = True
paginate_by = 30
@ -29,35 +32,39 @@ class BasePageListView(AttachedToMixin, ParentMixin, BaseView, ListView):
return super().get(*args, **kwargs)
def get_queryset(self):
return super().get_queryset().select_subclasses().published() \
.select_related('cover')
return (
super()
.get_queryset()
.select_subclasses()
.published()
.select_related("cover")
)
def get_context_data(self, **kwargs):
kwargs.setdefault('item_template_name', self.item_template_name)
kwargs.setdefault('has_headline', self.has_headline)
kwargs.setdefault("item_template_name", self.item_template_name)
kwargs.setdefault("has_headline", self.has_headline)
return super().get_context_data(**kwargs)
class BasePageDetailView(BaseView, DetailView):
""" Base view class for BasePage. """
template_name = 'aircox/basepage_detail.html'
context_object_name = 'page'
"""Base view class for BasePage."""
template_name = "aircox/basepage_detail.html"
context_object_name = "page"
has_filters = False
def get_queryset(self):
return super().get_queryset().select_related('cover')
return super().get_queryset().select_related("cover")
# This should not exists: it allows mapping not published pages
# or it should be only used for trashed pages.
def not_published_redirect(self, page):
"""
When a page is not published, redirect to the returned url instead of an
HTTP 404 code.
"""
"""When a page is not published, redirect to the returned url instead
of an HTTP 404 code."""
return None
def get_object(self):
if getattr(self, 'object', None):
if getattr(self, "object", None):
return self.object
obj = super().get_object()
@ -65,7 +72,7 @@ class BasePageDetailView(BaseView, DetailView):
redirect_url = self.not_published_redirect(obj)
if redirect_url:
raise Redirect(redirect_url)
raise Http404('%s not found' % self.model._meta.verbose_name)
raise Http404("%s not found" % self.model._meta.verbose_name)
return obj
def get_page(self):
@ -73,7 +80,8 @@ class BasePageDetailView(BaseView, DetailView):
class PageListView(FiltersMixin, BasePageListView):
""" Page list view. """
"""Page list view."""
filterset_class = PageFilters
template_name = None
has_filters = True
@ -81,58 +89,65 @@ class PageListView(FiltersMixin, BasePageListView):
filters = None
def get_template_names(self):
return super().get_template_names() + ['aircox/page_list.html']
return super().get_template_names() + ["aircox/page_list.html"]
def get_filterset(self, data, query):
# FIXME: not the most efficient, cause join then split (in django filters)
data['category__id__in'] = ','.join(data.getlist('category__id__in'))
# FIXME: not the most efficient, cause join then split (django filters)
data["category__id__in"] = ",".join(data.getlist("category__id__in"))
return super().get_filterset(data, query)
def get_queryset(self):
qs = super().get_queryset().select_related('category') \
.order_by('-pub_date')
qs = (
super()
.get_queryset()
.select_related("category")
.order_by("-pub_date")
)
return qs
def get_context_data(self, **kwargs):
kwargs['categories'] = self.model.objects.published() \
.filter(category__isnull=False) \
.values_list('category__title', 'category__id') \
.distinct()
kwargs["categories"] = (
self.model.objects.published()
.filter(category__isnull=False)
.values_list("category__title", "category__id")
.distinct()
)
return super().get_context_data(**kwargs)
class PageDetailView(BasePageDetailView):
""" Base view class for pages. """
"""Base view class for pages."""
template_name = None
context_object_name = 'page'
context_object_name = "page"
has_filters = False
def get_template_names(self):
return super().get_template_names() + ['aircox/page_detail.html']
return super().get_template_names() + ["aircox/page_detail.html"]
def get_queryset(self):
return super().get_queryset().select_related('category')
return super().get_queryset().select_related("category")
def get_context_data(self, **kwargs):
if self.object.allow_comments and not 'comment_form' in kwargs:
kwargs['comment_form'] = CommentForm()
kwargs['comments'] = Comment.objects.filter(page=self.object) \
.order_by('-date')
if self.object.allow_comments and "comment_form" not in kwargs:
kwargs["comment_form"] = CommentForm()
kwargs["comments"] = Comment.objects.filter(page=self.object).order_by(
"-date"
)
return super().get_context_data(**kwargs)
@classmethod
def as_view(cls, *args, **kwargs):
view = super(PageDetailView, cls).as_view(*args, **kwargs)
return check_honeypot(view, field_name='website')
return check_honeypot(view, field_name="website")
def post(self, request, *args, **kwargs):
self.object = self.get_object()
if not self.object.allow_comments:
return HttpResponse(_('comments are not allowed'), status=503)
return HttpResponse(_("comments are not allowed"), status=503)
form = CommentForm(request.POST)
comment = form.save(commit=False)
comment.page = self.object
comment.save()
return self.get(request, *args, **kwargs)

View File

@ -1,14 +1,10 @@
from django.db.models import Q
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import get_object_or_404
from django.urls import reverse
from ..models import Episode, Program, Page, StaticPage
from .mixins import ParentMixin, AttachedToMixin
from ..models import Page, Program, StaticPage
from .mixins import ParentMixin
from .page import PageDetailView, PageListView
__all__ = ['ProgramPageDetailView', 'ProgramDetailView', 'ProgramPageListView']
__all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"]
class BaseProgramMixin:
@ -16,12 +12,13 @@ class BaseProgramMixin:
return self.object
def get_sidebar_url(self):
return reverse('program-page-list',
kwargs={"parent_slug": self.program.slug})
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
kwargs["program"] = self.program
return super().get_context_data(**kwargs)
@ -39,9 +36,9 @@ class ProgramListView(PageListView):
# FIXME: not used
class ProgramPageDetailView(BaseProgramMixin, ParentMixin, PageDetailView):
"""
Base view class for a page that is displayed as a program's child page.
"""
"""Base view class for a page that is displayed as a program's child
page."""
parent_model = Program
def get_program(self):
@ -61,6 +58,5 @@ class ProgramPageListView(BaseProgramMixin, PageListView):
return self.parent
def get_context_data(self, **kwargs):
kwargs.setdefault('sidebar_url_parent', None)
kwargs.setdefault("sidebar_url_parent", None)
return super().get_context_data(**kwargs)