work on home page, fix views & templates issues

This commit is contained in:
bkfox
2019-09-10 17:57:24 +02:00
parent 215a6ac331
commit e30d1b54ef
51 changed files with 658 additions and 276 deletions

View File

@ -1,9 +1,12 @@
from . import api, admin
from .article import ArticleDetailView, ArticleListView
from .base import BaseView
from .home import HomeView
from .article import ArticleDetailView, ArticleListView
from .episode import EpisodeDetailView, EpisodeListView, DiffusionListView
from .log import LogListView
from .page import PageDetailView, PageListView
from .program import ProgramDetailView, ProgramPageListView
from .program import ProgramDetailView, ProgramListView, \
ProgramPageDetailView, ProgramPageListView

View File

@ -44,8 +44,7 @@ class AdminSite(admin.AdminSite):
def get_urls(self):
from django.urls import path, include
urls = super().get_urls()
urls += [
urls = super().get_urls() + [
path('tools/statistics/',
self.admin_view(StatisticsView.as_view()),
name='tools-stats'),

View File

@ -4,7 +4,6 @@ from django.utils import timezone as tz
from rest_framework.generics import ListAPIView
from ..utils import str_to_date
from ..models import Log
from ..serializers import LogInfo, LogInfoSerializer
from .log import LogListMixin

View File

@ -25,7 +25,7 @@ class ArticleDetailView(PageDetailView):
class ArticleListView(ParentMixin, PageListView):
model = Article
template_name = 'aircox/article_list.html'
show_headline = True
has_headline = True
is_static = False
parent_model = Program

View File

@ -2,6 +2,7 @@
from django.http import Http404
from django.views.generic import DetailView, ListView
from django.views.generic.base import TemplateResponseMixin, ContextMixin
from django.urls import reverse
from ..models import Page
from ..utils import Redirect
@ -35,21 +36,25 @@ class BaseView(TemplateResponseMixin, ContextMixin):
return Page.objects.select_subclasses().published() \
.order_by('-pub_date')
def get_context_data(self, sidebar_items=None, **kwargs):
def get_sidebar_url(self):
return reverse('page-list')
def get_context_data(self, **kwargs):
kwargs.setdefault('station', self.station)
kwargs.setdefault('cover', self.cover)
kwargs.setdefault('has_filters', self.has_filters)
has_sidebar = kwargs.setdefault('has_sidebar', self.has_sidebar)
if has_sidebar and sidebar_items is None:
sidebar_items = self.get_sidebar_queryset()
sidebar_items = None if sidebar_items is None else \
sidebar_items[:self.list_count]
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()
if not 'audio_streams' in kwargs:
streams = self.station.audio_streams
streams = streams and streams.split('\n')
kwargs['audio_streams'] = streams
return super().get_context_data(sidebar_items=sidebar_items, **kwargs)
return super().get_context_data(**kwargs)

View File

@ -21,9 +21,6 @@ class EpisodeDetailView(ProgramPageDetailView):
return Sound.objects.diffusion(diffusion).podcasts()
def get_context_data(self, **kwargs):
self.program = kwargs.setdefault('program', self.object.program)
kwargs.setdefault('parent', self.program)
if not 'tracks' in kwargs:
kwargs['tracks'] = self.object.track_set.order_by('position')
if not 'podcasts' in kwargs:
@ -33,8 +30,8 @@ class EpisodeDetailView(ProgramPageDetailView):
class EpisodeListView(ParentMixin, PageListView):
model = Episode
item_template_name = 'aircox/episode_item.html'
show_headline = True
item_template_name = 'aircox/widgets/episode_item.html'
has_headline = True
parent_model = Program

44
aircox/views/home.py Normal file
View File

@ -0,0 +1,44 @@
import datetime
from django.utils.translation import ugettext as _
from django.utils import timezone as tz
from ..models import Diffusion, Log, Page
from .page import PageListView
class HomeView(PageListView):
template_name = 'aircox/home.html'
model = Page
queryset = Page.objects.select_subclasses()
paginate_by = 10
list_count = 40
logs_count = 5
has_filters = False
def get_logs(self):
today = datetime.date.today()
logs = Log.objects.on_air().today(today).filter(track__isnull=False)
diffs = Diffusion.objects.on_air().today(today)
return Log.merge_diffusions(logs, diffs, self.logs_count)
def get_sidebar_queryset(self):
today = datetime.date.today()
return Diffusion.objects.on_air().today(today)
def get_top_diffs(self):
now = tz.now()
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])
else:
diffs = next_diffs[:3]
return diffs
def get_context_data(self, **kwargs):
kwargs['logs'] = self.get_logs()
kwargs['top_diffs'] = self.get_top_diffs()
return super().get_context_data(**kwargs)

