def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'reassign': selected_worksheets = WorkflowAction._get_selected_items(self) selected_worksheet_uids = selected_worksheets.keys() if selected_worksheets: changes = False for uid in selected_worksheet_uids: worksheet = selected_worksheets[uid] # Double-check the state first if workflow.getInfoFor(worksheet, 'review_state') == 'open': worksheet.setAnalyst(form['Analyst'][0][uid]) changes = True if changes: message = self.context.translate(PMF('Changes saved.')) self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header("referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form CheckAuthenticator(form) analysis_uids = form.get("uids", []) if not analysis_uids: self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) return action, came_from = WorkflowAction._get_form_workflow_action(self) if action == "submit": # Submit the form. Saves the results, methods, etc. # Calls to its parent class AnalysesWorkflowAction self.workflow_action_submit() elif action == "assign": # Assign the analyses self.do_assign(analysis_uids) elif action == "unassign": # Unassign analyses self.do_unassign(analysis_uids) elif action == "verify": # default bika_listing.py/WorkflowAction, but then go to view # screen. self.destination_url = self.context.absolute_url() return self.workflow_action_default( action="verify", came_from=came_from) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'reassign': selected_worksheets = WorkflowAction._get_selected_items(self) selected_worksheet_uids = selected_worksheets.keys() if selected_worksheets: changes = False for uid in selected_worksheet_uids: worksheet = selected_worksheets[uid] # Double-check the state first if workflow.getInfoFor(worksheet, 'review_state') == 'open': worksheet.setAnalyst(form['Analyst'][0][uid]) changes = True if changes: message = self.context.translation_service.translate( PMF('Changes saved.')) self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header( "referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'submit': objects = WorkflowAction._get_selected_items(self) if not objects: message = self.context.translate( _b("No analyses have been selected")) self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() + \ "/batchbook" self.request.response.redirect(self.destination_url) return for ar_uid, ar in objects.items(): for analysis in ar.getAnalyses(full_objects=True): kw = analysis.getKeyword() values = form.get(kw) analysis.setResult(values[0][ar_uid]) if values[0][ar_uid]: doActionFor(analysis, 'submit') message = self.context.translate(_p("Changes saved.")) self.context.plone_utils.addPortalMessage(message, 'info') self.request.response.redirect(self.request.get('URL')) return else: WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) action, _ = WorkflowAction._get_form_workflow_action(self) if action == 'receive' and 'Type' in form: BiospecimenWorkflowAction.__call__(self) else: WorkflowAction.__call__(self)
def workflow_action_receive(self): # default bika_listing.py/WorkflowAction, but then # print automatic labels. if 'receive' in self.context.bika_setup.getAutoPrintLabels(): size = self.context.bika_setup.getAutoLabelSize() q = "/sticker?size=%s&items=%s" % (size, self.context.getId()) self.destination_url = self.context.absolute_url() + q WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) uc = getToolByName(self.context, 'uid_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'duplicate': selected_services = WorkflowAction._get_selected_items(self) ## Create a copy of the selected services folder = self.context.bika_setup.bika_analysisservices created = [] for service in selected_services.values(): _id = folder.invokeFactory('AnalysisService', id = 'tmp') dup = folder[_id] dup.setTitle('%s (copy)' % service.Title()) _id = renameAfterCreation(dup) dup.edit( description = service.Description(), PointOfCapture = service.getPointOfCapture(), ReportDryMatter = service.getReportDryMatter(), Unit = service.getUnit(), Precision = service.getPrecision(), Price = service.getPrice(), CorporatePrice = service.getCorporatePrice(), VAT = service.getVAT(), Calculation = service.getCalculation(), Instrument = service.getInstrument(), MaxTimeAllowed = service.getMaxTimeAllowed(), DuplicateVariation = service.getDuplicateVariation(), Category = service.getCategory(), Department = service.getDepartment(), Accredited = service.getAccredited(), Uncertainties = service.getUncertainties(), ResultOptions = service.getResultOptions() ) created.append(_id) if len(created) > 1: message = self.context.translation_service.translate( _('Services ${services} were successfully created.', mapping = {'services': ', '.join(created)})) self.destination_url = self.request.get_header("referer", self.context.absolute_url()) else: message = self.context.translation_service.translate( _('Analysis request ${service} was successfully created.', mapping = {'service': ', '.join(created)})) self.destination_url = dup.absolute_url() + "/base_edit" self.context.plone_utils.addPortalMessage(message, 'info') self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) uc = getToolByName(self.context, 'uid_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'duplicate': selected_services = WorkflowAction._get_selected_items(self) ## Create a copy of the selected services folder = self.context.bika_setup.bika_analysisservices created = [] for service in selected_services.values(): _id = folder.invokeFactory('AnalysisService', id='tmp') dup = folder[_id] dup.setTitle('%s (copy)' % service.Title()) _id = renameAfterCreation(dup) dup.edit(description=service.Description(), PointOfCapture=service.getPointOfCapture(), ReportDryMatter=service.getReportDryMatter(), Unit=service.getUnit(), Precision=service.getPrecision(), Price=service.getPrice(), CorporatePrice=service.getCorporatePrice(), VAT=service.getVAT(), Calculation=service.getCalculation(), Instrument=service.getInstrument(), MaxTimeAllowed=service.getMaxTimeAllowed(), DuplicateVariation=service.getDuplicateVariation(), Category=service.getCategory(), Department=service.getDepartment(), Accredited=service.getAccredited(), Uncertainties=service.getUncertainties(), ResultOptions=service.getResultOptions()) created.append(_id) if len(created) > 1: message = self.context.translation_service.translate( _('Services ${services} were successfully created.', mapping={'services': ', '.join(created)})) self.destination_url = self.request.get_header( "referer", self.context.absolute_url()) else: message = self.context.translation_service.translate( _('Analysis request ${service} was successfully created.', mapping={'service': ', '.join(created)})) self.destination_url = dup.absolute_url() + "/base_edit" self.context.plone_utils.addPortalMessage(message, 'info') self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) action, _ = WorkflowAction._get_form_workflow_action(self) if action == 'receive' and 'Type' in form: BiospecimenWorkflowAction.__call__(self) elif action == 'receive' and 'AliquotType' in form: AliquotWorkflowAction.__call__(self) else: WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) action, _ = WorkflowAction._get_form_workflow_action(self) if type(action) in (list, tuple): action = action[0] # Call out to the workflow action method method_name = 'workflow_action_' + action method = getattr(self, method_name, False) if method: method() else: WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) action, came_from = WorkflowAction._get_form_workflow_action(self) if type(action) in (list, tuple): action = action[0] if type(came_from) in (list, tuple): came_from = came_from[0] # Call out to the workflow action method # Use default bika_listing.py/WorkflowAction for other transitions method_name = 'workflow_action_' + action method = getattr(self, method_name, False) if method: method() else: WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'reassign': mtool = getToolByName(self.context, 'portal_membership') if not mtool.checkPermission(ManageWorksheets, self.context): # Redirect to WS list msg = _('You do not have sufficient privileges to ' 'manage worksheets.') self.context.plone_utils.addPortalMessage(msg, 'warning') portal = getToolByName(self.context, 'portal_url').getPortalObject() self.destination_url = portal.absolute_url() + "/worksheets" self.request.response.redirect(self.destination_url) return selected_worksheets = WorkflowAction._get_selected_items(self) selected_worksheet_uids = selected_worksheets.keys() if selected_worksheets: changes = False for uid in selected_worksheet_uids: worksheet = selected_worksheets[uid] # Double-check the state first if workflow.getInfoFor(worksheet, 'review_state') == 'open': worksheet.setAnalyst(form['Analyst'][0][uid]) worksheet.reindexObject(idxs=['getAnalyst']) changes = True if changes: message = PMF('Changes saved.') self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header( "referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'reassign': mtool = getToolByName(self.context, 'portal_membership') if not mtool.checkPermission(ManageWorksheets, self.context): # Redirect to WS list msg = _('You do not have sufficient privileges to ' 'manage worksheets.') self.context.plone_utils.addPortalMessage(msg, 'warning') portal = getToolByName(self.context, 'portal_url').getPortalObject() self.destination_url = portal.absolute_url() + "/worksheets" self.request.response.redirect(self.destination_url) return selected_worksheets = WorkflowAction._get_selected_items(self) selected_worksheet_uids = selected_worksheets.keys() if selected_worksheets: changes = False for uid in selected_worksheet_uids: worksheet = selected_worksheets[uid] # Double-check the state first if workflow.getInfoFor(worksheet, 'review_state') == 'open': worksheet.setAnalyst(form['Analyst'][0][uid]) worksheet.reindexObject(idxs=['getAnalyst']) changes = True if changes: message = PMF('Changes saved.') self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header("referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form CheckAuthenticator(form) action, came_from = WorkflowAction._get_form_workflow_action(self) if action == "reassign": mtool = api.get_tool("portal_membership") if not mtool.checkPermission(ManageWorksheets, self.context): # Redirect to WS list msg = _("You do not have sufficient privileges to " "manage worksheets.") self.context.plone_utils.addPortalMessage(msg, "warning") portal = api.get_portal() self.destination_url = portal.absolute_url() + "/worksheets" self.request.response.redirect(self.destination_url) return selected_worksheets = WorkflowAction._get_selected_items(self) selected_worksheet_uids = selected_worksheets.keys() if selected_worksheets: changes = False for uid in selected_worksheet_uids: worksheet = selected_worksheets[uid] # Double-check the state first if api.get_workflow_status_of(worksheet) == "open": analyst = form["Analyst"][0][uid] worksheet.setAnalyst(analyst) worksheet.reindexObject(idxs=["getAnalyst"]) changes = True if changes: message = _("Changes saved.") self.context.plone_utils.addPortalMessage(message, "info") self.destination_url = self.request.get_header( "referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'submit': # Submit the form. Saves the results, methods, etc. self.submit() ## assign elif action == 'assign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() if selected_analyses: for uid in selected_analysis_uids: analysis = rc.lookupObject(uid) # Double-check the state first if (workflow.getInfoFor(analysis, 'worksheetanalysis_review_state') == 'unassigned' and workflow.getInfoFor(analysis, 'review_state') == 'sample_received' and workflow.getInfoFor(analysis, 'cancellation_state') == 'active'): self.context.addAnalysis(analysis) self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## unassign elif action == 'unassign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() for analysis_uid in selected_analysis_uids: try: analysis = bac(UID=analysis_uid)[0].getObject() except IndexError: # Duplicate analyses are removed when their analyses # get removed, so indexerror is expected. continue if skip(analysis, action, peek=True): continue self.context.removeAnalysis(analysis) message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## verify elif action == 'verify': # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() return self.workflow_action_default(action='verify', came_from='edit') else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def workflow_action_verify(self): # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() WorkflowAction.__call__(self)
def __call__(self): form = self.request.form CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'submit': # Submit the form. Saves the results, methods, etc. self.submit() ## assign elif action == 'assign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return analysis_uids = form.get("uids", []) if analysis_uids: # We retrieve the analyses from the database sorted by AR ID # ascending, so the positions of the ARs inside the WS are # consistent with the order of the ARs catalog = get_tool(CATALOG_ANALYSIS_LISTING) brains = catalog({ 'UID': analysis_uids, 'sort_on': 'getRequestID' }) # Now, we need the analyses within a request ID to be sorted by # sortkey (sortable_title index), so it will appear in the same # order as they appear in Analyses list from AR view curr_arid = None curr_brains = [] sorted_brains = [] for brain in brains: arid = brain.getRequestID if curr_arid != arid: # Sort the brains we've collected until now, that belong to # the same Analysis Request curr_brains.sort(key=attrgetter('getPrioritySortkey')) sorted_brains.extend(curr_brains) curr_arid = arid curr_brains = [] # Now we are inside the same AR curr_brains.append(brain) continue # Sort the last set of brains we've collected curr_brains.sort(key=attrgetter('getPrioritySortkey')) sorted_brains.extend(curr_brains) # Add analyses in the worksheet for brain in sorted_brains: analysis = brain.getObject() self.context.addAnalysis(analysis) self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## unassign elif action == 'unassign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() for analysis_uid in selected_analysis_uids: try: analysis = bac(UID=analysis_uid)[0].getObject() except IndexError: # Duplicate analyses are removed when their analyses # get removed, so indexerror is expected. continue if skip(analysis, action, peek=True): continue self.context.removeAnalysis(analysis) message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## verify elif action == 'verify': # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() return self.workflow_action_default(action='verify', came_from=came_from) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) skiplist = self.request.get('workflow_skiplist', []) action, came_from = WorkflowAction._get_form_workflow_action(self) # XXX combine data from multiple bika listing tables. item_data = {} if 'item_data' in form: if type(form['item_data']) == list: for i_d in form['item_data']: for i,d in json.loads(i_d).items(): item_data[i] = d else: item_data = json.loads(form['item_data']) ## publish if action in ('prepublish', 'publish', 'prepublish'): if not isActive(self.context): message = _('Item is inactive.') self.context.plone_utils.addPortalMessage(message, 'info') self.request.response.redirect(self.context.absolute_url()) return # XXX publish entire AR. transitioned = Publish(self.context, self.request, action, [self.context, ])() if len(transitioned) == 1: message = _('message_item_published', default = '${items} was published.', mapping = {'items': ', '.join(transitioned)}) else: message = _('No ARs were published.') self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header("referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) ## submit elif action == 'submit' and self.request.form.has_key("Result"): if not isActive(self.context): message = _('Item is inactive.') self.context.plone_utils.addPortalMessage(message, 'info') self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) results = {} hasInterims = {} # first save results for entire form for uid, result in self.request.form['Result'][0].items(): if uid in selected_analyses: analysis = selected_analyses[uid] else: analysis = rc.lookupObject(uid) if not analysis: # ignore result if analysis object no longer exists continue if not(getSecurityManager().checkPermission(EditResults, analysis)): # or changes no longer allowed continue results[uid] = result service = analysis.getService() interimFields = item_data[uid] if len(interimFields) > 0: hasInterims[uid] = True else: hasInterims[uid] = False unit = service.getUnit() analysis.edit( Result = result, InterimFields = interimFields, Retested = form.has_key('retested') and \ form['retested'].has_key(uid), Unit = unit and unit or '') # discover which items may be submitted submissable = [] for uid, analysis in selected_analyses.items(): if uid not in results: continue if not results[uid]: continue can_submit = True for dependency in analysis.getDependencies(): dep_state = workflow.getInfoFor(dependency, 'review_state') if hasInterims[uid]: if dep_state in ('sample_due', 'sample_received', 'attachment_due', 'to_be_verified',): can_submit = False break else: if dep_state in ('sample_due', 'sample_received',): can_submit = False break if can_submit and analysis not in submissable: submissable.append(analysis) # and then submit them. for analysis in submissable: if not analysis.UID() in skiplist: try: workflow.doActionFor(analysis, 'submit') except WorkflowException: pass if self.context.getReportDryMatter(): self.context.setDryMatterResults() message = _("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header("referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) ## verify elif action == 'verify': # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() WorkflowAction.__call__(self) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'submit': # Submit the form. Saves the results, methods, etc. self.submit() ## assign elif action == 'assign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() if selected_analyses: for uid in selected_analysis_uids: analysis = rc.lookupObject(uid) # Double-check the state first if (workflow.getInfoFor(analysis, 'worksheetanalysis_review_state') == 'unassigned' and workflow.getInfoFor( analysis, 'review_state') == 'sample_received' and workflow.getInfoFor( analysis, 'cancellation_state') == 'active'): self.context.addAnalysis(analysis) self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## unassign elif action == 'unassign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() for analysis_uid in selected_analysis_uids: try: analysis = bac(UID=analysis_uid)[0].getObject() except IndexError: # Duplicate analyses are removed when their analyses # get removed, so indexerror is expected. continue if skip(analysis, action, peek=True): continue self.context.removeAnalysis(analysis) message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## verify elif action == 'verify': # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() return self.workflow_action_default(action='verify', came_from=came_from) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') pc = getToolByName(self.context, 'portal_catalog') rc = getToolByName(self.context, REFERENCE_CATALOG) # use came_from to decide which UI action was clicked. # "workflow_action" is the action name specified in the # portal_workflow transition url. came_from = "workflow_action" action = form.get(came_from, '') if not action: # workflow_action_button is the action name specified in # the bika_listing_view table buttons. came_from = "workflow_action_button" action = form.get(came_from, '') # XXX some browsers agree better than others about our JS ideas. if type(action) == type([]): action = action[0] if not action: if self.destination_url == "": self.destination_url = self.request.get_header("referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) return if action in ('prepublish', 'publish', 'prepublish'): # We pass a list of AR objects to Publish. # it returns a list of AR IDs which were actually published. ARs_to_publish = [] transitioned = [] if 'paths' in form: for path in form['paths']: item_id = path.split("/")[-1] item_path = path.replace("/" + item_id, '') ar = pc(id = item_id, path = {'query':item_path, 'depth':1})[0].getObject() # can't publish inactive items if not( 'bika_inactive_workflow' in workflow.getChainFor(ar) and \ workflow.getInfoFor(ar, 'inactive_state', '') == 'inactive'): ar.setDatePublished(DateTime()) ARs_to_publish.append(ar) transitioned = Publish(self.context, self.request, action, ARs_to_publish)() if len(transitioned) > 1: message = _('message_items_published', default = '${items} were published.', mapping = {'items': ', '.join(transitioned)}) elif len(transitioned) == 1: message = _('message_item_published', default = '${items} published.', mapping = {'items': ', '.join(transitioned)}) else: message = _('No items were published') message = self.context.translate(message) self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header("referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'submit': # Submit the form. Saves the results, methods, etc. self.submit() ## assign elif action == 'assign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return analysis_uids = form.get("uids", []) if analysis_uids: # We retrieve the analyses from the database sorted by AR ID # ascending, so the positions of the ARs inside the WS are # consistent with the order of the ARs catalog = get_tool(CATALOG_ANALYSIS_LISTING) brains = catalog({'UID': analysis_uids, 'sort_on': 'getRequestID'}) # Now, we need the analyses within a request ID to be sorted by # sortkey (sortable_title index), so it will appear in the same # order as they appear in Analyses list from AR view curr_arid = None curr_brains = [] sorted_brains = [] for brain in brains: arid = brain.getRequestID if curr_arid != arid: # Sort the brains we've collected until now, that belong to # the same Analysis Request curr_brains.sort(key=attrgetter('getPrioritySortkey')) sorted_brains.extend(curr_brains) curr_arid = arid curr_brains = [] # Now we are inside the same AR curr_brains.append(brain) continue # Sort the last set of brains we've collected curr_brains.sort(key=attrgetter('getPrioritySortkey')) sorted_brains.extend(curr_brains) # Add analyses in the worksheet for brain in sorted_brains: analysis = brain.getObject() self.context.addAnalysis(analysis) self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## unassign elif action == 'unassign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() for analysis_uid in selected_analysis_uids: try: analysis = bac(UID=analysis_uid)[0].getObject() except IndexError: # Duplicate analyses are removed when their analyses # get removed, so indexerror is expected. continue if skip(analysis, action, peek=True): continue self.context.removeAnalysis(analysis) message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## verify elif action == 'verify': # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() return self.workflow_action_default(action='verify', came_from=came_from) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) rc = getToolByName(self.context, REFERENCE_CATALOG) bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) if action == 'submit': # Submit the form. Saves the results, methods, etc. self.submit() ## assign elif action == 'assign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return analyses = WorkflowAction._get_selected_items(self).values() if analyses: analyses = sorted(analyses, key=methodcaller('getRequestID')) for analysis in analyses: if self.isAddable(analysis): self.context.addAnalysis(analysis) self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## unassign elif action == 'unassign': if not self.context.checkUserManage(): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() for analysis_uid in selected_analysis_uids: try: analysis = bac(UID=analysis_uid)[0].getObject() except IndexError: # Duplicate analyses are removed when their analyses # get removed, so indexerror is expected. continue if skip(analysis, action, peek=True): continue self.context.removeAnalysis(analysis) message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## verify elif action == 'verify': # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() return self.workflow_action_default(action='verify', came_from=came_from) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)
def __call__(self): form = self.request.form plone.protect.CheckAuthenticator(form) workflow = getToolByName(self.context, 'portal_workflow') rc = getToolByName(self.context, REFERENCE_CATALOG) bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') action, came_from = WorkflowAction._get_form_workflow_action(self) # XXX combine data from multiple bika listing tables. item_data = {} if 'item_data' in form: if type(form['item_data']) == list: for i_d in form['item_data']: for i, d in json.loads(i_d).items(): item_data[i] = d else: item_data = json.loads(form['item_data']) if action == 'submit' and self.request.form.has_key("Result"): selected_analyses = WorkflowAction._get_selected_items(self) results = {} hasInterims = {} # first save results for entire form for uid, result in self.request.form['Result'][0].items(): if uid in selected_analyses: analysis = selected_analyses[uid] else: analysis = rc.lookupObject(uid) if not analysis: # ignore result if analysis object no longer exists continue if not(getSecurityManager().checkPermission(EditResults, analysis)): # or changes no longer allowed continue if not isActive(analysis): # or it's cancelled continue results[uid] = result service = analysis.getService() interimFields = item_data[uid] if len(interimFields) > 0: hasInterims[uid] = True else: hasInterims[uid] = False unit = service.getUnit() analysis.edit( Result = result, InterimFields = interimFields, Retested = form.has_key('retested') and \ form['retested'].has_key(uid), Unit = unit and unit or '') # discover which items may be submitted submissable = [] for uid, analysis in selected_analyses.items(): if uid not in results: continue can_submit = True if hasattr(analysis, 'getDependencies'): dependencies = analysis.getDependencies() for dependency in dependencies: dep_state = workflow.getInfoFor(dependency, 'review_state') if hasInterims[uid]: if dep_state in ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received', 'attachment_due', 'to_be_verified',): can_submit = False break else: if dep_state in ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received',): can_submit = False break for dependency in dependencies: if workflow.getInfoFor(dependency, 'review_state') in \ ('to_be_sampled', 'to_be_preserved', 'sample_due', 'sample_received'): can_submit = False if can_submit: submissable.append(analysis) # and then submit them. for analysis in submissable: doActionFor(analysis, 'submit') message = PMF("Changes saved.") self.context.plone_utils.addPortalMessage(message, 'info') self.destination_url = self.request.get_header("referer", self.context.absolute_url()) self.request.response.redirect(self.destination_url) ## assign elif action == 'assign': if not(getSecurityManager().checkPermission(EditWorksheet, self.context)): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() if selected_analyses: for uid in selected_analysis_uids: analysis = rc.lookupObject(uid) # Double-check the state first if (workflow.getInfoFor(analysis, 'worksheetanalysis_review_state') == 'unassigned' and workflow.getInfoFor(analysis, 'review_state') == 'sample_received' and workflow.getInfoFor(analysis, 'cancellation_state') == 'active'): self.context.addAnalysis(analysis) self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## unassign elif action == 'unassign': if not(getSecurityManager().checkPermission(EditWorksheet, self.context)): self.request.response.redirect(self.context.absolute_url()) return selected_analyses = WorkflowAction._get_selected_items(self) selected_analysis_uids = selected_analyses.keys() for analysis_uid in selected_analysis_uids: try: analysis = bac(UID=analysis_uid)[0].getObject() except IndexError: # Duplicate analyses are removed when their analyses # get removed, so indexerror is expected. continue if skip(analysis, action, peek=True): continue self.context.removeAnalysis(analysis) self.destination_url = self.context.absolute_url() self.request.response.redirect(self.destination_url) ## verify elif action == 'verify': # default bika_listing.py/WorkflowAction, but then go to view screen. self.destination_url = self.context.absolute_url() WorkflowAction.__call__(self) else: # default bika_listing.py/WorkflowAction for other transitions WorkflowAction.__call__(self)