8b20f8385801eafa2b664aff8f9448ff31611fe9
[prawokultury.git] / migdal / templatetags / migdal_tags.py
1 # -*- coding: utf-8 -*-
2 # This file is part of PrawoKultury, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 #
5 from django_comments_xtd.models import XtdComment
6 from django.contrib import comments
7 from django.core.urlresolvers import reverse
8 from django import template
9 from migdal.models import Category, Entry
10 from migdal import settings
11 from django.utils.translation import ugettext_lazy as _
12
13 register = template.Library()
14
15
16 @register.simple_tag(takes_context=True)
17 def entry_begin(context, entry):
18     t = template.loader.select_template((
19         'migdal/entry/%s/entry_begin.html' % entry.type,
20         'migdal/entry/entry_begin.html',
21     ))
22     context = {
23         'request': context['request'],
24         'object': entry,
25     }
26     return t.render(template.Context(context))
27
28
29 @register.simple_tag(takes_context=True)
30 def entry_short(context, entry):
31     t = template.loader.select_template((
32         'migdal/entry/%s/entry_short.html' % entry.type,
33         'migdal/entry/entry_short.html',
34     ))
35     context = {
36         'request': context['request'],
37         'object': entry,
38     }
39     return t.render(template.Context(context))
40
41
42 @register.simple_tag(takes_context=True)
43 def entry_promobox(context, entry, counter):
44     t = template.loader.select_template((
45         'migdal/entry/%s/entry_promobox.html' % entry.type,
46         'migdal/entry/entry_promobox.html',
47     ))
48     context = {
49         'request': context['request'],
50         'object': entry,
51         'counter': counter,
52     }
53     return t.render(template.Context(context))
54
55
56 @register.inclusion_tag('migdal/categories.html', takes_context=True)
57 def categories(context, taxonomy):
58     context = {
59         'request': context['request'],
60         'object_list': Category.objects.filter(taxonomy=taxonomy)
61     }
62     return context
63
64
65 @register.inclusion_tag('migdal/last_comments.html')
66 def last_comments(limit=10):
67     return {'object_list': 
68         XtdComment.objects.filter(is_public=True, is_removed=False).order_by('-submit_date')[:limit]}
69
70
71 @register.inclusion_tag(['comments/form.html'])
72 def entry_comment_form(entry):
73     return {
74             'form': comments.get_form()(entry),
75             'next': entry.get_absolute_url(),
76         }
77
78
79 class MenuItem(object):
80     html_id = None
81
82     def __init__(self, title, url, html_id=None):
83         self.title = title
84         self.url = url
85         self.html_id = html_id
86
87     def check_active(self, chooser, value):
88         self.active = chooser == 'url' and value == self.url
89
90
91 class ModelMenuItem(object):
92     def __init__(self, obj, title=None, html_id=None):
93         self.obj = obj
94         self.title = title or unicode(obj)
95         self.url = obj.get_absolute_url()
96         self.html_id = html_id
97
98     def check_active(self, chooser, value):
99         self.active = (chooser == 'object' and value == self.obj or
100                         chooser == 'objects' and self.obj in value)
101
102 class CategoryMenuItem(ModelMenuItem):
103     def check_active(self, chooser, value):
104         super(CategoryMenuItem, self).check_active(chooser, value)
105         self.active = (self.active or
106                        (chooser == 'object' and isinstance(value, Entry) and
107                         self.obj in value.categories.all()))
108
109
110 class EntryTypeMenuItem(object):
111     def __init__(self, title, type_, html_id=None):
112         self.type = type_
113         self.title = title
114         self.url = reverse('migdal_entry_list_%s' % type_)
115         self.html_id = html_id
116
117     def check_active(self, chooser, value):
118         self.active = (chooser == 'object' and isinstance(value, Entry)
119                         and value.type == self.type or
120                         chooser == 'entry_type' and value == self.type)
121
122 @register.inclusion_tag('migdal/menu.html', takes_context=True)
123 def main_menu(context, chooser=None, value=None):
124     items = [
125         ModelMenuItem(Entry.objects.get(slug_pl='o-nas')),
126         EntryTypeMenuItem(_(u'Publications'), u'publications'),
127         MenuItem(_(u'Events'), reverse('events')),
128         CategoryMenuItem(Category.objects.get(slug_pl='stanowisko'), title=_('Positions')),
129         CategoryMenuItem(Category.objects.get(slug_pl='pierwsza-pomoc')),
130     ]
131     if context['request'].LANGUAGE_CODE == 'pl':
132         items.append(MenuItem(u'en', '/en/', html_id='item-lang'))
133     else:
134         items.append(MenuItem(u'pl', '/', html_id='item-lang'))
135     for item in items:
136         item.check_active(chooser, value)
137     return {'items': items}