def isSamplePointHidden(self): return isAttributeHidden('AnalysisRequest', 'SamplePoint')
def __call__(self): bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') self.report_content = {} parms = [] headings = {} headings['header'] = _("Analyses out of range") headings['subheader'] = _("Analyses results out of specified range") count_all = 0 query = {"portal_type": "Analysis", "sort_order": "reverse"} spec_uid = self.request.form.get("spec", False) spec_obj = None spec_title = "" if spec_uid: brains = bsc(UID=spec_uid) if brains: spec_obj = brains[0].getObject() spec_title = spec_obj.Title() parms.append( {"title": _("Range spec"), "value": spec_title, "type": "text"}) date_query = formatDateQuery(self.context, 'Received') if date_query: query['getDateReceived'] = date_query received = formatDateParms(self.context, 'Received') else: received = 'Undefined' parms.append( {'title': _('Received'), 'value': received, 'type': 'text'}) wf_tool = getToolByName(self.context, 'portal_workflow') if self.request.form.has_key('bika_analysis_workflow'): query['review_state'] = self.request.form['bika_analysis_workflow'] review_state = wf_tool.getTitleForStateOnType( self.request.form['bika_analysis_workflow'], 'Analysis') else: review_state = 'Undefined' parms.append( {'title': _('Status'), 'value': review_state, 'type': 'text'}) if self.request.form.has_key('bika_cancellation_workflow'): query['cancellation_state'] = self.request.form[ 'bika_cancellation_workflow'] cancellation_state = wf_tool.getTitleForStateOnType( self.request.form['bika_cancellation_workflow'], 'Analysis') else: cancellation_state = 'Undefined' parms.append( {'title': _('Active'), 'value': cancellation_state, 'type': 'text'}) if self.request.form.has_key('bika_worksheetanalysis_workflow'): query['worksheetanalysis_review_state'] = self.request.form[ 'bika_worksheetanalysis_workflow'] ws_review_state = wf_tool.getTitleForStateOnType( self.request.form['bika_worksheetanalysis_workflow'], 'Analysis') else: ws_review_state = 'Undefined' parms.append( {'title': _('Assigned to worksheet'), 'value': ws_review_state, 'type': 'text'}) # and now lets do the actual report lines col_heads = [_('Client'), _('Request'), _('Sample type'), _('Sample point'), _('Category'), _('Analysis'), _('Result'), _('Min'), _('Max'), _('Status'), ] if isAttributeHidden('Sample', 'SamplePoint'): col_heads.remove(_('Sample point')) formats = {'columns': 10, 'col_heads': col_heads, 'class': '', } datalines = [] for a_proxy in bac(query): analysis = a_proxy.getObject() if analysis.getResult(): try: result = float(analysis.getResult()) except: continue else: continue keyword = analysis.getKeyword() # determine which specs to use for this particular analysis # 1) if a spec is given in the query form, use it. # 2) if a spec is entered directly on the analysis, use it. # otherwise just continue to the next object. spec_dict = False if spec_obj: rr = spec_obj.getResultsRangeDict() if keyword in rr: spec_dict = rr[keyword] else: ar = analysis.aq_parent ar_spec_obj = ar.getSpecification() if ar_spec_obj: rr = ar_spec_obj.getResultsRangeDict() if keyword in rr: spec_dict = rr[keyword] else: if hasattr(analysis, "specification") \ and analysis.specification: spec_dict = analysis.specification else: continue if not spec_dict: continue try: spec_min = float(spec_dict['min']) spec_max = float(spec_dict['max']) except ValueError: continue if spec_min <= result <= spec_max: continue # check if in shoulder: out of range, but in acceptable # error percentage shoulder = False error = 0 try: error = float(spec_dict.get('error', '0')) except: error = 0 pass error_amount = (result / 100) * error error_min = result - error_amount error_max = result + error_amount if ((result < spec_min) and (error_max >= spec_min)) or \ ((result > spec_max) and (error_min <= spec_max)): shoulder = True dataline = [] dataitem = {'value': analysis.getClientTitle()} dataline.append(dataitem) dataitem = {'value': analysis.getRequestID()} dataline.append(dataitem) dataitem = {'value': analysis.aq_parent.getSampleTypeTitle()} dataline.append(dataitem) if isAttributeHidden('Sample', 'SamplePoint'): dataitem = {'value': analysis.aq_parent.getSamplePointTitle()} dataline.append(dataitem) dataitem = {'value': analysis.getCategoryTitle()} dataline.append(dataitem) dataitem = {'value': analysis.getServiceTitle()} dataline.append(dataitem) if shoulder: dataitem = {'value': analysis.getResult(), 'img_after': '++resource++bika.lims.images/exclamation.png'} else: dataitem = {'value': analysis.getResult()} dataline.append(dataitem) dataitem = {'value': spec_dict['min']} dataline.append(dataitem) dataitem = {'value': spec_dict['max']} dataline.append(dataitem) state = wf_tool.getInfoFor(analysis, 'review_state', '') review_state = wf_tool.getTitleForStateOnType( state, 'Analysis') dataitem = {'value': review_state} dataline.append(dataitem) datalines.append(dataline) count_all += 1 # table footer data footlines = [] footline = [] footitem = {'value': _('Number of analyses out of range for period'), 'colspan': 9, 'class': 'total_label'} footline.append(footitem) footitem = {'value': count_all} footline.append(footitem) footlines.append(footline) # report footer data footnotes = [] footline = [] footitem = {'value': _('Analysis result within error range'), 'img_before': '++resource++bika.lims.images/exclamation.png' } footline.append(footitem) footnotes.append(footline) self.report_content = { 'headings': headings, 'parms': parms, 'formats': formats, 'datalines': datalines, 'footings': footlines, 'footnotes': footnotes} title = t(headings['header']) return {'report_title': title, 'report_data': self.template()}
def __call__(self): context = self.context workflow = getToolByName(context, 'portal_workflow') # Collect related data and objects invoice = context.getInvoice() sample = context.getSample() samplePoint = sample.getSamplePoint() reviewState = workflow.getInfoFor(context, 'review_state') # Collection invoice information if invoice: self.invoiceId = invoice.getId() else: self.invoiceId = _('Proforma (Not yet invoiced)') # Collect verified invoice information verified = reviewState in VERIFIED_STATES if verified: self.verifiedBy = context.getVerifier() self.verified = verified self.request['verified'] = verified # Collect published date datePublished = context.getDatePublished() if datePublished is not None: datePublished = self.ulocalized_time( datePublished, long_format=1 ) self.datePublished = datePublished # Collect received date dateReceived = context.getDateReceived() if dateReceived is not None: dateReceived = self.ulocalized_time(dateReceived, long_format=1) self.dateReceived = dateReceived # Collect general information self.reviewState = reviewState contact = context.getContact() self.contact = contact.Title() if contact else "" self.clientOrderNumber = context.getClientOrderNumber() self.clientReference = context.getClientReference() self.clientSampleId = sample.getClientSampleID() self.sampleType = sample.getSampleType().Title() self.samplePoint = samplePoint and samplePoint.Title() self.requestId = context.getRequestID() self.headers = [ {'title': 'Invoice ID', 'value': self.invoiceId}, {'title': 'Client Reference', 'value': self.clientReference }, {'title': 'Sample Type', 'value': self.sampleType}, {'title': 'Request ID', 'value': self.requestId}, {'title': 'Date Received', 'value': self.dateReceived}, ] if not isAttributeHidden('AnalysisRequest', 'ClientOrderNumber'): self.headers.append({'title': 'Client Sample Id', 'value': self.clientOrderNumber}) if not isAttributeHidden('AnalysisRequest', 'SamplePoint'): self.headers.append( {'title': 'Sample Point', 'value': self.samplePoint}) if self.verified: self.headers.append( {'title': 'Verified By', 'value': self.verifiedBy}) if self.datePublished: self.headers.append( {'title': 'datePublished', 'value': self.datePublished}) # <tal:published tal:condition="view/datePublished"> # <th i18n:translate="">Date Published</th> # <td tal:content="view/datePublished"></td> # </tal:published> #</tr> # Retrieve required data from analyses collection analyses = [] for analysis in context.getRequestedAnalyses(): service = analysis.getService() categoryName = service.getCategory().Title() # Find the category try: category = ( o for o in analyses if o['name'] == categoryName ).next() except: category = {'name': categoryName, 'analyses': []} analyses.append(category) # Append the analysis to the category category['analyses'].append({ 'title': analysis.Title(), 'price': analysis.getPrice(), 'priceVat': "%.2f" % analysis.getVATAmount(), 'priceTotal': "%.2f" % analysis.getTotalPrice(), }) self.analyses = analyses # Get totals self.subtotal = context.getSubtotal() self.VATAmount = "%.2f" % context.getVATAmount() self.totalPrice = "%.2f" % context.getTotalPrice() # Render the template return self.template()
def __call__(self): context = self.context workflow = getToolByName(context, 'portal_workflow') # Collect related data and objects invoice = context.getInvoice() sample = context.getSample() samplePoint = sample.getSamplePoint() reviewState = workflow.getInfoFor(context, 'review_state') # Collection invoice information if invoice: self.invoiceId = invoice.getId() else: self.invoiceId = _('Proforma (Not yet invoiced)') # Collect verified invoice information verified = reviewState in VERIFIED_STATES if verified: self.verifiedBy = context.getVerifier() self.verified = verified self.request['verified'] = verified # Collect published date self.datePublished = \ self.ulocalized_time(getTransitionDate(context, 'publish'), long_format=1) # Collect received date dateReceived = context.getDateReceived() if dateReceived is not None: dateReceived = self.ulocalized_time(dateReceived, long_format=1) self.dateReceived = dateReceived # Collect general information self.reviewState = reviewState contact = context.getContact() self.contact = contact.Title() if contact else "" self.clientOrderNumber = context.getClientOrderNumber() self.clientReference = context.getClientReference() self.clientSampleId = sample.getClientSampleID() self.sampleType = sample.getSampleType().Title() self.samplePoint = samplePoint and samplePoint.Title() self.requestId = context.getRequestID() self.headers = [ { 'title': 'Invoice ID', 'value': self.invoiceId }, { 'title': 'Client Reference', 'value': self.clientReference }, { 'title': 'Sample Type', 'value': self.sampleType }, { 'title': 'Request ID', 'value': self.requestId }, { 'title': 'Date Received', 'value': self.dateReceived }, ] if not isAttributeHidden('AnalysisRequest', 'ClientOrderNumber'): self.headers.append({ 'title': 'Client Sample Id', 'value': self.clientOrderNumber }) if not isAttributeHidden('AnalysisRequest', 'SamplePoint'): self.headers.append({ 'title': 'Sample Point', 'value': self.samplePoint }) if self.verified: self.headers.append({ 'title': 'Verified By', 'value': self.verifiedBy }) if self.datePublished: self.headers.append({ 'title': 'datePublished', 'value': self.datePublished }) analyses = [] profiles = [] # Retrieve required data from analyses collection all_analyses, all_profiles, analyses_from_profiles = context.getServicesAndProfiles( ) # Relating category with solo analysis for analysis in all_analyses: categoryName = analysis.getCategoryTitle() # Find the category try: category = (o for o in analyses if o['name'] == categoryName).next() except: category = {'name': categoryName, 'analyses': []} analyses.append(category) # Append the analysis to the category category['analyses'].append({ 'title': analysis.Title(), 'price': analysis.getPrice(), 'priceVat': "%.2f" % analysis.getVATAmount(), 'priceTotal': "%.2f" % analysis.getTotalPrice(), }) # Relating analysis services with their profiles # We'll take the analysis contained on each profile for profile in all_profiles: # If profile's checkbox "Use Analysis Profile Price" is enabled, only the profile price will be displayed. # Otherwise each analysis will display its own price. pservices = [] if profile.getUseAnalysisProfilePrice(): # We have to use the profiles price only for pservice in profile.getService(): pservices.append({ 'title': pservice.Title(), 'price': None, 'priceVat': None, 'priceTotal': None, }) profiles.append({ 'name': profile.title, 'price': profile.getAnalysisProfilePrice(), 'priceVat': profile.getVATAmount(), 'priceTotal': profile.getTotalPrice(), 'analyses': pservices }) else: # We need the analyses prices instead of profile price for pservice in profile.getService(): # We want the analysis instead of the service, because we want the price for the client # (for instance the bulk price) panalysis = self._getAnalysisForProfileService( pservice.getKeyword(), analyses_from_profiles) pservices.append({ 'title': pservice.Title(), 'price': panalysis.getPrice() if panalysis else pservice.getPrice(), 'priceVat': "%.2f" % panalysis.getVATAmount() if panalysis else pservice.getVATAmount(), 'priceTotal': "%.2f" % panalysis.getTotalPrice() if panalysis else pservice.getTotalPrice(), }) profiles.append({ 'name': profile.title, 'price': None, 'priceVat': None, 'priceTotal': None, 'analyses': pservices }) self.analyses = analyses self.profiles = profiles # Get subtotals self.subtotal = context.getSubtotal() self.subtotalVATAmount = "%.2f" % context.getSubtotalVATAmount() self.subtotalTotalPrice = "%.2f" % context.getSubtotalTotalPrice() # Get totals self.memberDiscount = Decimal(context.getDefaultMemberDiscount()) self.discountAmount = context.getDiscountAmount() self.VATAmount = "%.2f" % context.getVATAmount() self.totalPrice = "%.2f" % context.getTotalPrice() # Render the template return self.template()
def __call__(self): context = self.context workflow = getToolByName(context, 'portal_workflow') # Collect related data and objects invoice = context.getInvoice() sample = context.getSample() samplePoint = sample.getSamplePoint() reviewState = workflow.getInfoFor(context, 'review_state') # Collection invoice information if invoice: self.invoiceId = invoice.getId() else: self.invoiceId = _('Proforma (Not yet invoiced)') # Collect verified invoice information verified = reviewState in VERIFIED_STATES if verified: self.verifiedBy = context.getVerifier() self.verified = verified self.request['verified'] = verified # Collect published date self.datePublished = \ self.ulocalized_time(getTransitionDate(context, 'publish'), long_format=1) # Collect received date dateReceived = context.getDateReceived() if dateReceived is not None: dateReceived = self.ulocalized_time(dateReceived, long_format=1) self.dateReceived = dateReceived # Collect general information self.reviewState = reviewState contact = context.getContact() self.contact = contact.Title() if contact else "" self.clientOrderNumber = context.getClientOrderNumber() self.clientReference = context.getClientReference() self.clientSampleId = sample.getClientSampleID() self.sampleType = sample.getSampleType().Title() self.samplePoint = samplePoint and samplePoint.Title() self.requestId = context.getRequestID() self.headers = [ {'title': 'Invoice ID', 'value': self.invoiceId}, {'title': 'Client Reference', 'value': self.clientReference }, {'title': 'Sample Type', 'value': self.sampleType}, {'title': 'Request ID', 'value': self.requestId}, {'title': 'Date Received', 'value': self.dateReceived}, ] if not isAttributeHidden('AnalysisRequest', 'ClientOrderNumber'): self.headers.append({'title': 'Client Sample Id', 'value': self.clientOrderNumber}) if not isAttributeHidden('AnalysisRequest', 'SamplePoint'): self.headers.append( {'title': 'Sample Point', 'value': self.samplePoint}) if self.verified: self.headers.append( {'title': 'Verified By', 'value': self.verifiedBy}) if self.datePublished: self.headers.append( {'title': 'datePublished', 'value': self.datePublished}) analyses = [] profiles = [] # Retrieve required data from analyses collection all_analyses, all_profiles, analyses_from_profiles = context.getServicesAndProfiles() # Relating category with solo analysis for analysis in all_analyses: service = analysis.getService() categoryName = service.getCategory().Title() # Find the category try: category = ( o for o in analyses if o['name'] == categoryName ).next() except: category = {'name': categoryName, 'analyses': []} analyses.append(category) # Append the analysis to the category category['analyses'].append({ 'title': analysis.Title(), 'price': analysis.getPrice(), 'priceVat': "%.2f" % analysis.getVATAmount(), 'priceTotal': "%.2f" % analysis.getTotalPrice(), }) # Relating analysis services with their profiles # We'll take the analysis contained on each profile for profile in all_profiles: # If profile's checkbox "Use Analysis Profile Price" is enabled, only the profile price will be displayed. # Otherwise each analysis will display its own price. pservices = [] if profile.getUseAnalysisProfilePrice(): # We have to use the profiles price only for pservice in profile.getService(): pservices.append({ 'title': pservice.Title(), 'price': None, 'priceVat': None, 'priceTotal': None, }) profiles.append({'name': profile.title, 'price': profile.getAnalysisProfilePrice(), 'priceVat': profile.getVATAmount(), 'priceTotal': profile.getTotalPrice(), 'analyses': pservices}) else: # We need the analyses prices instead of profile price for pservice in profile.getService(): # We want the analysis instead of the service, because we want the price for the client # (for instance the bulk price) panalysis = self._getAnalysisForProfileService(pservice.getKeyword(), analyses_from_profiles) pservices.append({ 'title': pservice.Title(), 'price': panalysis.getPrice() if panalysis else pservice.getPrice(), 'priceVat': "%.2f" % panalysis.getVATAmount() if panalysis else pservice.getVATAmount(), 'priceTotal': "%.2f" % panalysis.getTotalPrice() if panalysis else pservice.getTotalPrice(), }) profiles.append({'name': profile.title, 'price': None, 'priceVat': None, 'priceTotal': None, 'analyses': pservices}) self.analyses = analyses self.profiles = profiles # Get subtotals self.subtotal = context.getSubtotal() self.subtotalVATAmount = "%.2f" % context.getSubtotalVATAmount() self.subtotalTotalPrice = "%.2f" % context.getSubtotalTotalPrice() # Get totals self.memberDiscount = Decimal(context.getDefaultMemberDiscount()) self.discountAmount = context.getDiscountAmount() self.VATAmount = "%.2f" % context.getVATAmount() self.totalPrice = "%.2f" % context.getTotalPrice() # Render the template return self.template()
def __call__(self): bsc = getToolByName(self.context, 'bika_setup_catalog') bac = getToolByName(self.context, 'bika_analysis_catalog') self.report_content = {} parms = [] headings = {} headings['header'] = _("Analyses out of range") headings['subheader'] = _("Analyses results out of specified range") count_all = 0 query = {"portal_type": "Analysis", "sort_order": "reverse"} spec_uid = self.request.form.get("spec", False) spec_obj = None spec_title = "" if spec_uid: brains = bsc(UID=spec_uid) if brains: spec_obj = brains[0].getObject() spec_title = spec_obj.Title() parms.append({ "title": _("Range spec"), "value": spec_title, "type": "text" }) date_query = formatDateQuery(self.context, 'Received') if date_query: query['getDateReceived'] = date_query received = formatDateParms(self.context, 'Received') else: received = 'Undefined' parms.append({ 'title': _('Received'), 'value': received, 'type': 'text' }) wf_tool = getToolByName(self.context, 'portal_workflow') if self.request.form.has_key('bika_analysis_workflow'): query['review_state'] = self.request.form['bika_analysis_workflow'] review_state = wf_tool.getTitleForStateOnType( self.request.form['bika_analysis_workflow'], 'Analysis') else: review_state = 'Undefined' parms.append({ 'title': _('Status'), 'value': review_state, 'type': 'text' }) if self.request.form.has_key('bika_cancellation_workflow'): query['cancellation_state'] = self.request.form[ 'bika_cancellation_workflow'] cancellation_state = wf_tool.getTitleForStateOnType( self.request.form['bika_cancellation_workflow'], 'Analysis') else: cancellation_state = 'Undefined' parms.append({ 'title': _('Active'), 'value': cancellation_state, 'type': 'text' }) if self.request.form.has_key('bika_worksheetanalysis_workflow'): query['worksheetanalysis_review_state'] = self.request.form[ 'bika_worksheetanalysis_workflow'] ws_review_state = wf_tool.getTitleForStateOnType( self.request.form['bika_worksheetanalysis_workflow'], 'Analysis') else: ws_review_state = 'Undefined' parms.append({ 'title': _('Assigned to worksheet'), 'value': ws_review_state, 'type': 'text' }) # and now lets do the actual report lines col_heads = [ _('Client'), _('Request'), _('Sample type'), _('Sample point'), _('Category'), _('Analysis'), _('Result'), _('Min'), _('Max'), _('Status'), ] if isAttributeHidden('Sample', 'SamplePoint'): col_heads.remove(_('Sample point')) formats = { 'columns': 10, 'col_heads': col_heads, 'class': '', } datalines = [] for a_proxy in bac(query): analysis = a_proxy.getObject() if analysis.getResult(): try: result = float(analysis.getResult()) except: continue else: continue keyword = analysis.getKeyword() # determine which specs to use for this particular analysis # 1) if a spec is given in the query form, use it. # 2) if a spec is entered directly on the analysis, use it. # otherwise just continue to the next object. spec_dict = False if spec_obj: rr = spec_obj.getResultsRangeDict() if keyword in rr: spec_dict = rr[keyword] else: ar = analysis.aq_parent rr = dicts_to_dict(ar.getResultsRange(), 'keyword') if keyword in rr: spec_dict = rr[keyword] else: continue if not spec_dict: continue try: spec_min = float(spec_dict['min']) spec_max = float(spec_dict['max']) except ValueError: continue if spec_min <= result <= spec_max: continue # check if in shoulder: out of range, but in acceptable # error percentage shoulder = False error = 0 try: error = float(spec_dict.get('error', '0')) except: error = 0 pass error_amount = (result / 100) * error error_min = result - error_amount error_max = result + error_amount if ((result < spec_min) and (error_max >= spec_min)) or \ ((result > spec_max) and (error_min <= spec_max)): shoulder = True dataline = [] dataitem = {'value': analysis.getClientTitle()} dataline.append(dataitem) dataitem = {'value': analysis.getRequestID()} dataline.append(dataitem) dataitem = {'value': analysis.aq_parent.getSampleTypeTitle()} dataline.append(dataitem) if isAttributeHidden('Sample', 'SamplePoint'): dataitem = {'value': analysis.aq_parent.getSamplePointTitle()} dataline.append(dataitem) dataitem = {'value': analysis.getCategoryTitle()} dataline.append(dataitem) dataitem = {'value': analysis.getServiceTitle()} dataline.append(dataitem) if shoulder: dataitem = { 'value': analysis.getResult(), 'img_after': '++resource++bika.lims.images/exclamation.png' } else: dataitem = {'value': analysis.getResult()} dataline.append(dataitem) dataitem = {'value': spec_dict['min']} dataline.append(dataitem) dataitem = {'value': spec_dict['max']} dataline.append(dataitem) state = wf_tool.getInfoFor(analysis, 'review_state', '') review_state = wf_tool.getTitleForStateOnType(state, 'Analysis') dataitem = {'value': review_state} dataline.append(dataitem) datalines.append(dataline) count_all += 1 # table footer data footlines = [] footline = [] footitem = { 'value': _('Number of analyses out of range for period'), 'colspan': 9, 'class': 'total_label' } footline.append(footitem) footitem = {'value': count_all} footline.append(footitem) footlines.append(footline) # report footer data footnotes = [] footline = [] footitem = { 'value': _('Analysis result within error range'), 'img_before': '++resource++bika.lims.images/exclamation.png' } footline.append(footitem) footnotes.append(footline) self.report_content = { 'headings': headings, 'parms': parms, 'formats': formats, 'datalines': datalines, 'footings': footlines, 'footnotes': footnotes } title = t(headings['header']) return {'report_title': title, 'report_data': self.template()}