Statistics
| Branch: | Tag: | Revision:

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))