Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / api / user.py @ 47a8481f

History | View | Annotate | Download (5.5 kB)

1
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from time import time, mktime
35

    
36
from django.http import HttpResponse
37
from django.utils import simplejson as json
38
from django.views.decorators.csrf import csrf_exempt
39

    
40
from snf_django.lib import api
41
from snf_django.lib.api import faults
42

    
43
from astakos.im.util import epoch
44
from astakos.im.models import Resource
45
from astakos.im.quotas import get_user_quotas
46

    
47
from .util import (
48
    get_uuid_displayname_catalogs as get_uuid_displayname_catalogs_util,
49
    send_feedback as send_feedback_util,
50
    user_from_token)
51

    
52
import logging
53
logger = logging.getLogger(__name__)
54

    
55

    
56
@api.api_method(http_method="GET", token_required=True, user_required=False,
57
                logger=logger)
58
@user_from_token  # Authenticate user!!
59
def authenticate(request):
60
    # Normal Response Codes: 200
61
    # Error Response Codes: internalServerError (500)
62
    #                       badRequest (400)
63
    #                       unauthorised (401)
64
    user = request.user
65
    if not user:
66
        raise faults.BadRequest('No user')
67

    
68
    # Check if the is active.
69
    if not user.is_active:
70
        raise faults.Unauthorized('User inactive')
71

    
72
    # Check if the token has expired.
73
    if (time() - mktime(user.auth_token_expires.timetuple())) > 0:
74
        raise faults.Unauthorized('Authentication expired')
75

    
76
    if not user.signed_terms:
77
        raise faults.Unauthorized('Pending approval terms')
78

    
79
    response = HttpResponse()
80
    user_info = {
81
        'id': user.id,
82
        'username': user.username,
83
        'uuid': user.uuid,
84
        'email': [user.email],
85
        'name': user.realname,
86
        'groups': list(user.groups.all().values_list('name', flat=True)),
87
        'auth_token': request.META.get('HTTP_X_AUTH_TOKEN'),
88
        'auth_token_created': epoch(user.auth_token_created),
89
        'auth_token_expires': epoch(user.auth_token_expires)}
90

    
91
    # append usage data if requested
92
    if request.REQUEST.get('usage', None):
93
        quotas = get_user_quotas(user)['system']
94
        usage = []
95
        for k in quotas:
96
            service, _, resource = k.partition('.')
97
            try:
98
                resource = Resource.objects.select_related().get(
99
                    service__name=service, name=k)
100
            except Resource.DoesNotExist:
101
                logger.error("Resource %s not found!" % k)
102
                continue
103
            usage.append(dict(
104
                name=k,
105
                description=resource.desc,
106
                unit=resource.unit or '',
107
                help_text=resource.help_text,
108
                help_text_input_each=resource.help_text_input_each,
109
                is_abbreviation=resource.is_abbreviation,
110
                report_desc=resource.report_desc,
111
                placeholder=resource.placeholder,
112
                verbose_name=resource.verbose_name,
113
                display_name=resource.display_name,
114
                pluralized_display_name=resource.pluralized_display_name,
115
                maxValue=quotas[k]['usage'],
116
                currValue=quotas[k]['limit']))
117
        user_info['usage'] = usage
118

    
119
    response.content = json.dumps(user_info)
120
    response['Content-Type'] = 'application/json; charset=UTF-8'
121
    response['Content-Length'] = len(response.content)
122
    return response
123

    
124

    
125
@csrf_exempt
126
@api.api_method(http_method="POST", token_required=True, user_required=False,
127
                logger=logger)
128
@user_from_token  # Authenticate user!!
129
def get_uuid_displayname_catalogs(request):
130
    # Normal Response Codes: 200
131
    # Error Response Codes: internalServerError (500)
132
    #                       badRequest (400)
133
    #                       unauthorised (401)
134

    
135
    return get_uuid_displayname_catalogs_util(request)
136

    
137

    
138
@csrf_exempt
139
@api.api_method(http_method="POST", token_required=True, user_required=False,
140
                logger=logger)
141
@user_from_token  # Authenticate user!!
142
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
143
    # Normal Response Codes: 200
144
    # Error Response Codes: internalServerError (500)
145
    #                       badRequest (400)
146
    #                       unauthorised (401)
147

    
148
    return send_feedback_util(request, email_template_name)