from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed from PLC.Filter import Filter from PLC.Sites import Site, Sites from PLC.Persons import Person, Persons from PLC.Nodes import Node, Nodes from PLC.PCUs import PCU, PCUs from PLC.Auth import Auth class GetPCUs(Method): """ Returns an array of structs containing details about power control units (PCUs). If pcu_filter is specified and is an array of PCU identifiers, or a struct of PCU attributes, only PCUs matching the filter will be returned. If return_fields is specified, only the specified details will be returned. Admin may query all PCUs. Non-admins may only query the PCUs at their sites. """ roles = ['admin', 'pi', 'tech', 'node'] accepts = [ Auth(), Mixed([PCU.fields['pcu_id']], Filter(PCU.fields)), Parameter([str], "List of fields to return", nullok = True) ] returns = [PCU.fields] def call(self, auth, pcu_filter = None, return_fields = None): # If we are not admin if not (isinstance(self.caller, Person) and 'admin' in self.caller['roles']): # Return only the PCUs at our site valid_pcu_ids = [] if isinstance(self.caller, Person): site_ids = self.caller['site_ids'] elif isinstance(self.caller, Node): site_ids = [self.caller['site_id']] for site in Sites(self.api, site_ids): valid_pcu_ids += site['pcu_ids'] if not valid_pcu_ids: return [] if pcu_filter is None: pcu_filter = valid_pcu_ids pcus = PCUs(self.api, pcu_filter, return_fields) # Filter out PCUs that are not viewable if not (isinstance(self.caller, Person) and 'admin' in self.caller['roles']): pcus = filter(lambda pcu: pcu['pcu_id'] in valid_pcu_ids, pcus) return pcus