AiC and REST login
[myslice.git] / rest / login.py
1 import json
2 from django.shortcuts               import render_to_response
3 from django.views.decorators.csrf   import csrf_exempt
4 from django.http                    import HttpResponse, HttpResponseNotFound, HttpResponseForbidden, HttpResponseServerError, HttpResponseBadRequest
5 from django.contrib.auth            import authenticate, login
6 from manifoldapi.manifoldresult     import ManifoldResult
7
8 import activity.user
9
10 @csrf_exempt
11 def dispatch(request):
12     if request.method == 'POST':
13        data = json.loads(request.body)
14     else:
15         return HttpResponseBadRequest(json.dumps({"error":"Bad request use POST"}), content_type="application/json")
16
17     result = None
18     username = None
19     password = None
20     if 'email' in data:
21         username = data['email']
22     if 'password' in data:
23         password = data['password']
24
25     if not username or not password:
26         return HttpResponseBadRequest(json.dumps({"error":"Bad request"}), content_type="application/json")
27     else:
28         token = {'username': username, 'password': password, 'request': request}
29         auth_result = authenticate(token=token)
30         # our authenticate function returns either
31         # . a ManifoldResult - when something has gone wrong, like e.g. backend is unreachable
32         # . a django User in case of success
33         # . or None if the backend could be reached but the authentication failed
34         if isinstance (auth_result, ManifoldResult):
35             manifoldresult = auth_result
36             # let's use ManifoldResult.__repr__
37             msg="%s"%manifoldresult
38             return HttpResponseServerError(json.dumps({"error":msg}), content_type="application/json")
39         # user was authenticated at the backend
40         elif auth_result is not None:
41             user=auth_result
42             if user is not None and user.is_active:
43                 login(request, user)
44
45                 if request.user.is_authenticated():
46                     try:
47                         result = {'email':username}
48                         # log user activity
49                         activity.user.login(request)
50                     except Exception as e:
51                         import traceback
52                         traceback.print_exc()
53                         msg = "Your session has expired"
54                         return HttpResponseServerError(json.dumps({"error":msg}), content_type="application/json")
55             else:
56                 msg = "Your account is not active, please contact the site admin."
57                 return HttpResponseForbidden(json.dumps({"error":msg}), content_type="application/json")
58         # otherwise
59         else:
60             msg = "Your username and/or password were incorrect."
61             return HttpResponseNotFound(json.dumps({"error":msg}), content_type="application/json")
62     return HttpResponse(json.dumps(result))
63