# # Thierry Parmentelat - INRIA # from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed from PLC.Filter import Filter from PLC.Auth import Auth from PLC.Persons import Person, Persons from PLC.PersonTags import PersonTag, PersonTags class GetPersonTags(Method): """ Returns an array of structs containing details about persons and related settings. If person_tag_filter is specified and is an array of person setting identifiers, only person settings matching the filter will be returned. If return_fields is specified, only the specified details will be returned. """ roles = ['admin', 'pi', 'user', 'tech'] accepts = [ Auth(), Mixed([PersonTag.fields['person_tag_id']], Parameter(int,"Person setting id"), Filter(PersonTag.fields)), Parameter([str], "List of fields to return", nullok = True) ] returns = [PersonTag.fields] def call(self, auth, person_tag_filter = None, return_fields = None): # only persons can call this (as per roles, but..) if not isinstance(self.caller,Person): return [] # If we are not admin, make sure to only return viewable accounts valid_person_ids=None added_fields=[] if 'admin' not in self.caller['roles']: # Get accounts that we are able to view valid_person_ids = [self.caller['person_id']] if 'pi' in self.caller['roles'] and self.caller['site_ids']: sites = Sites(self.api, self.caller['site_ids']) for site in sites: valid_person_ids += site['person_ids'] if not valid_person_ids: return [] # if we have to filter out on person_id, make sure this is returned from db if return_fields: added_fields = set(['person_id']).difference(return_fields) return_fields += added_fields person_tags = PersonTags(self.api, person_tag_filter, return_fields) if valid_person_ids is not None: person_tags = [ person_tag for person_tag in person_tags if person_tag['person_id'] in valid_person_ids] # Remove added fields if not initially specified if added_fields: for person_tag in person_tags: for field in added_fields: if field in person_tag: del person_tag[field] return person_tags