def workflow_script_submit(self): if skip(self, "submit"): return workflow = getToolByName(self, "portal_workflow") self.reindexObject(idxs=["review_state", ]) # If all analyses on the worksheet have been submitted, # then submit the worksheet. ws = self.getBackReferences('WorksheetAnalysis') ws = ws[0] # if the worksheet analyst is not assigned, the worksheet can't be transitioned. if ws.getAnalyst() and not skip(ws, "submit", peek=True): all_submitted = True for a in ws.getAnalyses(): if workflow.getInfoFor(a, 'review_state') in \ ('sample_due', 'sample_received', 'assigned',): all_submitted = False break if all_submitted: workflow.doActionFor(ws, 'submit') # If no problem with attachments, do 'attach' action. can_attach = True if not self.getAttachment(): service = self.getService() if service.getAttachmentOption() == 'r': can_attach = False if can_attach: workflow.doActionFor(self, 'attach')
def workflow_script_verify(self): if skip(self, "verify"): return workflow = getToolByName(self, 'portal_workflow') self.reindexObject(idxs=[ "review_state", ]) # If all other analyses on the worksheet are verified, # then verify the worksheet. ws = self.getBackReferences('WorksheetAnalysis') ws = ws[0] ws_state = workflow.getInfoFor(ws, 'review_state') if ws_state == 'to_be_verified' and not skip(ws, "verify", peek=True): all_verified = True for a in ws.getAnalyses(): if workflow.getInfoFor(a, 'review_state') in \ ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received', 'attachment_due', 'to_be_verified', 'assigned'): all_verified = False break if all_verified: if not "verify all analyses" in self.REQUEST[ 'workflow_skiplist']: self.REQUEST["workflow_skiplist"].append( "verify all analyses") workflow.doActionFor(ws, "verify")
def workflow_script_unassign(self): if skip(self, "unassign"): return workflow = getToolByName(self, 'portal_workflow') self.reindexObject(idxs=["review_state", ]) rc = getToolByName(self, REFERENCE_CATALOG) wsUID = self.REQUEST['context_uid'] ws = rc.lookupObject(wsUID) # May need to promote the Worksheet's review_state # if all other analyses are at a higher state than this one was. # (or maybe retract it if there are no analyses left) # Note: duplicates, controls and blanks have 'assigned' as a review_state. can_submit = True can_attach = True can_verify = True ws_empty = False analyses = ws.getAnalyses() # We flag this worksheet as empty if there is ONE UNASSIGNED # analysis left: worksheet.removeAnalysis() hasn't removed it from # the layout yet at this stage. if len(analyses) == 1 \ and workflow.getInfoFor(analyses[0], 'review_state') == 'unassigned': ws_empty = True for a in analyses: a_state = workflow.getInfoFor(a, 'review_state') if a_state in \ ('assigned', 'sample_due', 'sample_received',): can_submit = False else: if not ws.getAnalyst(): can_submit = False if a_state in \ ('assigned', 'sample_due', 'sample_received', 'attachment_due',): can_attach = False if a_state in \ ('assigned', 'sample_due', 'sample_received', 'attachment_due', 'to_be_verified',): can_verify = False if not ws_empty: # Note: WS adds itself to the skiplist so we have to take it off again # to allow multiple promotions (maybe by more than one self). if can_submit and workflow.getInfoFor(ws, 'review_state') == 'open': workflow.doActionFor(ws, 'submit') skip(ws, 'submit', unskip=True) if can_attach and workflow.getInfoFor(ws, 'review_state') == 'attachment_due': workflow.doActionFor(ws, 'attach') skip(ws, 'attach', unskip=True) if can_verify and workflow.getInfoFor(ws, 'review_state') == 'to_be_verified': self.REQUEST["workflow_skiplist"].append('verify all analyses') workflow.doActionFor(ws, 'verify') skip(ws, 'verify', unskip=True) else: if workflow.getInfoFor(ws, 'review_state') != 'open': workflow.doActionFor(ws, 'retract') skip(ws, 'retract', unskip=True)
def workflow_script_retract(self): if skip(self, "retract"): return workflow = getToolByName(self, 'portal_workflow') self.reindexObject(idxs=["review_state", ]) # Escalate action to the Worksheet. ws = self.getBackReferences('WorksheetAnalysis') ws = ws[0] if not skip(ws, "retract", peek=True): if workflow.getInfoFor(ws, 'review_state') == 'open': skip(ws, "retract") else: if not "retract all analyses" in self.REQUEST['workflow_skiplist']: self.REQUEST["workflow_skiplist"].append("retract all analyses") workflow.doActionFor(ws, 'retract')
def submitTransition(self, action, came_from, items): """ Performs the action's transition for the specified items Returns (numtransitions, destination), where: - numtransitions: the number of objects successfully transitioned. If no objects have been successfully transitioned, gets 0 value - destination: the destination url to be loaded immediately """ dest = None transitioned = [] workflow = getToolByName(self.context, 'portal_workflow') # transition selected items from the bika_listing/Table. for item in items: # the only actions allowed on inactive/cancelled # items are "reinstate" and "activate" if not isActive(item) and action not in ('reinstate', 'activate'): continue if not skip(item, action, peek=True): allowed_transitions = [it['id'] for it in \ workflow.getTransitionsFor(item)] if action in allowed_transitions: success, message = doActionFor(item, action) if success: transitioned.append(item.id) else: self.context.plone_utils.addPortalMessage(message, 'error') # automatic label printing if transitioned and action == 'receive' \ and 'receive' in self.portal.bika_setup.getAutoPrintStickers(): q = "/sticker?autoprint=1&template=%s&items=" % (self.portal.bika_setup.getAutoStickerTemplate()) # selected_items is a list of UIDs (stickers for AR_add use IDs) q += ",".join(transitioned) dest = self.context.absolute_url() + q return len(transitioned), dest
def workflow_script_attach(self): if skip(self, "attach"): return workflow = getToolByName(self, 'portal_workflow') self.reindexObject(idxs=["review_state", ]) # If all analyses on the worksheet have been attached, # then attach the worksheet. ws = self.getBackReferences('WorksheetAnalysis') ws = ws[0] ws_state = workflow.getInfoFor(ws, 'review_state') if ws_state == 'attachment_due' and not skip(ws, "attach", peek=True): can_attach = True for a in ws.getAnalyses(): if workflow.getInfoFor(a, 'review_state') in \ ('sample_due', 'sample_received', 'attachment_due', 'assigned',): can_attach = False break if can_attach: workflow.doActionFor(ws, 'attach')
def ObjectInitializedEventHandler(instance, event): # This handler fires for DuplicateAnalysis because # DuplicateAnalysis also provides IAnalysis. # DuplicateAnalysis doesn't have analysis_workflow. if instance.portal_type == "DuplicateAnalysis": return if instance.portal_type == 'Analysis': alsoProvides(instance, IRoutineAnalysis) workflow = getToolByName(instance, 'portal_workflow') ar = instance.aq_parent ar_state = workflow.getInfoFor(ar, 'review_state') ar_ws_state = workflow.getInfoFor(ar, 'worksheetanalysis_review_state') # Set the state of the analysis depending on the state of the AR. if ar_state in ('sample_registered', 'to_be_sampled', 'sampled', 'to_be_preserved', 'sample_due', 'sample_received'): changeWorkflowState(instance, "bika_analysis_workflow", ar_state) elif ar_state in ('to_be_verified'): # Apply to AR only; we don't want this transition to cascade. if 'workflow_skiplist' not in ar.REQUEST: ar.REQUEST['workflow_skiplist'] = [] ar.REQUEST['workflow_skiplist'].append("retract all analyses") workflow.doActionFor(ar, 'retract') ar.REQUEST['workflow_skiplist'].remove("retract all analyses") if ar_ws_state == 'assigned': workflow.doActionFor(ar, 'unassign') skip(ar, 'unassign', unskip=True) instance.updateDueDate() return
def AfterTransitionEventHandler(instance, event): # creation doesn't have a 'transition' if not event.transition: return debug_mode = True #App.config.getConfiguration().debug_mode "Commented by Yasir" if not debug_mode: return if not skip(instance, event.transition.id, peek=True): logger.debug("Started transition %s on %s" % (event.transition.id, instance))
def workflow_script_verify(self): if skip(self, "verify"): return workflow = getToolByName(self, 'portal_workflow') self.reindexObject(idxs=["review_state", ]) # If all other analyses on the worksheet are verified, # then verify the worksheet. ws = self.getBackReferences('WorksheetAnalysis') ws = ws[0] ws_state = workflow.getInfoFor(ws, 'review_state') if ws_state == 'to_be_verified' and not skip(ws, "verify", peek=True): all_verified = True for a in ws.getAnalyses(): if workflow.getInfoFor(a, 'review_state') in \ ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received', 'attachment_due', 'to_be_verified', 'assigned'): all_verified = False break if all_verified: if not "verify all analyses" in self.REQUEST['workflow_skiplist']: self.REQUEST["workflow_skiplist"].append("verify all analyses") workflow.doActionFor(ws, "verify")
def workflow_script_assign(self): if skip(self, "assign"): return workflow = getToolByName(self, 'portal_workflow') self.reindexObject(idxs=["review_state", ]) rc = getToolByName(self, REFERENCE_CATALOG) wsUID = self.REQUEST['context_uid'] ws = rc.lookupObject(wsUID) # retract the worksheet to 'open' ws_state = workflow.getInfoFor(ws, 'review_state') if ws_state != 'open': if 'workflow_skiplist' not in self.REQUEST: self.REQUEST['workflow_skiplist'] = ['retract all analyses', ] else: self.REQUEST["workflow_skiplist"].append('retract all analyses') workflow.doActionFor(ws, 'retract')
def workflow_script_assign(self): if skip(self, "assign"): return workflow = getToolByName(self, 'portal_workflow') self.reindexObject(idxs=["review_state", ]) rc = getToolByName(self, REFERENCE_CATALOG) if 'context_uid' in self.REQUEST: wsUID = self.REQUEST['context_uid'] ws = rc.lookupObject(wsUID) # retract the worksheet to 'open' ws_state = workflow.getInfoFor(ws, 'review_state') if ws_state != 'open': if 'workflow_skiplist' not in self.REQUEST: self.REQUEST['workflow_skiplist'] = ['retract all analyses', ] else: self.REQUEST["workflow_skiplist"].append('retract all analyses') workflow.doActionFor(ws, 'retract')
def ObjectRemovedEventHandler(instance, event): # This handler fires for DuplicateAnalysis because # DuplicateAnalysis also provides IAnalysis. # DuplicateAnalysis doesn't have analysis_workflow. if instance.portal_type == "DuplicateAnalysis": return # May need to promote the AR's review_state # if all other analyses are at a higher state than this one was. workflow = getToolByName(instance, 'portal_workflow') ar = instance.aq_parent can_submit = True can_attach = True can_verify = True can_publish = True # We add this manually here, because during admin/ZMI removal, # it may possibly not be added by the workflow code. if not 'workflow_skiplist' in instance.REQUEST: instance.REQUEST['workflow_skiplist'] = [] for a in ar.getAnalyses(): a_state = a.review_state if a_state in \ ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received',): can_submit = False if a_state in \ ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received', 'attachment_due',): can_attach = False if a_state in \ ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received', 'attachment_due', 'to_be_verified',): can_verify = False if a_state in \ ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received', 'attachment_due', 'to_be_verified', 'verified',): can_publish = False # Note: AR adds itself to the skiplist so we have to take it off again # to allow multiple promotions (maybe by more than one deleted instance). if can_submit and workflow.getInfoFor(ar, 'review_state') == 'sample_received': try: workflow.doActionFor(ar, 'submit') except WorkflowException: pass skip(ar, 'submit', unskip=True) if can_attach and workflow.getInfoFor(ar, 'review_state') == 'attachment_due': try: workflow.doActionFor(ar, 'attach') except WorkflowException: pass skip(ar, 'attach', unskip=True) if can_verify and workflow.getInfoFor(ar, 'review_state') == 'to_be_verified': instance.REQUEST["workflow_skiplist"].append('verify all analyses') try: workflow.doActionFor(ar, 'verify') except WorkflowException: pass skip(ar, 'verify', unskip=True) if can_publish and workflow.getInfoFor(ar, 'review_state') == 'verified': instance.REQUEST["workflow_skiplist"].append('publish all analyses') try: workflow.doActionFor(ar, 'publish') except WorkflowException: pass skip(ar, 'publish', unskip=True) ar_ws_state = workflow.getInfoFor(ar, 'worksheetanalysis_review_state') if ar_ws_state == 'unassigned': if not ar.getAnalyses(worksheetanalysis_review_state = 'unassigned'): if ar.getAnalyses(worksheetanalysis_review_state = 'assigned'): try: workflow.doActionFor(ar, 'assign') except WorkflowException: pass skip(ar, 'assign', unskip=True) return