root / snf-astakos-app / astakos / im / templatetags / astakos_tags.py @ 2e15f9f6
History | View | Annotate | Download (7 kB)
1 | dd5f8f4d | Kostas Papadimitriou | # Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | dd5f8f4d | Kostas Papadimitriou | #
|
3 | dd5f8f4d | Kostas Papadimitriou | # Redistribution and use in source and binary forms, with or
|
4 | dd5f8f4d | Kostas Papadimitriou | # without modification, are permitted provided that the following
|
5 | dd5f8f4d | Kostas Papadimitriou | # conditions are met:
|
6 | dd5f8f4d | Kostas Papadimitriou | #
|
7 | dd5f8f4d | Kostas Papadimitriou | # 1. Redistributions of source code must retain the above
|
8 | dd5f8f4d | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
9 | dd5f8f4d | Kostas Papadimitriou | # disclaimer.
|
10 | dd5f8f4d | Kostas Papadimitriou | #
|
11 | dd5f8f4d | Kostas Papadimitriou | # 2. Redistributions in binary form must reproduce the above
|
12 | dd5f8f4d | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
13 | dd5f8f4d | Kostas Papadimitriou | # disclaimer in the documentation and/or other materials
|
14 | dd5f8f4d | Kostas Papadimitriou | # provided with the distribution.
|
15 | dd5f8f4d | Kostas Papadimitriou | #
|
16 | dd5f8f4d | Kostas Papadimitriou | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | dd5f8f4d | Kostas Papadimitriou | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | dd5f8f4d | Kostas Papadimitriou | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | dd5f8f4d | Kostas Papadimitriou | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | dd5f8f4d | Kostas Papadimitriou | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | dd5f8f4d | Kostas Papadimitriou | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | dd5f8f4d | Kostas Papadimitriou | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | dd5f8f4d | Kostas Papadimitriou | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | dd5f8f4d | Kostas Papadimitriou | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | dd5f8f4d | Kostas Papadimitriou | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | dd5f8f4d | Kostas Papadimitriou | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | dd5f8f4d | Kostas Papadimitriou | # POSSIBILITY OF SUCH DAMAGE.
|
28 | dd5f8f4d | Kostas Papadimitriou | #
|
29 | dd5f8f4d | Kostas Papadimitriou | # The views and conclusions contained in the software and
|
30 | dd5f8f4d | Kostas Papadimitriou | # documentation are those of the authors and should not be
|
31 | dd5f8f4d | Kostas Papadimitriou | # interpreted as representing official policies, either expressed
|
32 | dd5f8f4d | Kostas Papadimitriou | # or implied, of GRNET S.A.
|
33 | dd5f8f4d | Kostas Papadimitriou | |
34 | dd5f8f4d | Kostas Papadimitriou | import urllib |
35 | dd5f8f4d | Kostas Papadimitriou | |
36 | dd5f8f4d | Kostas Papadimitriou | from inspect import getargspec |
37 | dd5f8f4d | Kostas Papadimitriou | |
38 | 4f78c22c | Sofia Papagiannaki | from django import template |
39 | c0b26605 | Sofia Papagiannaki | from django.core.urlresolvers import resolve |
40 | 4f78c22c | Sofia Papagiannaki | from django.conf import settings |
41 | dd5f8f4d | Kostas Papadimitriou | from django.template import TemplateSyntaxError, Variable |
42 | 4f78c22c | Sofia Papagiannaki | |
43 | 4f78c22c | Sofia Papagiannaki | register = template.Library() |
44 | 4f78c22c | Sofia Papagiannaki | |
45 | 4f78c22c | Sofia Papagiannaki | MESSAGES_VIEWS_MAP = getattr(settings, 'ASTAKOS_MESSAGES_VIEWS_MAP', { |
46 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.index': 'LOGIN_MESSAGES', |
47 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.logout': 'LOGIN_MESSAGES', |
48 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.login': 'LOGIN_MESSAGES', |
49 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.signup': 'SIGNUP_MESSAGES', |
50 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.edit_profile': 'PROFILE_MESSAGES', |
51 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.change_password': 'PROFILE_MESSAGES', |
52 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.invite': 'PROFILE_MESSAGES', |
53 | 4f78c22c | Sofia Papagiannaki | 'astakos.im.views.feedback': 'PROFILE_MESSAGES', |
54 | 4f78c22c | Sofia Papagiannaki | }) |
55 | 4f78c22c | Sofia Papagiannaki | |
56 | 9a06d96f | Olga Brani | |
57 | dd5f8f4d | Kostas Papadimitriou | # helper tag decorator
|
58 | dd5f8f4d | Kostas Papadimitriou | # https://github.com/djblets/djblets/blob/master/djblets/util/decorators.py#L96
|
59 | dd5f8f4d | Kostas Papadimitriou | def basictag(takes_context=False): |
60 | dd5f8f4d | Kostas Papadimitriou | """
|
61 | dd5f8f4d | Kostas Papadimitriou | A decorator similar to Django's @register.simple_tag that optionally
|
62 | dd5f8f4d | Kostas Papadimitriou | takes a context parameter. This condenses many tag implementations down
|
63 | dd5f8f4d | Kostas Papadimitriou | to a few lines of code.
|
64 | dd5f8f4d | Kostas Papadimitriou |
|
65 | dd5f8f4d | Kostas Papadimitriou | Example:
|
66 | dd5f8f4d | Kostas Papadimitriou | @register.tag
|
67 | dd5f8f4d | Kostas Papadimitriou | @basictag(takes_context=True)
|
68 | dd5f8f4d | Kostas Papadimitriou | def printuser(context):
|
69 | dd5f8f4d | Kostas Papadimitriou | return context['user']
|
70 | dd5f8f4d | Kostas Papadimitriou | """
|
71 | dd5f8f4d | Kostas Papadimitriou | class BasicTagNode(template.Node): |
72 | dd5f8f4d | Kostas Papadimitriou | def __init__(self, take_context, tag_name, tag_func, args): |
73 | dd5f8f4d | Kostas Papadimitriou | self.takes_context = takes_context
|
74 | dd5f8f4d | Kostas Papadimitriou | self.tag_name = tag_name
|
75 | dd5f8f4d | Kostas Papadimitriou | self.tag_func = tag_func
|
76 | dd5f8f4d | Kostas Papadimitriou | self.args = args
|
77 | dd5f8f4d | Kostas Papadimitriou | |
78 | dd5f8f4d | Kostas Papadimitriou | def render(self, context): |
79 | dd5f8f4d | Kostas Papadimitriou | args = [Variable(var).resolve(context) for var in self.args] |
80 | dd5f8f4d | Kostas Papadimitriou | |
81 | dd5f8f4d | Kostas Papadimitriou | if self.takes_context: |
82 | dd5f8f4d | Kostas Papadimitriou | return self.tag_func(context, *args) |
83 | dd5f8f4d | Kostas Papadimitriou | else:
|
84 | dd5f8f4d | Kostas Papadimitriou | return self.tag_func(*args) |
85 | dd5f8f4d | Kostas Papadimitriou | |
86 | dd5f8f4d | Kostas Papadimitriou | def basictag_func(tag_func): |
87 | dd5f8f4d | Kostas Papadimitriou | def _setup_tag(parser, token): |
88 | dd5f8f4d | Kostas Papadimitriou | bits = token.split_contents() |
89 | dd5f8f4d | Kostas Papadimitriou | tag_name = bits[0]
|
90 | dd5f8f4d | Kostas Papadimitriou | del(bits[0]) |
91 | dd5f8f4d | Kostas Papadimitriou | |
92 | dd5f8f4d | Kostas Papadimitriou | params, xx, xxx, defaults = getargspec(tag_func) |
93 | dd5f8f4d | Kostas Papadimitriou | max_args = len(params)
|
94 | dd5f8f4d | Kostas Papadimitriou | |
95 | dd5f8f4d | Kostas Papadimitriou | if takes_context:
|
96 | dd5f8f4d | Kostas Papadimitriou | if params[0] == 'context': |
97 | dd5f8f4d | Kostas Papadimitriou | max_args -= 1 # Ignore context |
98 | dd5f8f4d | Kostas Papadimitriou | else:
|
99 | dd5f8f4d | Kostas Papadimitriou | raise TemplateSyntaxError, \
|
100 | dd5f8f4d | Kostas Papadimitriou | "Any tag function decorated with takes_context=True " \
|
101 | dd5f8f4d | Kostas Papadimitriou | "must have a first argument of 'context'"
|
102 | dd5f8f4d | Kostas Papadimitriou | |
103 | dd5f8f4d | Kostas Papadimitriou | min_args = max_args - len(defaults or []) |
104 | dd5f8f4d | Kostas Papadimitriou | |
105 | dd5f8f4d | Kostas Papadimitriou | if not min_args <= len(bits) <= max_args: |
106 | dd5f8f4d | Kostas Papadimitriou | if min_args == max_args:
|
107 | dd5f8f4d | Kostas Papadimitriou | raise TemplateSyntaxError, \
|
108 | dd5f8f4d | Kostas Papadimitriou | "%r tag takes %d arguments." % (tag_name, min_args)
|
109 | dd5f8f4d | Kostas Papadimitriou | else:
|
110 | dd5f8f4d | Kostas Papadimitriou | raise TemplateSyntaxError, \
|
111 | dd5f8f4d | Kostas Papadimitriou | "%r tag takes %d to %d arguments, got %d." % \
|
112 | dd5f8f4d | Kostas Papadimitriou | (tag_name, min_args, max_args, len(bits))
|
113 | dd5f8f4d | Kostas Papadimitriou | |
114 | dd5f8f4d | Kostas Papadimitriou | return BasicTagNode(takes_context, tag_name, tag_func, bits)
|
115 | dd5f8f4d | Kostas Papadimitriou | |
116 | dd5f8f4d | Kostas Papadimitriou | _setup_tag.__name__ = tag_func.__name__ |
117 | dd5f8f4d | Kostas Papadimitriou | _setup_tag.__doc__ = tag_func.__doc__ |
118 | dd5f8f4d | Kostas Papadimitriou | _setup_tag.__dict__.update(tag_func.__dict__) |
119 | dd5f8f4d | Kostas Papadimitriou | return _setup_tag
|
120 | dd5f8f4d | Kostas Papadimitriou | |
121 | dd5f8f4d | Kostas Papadimitriou | return basictag_func
|
122 | dd5f8f4d | Kostas Papadimitriou | |
123 | dd5f8f4d | Kostas Papadimitriou | |
124 | 4f78c22c | Sofia Papagiannaki | @register.tag(name='display_messages') |
125 | 4f78c22c | Sofia Papagiannaki | def display_messages(parser, token): |
126 | 4f78c22c | Sofia Papagiannaki | return MessagesNode()
|
127 | 4f78c22c | Sofia Papagiannaki | |
128 | 9a06d96f | Olga Brani | |
129 | 4f78c22c | Sofia Papagiannaki | class DummyMessage(object): |
130 | 4f78c22c | Sofia Papagiannaki | def __init__(self, type, msg): |
131 | 4f78c22c | Sofia Papagiannaki | self.message = msg
|
132 | 4f78c22c | Sofia Papagiannaki | self.tags = type |
133 | 4f78c22c | Sofia Papagiannaki | |
134 | 4f78c22c | Sofia Papagiannaki | def __repr__(self): |
135 | 4f78c22c | Sofia Papagiannaki | return "%s: %s" % (self.tags, self.message) |
136 | 4f78c22c | Sofia Papagiannaki | |
137 | 9a06d96f | Olga Brani | |
138 | 4f78c22c | Sofia Papagiannaki | class MessagesNode(template.Node): |
139 | 4f78c22c | Sofia Papagiannaki | |
140 | 4f78c22c | Sofia Papagiannaki | def get_view_messages(self, context): |
141 | 4f78c22c | Sofia Papagiannaki | messages = list(context['GLOBAL_MESSAGES']) |
142 | 4f78c22c | Sofia Papagiannaki | try:
|
143 | 4f78c22c | Sofia Papagiannaki | view = resolve(context['request'].get_full_path())[0] |
144 | 4f78c22c | Sofia Papagiannaki | view_name = "%s.%s" % (view.__module__, view.func_name)
|
145 | 4f78c22c | Sofia Papagiannaki | messages += context[MESSAGES_VIEWS_MAP.get(view_name)] |
146 | 4f78c22c | Sofia Papagiannaki | return messages
|
147 | 4f78c22c | Sofia Papagiannaki | except Exception, e: |
148 | 4f78c22c | Sofia Papagiannaki | return messages
|
149 | 4f78c22c | Sofia Papagiannaki | |
150 | 4f78c22c | Sofia Papagiannaki | def render(self, context): |
151 | 4f78c22c | Sofia Papagiannaki | if self not in context.render_context: |
152 | 4f78c22c | Sofia Papagiannaki | messages = list(context['messages']) |
153 | 4f78c22c | Sofia Papagiannaki | if context['EXTRA_MESSAGES_SET']: |
154 | 4f78c22c | Sofia Papagiannaki | view_messages = self.get_view_messages(context)
|
155 | 4f78c22c | Sofia Papagiannaki | for msg_object in view_messages: |
156 | 4f78c22c | Sofia Papagiannaki | messages.append(DummyMessage(msg_object[0], msg_object[1])) |
157 | 4f78c22c | Sofia Papagiannaki | |
158 | 4f78c22c | Sofia Papagiannaki | if not messages: |
159 | 4f78c22c | Sofia Papagiannaki | return "" |
160 | 4f78c22c | Sofia Papagiannaki | |
161 | 4f78c22c | Sofia Papagiannaki | cls = messages[-1].tags
|
162 | 4f78c22c | Sofia Papagiannaki | content = '<div class="top-msg active %s">' % cls
|
163 | 4f78c22c | Sofia Papagiannaki | for msg in messages: |
164 | 9a06d96f | Olga Brani | content += '<div class="msg %s">%s</div>' % (
|
165 | 9a06d96f | Olga Brani | msg.tags, msg.message) |
166 | 4f78c22c | Sofia Papagiannaki | |
167 | 4f78c22c | Sofia Papagiannaki | content += '<a href="#" title="close" class="close">X</a>'
|
168 | 4f78c22c | Sofia Papagiannaki | content += '</div>'
|
169 | 4f78c22c | Sofia Papagiannaki | context.render_context[self] = content
|
170 | 4f78c22c | Sofia Papagiannaki | |
171 | 4f78c22c | Sofia Papagiannaki | return context.render_context[self] |
172 | 279d6e51 | Olga Brani | |
173 | 279d6e51 | Olga Brani | |
174 | 279d6e51 | Olga Brani | @register.simple_tag
|
175 | 669cfe19 | Olga Brani | def get_grant_value(rname, form): |
176 | 669cfe19 | Olga Brani | grants = form.instance.grants |
177 | 669cfe19 | Olga Brani | service_name, resource_name = rname.split('.',1) |
178 | 669cfe19 | Olga Brani | try:
|
179 | 669cfe19 | Olga Brani | return form.instance.projectresourcegrant_set.get(resource__name=resource_name,
|
180 | 669cfe19 | Olga Brani | resource__service__name=service_name).member_capacity |
181 | 669cfe19 | Olga Brani | except:
|
182 | dd5f8f4d | Kostas Papadimitriou | return '' |
183 | dd5f8f4d | Kostas Papadimitriou | |
184 | dd5f8f4d | Kostas Papadimitriou | @register.tag(name="provider_login_url") |
185 | dd5f8f4d | Kostas Papadimitriou | @basictag(takes_context=True) |
186 | dd5f8f4d | Kostas Papadimitriou | def provider_login_url(context, provider): |
187 | dd5f8f4d | Kostas Papadimitriou | request = context['request'].REQUEST
|
188 | dd5f8f4d | Kostas Papadimitriou | next = request.get('next', None) |
189 | dd5f8f4d | Kostas Papadimitriou | code = request.get('code', None) |
190 | dd5f8f4d | Kostas Papadimitriou | key = request.get('key', None) |
191 | dd5f8f4d | Kostas Papadimitriou | |
192 | dd5f8f4d | Kostas Papadimitriou | attrs = {} |
193 | dd5f8f4d | Kostas Papadimitriou | if next: |
194 | dd5f8f4d | Kostas Papadimitriou | attrs['next'] = next |
195 | dd5f8f4d | Kostas Papadimitriou | if code:
|
196 | dd5f8f4d | Kostas Papadimitriou | attrs['code'] = code
|
197 | dd5f8f4d | Kostas Papadimitriou | if key:
|
198 | dd5f8f4d | Kostas Papadimitriou | attrs['key'] = key
|
199 | dd5f8f4d | Kostas Papadimitriou | |
200 | dd5f8f4d | Kostas Papadimitriou | url = provider.add_url |
201 | dd5f8f4d | Kostas Papadimitriou | |
202 | dd5f8f4d | Kostas Papadimitriou | joinchar = "?"
|
203 | dd5f8f4d | Kostas Papadimitriou | if "?" in url: |
204 | dd5f8f4d | Kostas Papadimitriou | joinchar = "&"
|
205 | dd5f8f4d | Kostas Papadimitriou | |
206 | dd5f8f4d | Kostas Papadimitriou | return "%s%s%s" % (provider.add_url, joinchar, urllib.urlencode(attrs)) |