]> git.0d.be Git - panikweb.git/blob - panikweb/paniktags/templatetags/paniktags.py
standardize week numbers on iso format
[panikweb.git] / panikweb / paniktags / templatetags / paniktags.py
1 import email.utils
2 import datetime
3 import re
4 import time
5 import urllib2
6 import uuid
7
8 from django import template
9 from django.conf import settings
10 from django.db.models.query import QuerySet
11 from django.utils import simplejson
12 from datetime import datetime, timedelta
13
14 from emissions.utils import period_program
15
16 from panikweb import utils
17
18 register = template.Library()
19
20 @register.filter(name='zip')
21 def zip_lists(a, b):
22     return zip(a, b)
23
24 @register.inclusion_tag('includes/audio.html', takes_context=True)
25 def audio(context, sound=None):
26     return {
27         'episode': context.get('episode'),
28         'sound': sound
29     }
30
31 @register.inclusion_tag('news/nav.html', takes_context=True)
32 def news_nav(context, date=None):
33     return {
34         'newsitem': context.get('newsitem'),
35         'news': context.get('news'),
36     }
37
38 @register.inclusion_tag('emissions/nav.html', takes_context=True)
39 def emission_nav(context, date=None, klass=None):
40     return {
41         'class': klass,
42         'categories': context.get('categories'),
43         'episodes': context.get('episodes'),
44         'emission': context.get('emission'),
45         'episode': context.get('episode'),
46     }
47
48 @register.inclusion_tag('episodes/resume.html', takes_context=True)
49 def episode_resume(context, date=None, model=None, klass=None):
50     return {
51         'model': model,
52         'class': klass,
53         'episode': context.get('episode'),
54         'date': date,
55     }
56
57 @register.inclusion_tag('episodes/detail.html', takes_context=True)
58 def episode_detail(context, date=None):
59     return {
60         'episode': context.get('episode'),
61         'emission': context.get('emission'),
62         'diffusions': context.get('diffusions'),
63     }
64
65 @register.inclusion_tag('emissions/detail.html', takes_context=True)
66 def emission_detail(context, date=None):
67     return {
68         'emission': context.get('emission'),
69         'schedules': context.get('schedules'),
70     }
71
72 @register.inclusion_tag('emissions/resume.html', takes_context=True)
73 def emission_resume(context, date=None):
74     return {
75         'emission': context.get('emission'),
76         'schedules': context.get('schedules'),
77     }
78
79 @register.inclusion_tag('emissions/inline.html', takes_context=True)
80 def emission_inline(context, date=None):
81     return {
82         'emission': context.get('emission'),
83         'schedules': context.get('schedules'),
84     }
85
86 @register.inclusion_tag('includes/player.html', takes_context=False)
87 def player():
88     return {'unique': uuid.uuid4()}
89
90 @register.inclusion_tag('includes/metaNav.html', takes_context=True)
91 def metanav(context, active=None):
92     return {
93         'sectionName': context.get('sectionName')
94         }
95
96 @register.inclusion_tag('includes/week.html', takes_context=True)
97 def weekview(context, year=None, week=None, weekday=None, fragment=None):
98     year = year if year else datetime.today().isocalendar()[0]
99     week = week if week else datetime.today().isocalendar()[1]
100     weekday = weekday if weekday else datetime.today().weekday()
101
102     date = utils.tofirstdayinisoweek(year, week)
103     date = datetime(*date.timetuple()[:3])
104
105     program = period_program(date, date+timedelta(days=7))
106     days = []
107     for day in range(7):
108         days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
109                      'datetime': date+timedelta(days=day)})
110     return {
111         'fragment': fragment,
112         'days': days,
113         'weekday': weekday,
114         'week': week,
115         'year': year,
116     }
117
118 @register.inclusion_tag('news/inline.html', takes_context=False)
119 def news_inline(content=None, klass=None, logo=None):
120     return {
121             'content': content,
122             'class': klass,
123             'logo': logo
124     }
125
126 @register.inclusion_tag('news/roll.html', takes_context=True)
127 def newsroll(context, nbr=None):
128     return {
129         'categories': context.get('categories'),
130         'news': context.get('news'),
131         'focus': context.get('focus'),
132         'nbr': nbr,
133     }
134
135
136 @register.filter
137 def jsonify(object):
138     if isinstance(object, QuerySet):
139         return serialize('json', object)
140     return simplejson.dumps(object)
141
142 @register.filter
143 def strreplace ( string, args ): 
144     find  = args.split(',')[0]
145     replace = args.split(',')[1]
146     return string.replace(find,replace)
147
148 @register.filter
149 def replace ( string, args ): 
150     search  = args.split(args[0])[1]
151     replace = args.split(args[0])[2]
152
153     return re.sub( search, replace, string )
154
155 @register.filter
156 def remove_tag_facet(url, facet):
157     facet = urllib2.quote(facet.encode('utf-8'), safe='')
158     return re.sub(r'&page=\d+', '', url.replace('&selected_facets=tags_exact:%s' % facet, ''))
159
160 @register.filter
161 def remove_category_facet(url, facet):
162     facet = urllib2.quote(facet.encode('utf-8'), safe='')
163     return re.sub(r'&page=\d+', '', url.replace('&selected_facets=categories_exact:%s' % facet, ''))
164
165
166 @register.filter
167 def append_tag_facet(url, facet):
168     facet = urllib2.quote(facet.encode('utf-8'), safe='')
169     return re.sub(r'&page=\d+', '', url + '&selected_facets=tags_exact:%s' % facet)
170
171 @register.filter
172 def append_category_facet(url, facet):
173     facet = urllib2.quote(facet.encode('utf-8'), safe='')
174     return re.sub(r'&page=\d+', '', url + '&selected_facets=categories_exact:%s' % facet)
175
176
177 @register.tag
178 def search_result_template(parser, token):
179     try:
180         tag_name, result_str = token.split_contents()
181     except ValueError:
182         raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0])
183     return FormatSearchResultNode(result_str)
184
185
186 class FormatSearchResultNode(template.Node):
187     def __init__(self, result_str):
188         self.result_var = template.Variable(result_str)
189
190     def render(self, context):
191         result = self.result_var.resolve(context)
192         dir_mapping = {
193             'newsitem': 'news',
194             'emission': 'emissions',
195             'episode': 'episodes'
196         }
197         t = template.loader.get_template('%s/search_result.html' % dir_mapping.get(result.model_name))
198         return t.render(template.context.Context({'result': result}, autoescape=context.autoescape))
199
200
201 @register.inclusion_tag('includes/piwik.html')
202 def piwik():
203     return {'enabled': settings.ENABLE_PIWIK}
204
205
206 @register.filter
207 def rfc822(datetime):
208     if datetime is None:
209         return ''
210     return email.utils.formatdate(time.mktime(datetime.timetuple()))