9 from django import template
10 from django.conf import settings
11 from django.core.urlresolvers import reverse
12 from django.db.models.query import QuerySet
13 from django.utils import simplejson
14 from datetime import datetime, timedelta
16 from emissions.models import Emission, Episode, NewsItem, SoundFile, Focus
17 from emissions.utils import period_program
19 from panikweb import utils
20 from panikweb import search
22 register = template.Library()
24 @register.filter(name='zip')
28 @register.inclusion_tag('includes/audio.html', takes_context=True)
29 def audio(context, sound=None):
31 'episode': context.get('episode'),
35 @register.inclusion_tag('listen/nav.html', takes_context=True)
36 def listen_nav(context, date=None, klass=None):
39 'categories': context.get('categories'),
42 @register.inclusion_tag('news/nav.html', takes_context=True)
43 def news_nav(context, date=None, klass=None):
46 'newsitem': context.get('newsitem'),
47 'categories': context.get('categories'),
48 'news': context.get('news'),
49 'search_query': context.get('search_query'),
52 @register.inclusion_tag('emissions/nav.html', takes_context=True)
53 def emission_nav(context, date=None, klass=None):
56 'categories': context.get('categories'),
57 'episodes': context.get('episodes'),
58 'emission': context.get('emission'),
59 'episode': context.get('episode'),
60 'search_query': context.get('search_query'),
63 @register.inclusion_tag('episodes/inline.html', takes_context=True)
64 def episode_inline(context, date=None, model=None, klass=None):
67 'episode': context.get('episode'),
70 @register.inclusion_tag('episodes/resume.html', takes_context=True)
71 def episode_resume(context, date=None, model=None, klass=None):
75 'episode': context.get('episode'),
79 @register.inclusion_tag('episodes/detail.html', takes_context=True)
80 def episode_detail(context, date=None):
81 soundfiles = SoundFile.objects.select_related().filter(
82 fragment=True, podcastable=True, episode=context.get('episode'))
84 'episode': context.get('episode'),
85 'emission': context.get('emission'),
86 'diffusions': context.get('diffusions'),
87 'soundfiles': soundfiles,
91 @register.inclusion_tag('emissions/detail.html', takes_context=True)
92 def emission_detail(context, date=None):
94 'emission': context.get('emission'),
95 'schedules': context.get('schedules'),
98 @register.inclusion_tag('emissions/resume.html', takes_context=True)
99 def emission_resume(context, date=None):
101 'emission': context.get('emission'),
102 'schedules': context.get('schedules'),
105 @register.inclusion_tag('emissions/inline.html', takes_context=True)
106 def emission_inline(context, date=None):
108 'emission': context.get('emission'),
109 'schedules': context.get('schedules'),
112 @register.inclusion_tag('soundfiles/resume.html')
113 def soundfile_resume(soundfile, date=None):
114 return {'soundfile': soundfile,
117 @register.inclusion_tag('includes/player.html', takes_context=True)
121 'unique': uuid.uuid4(),
122 'soundfiles': context.get('soundfiles'),
125 @register.inclusion_tag('includes/metaNav.html', takes_context=True)
126 def metanav(context, active=None):
128 'sectionName': context.get('sectionName')
131 @register.inclusion_tag('includes/week.html')
132 def weekview(year=None, week=None):
133 year = year if year else datetime.today().isocalendar()[0]
134 week = week if week else datetime.today().isocalendar()[1]
136 date = utils.tofirstdayinisoweek(year, week)
137 date = datetime(*date.timetuple()[:3])
139 program = period_program(date, date+timedelta(days=7))
142 days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
143 'datetime': date+timedelta(days=day)})
151 @register.inclusion_tag('includes/week-nav.html')
152 def weeknav(year=None, week=None, weekday=None):
153 year = year if year else datetime.today().isocalendar()[0]
154 week = week if week else datetime.today().isocalendar()[1]
155 weekday = weekday if weekday else datetime.today().weekday()
157 date = utils.tofirstdayinisoweek(year, week)
158 date = datetime(*date.timetuple()[:3])
162 days.append({'datetime': date+timedelta(days=day)})
164 previous_week = date - timedelta(days=7)
165 previous_week_year, previous_week_no = previous_week.isocalendar()[:2]
167 next_week = date + timedelta(days=7)
168 next_week_year, next_week_no = next_week.isocalendar()[:2]
175 'previous_week_year': previous_week_year,
176 'previous_week_no': previous_week_no,
177 'next_week_year': next_week_year,
178 'next_week_no': next_week_no,
182 @register.inclusion_tag('news/inline.html', takes_context=True)
183 def news_inline(context, klass=None, logo=None):
185 'content': context.get('content'),
190 @register.inclusion_tag('news/roll.html')
193 'news': Focus.objects.filter(current=True).select_related('emission', 'newsitem',
194 'soundfile', 'episode', 'newsitem__category').order_by('?')[:3]
200 if isinstance(object, QuerySet):
201 return serialize('json', object)
202 return simplejson.dumps(object)
205 def strreplace ( string, args ):
206 find = args.split(',')[0]
207 replace = args.split(',')[1]
208 return string.replace(find,replace)
211 def replace ( string, args ):
212 search = args.split(args[0])[1]
213 replace = args.split(args[0])[2]
215 return re.sub( search, replace, string )
218 def remove_facet(facet_id, url, facet):
219 scheme, netloc, path, query, fragment = list(urlparse.urlsplit(str(url)))
220 facet = '%s_exact:%s' % (facet_id, facet.encode('utf-8'))
221 query_string = urlparse.parse_qsl(query)
222 query_string = [x for x in query_string if not (
223 x[0] == 'selected_facets' and x[1] == facet)]
224 query = '&'.join(['%s=%s' % x for x in query_string])
225 url = urlparse.urlunsplit([scheme, netloc, path, query, None])
226 return re.sub(r'&page=\d+', '', url)
229 def remove_tag_facet(url, facet):
230 return remove_facet('tags', url, facet)
233 def remove_category_facet(url, facet):
234 return remove_facet('categories', url, facet)
238 def remove_news_category_facet(url, facet):
239 return remove_facet('news_categories', url, facet)
242 def remove_format_facet(url, facet):
243 return remove_facet('format', url, facet)
246 def append_facet(facet_id, url, facet):
247 facet = urllib2.quote(facet.encode('utf-8'), safe='')
250 return re.sub(r'&page=\d+', '', url + '&selected_facets=%s_exact:%s' % (facet_id, facet))
253 def append_tag_facet(url, facet):
254 return append_facet('tags', url, facet)
257 def append_category_facet(url, facet):
258 return append_facet('categories', url, facet)
261 def append_news_category_facet(url, facet):
262 return append_facet('news_categories', url, facet)
265 def append_format_facet(url, facet):
266 return append_facet('format', url, facet)
270 def search_result_template(parser, token):
272 tag_name, result_str = token.split_contents()
274 raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0])
275 return FormatSearchResultNode(result_str)
278 class FormatSearchResultNode(template.Node):
279 def __init__(self, result_str):
280 self.result_var = template.Variable(result_str)
282 def render(self, context):
283 result = self.result_var.resolve(context)
286 'emission': 'emissions',
287 'episode': 'episodes'
289 t = template.loader.get_template('%s/search_result.html' % dir_mapping.get(result.model_name))
290 return t.render(template.context.Context({'result': result}, autoescape=context.autoescape))
293 @register.inclusion_tag('includes/piwik.html')
295 return {'enabled': settings.ENABLE_PIWIK}
299 def rfc822(datetime):
302 return email.utils.formatdate(time.mktime(datetime.timetuple()))
304 @register.inclusion_tag('includes/related.html', takes_context=False)
305 def related_objects(object):
306 sqs = search.MoreLikeThisSearchQuerySet().models(Emission, Episode, NewsItem)
307 return {'more_like_this': sqs.more_like_this(object)[:12]}
311 def get_focus_url(object):
313 return reverse('newsitem-view', kwargs={'slug': object.newsitem.slug})
315 return reverse('emission-view', kwargs={'slug': object.emission.slug})
317 return reverse('episode-view', kwargs={
318 'slug': object.episode.slug, 'emission_slug': object.episode.emission.slug})
320 return reverse('episode-view', kwargs={
321 'slug': object.soundfile.episode.slug,
322 'emission_slug': object.soundfile.episode.emission.slug})
327 return tag.slug.replace('-', ' ')