====
[plcapi.git] / PLC / Methods / UpdatePersonTag.py
1 #
2 # Thierry Parmentelat - INRIA
3 #
4 from PLC.Faults import *
5 from PLC.Method import Method
6 from PLC.Parameter import Parameter, Mixed
7 from PLC.Auth import Auth
8
9 from PLC.Persons import Person, Persons
10 from PLC.TagTypes import TagType, TagTypes
11 from PLC.PersonTags import PersonTag, PersonTags
12
13 # need to import so the core classes get decorated with caller_may_write_tag
14 from PLC.AuthorizeHelpers import AuthorizeHelpers
15
16 class UpdatePersonTag(Method):
17     """
18     Updates the value of an existing person setting
19
20     Admins have full access.  Non-admins can change their own tags.
21
22     Returns 1 if successful, faults otherwise.
23     """
24
25     roles = ['admin', 'pi', 'tech', 'user']
26
27     accepts = [
28         Auth(),
29         PersonTag.fields['person_tag_id'],
30         PersonTag.fields['value']
31         ]
32
33     returns = Parameter(int, '1 if successful')
34
35     def call(self, auth, person_tag_id, value):
36         person_tags = PersonTags(self.api, [person_tag_id])
37         if not person_tags:
38             raise PLCInvalidArgument, "No such person setting %r"%person_tag_id
39         person_tag = person_tags[0]
40
41         tag_type_id = person_tag['tag_type_id']
42         tag_type = TagTypes (self.api,[tag_type_id])[0]
43
44         persons = Persons (self.api, person_tag['person_id'])
45         if not persons:
46             raise PLCInvalidArgument, "No such person %d"%person_tag['person_id']
47         person=persons[0]
48
49         # check authorizations
50         person.caller_may_write_tag(self.api,self.caller,tag_type)
51
52         person_tag['value'] = value
53         person_tag.sync()
54
55         self.object_ids = [person_tag['person_tag_id']]
56         return 1