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