From 81fa1b07cd94a94b708b972d2f7df4c0f6808c2d Mon Sep 17 00:00:00 2001 From: toropok Date: Sun, 7 Nov 2021 00:37:58 +0700 Subject: [PATCH 1/3] Lookup for dependent analysis in partitions Let calculations work in case dependent analysis assigned to the subsample (partition) --- src/bika/lims/content/abstractroutineanalysis.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/bika/lims/content/abstractroutineanalysis.py b/src/bika/lims/content/abstractroutineanalysis.py index 1a0f553d8f..ef324ccaa3 100644 --- a/src/bika/lims/content/abstractroutineanalysis.py +++ b/src/bika/lims/content/abstractroutineanalysis.py @@ -320,8 +320,13 @@ def is_dependent(analysis): query = dict(UID=services, getKeyword=self.getKeyword()) services = api.search(query, "bika_setup_catalog") return len(services) > 0 - - siblings = self.getSiblings(with_retests=with_retests) + + request = self.getRequest() + if request.isPartition(): + siblings = request.getParentAnalysisRequest().getAnalyses(full_objects=True) + else: + siblings = self.getSiblings(with_retests=with_retests) + dependents = filter(lambda sib: is_dependent(sib), siblings) if not recursive: return dependents From 3cc0de021291a000ebfbdfee55e27e198222a1fa Mon Sep 17 00:00:00 2001 From: toropok Date: Sun, 7 Nov 2021 01:12:11 +0700 Subject: [PATCH 2/3] Update CHANGES.rst --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index d6d7f4ffb5..8eb537aef9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,7 @@ Changelog 2.0.1 (unreleased) ------------------ +- #1871 Allow calculations to rely on results of tests in subsamples (partitiones) - #1864 Added UID reference field/widget for Dexterity Contents - #1867 Fix error when invalidating samples with copies of analyses - #1865 Fix indexing of temporary objects resulting in orphan entries in catalog From 4a5da4758b5c374b3d9be8b58eacfafb48021972 Mon Sep 17 00:00:00 2001 From: toropok Date: Wed, 10 Nov 2021 13:39:07 +0700 Subject: [PATCH 3/3] Update ARAnalysesFieldWithPartitions.rst --- .../ARAnalysesFieldWithPartitions.rst | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst b/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst index 90ead40942..3df101ffc1 100644 --- a/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst +++ b/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst @@ -67,6 +67,11 @@ Create some basic objects for the test: >>> Fe = api.create(setup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(setup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) >>> Mg = api.create(setup.bika_analysisservices, "AnalysisService", title="Magnesium", Keyword="Mg", Price="20", Category=category.UID()) + >>> Ca = api.create(setup.bika_analysisservices, "AnalysisService", title="Calcium", Keyword="Ca", Price="20", Category=category.UID()) + >>> THCaCO3 = api.create(setup.bika_analysisservices, "AnalysisService", title="Calcium", Keyword="THCaCO3", Price="20", Category=category.UID()) + >>> calc = api.create(setup.bika_calculations, "Calculation", title="Total Hardness") + >>> calc.setFormula("[Ca] + [Mg]") + >>> THCaCO3.setCalculation(calc) Creation of a Sample with a Partition @@ -330,3 +335,32 @@ partition, nothing will happen: [] >>> partition.objectValues("Analysis") [, , ] + + +Test calculation when dependant service assigned to a partition subsample: +.......................................................................... + +Create a Sample and receive: + + >>> sample2 = new_sample([Ca, Mg, THCaCO3]) + +Create a Partition containing of the Sample, containing the analysis `Ca`: + + >>> ca = get_analysis_from(sample2, Ca) + >>> partition2 = create_partition(sample, request, [ca]) + +Set result values to analysis (Ca, Mg) + + >>> analyses = sample2.getAnalyses(full_objects=True) + >>> ca_analysis = filter(lambda an: an.getKeyword()=="Ca", analyses)[0] + >>> mg_analysis = filter(lambda an: an.getKeyword()=="Mg", analyses)[0] + >>> ca_analysis.setResult(10) + >>> mg_analysis.setResult(10) + +Calculate dependant result and make sure it's correct: + >>> th_analysis = filter(lambda an: an.getKeyword()=="THCaCO3", analyses)[0] + >>> th_analysis.calculateResult() + True + >>> th_analysis.getResult() + '20.0' +