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.utils import period_program
16 from panikweb import utils
17 from panikweb import search
19 register = template.Library()
21 @register.filter(name='zip')
25 @register.inclusion_tag('includes/audio.html', takes_context=True)
26 def audio(context, sound=None):
28 'episode': context.get('episode'),
32 @register.inclusion_tag('listen/nav.html', takes_context=True)
33 def listen_nav(context, date=None, klass=None):
36 'categories': context.get('categories'),
39 @register.inclusion_tag('news/nav.html', takes_context=True)
40 def news_nav(context, date=None, klass=None):
43 'newsitem': context.get('newsitem'),
44 'categories': context.get('categories'),
45 'news': context.get('news'),
48 @register.inclusion_tag('emissions/nav.html', takes_context=True)
49 def emission_nav(context, date=None, klass=None):
52 'categories': context.get('categories'),
53 'episodes': context.get('episodes'),
54 'emission': context.get('emission'),
55 'episode': context.get('episode'),
58 @register.inclusion_tag('episodes/resume.html', takes_context=True)
59 def episode_resume(context, date=None, model=None, klass=None):
63 'episode': context.get('episode'),
67 @register.inclusion_tag('episodes/detail.html', takes_context=True)
68 def episode_detail(context, date=None):
70 'episode': context.get('episode'),
71 'emission': context.get('emission'),
72 'diffusions': context.get('diffusions'),
75 @register.inclusion_tag('emissions/detail.html', takes_context=True)
76 def emission_detail(context, date=None):
78 'emission': context.get('emission'),
79 'schedules': context.get('schedules'),
82 @register.inclusion_tag('emissions/resume.html', takes_context=True)
83 def emission_resume(context, date=None):
85 'emission': context.get('emission'),
86 'schedules': context.get('schedules'),
89 @register.inclusion_tag('emissions/inline.html', takes_context=True)
90 def emission_inline(context, date=None):
92 'emission': context.get('emission'),
93 'schedules': context.get('schedules'),
96 @register.inclusion_tag('includes/player.html', takes_context=False)
98 return {'unique': uuid.uuid4()}
100 @register.inclusion_tag('includes/metaNav.html', takes_context=True)
101 def metanav(context, active=None):
103 'sectionName': context.get('sectionName')
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()
112 date = utils.tofirstdayinisoweek(year, week)
113 date = datetime(*date.timetuple()[:3])
115 program = period_program(date, date+timedelta(days=7))
118 days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
119 'datetime': date+timedelta(days=day)})
121 'fragment': fragment,
128 @register.inclusion_tag('news/inline.html', takes_context=True)
129 def news_inline(context, klass=None, logo=None):
131 'content': context.get('content'),
136 @register.inclusion_tag('news/roll.html', takes_context=True)
137 def newsroll(context, nbr=None):
139 'categories': context.get('categories'),
140 'news': context.get('news'),
141 'focus': context.get('focus'),
148 if isinstance(object, QuerySet):
149 return serialize('json', object)
150 return simplejson.dumps(object)
153 def strreplace ( string, args ):
154 find = args.split(',')[0]
155 replace = args.split(',')[1]
156 return string.replace(find,replace)
159 def replace ( string, args ):
160 search = args.split(args[0])[1]
161 replace = args.split(args[0])[2]
163 return re.sub( search, replace, string )
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, ''))
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, ''))
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)
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)
188 def search_result_template(parser, token):
190 tag_name, result_str = token.split_contents()
192 raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0])
193 return FormatSearchResultNode(result_str)
196 class FormatSearchResultNode(template.Node):
197 def __init__(self, result_str):
198 self.result_var = template.Variable(result_str)
200 def render(self, context):
201 result = self.result_var.resolve(context)
204 'emission': 'emissions',
205 'episode': 'episodes'
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))
211 @register.inclusion_tag('includes/piwik.html')
213 return {'enabled': settings.ENABLE_PIWIK}
217 def rfc822(datetime):
220 return email.utils.formatdate(time.mktime(datetime.timetuple()))
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]}