Revision ee7a2b87 snf-astakos-app/astakos/im/api/__init__.py

b/snf-astakos-app/astakos/im/api/__init__.py
1
# Copyright 2011-2012 GRNET S.A. All rights reserved.
1
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 2
#
3 3
# Redistribution and use in source and binary forms, with or
4 4
# without modification, are permitted provided that the following
......
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33 33

  
34
from functools import wraps
35
from traceback import format_exc
36
from urllib import quote, unquote
34
from functools import partial
37 35

  
38 36
from django.http import HttpResponse
39 37
from django.utils import simplejson as json
40
from django.conf import settings
41 38
from django.core.urlresolvers import reverse
42 39
from django.utils.translation import ugettext as _
43 40
from django.contrib import messages
44 41

  
45
from astakos.im.models import AstakosUser, Service, Resource
42
from astakos.im.models import AstakosUser, Service
43
from snf_django.lib import api
46 44
from snf_django.lib.api import faults
47 45
from astakos.im.settings import (
48 46
    INVITATIONS_ENABLED, COOKIE_NAME, EMAILCHANGE_ENABLED, QUOTAHOLDER_URL,
......
58 56
absolute = lambda request, url: request.build_absolute_uri(url)
59 57

  
60 58

  
61
def render_fault(request, fault):
62
    if isinstance(fault, faults.InternalServerError) and settings.DEBUG:
63
        fault.details = format_exc(fault)
64

  
65
    request.serialization = 'text'
66
    data = fault.message + '\n'
67
    if fault.details:
68
        data += '\n' + fault.details
69
    response = HttpResponse(data, status=fault.code)
70
    response['Content-Length'] = len(response.content)
71
    return response
72

  
73

  
74
def api_method(http_method=None):
75
    """Decorator function for views that implement an API method."""
76
    def decorator(func):
77
        @wraps(func)
78
        def wrapper(request, *args, **kwargs):
79
            try:
80
                if http_method and request.method != http_method:
81
                    raise faults.BadRequest('Method not allowed.')
82
                response = func(request, *args, **kwargs)
83
                return response
84
            except faults.Fault, fault:
85
                return render_fault(request, fault)
86
            except BaseException, e:
87
                logger.exception('Unexpected error: %s' % e)
88
                fault = faults.InternalServerError('Unexpected error')
89
                return render_fault(request, fault)
90
        return wrapper
91
    return decorator
59
# Decorator for API methods, using common utils.api_method decorator.
60
# It is used for 'get_services' and 'get_menu' methods that do not
61
# require any sort of authentication
62
api_method = partial(api.api_method, user_required=False,
63
                     token_required=False, logger=logger)
92 64

  
93 65

  
94 66
def get_services_dict():
95
    services = Service.objects.all()
96
    data = tuple({'id': s.pk, 'name': s.name, 'url': s.url, 'icon':
97
                 s.icon} for s in services)
98
    return data
67
    """Return dictionary with information about available Services."""
68
    return list(Service.objects.values("id", "name", "url", "icon"))
69

  
99 70

  
100 71
@api_method(http_method=None)
101 72
def get_services(request):
......
122 93
@api_method()
123 94
def get_menu(request, with_extra_links=False, with_signout=True):
124 95
    user = request.user
125
    from_location = request.GET.get('location')
126 96
    index_url = reverse('index')
127 97

  
128
    l = [{'url': absolute(request, index_url), 'name': _("Sign in")}]
129 98
    if user.is_authenticated():
130 99
        l = []
131 100
        append = l.append
132 101
        item = MenuItem
133 102
        item.current_path = absolute(request, request.path)
134
        append(item(
135
               url=absolute(request, reverse('index')),
136
               name=user.email))
103
        append(item(url=absolute(request, reverse('index')),
104
                    name=user.email))
137 105
        if with_extra_links:
138
            append(item(
139
                url=absolute(request, reverse('landing')),
140
                name="Overview"))
106
            append(item(url=absolute(request, reverse('landing')),
107
                        name="Overview"))
141 108
        if with_signout:
142
            append(item(
143
                   url=absolute(request, reverse('edit_profile')),
144
                   name="Dashboard"))
109
            append(item(url=absolute(request, reverse('edit_profile')),
110
                        name="Dashboard"))
145 111
        if with_extra_links:
146 112
            append(item(url=absolute(request, reverse('edit_profile')),
147
                    name="Profile"))
113
                        name="Profile"))
148 114

  
149 115
        if with_extra_links:
150 116
            if INVITATIONS_ENABLED:
151
                append(item(
152
                       url=absolute(request, reverse('invite')),
153
                       name="Invitations"))
117
                append(item(url=absolute(request, reverse('invite')),
118
                            name="Invitations"))
154 119

  
120
            append(item(url=absolute(request, reverse('resource_usage')),
121
                        name="Usage"))
155 122

  
156
            append(item(
157
                   url=absolute(request, reverse('resource_usage')),
158
                   name="Usage"))
159 123
            if QUOTAHOLDER_URL and PROJECTS_VISIBLE:
160
                append(item(
161
                       url=absolute(request, reverse('project_list')),
162
                       name="Projects"))
124
                append(item(url=absolute(request, reverse('project_list')),
125
                            name="Projects"))
163 126
            #append(item(
164 127
                #url=absolute(request, reverse('api_access')),
165 128
                #name="API Access"))
166 129

  
167
            append(item(
168
                   url=absolute(request, reverse('feedback')),
169
                   name="Contact"))
130
            append(item(url=absolute(request, reverse('feedback')),
131
                        name="Contact"))
170 132
        if with_signout:
171
            append(item(
172
                   url=absolute(request, reverse('logout')),
173
                   name="Sign out"))
133
            append(item(url=absolute(request, reverse('logout')),
134
                        name="Sign out"))
135
    else:
136
        l = [{'url': absolute(request, index_url),
137
              'name': _("Sign in")}]
174 138

  
175 139
    callback = request.GET.get('callback', None)
176 140
    data = json.dumps(tuple(l))
......
217 181
        if name == 'current_path':
218 182
            self.__set_is_active__()
219 183

  
184

  
220 185
def __get_uuid_displayname_catalogs(request, user_call=True):
221 186
    # Normal Response Codes: 200
222 187
    # Error Response Codes: BadRequest (400)
......
232 197
        displaynames = input_data.get('displaynames', [])
233 198
        if displaynames == None and user_call:
234 199
            displaynames = []
235
        d  = {'uuid_catalog':AstakosUser.objects.uuid_catalog(uuids),
236
              'displayname_catalog':AstakosUser.objects.displayname_catalog(displaynames)}
200
        user_obj = AstakosUser.objects
201
        d = {'uuid_catalog': user_obj.uuid_catalog(uuids),
202
             'displayname_catalog': user_obj.displayname_catalog(displaynames)}
237 203

  
238 204
        response = HttpResponse()
239 205
        response.content = json.dumps(d)
......
241 207
        response['Content-Length'] = len(response.content)
242 208
        return response
243 209

  
244
def __send_feedback(request, email_template_name='im/feedback_mail.txt', user=None):
210

  
211
def __send_feedback(request, email_template_name='im/feedback_mail.txt',
212
                    user=None):
245 213
    if not user:
246 214
        auth_token = request.POST.get('auth', '')
247 215
        if not auth_token:

Also available in: Unified diff