X-Git-Url: https://code.grnet.gr/git/astakos/blobdiff_plain/304acb6023e02490ff888bf1e6bd49ba23908625..666c74904d6faf2c5c586f92d5e6ee105a211660:/snf-astakos-app/astakos/im/api/__init__.py diff --git a/snf-astakos-app/astakos/im/api/__init__.py b/snf-astakos-app/astakos/im/api/__init__.py index 9fba519..754f34f 100644 --- a/snf-astakos-app/astakos/im/api/__init__.py +++ b/snf-astakos-app/astakos/im/api/__init__.py @@ -41,7 +41,7 @@ from django.conf import settings from django.core.urlresolvers import reverse from astakos.im.models import AstakosUser, GroupKind, Service, Resource -from astakos.im.api.faults import Fault, ItemNotFound, InternalServerError +from astakos.im.api.faults import Fault, ItemNotFound, InternalServerError, BadRequest from astakos.im.settings import INVITATIONS_ENABLED, COOKIE_NAME, EMAILCHANGE_ENABLED import logging @@ -49,6 +49,9 @@ logger = logging.getLogger(__name__) format = ('%a, %d %b %Y %H:%M:%S GMT') +absolute = lambda request, url: request.build_absolute_uri(url) + + def render_fault(request, fault): if isinstance(fault, InternalServerError) and settings.DEBUG: fault.details = format_exc(fault) @@ -61,6 +64,7 @@ def render_fault(request, fault): response['Content-Length'] = len(response.content) return response + def api_method(http_method=None): """Decorator function for views that implement an API method.""" def decorator(func): @@ -80,61 +84,65 @@ def api_method(http_method=None): return wrapper return decorator + def _get_user_by_username(user_id): try: - user = AstakosUser.objects.get(username = user_id) - except AstakosUser.DoesNotExist, e: + user = AstakosUser.objects.get(username=user_id) + except AstakosUser.DoesNotExist: raise ItemNotFound('Invalid userid') else: response = HttpResponse() - response.status=200 - user_info = {'id':user.id, - 'username':user.username, - 'email':[user.email], - 'name':user.realname, - 'auth_token_created':user.auth_token_created.strftime(format), - 'auth_token_expires':user.auth_token_expires.strftime(format), - 'has_credits':user.has_credits, - 'enabled':user.is_active, - 'groups':[g.name for g in user.groups.all()]} + response.status = 200 + user_info = {'id': user.id, + 'username': user.username, + 'email': [user.email], + 'name': user.realname, + 'auth_token_created': user.auth_token_created.strftime(format), + 'auth_token_expires': user.auth_token_expires.strftime(format), + 'has_credits': user.has_credits, + 'enabled': user.is_active, + 'groups': [g.name for g in user.groups.all()]} response.content = json.dumps(user_info) response['Content-Type'] = 'application/json; charset=UTF-8' response['Content-Length'] = len(response.content) return response + def _get_user_by_email(email): if not email: raise BadRequest('Email missing') try: - user = AstakosUser.objects.get(email = email) - except AstakosUser.DoesNotExist, e: + user = AstakosUser.objects.get(email__iexact=email) + except AstakosUser.DoesNotExist: raise ItemNotFound('Invalid email') - + if not user.is_active: raise ItemNotFound('Inactive user') else: response = HttpResponse() - response.status=200 - user_info = {'id':user.id, - 'username':user.username, - 'email':[user.email], - 'enabled':user.is_active, - 'name':user.realname, - 'auth_token_created':user.auth_token_created.strftime(format), - 'auth_token_expires':user.auth_token_expires.strftime(format), - 'has_credits':user.has_credits, - 'groups':[g.name for g in user.groups.all()], - 'user_permissions':[p.codename for p in user.user_permissions.all()]} + response.status = 200 + user_info = {'id': user.id, + 'username': user.username, + 'email': [user.email], + 'enabled': user.is_active, + 'name': user.realname, + 'auth_token_created': user.auth_token_created.strftime(format), + 'auth_token_expires': user.auth_token_expires.strftime(format), + 'has_credits': user.has_credits, + 'groups': [g.name for g in user.groups.all()], + 'user_permissions': [p.codename for p in user.user_permissions.all()]} response.content = json.dumps(user_info) response['Content-Type'] = 'application/json; charset=UTF-8' response['Content-Length'] = len(response.content) return response + @api_method(http_method='GET') def get_services(request): callback = request.GET.get('callback', None) services = Service.objects.all() - data = tuple({'id':s.pk, 'name':s.name, 'url':s.url, 'icon':s.icon} for s in services) + data = tuple({'id': s.pk, 'name': s.name, 'url': s.url, 'icon': + s.icon} for s in services) data = json.dumps(data) mimetype = 'application/json' @@ -144,38 +152,70 @@ def get_services(request): return HttpResponse(content=data, mimetype=mimetype) + @api_method() def get_menu(request, with_extra_links=False, with_signout=True): user = request.user - if not isinstance(user, AstakosUser): - cookie = unquote(request.COOKIES.get(COOKIE_NAME, '')) - email = cookie.partition('|')[0] - try: - if email: - user = AstakosUser.objects.get(email=email, is_active=True) - except AstakosUser.DoesNotExist: - pass - - absolute = lambda (url): request.build_absolute_uri(url) - if not isinstance(user, AstakosUser): - index_url = reverse('index') - l = [{ 'url': absolute(index_url), 'name': "Sign in"}] - else: + index_url = reverse('index') + l = [{'url': absolute(request, index_url), 'name': "Sign in"}] + if user.is_authenticated(): l = [] - l.append(dict(url=absolute(reverse('index')), name=user.email)) - l.append(dict(url=absolute(reverse('edit_profile')), name="My account")) + append = l.append + item = MenuItem + item.current_path = absolute(request, request.path) + append(item( + url=absolute(request, reverse('index')), + name=user.email)) + append(item(url=absolute(request, reverse('edit_profile')), + name="My account")) if with_extra_links: if user.has_usable_password() and user.provider in ('local', ''): - l.append(dict(url=absolute(reverse('password_change')), name="Change password")) + append(item( + url=absolute(request, reverse('password_change')), + name="Change password")) if EMAILCHANGE_ENABLED: - l.append(dict(url=absolute(reverse('email_change')), name="Change email")) + append(item( + url=absolute(request, reverse('email_change')), + name="Change email")) if INVITATIONS_ENABLED: - l.append(dict(url=absolute(reverse('invite')), name="Invitations")) - l.append(dict(url=absolute(reverse('feedback')), name="Feedback")) - l.append(dict(url=absolute(reverse('group_list')), name="Groups")) - l.append(dict(url=absolute(reverse('resource_list')), name="Resources")) + append(item( + url=absolute(request, reverse('invite')), + name="Invitations")) + + append(item( + url=absolute(request, reverse('group_list')), + name="Projects", +# submenu=(item( +# url=absolute(request, +# reverse('group_list')), +# name="Overview"), +# item( +# url=absolute(request, +# reverse('group_create_list')), +# name="Create"), +# item( +# url=absolute(request, +# reverse('group_search')), +# name="Join"), +# ) + ) + ) + append(item( + url=absolute(request, reverse('resource_usage')), + name="Usage")) + append(item( + url=absolute(request, reverse('feedback')), + name="Feedback")) +# append(item( +# url=absolute(request, reverse('billing')), +# name="Billing")) +# append(item( +# url=absolute(request, reverse('timeline')), +# name="Timeline")) if with_signout: - l.append(dict(url=absolute(reverse('logout')), name="Sign out")) + append(item( + url=absolute(request, reverse('logout')), + name="Sign out")) callback = request.GET.get('callback', None) data = json.dumps(tuple(l)) @@ -185,4 +225,39 @@ def get_menu(request, with_extra_links=False, with_signout=True): mimetype = 'application/javascript' data = '%s(%s)' % (callback, data) - return HttpResponse(content=data, mimetype=mimetype) \ No newline at end of file + return HttpResponse(content=data, mimetype=mimetype) + + +class MenuItem(dict): + current_path = '' + + def __init__(self, *args, **kwargs): + super(MenuItem, self).__init__(*args, **kwargs) + if kwargs.get('url') or kwargs.get('submenu'): + self.__set_is_active__() + + def __setitem__(self, key, value): + super(MenuItem, self).__setitem__(key, value) + if key in ('url', 'submenu'): + self.__set_is_active__() + + def __set_is_active__(self): + if self.get('is_active'): + return + if self.current_path == self.get('url'): + self.__setitem__('is_active', True) + else: + submenu = self.get('submenu', ()) + current = (i for i in submenu if i.get('url') == self.current_path) + try: + current_node = current.next() + if not current_node.get('is_active'): + current_node.__setitem__('is_active', True) + self.__setitem__('is_active', True) + except StopIteration: + return + + def __setattribute__(self, name, value): + super(MenuItem, self).__setattribute__(name, value) + if name == 'current_path': + self.__set_is_active__()