forked from rc/aircox
code quality
This commit is contained in:
@ -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",
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user