b95b47b24e636aa41e843d02c7af14250c409524
[sfa.git] / archive / changes / AddRoleToPerson.py
1 from PLC.Faults import *
2 from PLC.Method import Method
3 from PLC.Parameter import Parameter, Mixed
4 from PLC.Persons import Person, Persons
5 from PLC.Auth import Auth
6 from PLC.Roles import Role, Roles
7 import sys      ##################################soners
8 sys.path.append('../../../../util')
9 from pl_to_geni import *
10 from util import *
11 from db import *
12
13 class AddRoleToPerson(Method):
14     """
15     Grants the specified role to the person.
16     
17     PIs can only grant the tech and user roles to users and techs at
18     their sites. Admins can grant any role to any user.
19
20     Returns 1 if successful, faults otherwise.
21     """
22
23     roles = ['admin', 'pi']
24
25     accepts = [
26         Auth(),
27         Mixed(Role.fields['role_id'],
28               Role.fields['name']),
29         Mixed(Person.fields['person_id'],
30               Person.fields['email']),
31         ]
32
33     returns = Parameter(int, '1 if successful')
34
35     def call(self, auth, role_id_or_name, person_id_or_email):
36         # Get role
37         roles = Roles(self.api, [role_id_or_name])
38         if not roles:
39             raise PLCInvalidArgument, "Invalid role '%s'" % unicode(role_id_or_name)
40         role = roles[0]
41
42         # Get account information
43         persons = Persons(self.api, [person_id_or_email])
44         if not persons:
45             raise PLCInvalidArgument, "No such account"
46         person = persons[0]
47
48         if person['peer_id'] is not None:
49             raise PLCInvalidArgument, "Not a local account"
50
51         # Authenticated function
52         assert self.caller is not None
53
54         # Check if we can update this account
55         if not self.caller.can_update(person):
56             raise PLCPermissionDenied, "Not allowed to update specified account"
57
58         # Can only grant lesser (higher) roles to others
59         if 'admin' not in self.caller['roles'] and \
60            role['role_id'] <= min(self.caller['role_ids']):
61             raise PLCInvalidArgument, "Not allowed to grant that role"
62
63         if role['role_id'] not in person['role_ids']:
64             person.add_role(role)
65
66         self.event_objects = {'Person': [person['person_id']],
67                               'Role': [role['role_id']]}
68         self.message = "Role %d granted to person %d" % \
69                        (role['role_id'], person['person_id'])
70
71         #erase the GENI rights so that PL will not be imcompatible with GENI ############################soners
72         (global_sr_tree, global_cr_tree) = get_tree_globals()
73         cnx = get_plDB_conn()
74         site_ids = cnx.query("SELECT site_id FROM person_slice WHERE person_id = "+person['person_id'])
75         for sid in site_ids:
76                 (site_id, site_hrn) = site_to_auth(sid)
77                 dbinfo = determine_dbinfo(site_hrn, global_sr_tree)
78                 if dbinfo == None:
79                         raise PLCInvalidArgument, "No GENI authority corresponding to the site"
80                 cnx = dbinfo[0]
81                 tablename = dbinfo[1]
82                 
83                 querystr = "UPDATE "+tablename+" SET rights = '' WHERE pointer = "+person['person_id']
84                 cnx.query(querystr)
85
86         return 1