def updateInstrumentStatus(self,instrument,status,key=None): session = ioSession() iostatus = session.query(InstrumentOperationStatus).filter(InstrumentOperationStatus.instrument == instrument)[0] iostatus_keys = session.query(KeyList).filter(KeyList.key_id == iostatus.id) str_keys = [k.key for k in iostatus_keys] active_keys = [k.active for k in iostatus_keys] # session.commit() self.log.debug("Current instrument status is %s" % InstrumentOperationFlag[iostatus.status]) if iostatus.status != InstrumentOperationFlag.LOCK.index: # Instrument currently unlocked iostatus.status = status.index # just flip status flag if key is not None and status == InstrumentOperationFlag.LOCK: # new status is a lock if key in str_keys: # Activating existing key iostatus_keys[str_keys.index(key)].active = True iostatus_keys[str_keys.index(key)].updatetime = self.controller.site().ut().replace(tzinfo=None) else: # Creating new key newkey = KeyList(key_id=iostatus.id, key=key, updatetime=self.controller.site().ut().replace(tzinfo=None), active=True) session.add(newkey) else: # Instrument is locked if status != InstrumentOperationFlag.LOCK: # it is an unlock operation if key in str_keys:# and key is in the list active_keys[str_keys.index(key)] = False iostatus_keys[str_keys.index(key)].active = False iostatus_keys[str_keys.index(key)].updatetime = self.controller.site().ut().replace(tzinfo=None) if True not in active_keys: # able to unlock instrument iostatus.status = status.index else: # Could not unlock instrument session.commit() return False else: # it is a new lock operation if key in str_keys: # Activating existing key iostatus_keys[str_keys.index(key)].active = True iostatus_keys[str_keys.index(key)].updatetime = self.controller.site().ut().replace(tzinfo=None) else: # Creating new key newkey = KeyList(key_id=iostatus.id, key=key, updatetime=self.controller.site().ut().replace(tzinfo=None), active=True) session.add(newkey) session.commit() return True
def __start__(self): # configure items list from chimera_manager.controllers import model for name,obj in inspect.getmembers(model): if inspect.isclass(obj) and issubclass(obj,model.Check): self.itemsList[name.upper()] = obj # Configure handlers for handler in self.checkHandlers.values(): self._injectInstrument(handler) # Configure base responses for name,obj in inspect.getmembers(baseresponse): if inspect.isclass(obj) and issubclass(obj,baseresponse.BaseResponse): self.responseList[name.upper()] = obj # Configure base responses handlers for handler in self.responseList.values(): self._injectInstrument(handler) # Todo: Configure user-defined responses # Read instrument status flag from database session = ioSession() for inst_ in self.controller.getInstrumentList(): status = session.query(InstrumentOperationStatus).filter(InstrumentOperationStatus.instrument == inst_) if status.count() == 0: self.log.warning("No %s intrument on database. Adding with status UNSET."%inst_) iostatus = InstrumentOperationStatus(instrument = inst_, status = InstrumentOperationFlag.UNSET.index, lastUpdate = self.controller.site().ut().replace(tzinfo=None), lastChange = self.controller.site().ut().replace(tzinfo=None)) session.add(iostatus) session.commit() else: self.controller.setFlag(inst_, InstrumentOperationFlag[status[0].status], False) return
def instrumentKey(self,instrument): session = ioSession() iostatus = session.query(InstrumentOperationStatus).filter(InstrumentOperationStatus.instrument == instrument)[0] iostatus_keys = session.query(KeyList).filter(KeyList.key_id == iostatus.id, KeyList.active == True) return [k.key for k in iostatus_keys]
def getInstrumentStatus(self,instrument): session = ioSession() iostatus = session.query(InstrumentOperationStatus).filter(InstrumentOperationStatus.instrument == instrument) return InstrumentOperationFlag[iostatus[0].status]