Initial slice view with users
[myslice.git] / auth / manifoldbackend.py
1 import time
2
3 from django.contrib.auth.models import User
4
5 from manifold.manifoldapi import ManifoldAPI, ManifoldResult
6 from manifold.core.query        import Query
7
8 # Name my backend 'ManifoldBackend'
9 class ManifoldBackend:
10
11     # Create an authentication method
12     # This is called by the standard Django login procedure
13     def authenticate(self, token=None):
14         if not token:
15             return None
16
17         try:
18             username = token['username']
19             password = token['password']
20             request = token['request']
21
22             auth = {'AuthMethod': 'password', 'Username': username, 'AuthString': password}
23             api = ManifoldAPI(auth)
24 #old            # Authenticate user and get session key
25 #old            # the new API would expect Get('local:session') instead
26 #old            session_result = api.GetSession()
27 #old            session = session_result.ok_value()
28 #old            if not session:
29 #old                print "GetSession failed",session_result.error()
30 #old                return
31 #old            print 'DEALING with session',session
32 #old            #self.session = session
33 #old            # Change GetSession() at some point to return expires as well
34 #old            expires = time.time() + (24 * 60 * 60)
35
36             sessions_result = api.forward(Query.create('local:session').to_dict())
37             print "result"
38             sessions = sessions_result.ok_value()
39             print "ok"
40             if not sessions:
41                 print "GetSession failed", sessions_result.error()
42             print "first"
43             session = sessions[0]
44             print "SESSION=", session
45
46             # Change to session authentication
47             api.auth = {'AuthMethod': 'session', 'session': session['session']}
48             self.api = api
49
50             # Get account details
51             # the new API would expect Get('local:user') instead
52             persons_result = api.forward(Query.get('local:user').to_dict())
53             persons = persons_result.ok_value()
54             if not persons:
55                 print "GetPersons failed",persons_result.error()
56                 return
57             person = persons[0]
58             print "PERSON=", person
59
60             request.session['manifold'] = {'auth': api.auth, 'person': person, 'expires': session['expires']}
61         except Exception, e:
62             print "E: manifoldbackend", e
63             return None
64
65         try:
66             # Check if the user exists in Django's local database
67             user = User.objects.get(username=username)
68         except User.DoesNotExist:
69             # Create a user in Django's local database
70             user = User.objects.create_user(username, username, 'passworddoesntmatter')
71             user.first_name = person['first_name']
72             user.last_name = person['last_name']
73             user.email = person['email']
74         return user
75
76     # Required for your backend to work properly - unchanged in most scenarios
77     def get_user(self, user_id):
78         try:
79             return User.objects.get(pk=user_id)
80         except User.DoesNotExist:
81             return None
82
83