]> git.0d.be Git - panikweb.git/blobdiff - panikweb/paniktags/templatetags/paniktags.py
misc: don't crash error pages in metanav
[panikweb.git] / panikweb / paniktags / templatetags / paniktags.py
index 868a1c36885eaf1e249754ba17818e21b01f9165..a8f9e7d540a018faa24de9526df7cf96544bef45 100644 (file)
@@ -1,19 +1,28 @@
 import email.utils
 import datetime
+import json
 import re
 import time
-import urllib2
 import uuid
 
 from django import template
 from django.conf import settings
+from django.core.urlresolvers import reverse
 from django.db.models.query import QuerySet
-from django.utils import simplejson
+from django.utils.encoding import force_text
+from django.utils.http import quote
+from django.utils.six.moves.urllib import parse as urlparse
+
 from datetime import datetime, timedelta
-from django.views.generic.dates import _date_from_string
 
+from emissions.models import Emission, Episode, NewsItem, SoundFile, Focus
 from emissions.utils import period_program
 
+from panikombo.models import Topik
+
+from panikweb import utils
+from panikweb import search
+
 register = template.Library()
 
 @register.filter(name='zip')
@@ -21,17 +30,29 @@ def zip_lists(a, b):
     return zip(a, b)
 
 @register.inclusion_tag('includes/audio.html', takes_context=True)
-def audio(context, sound=None):
+def audio(context, sound=None, embed=False, display_fragment_name=False):
     return {
         'episode': context.get('episode'),
-        'sound': sound
+        'sound': sound,
+        'display_fragment_name': display_fragment_name,
+        'embed': embed,
+    }
+
+@register.inclusion_tag('listen/nav.html', takes_context=True)
+def listen_nav(context, date=None, klass=None):
+    return {
+        'class': klass,
+        'categories': context.get('categories'),
     }
 
 @register.inclusion_tag('news/nav.html', takes_context=True)
-def news_nav(context, date=None):
+def news_nav(context, date=None, klass=None):
     return {
+        'class': klass,
         'newsitem': context.get('newsitem'),
+        'categories': context.get('categories'),
         'news': context.get('news'),
+        'search_query': context.get('search_query'),
     }
 
 @register.inclusion_tag('emissions/nav.html', takes_context=True)
@@ -42,8 +63,16 @@ def emission_nav(context, date=None, klass=None):
         'episodes': context.get('episodes'),
         'emission': context.get('emission'),
         'episode': context.get('episode'),
+        'search_query': context.get('search_query'),
     }
 
+@register.inclusion_tag('episodes/inline.html', takes_context=True)
+def episode_inline(context, date=None, model=None, klass=None):
+    return {
+        'class': klass,
+        'episode': context.get('episode'),
+        'date': date,
+    }
 @register.inclusion_tag('episodes/resume.html', takes_context=True)
 def episode_resume(context, date=None, model=None, klass=None):
     return {
@@ -55,10 +84,15 @@ def episode_resume(context, date=None, model=None, klass=None):
 
 @register.inclusion_tag('episodes/detail.html', takes_context=True)
 def episode_detail(context, date=None):
+    soundfiles = SoundFile.objects.select_related().filter(
+            fragment=True, podcastable=True, episode=context.get('episode'))
     return {
         'episode': context.get('episode'),
         'emission': context.get('emission'),
         'diffusions': context.get('diffusions'),
+        'soundfiles': soundfiles,
+        'date': date,
+        'topiks': context.get('topiks'),
     }
 
 @register.inclusion_tag('emissions/detail.html', takes_context=True)
@@ -82,20 +116,50 @@ def emission_inline(context, date=None):
         'schedules': context.get('schedules'),
     }
 
-@register.inclusion_tag('includes/player.html', takes_context=False)
-def player():
-    return {'unique': uuid.uuid4()}
+@register.inclusion_tag('soundfiles/resume.html')
+def soundfile_resume(soundfile, date=None):
+    return {'soundfile': soundfile,
+            'date': date}
 
-@register.inclusion_tag('includes/metaNav.html', takes_context=False)
-def metanav():
-    return {}
+@register.inclusion_tag('includes/player.html', takes_context=True)
+def player(context):
 
