diff --git a/CHANGES.rst b/CHANGES.rst
index 65377711e8..9feea25da0 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,7 @@ Changelog
2.7.0 (unreleased)
------------------
+- #2963 Show analysis service keyword as code across service listings
- #2957 Harmonize form input widths via tunable CSS variables
- #2956 Restrict client discount fields to lab staff
- #2958 Add labels with colors, filtering, and bulk-manage modal for samples
diff --git a/src/bika/lims/browser/analysisrequest/manage_analyses.py b/src/bika/lims/browser/analysisrequest/manage_analyses.py
index da29b3a67c..c5ddd221a6 100644
--- a/src/bika/lims/browser/analysisrequest/manage_analyses.py
+++ b/src/bika/lims/browser/analysisrequest/manage_analyses.py
@@ -74,6 +74,9 @@ def __init__(self, context, request):
"title": _("Service"),
"index": "sortable_title",
"sortable": False}),
+ ("Keyword", {
+ "title": _("Keyword"),
+ "sortable": False}),
("ResultUnit", {
"title": _("Unit"),
"sortable": False}),
@@ -94,7 +97,7 @@ def __init__(self, context, request):
"title": _("Max")}),
))
- columns = ["Title", "Unit", "Hidden", ]
+ columns = ["Title", "Keyword", "Unit", "Hidden", ]
if self.show_prices():
columns.append("Price")
if self.show_ar_specs():
@@ -238,6 +241,8 @@ def folderitem(self, obj, item, index):
spec = rr.get(keyword, ResultsRangeDict())
item["Title"] = obj.Title()
+ item["Keyword"] = keyword
+ item["replace"]["Keyword"] = "{}".format(keyword)
item["ResultUnit"] = obj.getUnit()
item["Price"] = price
item["before"]["Price"] = self.get_currency_symbol()
diff --git a/src/bika/lims/browser/analysisrequest/templates/ar_add2.pt b/src/bika/lims/browser/analysisrequest/templates/ar_add2.pt
index 9bc456ac6e..9ed898da23 100644
--- a/src/bika/lims/browser/analysisrequest/templates/ar_add2.pt
+++ b/src/bika/lims/browser/analysisrequest/templates/ar_add2.pt
@@ -104,6 +104,15 @@
{{title}}
+ {{#if keyword}}
+
{{keyword}}
+ {}".format(keyword)
# Add methods
methods = obj.getMethods()
diff --git a/src/bika/lims/browser/widgets/analysisspecificationwidget.py b/src/bika/lims/browser/widgets/analysisspecificationwidget.py
index c1d1c71e94..a310621f2f 100644
--- a/src/bika/lims/browser/widgets/analysisspecificationwidget.py
+++ b/src/bika/lims/browser/widgets/analysisspecificationwidget.py
@@ -248,6 +248,7 @@ def folderitem(self, obj, item, index):
item["Title"] = title
item["Keyword"] = keyword
+ item["replace"]["Keyword"] = "{}".format(keyword)
item["replace"]["Title"] = get_link(url, value=title)
item["choices"]["min_operator"] = self.min_operator_choices
item["choices"]["max_operator"] = self.max_operator_choices
diff --git a/src/bika/lims/browser/widgets/artemplateanalyseswidget.py b/src/bika/lims/browser/widgets/artemplateanalyseswidget.py
index eda2e167a6..886a128265 100644
--- a/src/bika/lims/browser/widgets/artemplateanalyseswidget.py
+++ b/src/bika/lims/browser/widgets/artemplateanalyseswidget.py
@@ -236,6 +236,10 @@ def folderitem(self, obj, item, index):
item["Hidden"] = hidden
item["selected"] = uid in self.configuration
+ keyword = obj.getKeyword()
+ item["Keyword"] = keyword
+ item["replace"]["Keyword"] = "{}".format(keyword)
+
# Make partition a required field
item.setdefault("required", []).append("Partition")
diff --git a/src/bika/lims/browser/widgets/serviceswidget.py b/src/bika/lims/browser/widgets/serviceswidget.py
index 6b1e0f008e..4d56ad8d57 100644
--- a/src/bika/lims/browser/widgets/serviceswidget.py
+++ b/src/bika/lims/browser/widgets/serviceswidget.py
@@ -152,6 +152,10 @@ def folderitem(self, obj, item, index):
item["selected"] = False
item["selected"] = uid in self.selected_services_uids
+ keyword = obj.getKeyword()
+ item["Keyword"] = keyword
+ item["replace"]["Keyword"] = "{}".format(keyword)
+
# Add methods
methods = obj.getMethods()
if methods:
diff --git a/src/bika/lims/controlpanel/bika_analysisservices.py b/src/bika/lims/controlpanel/bika_analysisservices.py
index ae8279c96a..b4784a7172 100644
--- a/src/bika/lims/controlpanel/bika_analysisservices.py
+++ b/src/bika/lims/controlpanel/bika_analysisservices.py
@@ -359,6 +359,11 @@ def folderitem(self, obj, item, index):
item["Department"] = title
item["replace"]["Department"] = get_link(url, title)
+ # Keyword
+ keyword = obj.getKeyword()
+ if keyword:
+ item["replace"]["Keyword"] = "{}".format(keyword)
+
# Unit
unit = obj.getUnit()
item["Unit"] = unit and format_supsub(unit) or ""
diff --git a/src/senaite/core/browser/samples/partition_magic.py b/src/senaite/core/browser/samples/partition_magic.py
index aadaea7bbe..0bcd23fae4 100644
--- a/src/senaite/core/browser/samples/partition_magic.py
+++ b/src/senaite/core/browser/samples/partition_magic.py
@@ -224,6 +224,7 @@ def get_analysis_data_for(self, ar):
info = self.get_base_info(an)
info.update({
"service_uid": an.getServiceUID(),
+ "keyword": an.getKeyword(),
})
out.append(info)
return out
diff --git a/src/senaite/core/browser/samples/templates/partition_magic.pt b/src/senaite/core/browser/samples/templates/partition_magic.pt
index 9c8b5881c6..5c5941f9f6 100644
--- a/src/senaite/core/browser/samples/templates/partition_magic.pt
+++ b/src/senaite/core/browser/samples/templates/partition_magic.pt
@@ -228,7 +228,15 @@
checked python:service_uid in template.get('analyses', {}).get(partition, [])"/>
)
+