From 0a2f32c061d329da41996bde7ce854743a8cf974 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 15 Sep 2013 18:04:33 +0200 Subject: [PATCH] listen archives page --- panikweb/paniktags/templatetags/paniktags.py | 8 ++-- panikweb/search.py | 36 ++++++++++++++-- panikweb/urls.py | 2 +- panikweb/views.py | 34 +-------------- panikweb_templates/templates/listen.html | 4 +- .../templates/listen/archives.html | 43 +++++++++++++++---- panikweb_templates/templates/listen/nav.html | 2 +- .../templates/soundfiles/resume.html | 6 +-- 8 files changed, 80 insertions(+), 55 deletions(-) diff --git a/panikweb/paniktags/templatetags/paniktags.py b/panikweb/paniktags/templatetags/paniktags.py index ec5d7a0..f836f10 100644 --- a/panikweb/paniktags/templatetags/paniktags.py +++ b/panikweb/paniktags/templatetags/paniktags.py @@ -11,6 +11,7 @@ from django.db.models.query import QuerySet from django.utils import simplejson from datetime import datetime, timedelta +from emissions.models import Emission, Episode, NewsItem from emissions.utils import period_program from panikweb import utils @@ -94,8 +95,9 @@ def emission_inline(context, date=None): } @register.inclusion_tag('soundfiles/resume.html') -def soundfile_resume(soundfile): - return {'soundfile': soundfile} +def soundfile_resume(soundfile, date=None): + return {'soundfile': soundfile, + 'date': date} @register.inclusion_tag('includes/player.html', takes_context=False) def player(): @@ -225,5 +227,5 @@ def rfc822(datetime): @register.inclusion_tag('includes/related.html', takes_context=False) def related_objects(object): - sqs = search.MoreLikeThisSearchQuerySet() + sqs = search.MoreLikeThisSearchQuerySet().models(Emission, Episode, NewsItem) return {'more_like_this': sqs.more_like_this(object)[:12]} diff --git a/panikweb/search.py b/panikweb/search.py index 76d0f25..39f3371 100644 --- a/panikweb/search.py +++ b/panikweb/search.py @@ -1,14 +1,15 @@ import haystack.backends.solr_backend -from haystack.query import SearchQuerySet +from haystack.query import SearchQuerySet, RelatedSearchQuerySet from haystack.constants import ID, DJANGO_CT, DJANGO_ID from haystack.utils import get_identifier from haystack.backends import EmptyResults from pysolr import SolrError - from django.conf import settings +from emissions.models import Emission, Episode, NewsItem, SoundFile + class MoreLikeThisSearchQuerySet(SearchQuerySet): def more_like_this(self, model_instance, **kwargs): @@ -110,8 +111,9 @@ class CustomSolrSearchBackend(haystack.backends.solr_backend.SolrSearchBackend): haystack.backends.solr_backend.SolrEngine.query = CustomSolrSearchQuery haystack.backends.solr_backend.SolrEngine.backend = CustomSolrSearchBackend +import haystack.views from haystack.views import search_view_factory, FacetedSearchView -from haystack.forms import FacetedSearchForm +from haystack.forms import FacetedSearchForm, SearchForm class SearchView(FacetedSearchView): @@ -126,8 +128,34 @@ class SearchView(FacetedSearchView): if x.startswith('tags_exact')] return context -sqs = SearchQuerySet().facet('categories').facet('tags') +sqs = SearchQuerySet().models(Emission, Episode, NewsItem).facet('categories').facet('tags') view = search_view_factory(SearchView, form_class=FacetedSearchForm, searchqueryset=sqs) + + + +class ListenArchivesForm(SearchForm): + def no_query_found(self): + return self.searchqueryset.all() + + def search(self): + sqs = super(ListenArchivesForm, self).search() + return sqs.load_all() + + +class ListenArchivesView(haystack.views.SearchView): + template = 'listen/archives.html' + + def __init__(self): + sqs = RelatedSearchQuerySet().filter(django_ct='emissions.soundfile').order_by('-date') + super(ListenArchivesView, self).__init__(searchqueryset=sqs, + form_class=ListenArchivesForm, results_per_page=20) + + def extra_context(self): + context = super(ListenArchivesView, self).extra_context() + context['sectionName'] = "Listen" + return context + +listenArchives = search_view_factory(ListenArchivesView) diff --git a/panikweb/urls.py b/panikweb/urls.py index 51b5278..64d2780 100644 --- a/panikweb/urls.py +++ b/panikweb/urls.py @@ -20,7 +20,7 @@ urlpatterns = patterns('', url(r'^ckeditor/', include('ckeditor.urls')), url(r'^emissions/archives$', 'panikweb.views.emissionsArchives', name='emissionsArchives'), url(r'^listen/$', 'panikweb.views.listen', name='listen'), - url(r'^listen/archives/$', 'panikweb.views.listenArchives', name='listenArchives'), + url(r'^listen/archives/$', 'panikweb.search.listenArchives', name='listenArchives'), url(r'^news/$', 'panikweb.views.news', name='news'), url(r'^news/archives/$', 'panikweb.views.newsArchives', name='newsArchives'), url(r'^news/(?P[\w,-]+)$', 'panikweb.views.newsitemview', name='news-view'), diff --git a/panikweb/views.py b/panikweb/views.py index 7061553..29f407f 100644 --- a/panikweb/views.py +++ b/panikweb/views.py @@ -519,7 +519,7 @@ class Listen(TemplateView): where=['''datetime = (SELECT MIN(datetime) FROM emissions_diffusion WHERE episode_id = emissions_episode.id)'''], - tables=['emissions_diffusion'],).order_by('-first_diffusion') [:20] + tables=['emissions_diffusion'],).order_by('-first_diffusion') [:10] context['categories'] = Category.objects.all() @@ -527,38 +527,6 @@ class Listen(TemplateView): listen = Listen.as_view() -class ListenArchives(TemplateView): - template_name = 'listen/archives.html' - def get_context_data(self, **kwargs): - - context = super(ListenArchives, self).get_context_data(**kwargs) - context['sectionName'] = "Listen" - context['episodes'] = Episode.objects.filter( - soundfile__podcastable=True, soundfile__fragment=False) \ - .select_related().extra(select={ - 'first_diffusion': 'emissions_diffusion.datetime', }, - select_params=(False, True), - where=['''datetime = (SELECT MIN(datetime) - FROM emissions_diffusion - WHERE episode_id = emissions_episode.id)'''], - tables=['emissions_diffusion'],).order_by('-first_diffusion') [:60] - - # get all related soundfiles in a single query - soundfiles = {} - for soundfile in SoundFile.objects.select_related().filter(podcastable=True, - fragment=False, episode__in=[x.id for x in context['episodes']]): - soundfiles[soundfile.episode_id] = soundfile - - # replace dynamic property by a static attribute, to avoid database - # lookups - for episode in context['episodes']: - episode.main_sound = soundfiles.get(episode.id) - context['categories'] = Category.objects.all() - - return context - -listenArchives = ListenArchives.as_view() - @cache_control(max_age=25) @csrf_exempt @to_json('api') diff --git a/panikweb_templates/templates/listen.html b/panikweb_templates/templates/listen.html index fbd41c9..4c79b3c 100644 --- a/panikweb_templates/templates/listen.html +++ b/panikweb_templates/templates/listen.html @@ -6,10 +6,10 @@ {% block main %}
-