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