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