Revision 14c5be5a snf-astakos-app/astakos/im/api/admin.py

b/snf-astakos-app/astakos/im/api/admin.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
import logging
35
import urllib
36 35

  
37 36
from functools import wraps
38
from traceback import format_exc
39 37
from time import time, mktime
40
from urllib import quote
41 38
from urlparse import urlparse
42 39
from collections import defaultdict
43 40

  
44
from django.conf import settings
45 41
from django.http import HttpResponse
46 42
from django.utils import simplejson as json
47
from django.core.urlresolvers import reverse
48 43

  
49 44
from astakos.im.api.faults import *
45
from astakos.im.api import render_fault
50 46
from astakos.im.models import AstakosUser, Service
51
from astakos.im.settings import INVITATIONS_ENABLED, COOKIE_NAME, EMAILCHANGE_ENABLED
52 47
from astakos.im.util import epoch
53 48
from astakos.im.api import _get_user_by_email, _get_user_by_username
54 49

  
55 50
logger = logging.getLogger(__name__)
56 51
format = ('%a, %d %b %Y %H:%M:%S GMT')
57 52

  
58
def render_fault(request, fault):
59
    if isinstance(fault, InternalServerError) and settings.DEBUG:
60
        fault.details = format_exc(fault)
61

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

  
70 53
def api_method(http_method=None, token_required=False, perms=None):
71 54
    """Decorator function for views that implement an API method."""
72 55
    if not perms:
......
171 154
    response['Content-Length'] = len(response.content)
172 155
    return response
173 156

  
174
@api_method(http_method='GET')
175
def get_services(request):
176
    callback = request.GET.get('callback', None)
177
    services = Service.objects.all()
178
    data = tuple({'id':s.pk, 'name':s.name, 'url':s.url, 'icon':s.icon} for s in services)
179
    data = json.dumps(data)
180
    mimetype = 'application/json'
181

  
182
    if callback:
183
        mimetype = 'application/javascript'
184
        data = '%s(%s)' % (callback, data)
185

  
186
    return HttpResponse(content=data, mimetype=mimetype)
187

  
188
@api_method()
189
def get_menu(request, with_extra_links=False, with_signout=True):
190
    index_url = reverse('index')
191
    absolute = lambda (url): request.build_absolute_uri(url)
192
    l = [{ 'url': absolute(index_url), 'name': "Sign in"}]
193
    cookie = urllib.unquote(request.COOKIES.get(COOKIE_NAME, ''))
194
    email = cookie.partition('|')[0]
195
    try:
196
        if not email:
197
            raise ValueError
198
        user = AstakosUser.objects.get(email=email, is_active=True)
199
    except AstakosUser.DoesNotExist:
200
        pass
201
    except ValueError:
202
        pass
203
    else:
204
        l = []
205
        l.append({ 'url': absolute(reverse('astakos.im.views.index')),
206
                  'name': user.email})
207
        l.append({ 'url': absolute(reverse('astakos.im.views.edit_profile')),
208
                  'name': "My account" })
209
        if with_extra_links:
210
            if user.has_usable_password() and user.provider == 'local':
211
                l.append({ 'url': absolute(reverse('password_change')),
212
                          'name': "Change password" })
213
            if EMAILCHANGE_ENABLED:
214
                l.append({'url':absolute(reverse('email_change')),
215
                          'name': "Change email"})
216
            if INVITATIONS_ENABLED:
217
                l.append({ 'url': absolute(reverse('astakos.im.views.invite')),
218
                          'name': "Invitations" })
219
            l.append({ 'url': absolute(reverse('astakos.im.views.feedback')),
220
                      'name': "Feedback" })
221
        if with_signout:
222
            l.append({ 'url': absolute(reverse('astakos.im.views.logout')),
223
                      'name': "Sign out"})
224

  
225
    callback = request.GET.get('callback', None)
226
    data = json.dumps(tuple(l))
227
    mimetype = 'application/json'
228

  
229
    if callback:
230
        mimetype = 'application/javascript'
231
        data = '%s(%s)' % (callback, data)
232

  
233
    return HttpResponse(content=data, mimetype=mimetype)
234

  
235 157
@api_method(http_method='GET', token_required=True, perms=['im.can_access_userinfo'])
236 158
def get_user_by_email(request, user=None):
237 159
    # Normal Response Codes: 200

Also available in: Unified diff