diff --git a/CHANGES.rst b/CHANGES.rst index d2e114a46e..c9dfc26516 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,7 @@ Changelog 2.4.0 (unreleased) ------------------ +- #2266 Change worksheet analysis column order for better results capturing - #2265 Change sample analysis column order for better results capturing - #2264 Collapsible analyses listings in sample view - #2262 Simplify attachment render in report options to single checkbox diff --git a/src/bika/lims/browser/analyses/view.py b/src/bika/lims/browser/analyses/view.py index a93c54a2c6..83101388a2 100644 --- a/src/bika/lims/browser/analyses/view.py +++ b/src/bika/lims/browser/analyses/view.py @@ -263,7 +263,8 @@ def get_default_columns_order(self): :returns: List of column keys """ name = "sampleview_analysis_columns_order" - return get_registry_record(name, default=[]) + columns_order = get_registry_record(name, default=[]) or [] + return columns_order def reorder_analysis_columns(self): """Reorder analysis columns based on registry configuration diff --git a/src/bika/lims/browser/worksheet/views/analyses.py b/src/bika/lims/browser/worksheet/views/analyses.py index e21e543b14..3f7a560335 100644 --- a/src/bika/lims/browser/worksheet/views/analyses.py +++ b/src/bika/lims/browser/worksheet/views/analyses.py @@ -35,6 +35,7 @@ from bika.lims.utils import to_int from plone.memoize import view from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile +from senaite.core.registry import get_registry_record class AnalysesView(BaseView): @@ -76,15 +77,6 @@ def __init__(self, context, request): ("Service", { "sortable": False, "title": _("Analysis")}), - ("Method", { - "sortable": False, - "ajax": True, - "on_change": "_on_method_change", - "title": _("Method")}), - ("Instrument", { - "sortable": False, - "ajax": True, - "title": _("Instrument")}), ("DetectionLimitOperand", { "title": _("DL"), "sortable": False, @@ -95,25 +87,34 @@ def __init__(self, context, request): "title": _("Result"), "ajax": True, "sortable": False}), + ("Uncertainty", { + "sortable": False, + "title": _("+-")}), + ("Specification", { + "title": _("Specification"), + "sortable": False}), ("retested", { "title": get_image("retested.png", title=t(_("Retested"))), "toggle": False, "type": "boolean"}), - ("Specification", { - "title": _("Specification"), - "sortable": False}), - ("Uncertainty", { + ("Method", { "sortable": False, - "title": _("+-")}), + "ajax": True, + "on_change": "_on_method_change", + "title": _("Method")}), + ("Instrument", { + "sortable": False, + "ajax": True, + "title": _("Instrument")}), + ("Attachments", { + "sortable": False, + "title": _("Attachments")}), ("DueDate", { "sortable": False, "title": _("Due Date")}), ("state_title", { "sortable": False, "title": _("State")}), - ("Attachments", { - "sortable": False, - "title": _("Attachments")}), )) # Inject Remarks column for listing @@ -151,6 +152,10 @@ def __init__(self, context, request): }, ] + def update(self): + super(AnalysesView, self).update() + self.reorder_analysis_columns() + def before_render(self): super(AnalysesView, self).before_render() @@ -158,6 +163,22 @@ def before_render(self): for state in self.review_states: state["custom_transitions"] = [self.set_analysis_remarks_modal] + @view.memoize + def get_default_columns_order(self): + """Return the default column order from the registry + + :returns: List of column keys + """ + name = "worksheetview_analysis_columns_order" + columns_order = get_registry_record(name, default=[]) or [] + # Always put `Pos` column first + try: + columns_order.remove("Pos") + except ValueError: + pass + columns_order.insert(0, "Pos") + return columns_order + def show_analysis_remarks_transition(self): """Check if the analysis remarks transitions should be rendered diff --git a/src/senaite/core/profiles/default/metadata.xml b/src/senaite/core/profiles/default/metadata.xml index af18eb68da..f3930d67df 100644 --- a/src/senaite/core/profiles/default/metadata.xml +++ b/src/senaite/core/profiles/default/metadata.xml @@ -1,6 +1,6 @@ - 2422 + 2423 profile-Products.ATContentTypes:base profile-Products.CMFEditions:CMFEditions diff --git a/src/senaite/core/profiles/default/registry.xml b/src/senaite/core/profiles/default/registry.xml index 204e4617bf..b859d4fd83 100644 --- a/src/senaite/core/profiles/default/registry.xml +++ b/src/senaite/core/profiles/default/registry.xml @@ -4,6 +4,9 @@ + + + diff --git a/src/senaite/core/registry/schema.py b/src/senaite/core/registry/schema.py index 120be41b6e..ad938b5a69 100644 --- a/src/senaite/core/registry/schema.py +++ b/src/senaite/core/registry/schema.py @@ -10,13 +10,49 @@ class ISenaiteRegistry(model.Schema): """ +class IWorksheetViewRegistry(ISenaiteRegistry): + """View settings for worksheets + """ + model.fieldset( + "worksheet_view", + label=_(u"Worksheet View"), + description=_("Worksheet view configuration"), + fields=[ + "worksheetview_analysis_columns_order", + ], + ) + + worksheetview_analysis_columns_order = schema.List( + title=_(u"Analysis columns order"), + description=_( + u"Default column order for worksheet analysis listings" + ), + value_type=schema.ASCIILine(title=u"Column"), + required=False, + default=[ + "Pos", + "Service", + "DetectionLimitOperand", + "Result", + "Uncertainty", + "Specification", + "retested", + "Method", + "Instrument", + "Attachments", + "DueDate", + "state_title", + ] + ) + + class ISampleViewRegistry(ISenaiteRegistry): - """Registry settings for sample settings + """View settings for samples """ model.fieldset( "sample_view", label=_(u"Sample View"), - description=_("Configuration for the sample view"), + description=_("Sample view configuration"), fields=[ "sampleview_collapse_field_analysis_table", "sampleview_collapse_lab_analysis_table", diff --git a/src/senaite/core/upgrade/v02_04_000.zcml b/src/senaite/core/upgrade/v02_04_000.zcml index 0733a32610..8c5bef5c16 100644 --- a/src/senaite/core/upgrade/v02_04_000.zcml +++ b/src/senaite/core/upgrade/v02_04_000.zcml @@ -202,4 +202,12 @@ handler="senaite.core.upgrade.v02_04_000.import_registry" profile="senaite.core:default"/> + +