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
8 class AddRoleToPerson(Method):
10 Grants the specified role to the person.
12 PIs can only grant the tech and user roles to users and techs at
13 their sites. Admins can grant any role to any user.
15 Returns 1 if successful, faults otherwise.
18 roles = ['admin', 'pi']
22 Mixed(Role.fields['role_id'],
24 Mixed(Person.fields['person_id'],
25 Person.fields['email']),
28 returns = Parameter(int, '1 if successful')
30 def call(self, auth, role_id_or_name, person_id_or_email):
32 roles = Roles(self.api, [role_id_or_name])
34 raise PLCInvalidArgument, "Invalid role '%s'" % unicode(role_id_or_name)
37 # Get account information
38 persons = Persons(self.api, [person_id_or_email])
40 raise PLCInvalidArgument, "No such account"
43 if person['peer_id'] is not None:
44 raise PLCInvalidArgument, "Not a local account"
46 # Authenticated function
47 assert self.caller is not None
49 # Check if we can update this account
50 if not self.caller.can_update(person):
51 raise PLCPermissionDenied, "Not allowed to update specified account"
53 # Can only grant lesser (higher) roles to others
54 if 'admin' not in self.caller['roles'] and \
55 role['role_id'] <= min(self.caller['role_ids']):
56 raise PLCInvalidArgument, "Not allowed to grant that role"
58 if role['role_id'] not in person['role_ids']:
61 self.event_objects = {'Person': [person['person_id']],
62 'Role': [role['role_id']]}
63 self.message = "Role %d granted to person %d" % \
64 (role['role_id'], person['person_id'])