]> git.0d.be Git - panikweb.git/blob - panikweb/paniktags/templatetags/paniktags.py
Adapt tabs & program to show current day
[panikweb.git] / panikweb / paniktags / templatetags / paniktags.py
1 import re
2 import urllib2
3 import uuid
4
5 from django import template
6 from django.db.models.query import QuerySet
7 from django.utils import simplejson
8 from datetime import datetime, timedelta
9 from django.views.generic.dates import _date_from_string
10
11 from emissions.utils import period_program
12
13 register = template.Library()
14
15 @register.filter(name='zip')
16 def zip_lists(a, b):
17     return zip(a, b)
18
19 @register.inclusion_tag('includes/audio.html', takes_context=True)
20 def audio(context, sound=None):
21     return {
22         'episode': context.get('episode'),
23         'sound': sound
24     }
25
26 @register.inclusion_tag('episodes/resume.html', takes_context=True)
27 def episode_resume(context, date=None, model=None, klass=None):
28     return {
29         'model': model,
30         'class': klass,
31         'episode': context.get('episode'),
32         'date': date,
33     }
34
35 @register.inclusion_tag('emissions/detail.html', takes_context=True)
36 def emission_detail(context, date=None):
37     return {
38         'emission': context.get('emission'),
39         'schedules': context.get('schedules'),
40     }
41
42 @register.inclusion_tag('includes/player.html', takes_context=False)
43 def player():
44     return {'unique': uuid.uuid4()}
45
46 @register.inclusion_tag('includes/metaNav.html', takes_context=False)
47 def metanav():
48     return {}
49
50 @register.inclusion_tag('includes/week.html', takes_context=True)
51 def weekview(context, year=None, week=None, weekday=None, fragment= None):
52     year = year if year else datetime.today().year
53     week = week if week else datetime.today().isocalendar()[1]-1
54     weekday = weekday if weekday else datetime.today().weekday()
55     date = _date_from_string(str(year), '%Y', '1', '%w', str(week), '%W')
56     date = datetime(*date.timetuple()[:3])
57
58     program = period_program(date, date+timedelta(days=7))
59     days = []
60     for day in range(7):
61         days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
62                      'datetime': date+timedelta(days=day)})
63     return {
64         'fragment': fragment,
65         'days': days,
66         'weekday': weekday,
67         'week': week,
68         'year': year,
69     }
70
71 @register.inclusion_tag('news/inline.html', takes_context=False)
72 def news_inline(content=None, klass=None, logo=None):
73     return {
74             'content': content,
75             'class': klass,
76             'logo': logo
77     }
78
79
80 @register.filter
81 def jsonify(object):
82     if isinstance(object, QuerySet):
83         return serialize('json', object)
84     return simplejson.dumps(object)
85
86 @register.filter
87 def remove_tag_facet(url, facet):
88     facet = urllib2.quote(facet.encode('utf-8'), safe='')
89     return re.sub(r'&page=\d+', '', url.replace('&selected_facets=tags_exact:%s' % facet, ''))
90
91 @register.filter
92 def remove_category_facet(url, facet):
93     facet = urllib2.quote(facet.encode('utf-8'), safe='')
94     return re.sub(r'&page=\d+', '', url.replace('&selected_facets=categories_exact:%s' % facet, ''))
95
96
97 @register.filter
98 def append_tag_facet(url, facet):
99     facet = urllib2.quote(facet.encode('utf-8'), safe='')
100     return re.sub(r'&page=\d+', '', url + '&selected_facets=tags_exact:%s' % facet)
101
102 @register.filter
103 def append_category_facet(url, facet):
104     facet = urllib2.quote(facet.encode('utf-8'), safe='')
105     return re.sub(r'&page=\d+', '', url + '&selected_facets=categories_exact:%s' % facet)
106
107
108 @register.tag
109 def search_result_template(parser, token):
110     try:
111         tag_name, result_str = token.split_contents()
112     except ValueError:
113         raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0])
114     return FormatSearchResultNode(result_str)
115
116
117 class FormatSearchResultNode(template.Node):
118     def __init__(self, result_str):
119         self.result_var = template.Variable(result_str)
120
121     def render(self, context):
122         result = self.result_var.resolve(context)
123         dir_mapping = {
124             'newsitem': 'news',
125             'emission': 'emissions',
126             'episode': 'episodes'
127         }
128         t = template.loader.get_template('%s/search_result.html' % dir_mapping.get(result.model_name))
129         return t.render(template.context.Context({'result': result}, autoescape=context.autoescape))