From 3267513a0c4c0db0159bd28fbcd6442c866d8db3 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 12 Dec 2012 09:16:12 +0100 Subject: [PATCH] add support for tags in UpdatePerson --- PLC/Methods/UpdatePerson.py | 65 +++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/PLC/Methods/UpdatePerson.py b/PLC/Methods/UpdatePerson.py index 79c1900..b85cc64 100644 --- a/PLC/Methods/UpdatePerson.py +++ b/PLC/Methods/UpdatePerson.py @@ -1,13 +1,15 @@ from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed -from PLC.Persons import Person, Persons from PLC.Auth import Auth +from PLC.Table import Row +from PLC.Persons import Person, Persons from PLC.sendmail import sendmail +from PLC.TagTypes import TagTypes +from PLC.PersonTags import PersonTags, PersonTag related_fields = Person.related_fields.keys() -can_update = lambda (field, value): field in \ - ['first_name', 'last_name', 'title', 'email', +can_update = ['first_name', 'last_name', 'title', 'email', 'password', 'phone', 'url', 'bio', 'accepted_aup', 'enabled'] + related_fields @@ -24,46 +26,54 @@ class UpdatePerson(Method): roles = ['admin', 'pi', 'user', 'tech'] - person_fields = dict(filter(can_update, Person.fields.items() + Person.related_fields.items())) + accepted_fields = Row.accepted_fields(can_update,Person.fields) + # xxx check the related_fields feature + accepted_fields.update(Person.related_fields) + accepted_fields.update(Person.tags) accepts = [ Auth(), Mixed(Person.fields['person_id'], Person.fields['email']), - person_fields + accepted_fields ] returns = Parameter(int, '1 if successful') def call(self, auth, person_id_or_email, person_fields): - person_fields = dict(filter(can_update, person_fields.items())) + # split provided fields + [native,related,tags,rejected] = Row.split_fields(person_fields,[Person.fields,Person.related_fields,Person.tags]) + + # type checking + native = Row.check_fields (native, self.accepted_fields) + if rejected: + raise PLCInvalidArgument, "Cannot update Person column(s) %r"%rejected + + # Authenticated function + assert self.caller is not None # Get account information persons = Persons(self.api, [person_id_or_email]) if not persons: - raise PLCInvalidArgument, "No such account" + raise PLCInvalidArgument, "No such account %s"%person_id_or_email person = persons[0] if person['peer_id'] is not None: - raise PLCInvalidArgument, "Not a local account" - - # Authenticated function - assert self.caller is not None + raise PLCInvalidArgument, "Not a local account %s"%person_id_or_email # Check if we can update this account if not self.caller.can_update(person): raise PLCPermissionDenied, "Not allowed to update specified account" # Make requested associations - for field in related_fields: - if field in person_fields: - person.associate(auth, field, person_fields[field]) - person_fields.pop(field) + for k,v in related.iteritems(): + person.associate (auth, k, v) - person.update(person_fields) + person.update(native) person.update_last_updated(False) - person.sync() - + person.sync(commit=True) + + # send a mail if 'enabled' in person_fields: To = [("%s %s" % (person['first_name'], person['last_name']), person['email'])] Cc = [] @@ -76,6 +86,25 @@ class UpdatePerson(Method): sendmail(self.api, To = To, Cc = Cc, Subject = Subject, Body = Body) + for (tagname,value) in tags.iteritems(): + # the tagtype instance is assumed to exist, just check that + tag_types = TagTypes(self.api,{'tagname':tagname}) + if not tag_types: + raise PLCInvalidArgument,"No such TagType %s"%tagname + tag_type = tag_types[0] + person_tags=PersonTags(self.api,{'tagname':tagname,'person_id':person['person_id']}) + if not person_tags: + person_tag = PersonTag(self.api) + person_tag['person_id'] = person['person_id'] + person_tag['tag_type_id'] = tag_type['tag_type_id'] + person_tag['tagname'] = tagname + person_tag['value'] = value + person_tag.sync() + else: + person_tag = person_tags[0] + person_tag['value'] = value + person_tag.sync() + # Logging variables self.event_objects = {'Person': [person['person_id']]} -- 2.43.0