def __call__(self): ar = self.context workflow = getToolByName(self.context, 'portal_workflow') if 'transition' in self.request.form: doActionFor(self.context, self.request.form['transition']) # Contacts get expanded for view contact = self.context.getContact() contacts = [] for cc in self.context.getCCContact(): contacts.append(cc) if contact in contacts: contacts.remove(contact) ccemails = [] for cc in contacts: ccemails.append( "%s <<a href='mailto:%s'>%s</a>>" % (cc.Title(), cc.getEmailAddress(), cc.getEmailAddress())) # CC Emails become mailto links emails = self.context.getCCEmails() if isinstance(emails, str): emails = emails and [ emails, ] or [] cc_emails = [] cc_hrefs = [] for cc in emails: cc_emails.append(cc) cc_hrefs.append("<a href='mailto:%s'>%s</a>" % (cc, cc)) # render header table self.header_table = HeaderTableView(self.context, self.request)() # Create Partitions View for this ARs sample p = SamplePartitionsView(self.context.getSample(), self.request) p.show_column_toggles = False self.parts = p.contents_table() # Create Field and Lab Analyses tables self.tables = {} for poc in POINTS_OF_CAPTURE: if self.context.getAnalyses(getPointOfCapture=poc): t = self.createAnalysesView( ar, self.request, getPointOfCapture=poc, show_categories=self.context.bika_setup. getCategoriseAnalysisServices()) t.allow_edit = True t.form_id = "%s_analyses" % poc t.review_states[0]['transitions'] = [{ 'id': 'submit' }, { 'id': 'retract' }, { 'id': 'verify' }] t.show_workflow_action_buttons = True t.show_select_column = True if getSecurityManager().checkPermission(EditFieldResults, self.context) \ and poc == 'field': t.review_states[0]['columns'].remove('DueDate') self.tables[POINTS_OF_CAPTURE.getValue( poc)] = t.contents_table() # Un-captured field analyses may cause confusion if ar.getAnalyses(getPointOfCapture='field', review_state=['sampled', 'sample_due']): message = _("There are field analyses without submitted results.") self.addMessage(message, 'info') # Create QC Analyses View for this AR show_cats = self.context.bika_setup.getCategoriseAnalysisServices() qcview = self.createQCAnalyesView(ar, self.request, show_categories=show_cats) qcview.allow_edit = False qcview.show_select_column = False qcview.show_workflow_action_buttons = False qcview.form_id = "%s_qcanalyses" qcview.review_states[0]['transitions'] = [{ 'id': 'submit' }, { 'id': 'retract' }, { 'id': 'verify' }] self.qctable = qcview.contents_table() # If a general retracted is done, rise a waring if workflow.getInfoFor(ar, 'review_state') == 'sample_received': allstatus = list() for analysis in ar.getAnalyses(): status = workflow.getInfoFor(analysis.getObject(), 'review_state') if status not in ['retracted', 'to_be_verified', 'verified']: allstatus = [] break else: allstatus.append(status) if len(allstatus) > 0: self.addMessage("General Retract Done", 'warning') # If is a retracted AR, show the link to child AR and show a warn msg if workflow.getInfoFor(ar, 'review_state') == 'invalid': childar = hasattr(ar, 'getChildAnalysisRequest') \ and ar.getChildAnalysisRequest() or None message = _( 'These results have been withdrawn and are ' 'listed here for trace-ability purposes. Please follow ' 'the link to the retest') if childar: message = (message + " %s.") % childar.getRequestID() else: message = message + "." self.addMessage(message, 'warning') # If is an AR automatically generated due to a Retraction, show it's # parent AR information if hasattr(ar, 'getParentAnalysisRequest') \ and ar.getParentAnalysisRequest(): par = ar.getParentAnalysisRequest() message = _( 'This Analysis Request has been ' 'generated automatically due to ' 'the retraction of the Analysis ' 'Request ${retracted_request_id}.', mapping={'retracted_request_id': par.getRequestID()}) self.addMessage(message, 'info') self.renderMessages() return self.template()
def __init__(self, context, request): super(AnalysisRequestAnalysesView, self).__init__(context, request) self.catalog = "bika_setup_catalog" self.contentFilter = {'portal_type': 'AnalysisService', 'sort_on': 'sortable_title', 'inactive_state': 'active', } self.context_actions = {} self.icon = self.portal_url + "/++resource++bika.lims.images/analysisrequest_big.png" self.title = self.context.Title() self.show_sort_column = False self.show_select_row = False self.show_select_column = True self.table_only = True self.show_select_all_checkbox = False self.pagesize = 999999 self.categories = [] self.do_cats = self.context.bika_setup.getCategoriseAnalysisServices() if self.do_cats: self.show_categories = True self.expand_all_categories = False self.ajax_categories = True self.category_index = 'getCategoryTitle' self.columns = { 'Title': {'title': _('Service'), 'index': 'sortable_title', 'sortable': False, }, 'Hidden': {'title': _('Hidden'), 'sortable': False, 'type': 'boolean', }, 'Price': {'title': _('Price'), 'sortable': False, }, 'Priority': {'title': _('Priority'), 'sortable': False, 'index': 'Priority', 'toggle': True }, 'Partition': {'title': _('Partition'), 'sortable': False, }, 'min': {'title': _('Min')}, 'max': {'title': _('Max')}, 'error': {'title': _('Permitted Error %')}, } columns = ['Title', 'Hidden', ] ShowPrices = self.context.bika_setup.getShowPrices() if ShowPrices: columns.append('Price') columns.append('Priority') ShowPartitions = self.context.bika_setup.getShowPartitions() if ShowPartitions: columns.append('Partition') EnableARSpecs = self.context.bika_setup.getEnableARSpecs() if EnableARSpecs: columns.append('min') columns.append('max') columns.append('error') self.review_states = [ {'id': 'default', 'title': _('All'), 'contentFilter': {}, 'columns': columns, 'transitions': [{'id': 'empty'}, ], # none 'custom_actions': [{'id': 'save_analyses_button', 'title': _('Save')}, ], }, ] # Create Partitions View for this ARs sample sample = self.context.getSample() p = SamplePartitionsView(sample, self.request) p.table_only = True p.allow_edit = False p.form_id = "parts" p.show_select_column = False p.show_table_footer = False p.review_states[0]['transitions'] = [{'id': 'empty'}, ] # none p.review_states[0]['custom_actions'] = [] p.review_states[0]['columns'] = ['PartTitle', 'getContainer', 'getPreservation', 'state_title'] self.parts = p.contents_table()
def __init__(self, context, request): super(AnalysisRequestAnalysesView, self).__init__(context, request) self.catalog = "bika_setup_catalog" self.contentFilter = {'portal_type': 'AnalysisService', 'sort_on': 'sortable_title', 'inactive_state': 'active', } self.context_actions = {} self.icon = self.portal_url + "/++resource++bika.lims.images/analysisrequest_big.png" self.title = self.context.Title() self.show_sort_column = False self.show_select_row = False self.show_select_column = True self.table_only = True self.show_select_all_checkbox = False self.pagesize = 0 self.columns = { 'Title': {'title': _('Service'), 'index': 'sortable_title', 'sortable': False, }, 'Price': {'title': _('Price'), 'sortable': False, }, 'Priority': {'title': _('Priority'), 'sortable': False, 'index': 'Priority', 'toggle': True }, 'Partition': {'title': _('Partition'), 'sortable': False, }, 'min': {'title': _('Min')}, 'max': {'title': _('Max')}, 'error': {'title': _('Permitted Error %')}, } columns = ['Title', ] ShowPrices = self.context.bika_setup.getShowPrices() if ShowPrices: columns.append('Price') columns.append('Priority') ShowPartitions = self.context.bika_setup.getShowPartitions() if ShowPartitions: columns.append('Partition') EnableARSpecs = self.context.bika_setup.getEnableARSpecs() if EnableARSpecs: columns.append('min') columns.append('max') columns.append('error') self.review_states = [ {'id': 'default', 'title': _('All'), 'contentFilter': {}, 'columns': columns, 'transitions': [{'id': 'empty'}, ], # none 'custom_actions': [{'id': 'save_analyses_button', 'title': _('Save')}, ], }, ] # Create Partitions View for this ARs sample sample = self.context.getSample() p = SamplePartitionsView(sample, self.request) p.table_only = True p.allow_edit = False p.form_id = "parts" p.show_select_column = False p.show_table_footer = False p.review_states[0]['transitions'] = [{'id': 'empty'}, ] # none p.review_states[0]['custom_actions'] = [] p.review_states[0]['columns'] = ['PartTitle', 'getContainer', 'getPreservation', 'state_title'] self.parts = p.contents_table()
def __call__(self): ar = self.context workflow = getToolByName(self.context, 'portal_workflow') if 'transition' in self.request.form: doActionFor(self.context, self.request.form['transition']) # Contacts get expanded for view contact = self.context.getContact() contacts = [] for cc in self.context.getCCContact(): contacts.append(cc) if contact in contacts: contacts.remove(contact) ccemails = [] for cc in contacts: ccemails.append("%s <<a href='mailto:%s'>%s</a>>" % (cc.Title(), cc.getEmailAddress(), cc.getEmailAddress())) # CC Emails become mailto links emails = self.context.getCCEmails() if isinstance(emails, str): emails = emails and [emails, ] or [] cc_emails = [] cc_hrefs = [] for cc in emails: cc_emails.append(cc) cc_hrefs.append("<a href='mailto:%s'>%s</a>" % (cc, cc)) # render header table self.header_table = HeaderTableView(self.context, self.request)() # Create Partitions View for this ARs sample p = SamplePartitionsView(self.context.getSample(), self.request) p.show_column_toggles = False self.parts = p.contents_table() # Create Field and Lab Analyses tables self.tables = {} for poc in POINTS_OF_CAPTURE: if self.context.getAnalyses(getPointOfCapture=poc): t = self.createAnalysesView( ar, self.request, getPointOfCapture=poc, show_categories=self.context.bika_setup.getCategoriseAnalysisServices()) t.allow_edit = True t.form_id = "%s_analyses" % poc t.review_states[0]['transitions'] = [{'id': 'submit'}, {'id': 'retract'}, {'id': 'verify'}] t.show_workflow_action_buttons = True t.show_select_column = True if getSecurityManager().checkPermission(EditFieldResults, self.context) \ and poc == 'field': t.review_states[0]['columns'].remove('DueDate') self.tables[POINTS_OF_CAPTURE.getValue(poc)] = t.contents_table() # Create QC Analyses View for this AR show_cats = self.context.bika_setup.getCategoriseAnalysisServices() qcview = self.createQCAnalyesView(ar, self.request, show_categories=show_cats) qcview.allow_edit = False qcview.show_select_column = False qcview.show_workflow_action_buttons = False qcview.form_id = "%s_qcanalyses" qcview.review_states[0]['transitions'] = [{'id': 'submit'}, {'id': 'retract'}, {'id': 'verify'}] self.qctable = qcview.contents_table() # Create the ResultsInterpretation by department view from resultsinterpretation import ARResultsInterpretationView self.riview = ARResultsInterpretationView(ar, self.request) # If a general retracted is done, rise a waring if workflow.getInfoFor(ar, 'review_state') == 'sample_received': allstatus = list() for analysis in ar.getAnalyses(): status = workflow.getInfoFor(analysis.getObject(), 'review_state') if status not in ['retracted', 'to_be_verified', 'verified']: allstatus = [] break else: allstatus.append(status) if len(allstatus) > 0: message = "General Retract Done. Submit this AR manually." self.addMessage(message, 'warning') # If is a retracted AR, show the link to child AR and show a warn msg if workflow.getInfoFor(ar, 'review_state') == 'invalid': childar = hasattr(ar, 'getChildAnalysisRequest') and \ ar.getChildAnalysisRequest() or None message = _('These results have been withdrawn and are ' 'listed here for trace-ability purposes. Please follow ' 'the link to the retest') if childar: message = (message + " %s.") % childar.getRequestID() else: message = message + "." self.addMessage(message, 'warning') # If is an AR automatically generated due to a Retraction, show it's # parent AR information if hasattr(ar, 'getParentAnalysisRequest') and \ ar.getParentAnalysisRequest(): par = ar.getParentAnalysisRequest() message = _('This Analysis Request has been ' 'generated automatically due to ' 'the retraction of the Analysis ' 'Request ${retracted_request_id}.', mapping={'retracted_request_id': par.getRequestID()}) self.addMessage(message, 'info') self.renderMessages() return self.template()
def __init__(self, context, request): super(AnalysisRequestAnalysesView, self).__init__(context, request) self.catalog = "bika_setup_catalog" self.contentFilter = { 'portal_type': 'AnalysisService', 'sort_on': 'sortable_title', 'sort_order': 'ascending', 'inactive_state': 'active', } self.sort_on = 'sortable_title' self.sort_order = 'ascending' self.context_actions = {} self.icon = self.portal_url + \ "/++resource++bika.lims.images/analysisrequest_big.png" self.title = self.context.Title() self.show_sort_column = False self.show_select_row = False self.show_select_column = True self.table_only = True self.show_select_all_checkbox = False self.pagesize = 999999 self.categories = [] self.do_cats = self.context.bika_setup.getCategoriseAnalysisServices() if self.do_cats: self.show_categories = True self.expand_all_categories = False self.ajax_categories = True self.category_index = 'getCategoryTitle' self.columns = { 'Title': { 'title': _('Service'), 'index': 'sortable_title', 'sortable': False, }, 'Unit': { 'title': _('Unit'), 'sortable': False, }, 'Hidden': { 'title': _('Hidden'), 'sortable': False, 'type': 'boolean', }, 'Price': { 'title': _('Price'), 'sortable': False, }, 'Partition': { 'title': _('Partition'), 'sortable': False, 'type': 'choices' }, 'warn_min': { 'title': _('Min warn') }, 'min': { 'title': _('Min') }, 'max': { 'title': _('Max') }, 'warn_max': { 'title': _('Max warn') }, } columns = [ 'Title', 'Unit', 'Hidden', ] ShowPrices = self.context.bika_setup.getShowPrices() if ShowPrices: columns.append('Price') ShowPartitions = self.context.bika_setup.getShowPartitions() if ShowPartitions: columns.append('Partition') EnableARSpecs = self.context.bika_setup.getEnableARSpecs() if EnableARSpecs: columns.append("warn_min") columns.append('min') columns.append('max') columns.append("warn_max") self.review_states = [ { 'id': 'default', 'title': _('All'), 'contentFilter': { "inactive_state": "active" }, 'columns': columns, 'transitions': [ { 'id': 'empty' }, ], # none 'custom_transitions': [{ 'id': 'save_analyses_button', 'title': _('Save') }], }, ] # Create Partitions View for this ARs sample sample = self.context.getSample() p = SamplePartitionsView(sample, self.request) p.table_only = True p.allow_edit = False p.form_id = "parts" p.show_select_column = False p.show_table_footer = False p.review_states[0]['transitions'] = [ { 'id': 'empty' }, ] # none p.review_states[0]['custom_transitions'] = [] p.review_states[0]['columns'] = [ 'PartTitle', 'getContainer', 'getPreservation', 'state_title' ] self.parts = p.contents_table()
def __call__(self): ar = self.context workflow = getToolByName(self.context, 'portal_workflow') if 'transition' in self.request.form: doActionFor(self.context, self.request.form['transition']) # If the analysis request has been received and hasn't been yet # verified yet, redirect the user to manage_results view, but only if # the user has privileges to Edit(Field)Results, cause otherwise she/he # will receive an InsufficientPrivileges error! if (self.request.PATH_TRANSLATED.endswith(self.context.id) and check_permission(EditResults, self.context) and check_permission(EditFieldResults, self.context) and wasTransitionPerformed(self.context, 'receive') and not wasTransitionPerformed(self.context, 'verify')): # Redirect to manage results view if not cancelled if api.get_workflow_status_of(ar, 'cancellation_state') != \ "cancelled": manage_results_url = "/".join( [self.context.absolute_url(), 'manage_results']) self.request.response.redirect(manage_results_url) return # Contacts get expanded for view contact = self.context.getContact() contacts = [] for cc in self.context.getCCContact(): contacts.append(cc) if contact in contacts: contacts.remove(contact) ccemails = [] for cc in contacts: ccemails.append( "%s <<a href='mailto:%s'>%s</a>>" % (cc.Title(), cc.getEmailAddress(), cc.getEmailAddress())) # CC Emails become mailto links emails = self.context.getCCEmails() if isinstance(emails, str): emails = emails and [ emails, ] or [] cc_emails = [] cc_hrefs = [] for cc in emails: cc_emails.append(cc) cc_hrefs.append("<a href='mailto:%s'>%s</a>" % (cc, cc)) # render header table self.header_table = HeaderTableView(self.context, self.request)() # Create Partitions View for this ARs sample p = SamplePartitionsView(self.context.getSample(), self.request) p.show_column_toggles = False self.parts = p.contents_table() # Create Field and Lab Analyses tables self.tables = {} for poc in POINTS_OF_CAPTURE: if self.context.getAnalyses(getPointOfCapture=poc): t = self.createAnalysesView( ar, self.request, getPointOfCapture=poc, show_categories=self.context.bika_setup. getCategoriseAnalysisServices(), getRequestUID=self.context.UID()) t.allow_edit = True t.form_id = "%s_analyses" % poc t.review_states[0]['transitions'] = [{ 'id': 'submit' }, { 'id': 'retract' }, { 'id': 'verify' }] t.show_workflow_action_buttons = True t.show_select_column = True if getSecurityManager().checkPermission(EditFieldResults, self.context) \ and poc == 'field': t.review_states[0]['columns'].remove('DueDate') self.tables[POINTS_OF_CAPTURE.getValue( poc)] = t.contents_table() # Create QC Analyses View for this AR show_cats = self.context.bika_setup.getCategoriseAnalysisServices() qcview = self.createQCAnalyesView(ar, self.request, show_categories=show_cats) qcview.allow_edit = False qcview.show_select_column = False qcview.show_workflow_action_buttons = False qcview.form_id = "%s_qcanalyses" qcview.review_states[0]['transitions'] = [{ 'id': 'submit' }, { 'id': 'retract' }, { 'id': 'verify' }] self.qctable = qcview.contents_table() # Create the ResultsInterpretation by department view from resultsinterpretation import ARResultsInterpretationView self.riview = ARResultsInterpretationView(ar, self.request) # If a general retracted is done, rise a waring if workflow.getInfoFor(ar, 'review_state') == 'sample_received': allstatus = list() for analysis in ar.getAnalyses(): status = workflow.getInfoFor(analysis.getObject(), 'review_state') if status not in ['retracted', 'to_be_verified', 'verified']: allstatus = [] break else: allstatus.append(status) if len(allstatus) > 0: message = "General Retract Done. Submit this AR manually." self.addMessage(message, 'warning') # If is a retracted AR, show the link to child AR and show a warn msg if workflow.getInfoFor(ar, 'review_state') == 'invalid': childar = hasattr(ar, 'getChildAnalysisRequest') \ and ar.getChildAnalysisRequest() or None message = _( 'These results have been withdrawn and are ' 'listed here for trace-ability purposes. Please follow ' 'the link to the retest') if childar: message = (message + " %s.") % childar.getId() else: message = message + "." self.addMessage(message, 'warning') # If is an AR automatically generated due to a Retraction, show it's # parent AR information if hasattr(ar, 'getParentAnalysisRequest') \ and ar.getParentAnalysisRequest(): par = ar.getParentAnalysisRequest() message = _( 'This Analysis Request has been ' 'generated automatically due to ' 'the retraction of the Analysis ' 'Request ${retracted_request_id}.', mapping={'retracted_request_id': par.getId()}) self.addMessage(message, 'info') self.renderMessages() return self.template()