10 from django import template
11 from django.conf import settings
12 from django.core.urlresolvers import reverse
13 from django.db.models.query import QuerySet
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 panikombo.models import Topik
21 from panikweb import utils
22 from panikweb import search
24 register = template.Library()
26 @register.filter(name='zip')
30 @register.inclusion_tag('includes/audio.html', takes_context=True)
31 def audio(context, sound=None, embed=False, display_fragment_name=False):
33 'episode': context.get('episode'),
35 'display_fragment_name': display_fragment_name,
39 @register.inclusion_tag('listen/nav.html', takes_context=True)
40 def listen_nav(context, date=None, klass=None):
43 'categories': context.get('categories'),
46 @register.inclusion_tag('news/nav.html', takes_context=True)
47 def news_nav(context, date=None, klass=None):
50 'newsitem': context.get('newsitem'),
51 'categories': context.get('categories'),
52 'news': context.get('news'),
53 'search_query': context.get('search_query'),
56 @register.inclusion_tag('emissions/nav.html', takes_context=True)
57 def emission_nav(context, date=None, klass=None):
60 'categories': context.get('categories'),
61 'episodes': context.get('episodes'),
62 'emission': context.get('emission'),
63 'episode': context.get('episode'),
64 'search_query': context.get('search_query'),
67 @register.inclusion_tag('episodes/inline.html', takes_context=True)
68 def episode_inline(context, date=None, model=None, klass=None):
71 'episode': context.get('episode'),
74 @register.inclusion_tag('episodes/resume.html', takes_context=True)
75 def episode_resume(context, date=None, model=None, klass=None):
79 'episode': context.get('episode'),
83 @register.inclusion_tag('episodes/detail.html', takes_context=True)
84 def episode_detail(context, date=None):
85 soundfiles = SoundFile.objects.select_related().filter(
86 fragment=True, podcastable=True, episode=context.get('episode'))
88 'episode': context.get('episode'),
89 'emission': context.get('emission'),
90 'diffusions': context.get('diffusions'),
91 'soundfiles': soundfiles,
93 'topiks': context.get('topiks'),
96 @register.inclusion_tag('emissions/detail.html', takes_context=True)
97 def emission_detail(context, date=None):
99 'emission': context.get('emission'),
100 'schedules': context.get('schedules'),
103 @register.inclusion_tag('emissions/resume.html', takes_context=True)
104 def emission_resume(context, date=None):
106 'emission': context.get('emission'),
107 'schedules': context.get('schedules'),
110 @register.inclusion_tag('emissions/inline.html', takes_context=True)
111 def emission_inline(context, date=None):
113 'emission': context.get('emission'),
114 'schedules': context.get('schedules'),
117 @register.inclusion_tag('soundfiles/resume.html')
118 def soundfile_resume(soundfile, date=None):
119 return {'soundfile': soundfile,
122 @register.inclusion_tag('includes/player.html', takes_context=True)
126 'unique': uuid.uuid4(),
127 'soundfiles': context.get('soundfiles'),
130 @register.inclusion_tag('includes/metaNav.html', takes_context=True)
131 def metanav(context, active=None):
132 request_path = context['request'].path
134 if request_path == '/':
136 elif request_path.startswith('/actus/'):
138 elif request_path.startswith('/sons/'):
140 elif request_path.startswith('/topiks'):
142 elif request_path.startswith('/emissions') or request_path == '/grille' or request_path == '/programme/':
143 section = 'Emissions'
144 elif request_path == '/recherche/':
147 'LANGUAGE_CODE': context.get('LANGUAGE_CODE'),
148 'sectionName': section,
151 @register.inclusion_tag('includes/week.html')
152 def weekview(year=None, week=None):
153 year = year if year else datetime.today().isocalendar()[0]
154 week = week if week else datetime.today().isocalendar()[1]
156 date = utils.tofirstdayinisoweek(year, week)
157 date = datetime(*date.timetuple()[:3])
159 program = period_program(date, date+timedelta(days=7))
162 days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
163 'datetime': date+timedelta(days=day)})
171 @register.inclusion_tag('includes/week-nav.html')
172 def weeknav(year=None, week=None, weekday=None):
173 year = year if year else datetime.today().isocalendar()[0]
174 week = week if week else datetime.today().isocalendar()[1]
175 weekday = weekday if weekday is not None else datetime.today().weekday()
177 date = utils.tofirstdayinisoweek(year, week)
178 date = datetime(*date.timetuple()[:3])
182 days.append({'datetime': date+timedelta(days=day)})
184 previous_week = date - timedelta(days=7)
185 previous_week_year, previous_week_no = previous_week.isocalendar()[:2]
187 next_week = date + timedelta(days=7)
188 next_week_year, next_week_no = next_week.isocalendar()[:2]
195 'previous_week_year': previous_week_year,
196 'previous_week_no': previous_week_no,
197 'next_week_year': next_week_year,
198 'next_week_no': next_week_no,
202 @register.inclusion_tag('news/inline.html', takes_context=True)
203 def news_inline(context, klass=None, logo=None):
205 'content': context.get('content'),
210 @register.inclusion_tag('news/roll.html')
213 'news': Focus.objects.filter(current=True).select_related('emission', 'newsitem',
214 'soundfile', 'episode', 'newsitem__category').order_by('?')[:3]
220 if isinstance(object, QuerySet):
221 return serialize('json', object)
222 return json.dumps(object)
225 def strreplace ( string, args ):
226 find = args.split(',')[0]
227 replace = args.split(',')[1]
228 return string.replace(find,replace)
231 def replace ( string, args ):
232 search = args.split(args[0])[1]
233 replace = args.split(args[0])[2]
235 return re.sub( search, replace, string )
238 def remove_facet(facet_id, url, facet):
239 scheme, netloc, path, query, fragment = list(urlparse.urlsplit(str(url)))
240 facet = '%s_exact:%s' % (facet_id, facet.encode('utf-8'))
241 query_string = urlparse.parse_qsl(query)
242 query_string = [x for x in query_string if not (
243 x[0] == 'selected_facets' and x[1] == facet)]
244 query = '&'.join(['%s=%s' % x for x in query_string])
245 url = urlparse.urlunsplit([scheme, netloc, path, query, None])
246 return re.sub(r'&page=\d+', '', url)
249 def remove_tag_facet(url, facet):
250 return remove_facet('tags', url, facet)
253 def remove_category_facet(url, facet):
254 return remove_facet('categories', url, facet)
258 def remove_news_category_facet(url, facet):
259 return remove_facet('news_categories', url, facet)
262 def remove_format_facet(url, facet):
263 return remove_facet('format', url, facet)
266 def append_facet(facet_id, url, facet):
267 facet = urllib2.quote(facet.encode('utf-8'), safe='')
270 return re.sub(r'&page=\d+', '', url + '&selected_facets=%s_exact:%s' % (facet_id, facet))
273 def append_tag_facet(url, facet):
274 return append_facet('tags', url, facet)
277 def append_category_facet(url, facet):
278 return append_facet('categories', url, facet)
281 def append_news_category_facet(url, facet):
282 return append_facet('news_categories', url, facet)
285 def append_format_facet(url, facet):
286 return append_facet('format', url, facet)
290 def search_result_template(parser, token):
292 tag_name, result_str = token.split_contents()
294 raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0])
295 return FormatSearchResultNode(result_str)
298 class FormatSearchResultNode(template.Node):
299 def __init__(self, result_str):
300 self.result_var = template.Variable(result_str)
302 def render(self, context):
303 result = self.result_var.resolve(context)
306 'emission': 'emissions',
307 'episode': 'episodes'
309 t = template.loader.get_template('%s/search_result.html' % dir_mapping.get(result.model_name))
310 return t.render(template.context.Context({'result': result}, autoescape=context.autoescape))
313 @register.inclusion_tag('includes/piwik.html')
315 return {'enabled': settings.ENABLE_PIWIK}
319 def rfc822(datetime):
322 return email.utils.formatdate(time.mktime(datetime.timetuple()))
324 @register.inclusion_tag('includes/related.html', takes_context=False)
325 def related_objects(object):
326 sqs = search.MoreLikeThisSearchQuerySet().models(Emission, Episode, NewsItem)
327 return {'more_like_this': sqs.more_like_this(object)[:12]}
329 @register.inclusion_tag('includes/topik.html', takes_context=True)
330 def topik(context, topik):
331 return {'topik': topik}
334 def get_focus_url(object):
336 return reverse('newsitem-view', kwargs={'slug': object.newsitem.slug})
338 return reverse('emission-view', kwargs={'slug': object.emission.slug})
340 return reverse('episode-view', kwargs={
341 'slug': object.episode.slug, 'emission_slug': object.episode.emission.slug})
343 return reverse('episode-view', kwargs={
344 'slug': object.soundfile.episode.slug,
345 'emission_slug': object.soundfile.episode.emission.slug})
347 return object.page.get_online_url()
356 def image_file(page):
358 matching_topik = Topik.objects.get(page=page)
359 return matching_topik.image
360 except Topik.DoesNotExist: