forked from rc/aircox
work on home page, fix views & templates issues
This commit is contained in:
@ -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
|
||||
|
||||
|
@ -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'),
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
44
aircox/views/home.py
Normal 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)
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user