View File

@ -2,6 +2,7 @@ from collections import deque
import datetime
from django.views.generic import ListView
from django.utils import timezone as tz
from ..models import Diffusion, Log
from .base import BaseView
@ -23,12 +24,14 @@ 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)
qs = super().get_queryset().on_air().filter(track__isnull=False) \
.filter(date__lte=tz.now())
return qs.today(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()
qs = Diffusion.objects.station(self.station).on_air() \
.filter(start__lte=tz.now())
return qs.today(self.date) if self.date is not None else \
qs.after(self.min_date) if self.min_date is not None else qs

View File

@ -63,9 +63,9 @@ class ParentMixin:
return super().get_queryset()
def get_context_data(self, **kwargs):
parent = kwargs.setdefault('parent', self.parent)
if parent is not None:
kwargs.setdefault('cover', parent.cover)
self.parent = kwargs.setdefault('parent', self.parent)
if self.parent is not None:
kwargs.setdefault('cover', self.parent.cover)
return super().get_context_data(**kwargs)

View File

@ -6,7 +6,7 @@ from django.views.generic import DetailView, ListView
from honeypot.decorators import check_honeypot
from ..forms import CommentForm
from ..models import Category, Comment
from ..models import Category, Comment, Page
from ..utils import Redirect
from .base import BaseView
@ -17,12 +17,12 @@ __all__ = ['PageDetailView', 'PageListView']
# TODO: pagination: in template, only a limited number of pages displayed
class PageListView(BaseView, ListView):
template_name = 'aircox/page_list.html'
item_template_name = 'aircox/page_item.html'
item_template_name = 'aircox/widgets/page_item.html'
has_sidebar = True
has_filters = True
paginate_by = 20
show_headline = True
has_headline = True
categories = None
def get(self, *args, **kwargs):
@ -30,7 +30,7 @@ class PageListView(BaseView, ListView):
return super().get(*args, **kwargs)
def get_queryset(self):
qs = super().get_queryset().published() \
qs = super().get_queryset().select_subclasses().published() \
.select_related('cover', 'category')
# category can be filtered based on request.GET['categories']
@ -50,7 +50,7 @@ class PageListView(BaseView, ListView):
kwargs.setdefault('item_template_name', self.item_template_name)
kwargs.setdefault('filter_categories', self.get_categories_queryset())
kwargs.setdefault('categories', self.categories)
kwargs.setdefault('show_headline', self.show_headline)
kwargs.setdefault('has_headline', self.has_headline)
return super().get_context_data(**kwargs)

View File

@ -1,6 +1,7 @@
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
from .mixins import ParentMixin
@ -10,30 +11,54 @@ from .page import PageDetailView, PageListView
__all__ = ['ProgramPageDetailView', 'ProgramDetailView', 'ProgramPageListView']
class ProgramPageDetailView(PageDetailView):
class BaseProgramMixin:
def get_program(self):
return self.object
def get_sidebar_url(self):
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
return super().get_context_data(**kwargs)
class ProgramDetailView(BaseProgramMixin, PageDetailView):
model = Program
def get_sidebar_queryset(self):
return super().get_sidebar_queryset().filter(parent=self.program)
class ProgramListView(PageListView):
model = Program
class ProgramPageDetailView(BaseProgramMixin, ParentMixin, PageDetailView):
"""
Base view class for a page that is displayed as a program's child page.
"""
program = None
has_sidebar = True
list_count = 5
parent_model = Program
def get_program(self):
self.parent = self.object.program
return self.object.program
def get_sidebar_queryset(self):
return super().get_sidebar_queryset().filter(parent=self.object)
return super().get_sidebar_queryset().filter(parent=self.program)
class ProgramPageListView(ParentMixin, PageListView):
class ProgramPageListView(BaseProgramMixin, ParentMixin, PageListView):
model = Page
parent_model = Program
queryset = Page.objects.select_subclasses()
class ProgramDetailView(ProgramPageDetailView):
model = Program
def get_program(self):
return self.parent
def get_context_data(self, **kwargs):
self.program = kwargs.setdefault('program', self.object)
kwargs.setdefault('sidebar_url_parent', None)
return super().get_context_data(**kwargs)