-@register.inclusion_tag('includes/week.html', takes_context=True)
-def weekview(context, year=None, week=None, weekday=None, fragment= None):
-    year = year if year else datetime.today().year
-    week = week if week else datetime.today().isocalendar()[1]-1
-    weekday = weekday if weekday else datetime.today().weekday()
-    date = _date_from_string(str(year), '%Y', '1', '%w', str(week), '%W')
+    return {
+        'unique': uuid.uuid4(),
+        'soundfiles': context.get('soundfiles'),
+    }
+
+@register.inclusion_tag('includes/metaNav.html', takes_context=True)
+def metanav(context, active=None):
+    try:
+        request_path = context['request'].path
+    except KeyError:
+        # a context without 'requests' may happen when rendering error pages
+        request_path = 'xxx'
+    section = 'About'
+    if request_path == '/':
+        section = 'Home'
+    elif request_path.startswith('/actus/'):
+        section = 'News'
+    elif request_path.startswith('/sons/'):
+        section = 'Listen'
+    elif request_path.startswith('/topiks'):
+        section = 'Topiks'
+    elif request_path.startswith('/emissions') or request_path == '/grille' or request_path == '/programme/':
+        section = 'Emissions'
+    elif request_path == '/recherche/':
+        section = 'Search'
+    return {
+        'LANGUAGE_CODE': context.get('LANGUAGE_CODE'),
+        'sectionName': section,
+        }
+
+@register.inclusion_tag('includes/week.html')
+def weekview(year=None, week=None):
+    year = year if year else datetime.today().isocalendar()[0]
+    week = week if week else datetime.today().isocalendar()[1]
+
+    date = utils.tofirstdayinisoweek(year, week)
     date = datetime(*date.timetuple()[:3])
 
     program = period_program(date, date+timedelta(days=7))
@@ -103,28 +167,65 @@ def weekview(context, year=None, week=None, weekday=None, fragment= None):
     for day in range(7):
         days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
                      'datetime': date+timedelta(days=day)})
+
+    return {
+        'days': days,
+        'week': week,
+        'year': year,
+    }
+
+@register.inclusion_tag('includes/week-nav.html')
+def weeknav(year=None, week=None, weekday=None):
+    year = year if year else datetime.today().isocalendar()[0]
+    week = week if week else datetime.today().isocalendar()[1]
+    weekday = weekday if weekday is not None else datetime.today().weekday()
+
+    date = utils.tofirstdayinisoweek(year, week)
+    date = datetime(*date.timetuple()[:3])
+
+    days = []
+    for day in range(7):
+        days.append({'datetime': date+timedelta(days=day)})
+
+    previous_week = date - timedelta(days=7)
+    previous_week_year, previous_week_no = previous_week.isocalendar()[:2]
+
+    next_week = date + timedelta(days=7)
+    next_week_year, next_week_no = next_week.isocalendar()[:2]
+
     return {
-        'fragment': fragment,
         'days': days,
         'weekday': weekday,
         'week': week,
         'year': year,
+        'previous_week_year': previous_week_year,
+        'previous_week_no': previous_week_no,
+        'next_week_year': next_week_year,
+        'next_week_no': next_week_no,
     }
 
-@register.inclusion_tag('news/inline.html', takes_context=False)
-def news_inline(content=None, klass=None, logo=None):
+
+@register.inclusion_tag('news/inline.html', takes_context=True)
+def news_inline(context, klass=None, logo=None):
     return {
-            'content': content,
+            'content': context.get('content'),
             'class': klass,
             'logo': logo
     }
 
+@register.inclusion_tag('news/roll.html')
+def newsroll():
+    return {
+        'news': Focus.objects.filter(current=True).select_related('emission', 'newsitem',
+            'soundfile', 'episode', 'newsitem__category').order_by('?')[:3]
+    }
+
 
 @register.filter
 def jsonify(object):
     if isinstance(object, QuerySet):
         return serialize('json', object)
-    return simplejson.dumps(object)
+    return json.dumps(object)
 
 @register.filter
 def strreplace ( string, args ): 
@@ -139,26 +240,56 @@ def replace ( string, args ):
 
     return re.sub( search, replace, string )
 
+
+def remove_facet(facet_id, url, facet):
+    scheme, netloc, path, query, fragment = list(urlparse.urlsplit(str(url)))
+    facet = '%s_exact:%s' % (facet_id, facet.encode('utf-8'))
+    query_string = urlparse.parse_qsl(query)
+    query_string = [x for x in query_string if not (
+        x[0] == 'selected_facets' and x[1] == facet)]
+    query = '&'.join(['%s=%s' % x for x in query_string])
+    url = urlparse.urlunsplit([scheme, netloc, path, query, None])
+    return force_text(re.sub(r'&page=\d+', '', url), 'utf-8')
+
 @register.filter
 def remove_tag_facet(url, facet):
