Fix merge conflict: MyAccount
[myslice.git] / portal / actions.py
1 from django.http                 import HttpResponse
2 from manifold.core.query         import Query
3 from manifold.manifoldapi        import execute_query
4 from portal.models               import PendingUser, PendingSlice
5 import json
6
7 # Get the list of authorities
8
9 def authority_get_pis(authority_hrn):
10     query = Query.get('authority').filter_by('authority_hrn', '==', authority_hrn).select('pi_users')
11     results = execute_query(query)
12     if not results:
13         raise Exception, "Authority not found: %s" % authority_hrn
14     result, = results
15     return result['pi_users']
16
17 def authority_get_pi_emails(authority_hrn):
18     user_hrns = authority_get_pis(authority_hrn)
19     
20     query = Query.get('user').filter_by('user_hrn', 'included', user_hrns).select('user_email')
21     results = execute_query(query)
22     
23     return [result['user_email'] for result in results]
24
25 # SFA add record (user, slice)
26
27 def sfa_add_user(user_params):
28     # sfi.py add --xrn=fed4fire.upmc.timur_friedman --type=user --key=/root/.sfi/timur.pub --email=timur.friedman@lip6.fr --extra=first_name=Timur --extra=last_name=Friedman --extra=enabled=true
29     # user_params: xrn type key email + first_name last_name enabled
30     query = Query.create('user').set(user_params).select('user_hrn')
31     results = execute_query(query)
32     if not results:
33         raise Exception, "Failed creating SFA user: %s" % user_params['user_hrn']
34     result, = results
35     return result['user_hrn']
36
37 def sfa_add_slice(slice_params):
38     pass
39
40 # Propose hrn
41
42 def manifold_add_user(request, user_params):
43     # user_params: email, password e.g., user_params = {'email':'aa@aa.com','password':'demo'}
44     query = Query.create('local:user').set(user_params).select('email')
45     results = execute_query(request,query)
46     if not results:
47         raise Exception, "Failed creating manifold user: %s" % user_params['email']
48     result, = results
49     return result['email']
50
51 def manifold_update_user(request, user_params):
52     # user_params: email, password e.g., user_params = {'password':'demo','config':'{"firstname":"ME"}'}
53     query = Query.update('local:user').set(user_params).select('email')
54     results = execute_query(request,query)
55     if not results:
56         raise Exception, "Failed updating manifold user: %s" % user_params['email']
57     result, = results
58     return result['email']
59
60
61 #def manifold_update_user(request,user_params):
62 #    # user_params: password and config
63 #    query = Query.update('local:user').set(user_params).select(['password','config'])
64 #    results = execute_query(request,query)
65 #    if not results:
66 #        raise Exception, "Failed updating manifold user: password %s and config %s" % (user_params['password'],user_params['config'])
67 #    result, = results
68 #    return (result['password'],result['config'])
69
70
71 def manifold_add_account(request, account_params):
72     query = Query.create('local:account').set(account_params).select(['user', 'platform'])
73     results = execute_query(request,query)
74     if not results:
75         raise Exception, "Failed creating manifold account on platform %s for user: %s" % (account_params['platform'], account_params['user'])
76     result, = results
77     return (result['user'], result['platform'])
78
79 def manifold_update_account(request,account_params):
80     # account_params: config
81     query = Query.update('local:account').set(account_params).select('config')
82     results = execute_query(request,query)
83     if not results:
84         raise Exception, "Failed updating manifold account: config %s" % account_params['config']
85     result, = results
86     return result['config']
87
88
89 def make_request_user(user):
90     request = {}
91     request['type'] = 'user'
92     request['id'] = user.id
93     request['timestamp'] = 'TODO' # XXX in DB ?
94     request['authority_hrn'] = user.authority_hrn
95     request['first_name'] = user.first_name
96     request['last_name'] = user.last_name
97     request['email'] = user.email
98     return request
99
100 def make_request_slice(slice):
101     request = {}
102     request['type'] = 'slice'
103     request['id'] = slice.id
104     request['timestamp'] = 'TODO' # XXX in DB ?
105     request['authority_hrn'] = slice.authority_hrn
106     request['number_of_nodes'] = slice.number_of_nodes
107     request['type_of_nodes'] = slice.type_of_nodes
108     request['purpose'] = slice.purpose
109     return request
110
111 def make_requests(pending_users, pending_slices):
112     print "pending users =", pending_users
113     print "pending slices =", pending_slices
114
115     requests = []
116     for user in pending_users:
117         requests.append(make_request_user(user))
118     for slice in pending_slices:
119         requests.append(make_request_slice(slice))
120     return requests   
121
122 def get_request_by_id(ids):
123     sorted_ids = { 'user': [], 'slice': [] }
124     for type__id in ids:
125         type, id = type__id.split('__')
126         sorted_ids[type].append(id)
127         
128     if not ids:
129         pending_users  = PendingUser.objects.all()
130         pending_slices = PendingSlice.objects.all()
131     else:
132         pending_users  = PendingUser.objects.filter(id__in=sorted_ids['user']).all()
133         pending_slices = PendingSlice.objects.filter(id__in=sorted_ids['slice']).all()
134
135     return make_requests(pending_users, pending_slices)
136
137 def get_request_by_authority(authority_hrns):
138     if not authority_hrns:
139         pending_users  = PendingUser.objects.all()
140         pending_slices = PendingSlice.objects.all()
141     else:
142         pending_users  = PendingUser.objects.filter(authority_hrn__in=authority_hrns).all()
143         pending_slices = PendingSlice.objects.filter(authority_hrn__in=authority_hrns).all()
144
145     return make_requests(pending_users, pending_slices)
146     
147 SFA_USER_KEYS         = ['xrn', 'type', 'key', 'first_name', 'last_name', 'email']
148 SFA_SLICE_KEYS        = []
149 MANIFOLD_USER_KEYS    = ['email', 'password']
150 MANIFOLD_ACCOUNT_KEYS = []
151
152 def portal_validate_request(request_ids):
153     status = {}
154
155     if not isinstance(request_ids, list):
156         request_ids = [request_ids]
157
158     requests = get_request_by_id(request_ids)
159     for request in requests:
160         # type, id, timestamp, details, allowed -- MISSING: authority_hrn
161         # CAREFUL about details
162         # user  : first name, last name, email, password, keypair
163         # slice : number of nodes, type of nodes, purpose
164         
165         request_status = {}
166
167         if request['type'] == 'user':
168             try:
169                 sfa_user_params = { key: request[key] for key in SFA_USER_KEYS }
170                 sfa_user_params['enabled'] = True
171                 # XXX # sfa_add_user(sfa_user_params)
172                 request_status['SFA user'] = {'status': True }
173             except Exception, e:
174                 request_status['SFA user'] = {'status': False, 'description': str(e)}
175
176             try:
177                 manifold_user_params = { key: request[key] for key in MANIFOLD_USER_KEYS }
178                 # XXX # manifold_add_user(manifold_user_params)
179                 request_status['MySlice user'] = {'status': True }
180             except Exception, e:
181                 request_status['MySlice user'] = {'status': False, 'description': str(e)}
182
183             # XXX
184             #manifold_account_params = { key: request[key] for key in MANIFOLD_ACCOUNT_KEYS }
185             #manifold_add_account(manifold_account_params)
186             request_status['MySlice testbed accounts'] = {'status': False }
187
188         elif request['type'] == 'slice':
189             try:
190                 sfa_slice_params = { key: request[key] for key in SFA_SLICE_KEYS }
191                 # XXX # sfa_add_slice(sfa_slice_params)
192                 request_status['SFA slice'] = {'status': True }
193             except Exception, e:
194                 request_status['SFA slice'] = {'status': False, 'description': str(e)}
195
196         status['%s__%s' % (request['type'], request['id'])] = request_status
197
198     # XXX remove from database succeeded actions
199
200     return status
201
202
203 def validate_action(*args, **kwargs):
204     ids = filter(None, kwargs['id'].split('/'))
205     status = portal_validate_request(ids)
206     json_answer = json.dumps(status)
207     return HttpResponse (json_answer, mimetype="application/json")
208
209 # Django and ajax
210 # http://djangosnippets.org/snippets/942/