Skip to content

Commit bf6542a

Browse files
authored
Allow to create samples without analyses (#2162)
* Added field in senaite setup * Added proxy field in bika setup * Added logic in sample add form * Changelog updated
1 parent 00f734c commit bf6542a

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

CHANGES.rst

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Changelog
44
2.4.0 (unreleased)
55
------------------
66

7+
- #2162 Allow to create samples without analyses
78
- #2160 Allow indexed attributes for ZCTextIndex in catalog API
89
- #2158 Fix traceback when accessing registry
910
- #2154 Cleanup the internal logic used for the creation of analysis objects

src/bika/lims/browser/analysisrequest/add2.py

+11
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,13 @@ def get_object_by_uid(self, uid):
132132
logger.warn("!! No object found for UID #{} !!")
133133
return obj
134134

135+
@viewcache.memoize
136+
def analyses_required(self):
137+
"""Check if analyses are required
138+
"""
139+
setup = api.get_setup()
140+
return setup.getSampleAnalysesRequired()
141+
135142
def get_currency(self):
136143
"""Returns the configured currency
137144
"""
@@ -1570,6 +1577,10 @@ def ajax_submit(self):
15701577
if record.get("Client", False):
15711578
required_fields.pop('Client', None)
15721579

1580+
# Check if analyses are required for sample registration
1581+
if not self.analyses_required():
1582+
required_fields.pop("Analyses", None)
1583+
15731584
# Contacts get pre-filled out if only one contact exists.
15741585
# We won't force those columns with only the Contact filled out to
15751586
# be required.

src/bika/lims/content/bikasetup.py

+28
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,17 @@ def getCounterTypes(self, instance=None):
324324
"Group analyses by category for samples")
325325
),
326326
),
327+
BooleanField(
328+
"SampleAnalysesRequired",
329+
schemata="Analyses",
330+
default=True,
331+
widget=BooleanWidget(
332+
label=_("label_bikasetup_sampleanalysesrequired",
333+
default="Require sample analyses"),
334+
description=_("description_bikasetup_sampleanalysesrequired",
335+
"Analyses are required for sample registration")
336+
),
337+
),
327338
BooleanField(
328339
'EnableARSpecs',
329340
schemata="Analyses",
@@ -1098,5 +1109,22 @@ def setCategorizeSampleAnalyses(self, value):
10981109
if setup:
10991110
setup.setCategorizeSampleAnalyses(value)
11001111

1112+
def getSampleAnalysesRequired(self):
1113+
"""Get the value from the senaite setup
1114+
"""
1115+
setup = api.get_senaite_setup()
1116+
# setup is `None` during initial site content structure installation
1117+
if setup:
1118+
return setup.getSampleAnalysesRequired()
1119+
return False
1120+
1121+
def setSampleAnalysesRequired(self, value):
1122+
"""Set the value in the senaite setup
1123+
"""
1124+
setup = api.get_senaite_setup()
1125+
# setup is `None` during initial site content structure installation
1126+
if setup:
1127+
setup.setSampleAnalysesRequired(value)
1128+
11011129

11021130
registerType(BikaSetup, PROJECTNAME)

src/senaite/core/content/senaitesetup.py

+25
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,16 @@ class ISetupSchema(model.Schema):
103103
default=False,
104104
)
105105

106+
sample_analyses_required = schema.Bool(
107+
title=_("title_senaitesetup_sampleanalysesrequired",
108+
default=u"Require sample analyses"),
109+
description=_(
110+
"description_senaitesetup_sampleanalysesrequired",
111+
default=u"Analyses are required for sample registration"
112+
),
113+
default=True,
114+
)
115+
106116
###
107117
# Fieldsets
108118
###
@@ -112,6 +122,7 @@ class ISetupSchema(model.Schema):
112122
fields=[
113123
"immediate_results_entry",
114124
"categorize_sample_analyses",
125+
"sample_analyses_required",
115126
]
116127
)
117128

@@ -233,3 +244,17 @@ def setCategorizeSampleAnalyses(self, value):
233244
"""
234245
mutator = self.mutator("categorize_sample_analyses")
235246
return mutator(self, value)
247+
248+
@security.protected(permissions.View)
249+
def getSampleAnalysesRequired(self):
250+
"""Returns if analyses are required in sample add form
251+
"""
252+
accessor = self.accessor("sample_analyses_required")
253+
return accessor(self)
254+
255+
@security.protected(permissions.ModifyPortalContent)
256+
def setSampleAnalysesRequired(self, value):
257+
"""Allow/Disallow to create samples without analyses
258+
"""
259+
mutator = self.mutator("sample_analyses_required")
260+
return mutator(self, value)

0 commit comments

Comments
 (0)