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
14 from emissions.models import Emission, Episode, NewsItem
15 from emissions.utils import period_program
17 from panikweb import utils
18 from panikweb import search
20 register = template.Library()
22 @register.filter(name='zip')
26 @register.inclusion_tag('includes/audio.html', takes_context=True)
27 def audio(context, sound=None):
29 'episode': context.get('episode'),
33 @register.inclusion_tag('listen/nav.html', takes_context=True)
34 def listen_nav(context, date=None, klass=None):
37 'categories': context.get('categories'),
40 @register.inclusion_tag('news/nav.html', takes_context=True)
41 def news_nav(context, date=None, klass=None):
44 'newsitem': context.get('newsitem'),
45 'categories': context.get('categories'),
46 'news': context.get('news'),
49 @register.inclusion_tag('emissions/nav.html', takes_context=True)
50 def emission_nav(context, date=None, klass=None):
53 'categories': context.get('categories'),
54 'episodes': context.get('episodes'),
55 'emission': context.get('emission'),
56 'episode': context.get('episode'),
59 @register.inclusion_tag('episodes/resume.html', takes_context=True)
60 def episode_resume(context, date=None, model=None, klass=None):
64 'episode': context.get('episode'),
68 @register.inclusion_tag('episodes/detail.html', takes_context=True)
69 def episode_detail(context, date=None):
71 'episode': context.get('episode'),
72 'emission': context.get('emission'),
73 'diffusions': context.get('diffusions'),
76 @register.inclusion_tag('emissions/detail.html', takes_context=True)
77 def emission_detail(context, date=None):
79 'emission': context.get('emission'),
80 'schedules': context.get('schedules'),
83 @register.inclusion_tag('emissions/resume.html', takes_context=True)
84 def emission_resume(context, date=None):
86 'emission': context.get('emission'),
87 'schedules': context.get('schedules'),
90 @register.inclusion_tag('emissions/inline.html', takes_context=True)
91 def emission_inline(context, date=None):
93 'emission': context.get('emission'),
94 'schedules': context.get('schedules'),
97 @register.inclusion_tag('soundfiles/resume.html')
98 def soundfile_resume(soundfile, date=None):
99 return {'soundfile': soundfile,
102 @register.inclusion_tag('includes/player.html', takes_context=False)
104 return {'unique': uuid.uuid4()}
106 @register.inclusion_tag('includes/metaNav.html', takes_context=True)
107 def metanav(context, active=None):
109 'sectionName': context.get('sectionName')
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()
118 date = utils.tofirstdayinisoweek(year, week)
119 date = datetime(*date.timetuple()[:3])
121 program = period_program(date, date+timedelta(days=7))
124 days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
125 'datetime': date+timedelta(days=day)})
127 'fragment': fragment,
134 @register.inclusion_tag('news/inline.html', takes_context=True)
135 def news_inline(context, klass=None, logo=None):
137 'content': context.get('content'),
142 @register.inclusion_tag('news/roll.html', takes_context=True)
143 def newsroll(context, nbr=None):
145 'categories': context.get('categories'),
146 'news': context.get('news'),
147 'focus': context.get('focus'),
154 if isinstance(object, QuerySet):
155 return serialize('json', object)
156 return simplejson.dumps(object)
159 def strreplace ( string, args ):
160 find = args.split(',')[0]
161 replace = args.split(',')[1]
162 return string.replace(find,replace)
165 def replace ( string, args ):
166 search = args.split(args[0])[1]
167 replace = args.split(args[0])[2]
169 return re.sub( search, replace, string )
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, ''))
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, ''))
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)
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)
194 def search_result_template(parser, token):
196 tag_name, result_str = token.split_contents()
198 raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0])
199 return FormatSearchResultNode(result_str)
202 class FormatSearchResultNode(template.Node):
203 def __init__(self, result_str):
204 self.result_var = template.Variable(result_str)
206 def render(self, context):
207 result = self.result_var.resolve(context)
210 'emission': 'emissions',
211 'episode': 'episodes'
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))
217 @register.inclusion_tag('includes/piwik.html')
219 return {'enabled': settings.ENABLE_PIWIK}
223 def rfc822(datetime):
226 return email.utils.formatdate(time.mktime(datetime.timetuple()))
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]}