(most) all functions now take SessionAuth in addition to PasswordAuth
[plcapi.git] / PLC / Methods / DeleteRoleFromPerson.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
8 class DeleteRoleFromPerson(Method):
9     """
10     Deletes the specified role from the person.
11     
12     PIs can only revoke the tech and user roles from users and techs
13     at their sites. ins can revoke any role from any user.
14
15     Returns 1 if successful, faults otherwise.
16     """
17
18     roles = ['admin', 'pi']
19
20     accepts = [
21         Auth(),
22         Mixed(Role.fields['role_id'],
23               Role.fields['name']),
24         Mixed(Person.fields['person_id'],
25               Person.fields['email']),
26         ]
27
28     returns = Parameter(int, '1 if successful')
29
30     def call(self, auth, role_id_or_name, person_id_or_email):
31         # Get all roles
32         roles = {}
33         for role_id, role in Roles(self.api).iteritems():
34             roles[role_id] = role['name']
35             roles[role['name']] = role_id
36
37         if role_id_or_name not in roles:
38             raise PLCInvalidArgument, "Invalid role identifier or name"
39
40         if isinstance(role_id_or_name, int):
41             role_id = role_id_or_name
42         else:
43             role_id = roles[role_id_or_name]
44
45         # Get account information
46         persons = Persons(self.api, [person_id_or_email])
47         if not persons:
48             raise PLCInvalidArgument, "No such account"
49
50         person = persons.values()[0]
51
52         # Authenticated function
53         assert self.caller is not None
54
55         # Check if we can update this account
56         if not self.caller.can_update(person):
57             raise PLCPermissionDenied, "Not allowed to update specified account"
58
59         # Can only revoke lesser (higher) roles from others
60         if 'admin' not in self.caller['roles'] and \
61            role_id <= min(self.caller['role_ids']):
62             raise PLCPermissionDenied, "Not allowed to revoke that role"
63
64         if role_id in person['role_ids']:
65             person.remove_role(role_id)
66
67         return 1