-    facet = urllib2.quote(facet.encode('utf-8'), safe='')
-    return re.sub(r'&page=\d+', '', url.replace('&selected_facets=tags_exact:%s' % facet, ''))
+    return remove_facet('tags', url, facet)
 
 @register.filter
 def remove_category_facet(url, facet):
-    facet = urllib2.quote(facet.encode('utf-8'), safe='')
-    return re.sub(r'&page=\d+', '', url.replace('&selected_facets=categories_exact:%s' % facet, ''))
+    return remove_facet('categories', url, facet)
+
 
+@register.filter
+def remove_news_category_facet(url, facet):
+    return remove_facet('news_categories', url, facet)
+
+@register.filter
+def remove_format_facet(url, facet):
+    return remove_facet('format', url, facet)
+
+
+def append_facet(facet_id, url, facet):
+    facet = quote(facet.encode('utf-8'), safe='')
+    if not '?' in url:
+        url = url + '?'
+    return re.sub(r'&page=\d+', '', url + '&selected_facets=%s_exact:%s' % (facet_id, facet))
 
 @register.filter
 def append_tag_facet(url, facet):
-    facet = urllib2.quote(facet.encode('utf-8'), safe='')
-    return re.sub(r'&page=\d+', '', url + '&selected_facets=tags_exact:%s' % facet)
+    return append_facet('tags', url, facet)
 
 @register.filter
 def append_category_facet(url, facet):
-    facet = urllib2.quote(facet.encode('utf-8'), safe='')
-    return re.sub(r'&page=\d+', '', url + '&selected_facets=categories_exact:%s' % facet)
+    return append_facet('categories', url, facet)
+
+@register.filter
+def append_news_category_facet(url, facet):
+    return append_facet('news_categories', url, facet)
+
+@register.filter
+def append_format_facet(url, facet):
+    return append_facet('format', url, facet)
 
 
 @register.tag
@@ -182,7 +313,7 @@ class FormatSearchResultNode(template.Node):
             'episode': 'episodes'
         }
         t = template.loader.get_template('%s/search_result.html' % dir_mapping.get(result.model_name))
-        return t.render(template.context.Context({'result': result}, autoescape=context.autoescape))
+        return t.render({'result': result})
 
 
 @register.inclusion_tag('includes/piwik.html')
@@ -195,3 +326,56 @@ def rfc822(datetime):
     if datetime is None:
         return ''
     return email.utils.formatdate(time.mktime(datetime.timetuple()))
+
+@register.inclusion_tag('includes/related.html', takes_context=False)
+def related_objects(object):
+    sqs = search.MoreLikeThisSearchQuerySet().models(Emission, Episode, NewsItem)
+    return {'more_like_this': sqs.more_like_this(object)[:12]}
+
+@register.inclusion_tag('includes/topik.html', takes_context=True)
+def topik(context, topik):
+    return {'topik': topik}
+
+@register.filter
+def get_focus_url(object):
+    if object.newsitem:
+        return reverse('newsitem-view', kwargs={'slug': object.newsitem.slug})
+    if object.emission:
+        return reverse('emission-view', kwargs={'slug': object.emission.slug})
+    if object.episode:
+        return reverse('episode-view', kwargs={
+            'slug': object.episode.slug, 'emission_slug': object.episode.emission.slug})
+    if object.soundfile:
+        return reverse('episode-view', kwargs={
+            'slug': object.soundfile.episode.slug,
+            'emission_slug': object.soundfile.episode.emission.slug})
+    if object.page:
+        return object.page.get_online_url()
+    return ''
+
+@register.filter
+def facet_tag(tag):
+    return tag.name
+
+
+@register.filter
+def image_file(page):
+    try:
+        matching_topik = Topik.objects.get(page=page)
+        return matching_topik.image
+    except Topik.DoesNotExist:
+        pass
+    return None
+
+
+@register.filter
+def set_absolute_urls(text):
+    text = text.replace('src="/', 'src="%s' % settings.WEBSITE_BASE_URL)
+    text = text.replace('href="/', 'href="%s' % settings.WEBSITE_BASE_URL)
+    return text
+
+@register.filter
+def as_absolute_url(url):
+    if url.startswith('/'):
+        url = settings.WEBSITE_BASE_URL + url.lstrip('/')
+    return url