43371b1a13a98d5d767ed4cb1b0c8254cbb0ccfb
[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 import app_settings
10 from migdal.models import Category, Entry
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, detail=False):
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         'detail': detail,
26     }
27     return t.render(template.Context(context))
28
29
30 @register.simple_tag(takes_context=True)
31 def entry_short(context, entry):
32     t = template.loader.select_template((
33         'migdal/entry/%s/entry_short.html' % entry.type,
34         'migdal/entry/entry_short.html',
35     ))
36     context = {
37         'request': context['request'],
38         'object': entry,
39     }
40     return t.render(template.Context(context))
41
42
43 @register.simple_tag(takes_context=True)
44 def entry_promobox(context, entry, counter):
45     t = template.loader.select_template((
46         'migdal/entry/%s/entry_promobox.html' % entry.type,
47         'migdal/entry/entry_promobox.html',
48     ))
49     context = {
50         'request': context['request'],
51         'object': entry,
52         'counter': counter,
53     }
54     return t.render(template.Context(context))
55
56
57 @register.inclusion_tag('migdal/categories.html', takes_context=True)
58 def categories(context, taxonomy):
59     context = {
60         'request': context['request'],
61         'object_list': Category.objects.filter(taxonomy=taxonomy)
62     }
63     return context
64
65
66 @register.inclusion_tag('migdal/last_comments.html')
67 def last_comments(limit=app_settings.LAST_COMMENTS):
68     return {'object_list': 
69         XtdComment.objects.filter(is_public=True, is_removed=False).order_by('-submit_date')[:limit]}
70
71
72 @register.inclusion_tag(['comments/form.html'])
73 def entry_comment_form(entry):
74     return {
75             'form': comments.get_form()(entry),
76             'next': entry.get_absolute_url(),
77         }
78
79
80 class MenuItem(object):
81     html_id = None
82
83     def __init__(self, title, url, html_id=None):
84         self.title = title
85         self.url = url
86         self.html_id = html_id
87
88     def check_active(self, chooser, value):
89         self.active = chooser == 'url' and value == self.url
90
91
92 class ModelMenuItem(object):
93     def __init__(self, obj, title=None, html_id=None):
94         self.obj = obj
95         self.title = title or unicode(obj)
96         self.url = obj.get_absolute_url()
97         self.html_id = html_id
98
99     def check_active(self, chooser, value):
100         self.active = (chooser == 'object' and value == self.obj or
101                         chooser == 'objects' and self.obj in value)
102
103 class CategoryMenuItem(ModelMenuItem):
104     def check_active(self, chooser, value):
105         super(CategoryMenuItem, self).check_active(chooser, value)
106         self.active = (self.active or
107                        (chooser == 'object' and isinstance(value, Entry) and
108                         self.obj in value.categories.all()))
109
110
111 class EntryTypeMenuItem(object):
112     def __init__(self, title, type_, html_id=None):
113         self.type = type_
114         self.title = title
115         self.url = reverse('migdal_entry_list_%s' % type_)
116         self.html_id = html_id
117
118     def check_active(self, chooser, value):
119         self.active = (chooser == 'object' and isinstance(value, Entry)
120                         and value.type == self.type or
121                         chooser == 'entry_type' and value == self.type)
122
123 @register.inclusion_tag('migdal/menu.html', takes_context=True)
124 def main_menu(context, chooser=None, value=None):
125     items = [
126         ModelMenuItem(Entry.objects.get(slug_pl='o-nas')),
127         EntryTypeMenuItem(_(u'Publications'), u'publications'),
128         MenuItem(_(u'Events'), reverse('events')),
129         CategoryMenuItem(Category.objects.get(slug_pl='stanowisko'),
130             title=_('Positions')),
131         CategoryMenuItem(Category.objects.get(slug_pl='pierwsza-pomoc'),
132             title=_('First aid in copyright')),
133     ]
134     if context['request'].LANGUAGE_CODE == 'pl':
135         items.append(MenuItem(u'en', '/en/', html_id='item-lang'))
136     else:
137         items.append(MenuItem(u'pl', '/', html_id='item-lang'))
138     for item in items:
139         item.check_active(chooser, value)
140     return {'items': items}