From 41d8a94a0b411c11a568198a783c5a08ef032181 Mon Sep 17 00:00:00 2001 From: Lunga Baliwe Date: Sun, 7 Jun 2026 13:14:27 +0200 Subject: [PATCH 1/3] Prevent duplicate "City" labels for countries with mixed subdivision types --- src/senaite/core/api/geo.py | 9 +++++++++ src/senaite/core/z3cform/widgets/address.py | 11 ++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/senaite/core/api/geo.py b/src/senaite/core/api/geo.py index a1cb526c21..27b7d8efe9 100644 --- a/src/senaite/core/api/geo.py +++ b/src/senaite/core/api/geo.py @@ -171,6 +171,15 @@ def get_subdivisions(thing, default=_marker): # Sort by code return sorted(subdivisions, key=lambda s: s.code) +def get_subdivision_type(subdivisions, default): + if not subdivisions: + return default + + types = set([sub.type for sub in subdivisions]) + if len(types) == 1: + return subdivisions[0].type + + return default def get_country_or_subdivision(thing, default=_marker): """Returns the country or subdivision for the thing passed-in diff --git a/src/senaite/core/z3cform/widgets/address.py b/src/senaite/core/z3cform/widgets/address.py index 9dce21d597..38646f2d56 100644 --- a/src/senaite/core/z3cform/widgets/address.py +++ b/src/senaite/core/z3cform/widgets/address.py @@ -235,9 +235,7 @@ def get_input_widget_attributes(self): subdivisions = geo.get_subdivisions(country, []) sub1[country] = map(lambda sub: sub.name, subdivisions) - label = _("State") - if subdivisions: - label = _(subdivisions[0].type) + label = geo.get_subdivision_type(subdivisions, _("State")) labels[country]["subdivision1"] = translate(label) subdivision1 = item.get("subdivision1") @@ -245,9 +243,7 @@ def get_input_widget_attributes(self): subdivisions = geo.get_subdivisions(subdivision1, []) sub2[subdivision1] = map(lambda sub: sub.name, subdivisions) - label = _("District") - if subdivisions: - label = _(subdivisions[0].type) + label = geo.get_subdivision_type(subdivisions, _("District")) labels[country]["subdivision2"] = translate(label) attributes = { @@ -305,12 +301,13 @@ def __call__(self): # Extract the subdivisions for this parent parent = safe_unicode(parent) items = geo.get_subdivisions(parent, default=[]) + subdivision_type = geo.get_subdivision_type(items, "State") def to_dict(subdivision): return { "name": subdivision.name, "code": subdivision.code, - "type": self.context.translate(_(subdivision.type)), + "type": self.context.translate(_(subdivision_type)), } return [to_dict(item) for item in items] From 71602752b7b6c3ae9c6b6fb2d7e4612ceec02af8 Mon Sep 17 00:00:00 2001 From: Lunga Baliwe Date: Sun, 7 Jun 2026 13:51:31 +0200 Subject: [PATCH 2/3] Changelog --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0af5a44226..1a06d6ff17 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,7 @@ Changelog 2.7.0 (unreleased) ------------------ +- #2931 Fix Laboratory address widget labels for countries with mixed subdivision types - #2928 Fix ASTM consumer boundary bugs (sender shape, instrument cascade, sample fallback) - #2925 Add 'reattach' workflow transition to re-link detached partitions to their primary - #2926 Strip surrounding whitespace from analysis unit choices so configuration typos don't break the round-trip From 88cf550aedf2e415281b1b2ff103df4a67fd8bfb Mon Sep 17 00:00:00 2001 From: Lunga Baliwe Date: Sun, 21 Jun 2026 17:20:20 +0200 Subject: [PATCH 3/3] Fixed translations --- src/senaite/core/z3cform/widgets/address.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/senaite/core/z3cform/widgets/address.py b/src/senaite/core/z3cform/widgets/address.py index 38646f2d56..68a99f10ed 100644 --- a/src/senaite/core/z3cform/widgets/address.py +++ b/src/senaite/core/z3cform/widgets/address.py @@ -235,7 +235,8 @@ def get_input_widget_attributes(self): subdivisions = geo.get_subdivisions(country, []) sub1[country] = map(lambda sub: sub.name, subdivisions) - label = geo.get_subdivision_type(subdivisions, _("State")) + state_label = _(u"label_subdivision_state", default=u"State") + label = geo.get_subdivision_type(subdivisions, state_label) labels[country]["subdivision1"] = translate(label) subdivision1 = item.get("subdivision1") @@ -243,7 +244,10 @@ def get_input_widget_attributes(self): subdivisions = geo.get_subdivisions(subdivision1, []) sub2[subdivision1] = map(lambda sub: sub.name, subdivisions) - label = geo.get_subdivision_type(subdivisions, _("District")) + district_label = _( + u"label_subdivision_district", default=u"District" + ) + label = geo.get_subdivision_type(subdivisions, district_label) labels[country]["subdivision2"] = translate(label) attributes = {