''' Operation.py ''' from GeneratedPy.GenOperation import GenOperation from sndcs_common.TrueAndFalseMixin import TrueAndFalseMixin from Pyro.EventService.Clients import Publisher from sndcs.Config import config def formattedOperationDescription(data): """ Return an operation description according to the config file format which should be of the form "%(customer_name)s - %s(item_number)s" Data should be a dictionary. The following keys should be available: customer_id customer_name job_number item_number item_description assembly_number assembly_description operation_number operation_description task_code task_description jobhed_note """ format = config.get("operation", "description_format", "%(customer_name)s - %(item_description)s - %(assembly_description)s - %(operation_description)s") return format % (data) class Operation(GenOperation,Publisher,TrueAndFalseMixin): def __init__(self): GenOperation.__init__(self) Publisher.__init__(self) self.eventservice._release() # Get the Pyro namespace from the config self.namespace = config.get("pyro", "namespace", "sndcs") def formattedDescription(self): assembly = self.assembly() jobHed = assembly.jobHed() customer = jobHed.customer() data = {"customer_id":customer.customerId(), "customer_name":customer.name(), "job_number":jobHed.number(), "item_number":jobHed.itemNumber(), "item_description":jobHed.itemDescription(), "assembly_number":assembly.number(), "assembly_description":assembly.description(), "operation_number":self.number(), "operation_description":self.description(), "task_code":self.taskCode(), "task_description":self.taskDescription()} return formattedOperationDescription(data) ### HELPER FUNCTIONS ### def taskCode(self): if self.tasks(): return self.tasks().description() else: return "" def taskDescription(self): if self.tasks(): return self.tasks().description() else: return "" ### ADD/DELETE FUNCTIONS ### def add(self): if self.assembly(): assembly=self.assembly() assembly_num = assembly.number() job_num = assembly.jobHed().number() priority = assembly.jobHed().priority() else: assembly_num = None job_num = None priority = 0 op_num=self.number() if self.department(): department=self.department().code() else: department=None self.publish(self.namespace + "_operation_add", {"serialNum":self.serialNum(), "job":job_num, "assembly":assembly_num, "operation":op_num, "description":self.formattedDescription(), "priority":priority, "department":department}) # Moved from OperationFactory.py self.eventservice._release() def delete(self): self.publish(self.namespace + "_operation_delete", {"serialNum":self.serialNum(),"assembly":self.assembly().serialNum()}) self.eventservice._release() ###OVERRIDDEN FUNCTIONS### def getPrevOperation(self): operations = [ (x.number(),x,) for x in self.assembly().operations() ] operations.sort() operations.reverse() y = 0 for x in operations: if x[0] == self.number(): try: return operations[y + 1][1] except IndexError: return None y += 1 return None def setCascadeComplete(self,data): if data and self.true(config.get("operation","cascade",False)): opr = self.getPrevOperation() if opr: opr.setCascadeComplete(data) self.setComplete(data) def setCascadeQtyComplete(self,data): if data and self.true(config.get("operation","cascade",False)): opr = self.getPrevOperation() if opr: opr.setCascadeQtyComplete(data / ( self.conversionUnit() / opr.conversionUnit() ) ) self.setQtyComplete(data)