]> 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 244e8c4f58140072b923ac263b9effedaf34ec6d..a8f9e7d540a018faa24de9526df7cf96544bef45 100644 (file)
@@ -3,19 +3,23 @@ import datetime
 import json
 import re
 import time
-import urlparse
-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.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 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
 
@@ -26,10 +30,12 @@ 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)
@@ -86,6 +92,7 @@ def episode_detail(context, date=None):
         'diffusions': context.get('diffusions'),
         'soundfiles': soundfiles,
         'date': date,
+        'topiks': context.get('topiks'),
     }
 
 @register.inclusion_tag('emissions/detail.html', takes_context=True)
@@ -124,9 +131,27 @@ def player(context):
 
 @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': context.get('sectionName')
+        'sectionName': section,
         }
 
 @register.inclusion_tag('includes/week.html')
@@ -224,7 +249,7 @@ def remove_facet(facet_id, url, facet):
         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 re.sub(r'&page=\d+', '', url)
+    return force_text(re.sub(r'&page=\d+', '', url), 'utf-8')
 
 @register.filter
 def remove_tag_facet(url, facet):
@@ -245,7 +270,7 @@ def remove_format_facet(url, facet):
 
 
 def append_facet(facet_id, url, facet):
-    facet = urllib2.quote(facet.encode('utf-8'), safe='')
+    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))
@@ -288,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')
@@ -307,6 +332,9 @@ 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):
@@ -321,8 +349,33 @@ def get_focus_url(object):
         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