From e381633be2102953a29c472c6084fbf2850c076b Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Fri, 17 May 2024 20:54:53 +0700 Subject: [PATCH 01/13] add dx content type for AnalysisCategory and AnalysisCategories --- src/bika/lims/content/abstractbaseanalysis.py | 2 +- src/bika/lims/content/analysiscategory.py | 1 + .../controlpanel/bika_analysiscategories.py | 108 +---------- src/bika/lims/controlpanel/configure.zcml | 8 - src/bika/lims/interfaces/__init__.py | 17 -- .../lims/profiles/default/factorytool.xml | 1 - .../lims/profiles/default/propertiestool.xml | 1 - .../default/structure/bika_setup/.objects | 1 - .../default/structure/bika_setup/.preserve | 1 - .../bika_analysiscategories/.objects | 0 .../bika_analysiscategories/.properties | 4 - src/bika/lims/profiles/default/types.xml | 2 - .../default/types/AnalysisCategories.xml | 28 --- .../default/types/AnalysisCategory.xml | 47 ----- .../analysiscategories/__init__.py | 19 ++ .../analysiscategories/configure.zcml | 13 ++ .../controlpanel/analysiscategories/view.py | 148 ++++++++++++++ .../core/browser/controlpanel/configure.zcml | 1 + .../core/catalog/indexer/senaitesetup.py | 2 +- .../core/content/analysiscategories.py | 38 ++++ src/senaite/core/content/analysiscategory.py | 182 ++++++++++++++++++ .../core/exportimport/setupdata/__init__.py | 50 ++--- src/senaite/core/interfaces/__init__.py | 27 +++ .../core/profiles/default/metadata.xml | 2 +- src/senaite/core/profiles/default/types.xml | 4 + .../default/types/AnalysisCategories.xml | 91 +++++++++ .../default/types/AnalysisCategory.xml | 88 +++++++++ src/senaite/core/setuphandlers.py | 1 + src/senaite/core/tests/doctests/API.rst | 2 +- .../core/tests/doctests/API_analysis.rst | 2 +- .../core/tests/doctests/ARAnalysesField.rst | 4 +- .../ARAnalysesFieldWithPartitions.rst | 2 +- .../doctests/AbbottM2000rtImportInterface.rst | 7 +- .../core/tests/doctests/AnalysisProfile.rst | 2 +- .../doctests/AnalysisRequestInvalidate.rst | 6 +- .../tests/doctests/AnalysisRequestRetract.rst | 6 +- .../core/tests/doctests/AnalysisRequests.rst | 6 +- .../doctests/AnalysisServiceInactivation.rst | 4 +- .../tests/doctests/AnalysisTurnaroundTime.rst | 2 +- .../core/tests/doctests/AutoImportResults.rst | 2 +- .../CobasIntegra400plusImportInterface.rst | 6 +- .../tests/doctests/DataManagerAnalysis.rst | 2 +- .../core/tests/doctests/DataManagerSample.rst | 2 +- .../tests/doctests/DuplicateResultsRange.rst | 2 +- .../tests/doctests/DynamicAnalysisSpec.rst | 2 +- src/senaite/core/tests/doctests/IDServer.rst | 4 +- .../doctests/InstrumentsImportInterface.rst | 6 +- .../core/tests/doctests/InternalUse.rst | 2 +- src/senaite/core/tests/doctests/Listings.rst | 2 +- ...CAnalysesWithInterimFieldsOnAWorksheet.rst | 2 +- .../RemoveAnalysesFromAnalysisRequest.rst | 2 +- .../core/tests/doctests/ResultOptions.rst | 2 +- .../core/tests/doctests/SampleAutoReceive.rst | 2 +- .../core/tests/doctests/SampleAutoVerify.rst | 2 +- .../core/tests/doctests/SampleTemplate.rst | 2 +- .../doctests/SecondaryAnalysisRequest.rst | 2 +- .../core/tests/doctests/SenaiteSetup.rst | 2 +- .../doctests/ServicesCalculationRecursion.rst | 2 +- .../core/tests/doctests/ShowPrices.rst | 2 +- .../SpecificationAndResultsRanges.rst | 2 +- .../core/tests/doctests/StringResult.rst | 2 +- .../doctests/SysmexXTi1800ImportInterface.rst | 6 +- .../doctests/SysmexXTi4000ImportInterface.rst | 2 +- .../core/tests/doctests/TextResult.rst | 2 +- .../core/tests/doctests/Uncertainties.rst | 2 +- .../tests/doctests/WorkflowAnalysisAssign.rst | 2 +- .../doctests/WorkflowAnalysisMultiVerify.rst | 2 +- .../doctests/WorkflowAnalysisPublish.rst | 2 +- .../tests/doctests/WorkflowAnalysisReject.rst | 2 +- .../WorkflowAnalysisRequestCancel.rst | 2 +- ...orkflowAnalysisRequestCreatePartitions.rst | 2 +- .../WorkflowAnalysisRequestInvalidate.rst | 2 +- .../WorkflowAnalysisRequestSample.rst | 2 +- .../WorkflowAnalysisRequestToBeSampled.rst | 2 +- .../tests/doctests/WorkflowAnalysisRetest.rst | 2 +- .../doctests/WorkflowAnalysisRetract.rst | 2 +- .../tests/doctests/WorkflowAnalysisSubmit.rst | 2 +- .../doctests/WorkflowAnalysisUnassign.rst | 2 +- .../tests/doctests/WorkflowAnalysisVerify.rst | 2 +- .../WorkflowDuplicateAnalysisAssign.rst | 2 +- .../WorkflowDuplicateAnalysisMultiVerify.rst | 2 +- .../WorkflowDuplicateAnalysisRetract.rst | 2 +- .../WorkflowDuplicateAnalysisSubmit.rst | 2 +- .../WorkflowDuplicateAnalysisVerify.rst | 2 +- .../WorkflowReferenceAnalysisBlankAssign.rst | 2 +- ...kflowReferenceAnalysisBlankMultiVerify.rst | 2 +- .../WorkflowReferenceAnalysisBlankRetract.rst | 2 +- .../WorkflowReferenceAnalysisBlankSubmit.rst | 2 +- .../WorkflowReferenceAnalysisBlankVerify.rst | 2 +- ...WorkflowReferenceAnalysisControlAssign.rst | 2 +- ...lowReferenceAnalysisControlMultiVerify.rst | 2 +- ...orkflowReferenceAnalysisControlRetract.rst | 2 +- ...WorkflowReferenceAnalysisControlSubmit.rst | 2 +- ...WorkflowReferenceAnalysisControlVerify.rst | 2 +- .../tests/doctests/WorkflowSampleDispatch.rst | 2 +- .../WorkflowWorksheetAutotransitions.rst | 2 +- .../doctests/WorkflowWorksheetRemove.rst | 2 +- .../doctests/WorkflowWorksheetRetract.rst | 2 +- .../tests/doctests/WorksheetApplyTemplate.rst | 2 +- src/senaite/core/upgrade/v02_06_000.py | 53 +++++ src/senaite/core/upgrade/v02_06_000.zcml | 8 + .../workflow/analysiscategory/__init__.py | 19 ++ .../core/workflow/analysiscategory/events.py | 45 +++++ 103 files changed, 859 insertions(+), 330 deletions(-) delete mode 100644 src/bika/lims/profiles/default/structure/bika_setup/bika_analysiscategories/.objects delete mode 100644 src/bika/lims/profiles/default/structure/bika_setup/bika_analysiscategories/.properties delete mode 100644 src/bika/lims/profiles/default/types/AnalysisCategories.xml delete mode 100644 src/bika/lims/profiles/default/types/AnalysisCategory.xml create mode 100644 src/senaite/core/browser/controlpanel/analysiscategories/__init__.py create mode 100644 src/senaite/core/browser/controlpanel/analysiscategories/configure.zcml create mode 100644 src/senaite/core/browser/controlpanel/analysiscategories/view.py create mode 100644 src/senaite/core/content/analysiscategories.py create mode 100644 src/senaite/core/content/analysiscategory.py create mode 100644 src/senaite/core/profiles/default/types/AnalysisCategories.xml create mode 100644 src/senaite/core/profiles/default/types/AnalysisCategory.xml create mode 100644 src/senaite/core/workflow/analysiscategory/__init__.py create mode 100644 src/senaite/core/workflow/analysiscategory/events.py diff --git a/src/bika/lims/content/abstractbaseanalysis.py b/src/bika/lims/content/abstractbaseanalysis.py index af9a55e564..87846b288e 100644 --- a/src/bika/lims/content/abstractbaseanalysis.py +++ b/src/bika/lims/content/abstractbaseanalysis.py @@ -28,9 +28,9 @@ from bika.lims.config import SERVICE_POINT_OF_CAPTURE from bika.lims.content.bikaschema import BikaSchema from bika.lims.interfaces import IBaseAnalysis -from bika.lims.interfaces import IHaveAnalysisCategory from bika.lims.interfaces import IHaveDepartment from bika.lims.interfaces import IHaveInstrument +from senaite.core.interfaces import IHaveAnalysisCategory from senaite.core.permissions import FieldEditAnalysisHidden from senaite.core.permissions import FieldEditAnalysisRemarks from senaite.core.permissions import FieldEditAnalysisResult diff --git a/src/bika/lims/content/analysiscategory.py b/src/bika/lims/content/analysiscategory.py index a6ea23a757..3ccc5fc95a 100644 --- a/src/bika/lims/content/analysiscategory.py +++ b/src/bika/lims/content/analysiscategory.py @@ -96,6 +96,7 @@ schema['description'].schemata = 'default' +# TODO: Migrated to DX - https://github.com/senaite/senaite.core/pull/ class AnalysisCategory(BaseContent): implements(IAnalysisCategory, IHaveDepartment, IDeactivable) security = ClassSecurityInfo() diff --git a/src/bika/lims/controlpanel/bika_analysiscategories.py b/src/bika/lims/controlpanel/bika_analysiscategories.py index ab9b47bcd8..0c6b9867e2 100644 --- a/src/bika/lims/controlpanel/bika_analysiscategories.py +++ b/src/bika/lims/controlpanel/bika_analysiscategories.py @@ -18,126 +18,20 @@ # Copyright 2018-2024 by it's authors. # Some rights reserved, see README and LICENSE. -import collections - from Products.ATContentTypes.content import schemata from Products.Archetypes import atapi -from bika.lims import api -from bika.lims import bikaMessageFactory as _ -from bika.lims.browser.bika_listing import BikaListingView from bika.lims.config import PROJECTNAME from bika.lims.interfaces import IAnalysisCategories -from senaite.core.permissions import AddAnalysisCategory -from bika.lims.utils import get_link -from plone.app.content.browser.interfaces import IFolderContentsView from plone.app.folder.folder import ATFolder from plone.app.folder.folder import ATFolderSchema -from plone.app.layout.globals.interfaces import IViewView from senaite.core.interfaces import IHideActionsMenu from zope.interface.declarations import implements -# TODO: Separate content and view into own modules! - - -class AnalysisCategoriesView(BikaListingView): - implements(IFolderContentsView, IViewView) - - def __init__(self, context, request): - super(AnalysisCategoriesView, self).__init__(context, request) - - self.catalog = "senaite_catalog_setup" - - self.contentFilter = { - "portal_type": "AnalysisCategory", - "sort_on": "sortable_title", - "sort_order": "ascending", - } - - self.context_actions = { - _("Add"): { - "url": "createObject?type_name=AnalysisCategory", - "permission": AddAnalysisCategory, - "icon": "++resource++bika.lims.images/add.png"} - } - - self.title = self.context.translate(_("Analysis Categories")) - self.icon = "{}/{}".format( - self.portal_url, - "/++resource++bika.lims.images/category_big.png" - ) - - self.show_select_row = False - self.show_select_column = True - self.pagesize = 25 - - self.columns = collections.OrderedDict(( - ("Title", { - "title": _("Category"), - "index": "sortable_title"}), - ("Description", { - "title": _("Description"), - "index": "Description", - "toggle": True, - }), - ("Department", { - "title": _("Department"), - "index": "department_title", - }), - ("SortKey", { - "title": _("Sort Key"), - "sortable": True - }), - )) - - self.review_states = [ - { - "id": "default", - "title": _("Active"), - "contentFilter": {"is_active": True}, - "columns": self.columns.keys(), - }, { - "id": "inactive", - "title": _("Inactive"), - "contentFilter": {'is_active': False}, - "columns": self.columns.keys(), - }, { - "id": "all", - "title": _("All"), - "contentFilter": {}, - "columns": self.columns.keys(), - }, - ] - - def folderitem(self, obj, item, index): - """Service triggered each time an item is iterated in folderitems. - The use of this service prevents the extra-loops in child objects. - :obj: the instance of the class to be foldered - :item: dict containing the properties of the object to be used by - the template - :index: current index of the item - """ - obj = api.get_object(obj) - title = obj.Title() - description = obj.Description() - url = obj.absolute_url() - - item["replace"]["Title"] = get_link(url, value=title) - item["Description"] = description - item["SortKey"] = obj.getSortKey() - - department = obj.getDepartment() - if department: - title = department.Title() - url = department.absolute_url() - item["replace"]["Department"] = get_link(url, value=title) - - return item - - schema = ATFolderSchema.copy() +# TODO: Migrated to DX - https://github.com/senaite/senaite.core/pull/ class AnalysisCategories(ATFolder): implements(IAnalysisCategories, IHideActionsMenu) displayContentsTab = False diff --git a/src/bika/lims/controlpanel/configure.zcml b/src/bika/lims/controlpanel/configure.zcml index 551ac83841..cb0a3942e5 100644 --- a/src/bika/lims/controlpanel/configure.zcml +++ b/src/bika/lims/controlpanel/configure.zcml @@ -28,14 +28,6 @@ layer="bika.lims.interfaces.IBikaLIMS" /> - - - diff --git a/src/bika/lims/profiles/default/propertiestool.xml b/src/bika/lims/profiles/default/propertiestool.xml index 80837e8174..025ccbac18 100644 --- a/src/bika/lims/profiles/default/propertiestool.xml +++ b/src/bika/lims/profiles/default/propertiestool.xml @@ -33,7 +33,6 @@ - diff --git a/src/bika/lims/profiles/default/structure/bika_setup/.objects b/src/bika/lims/profiles/default/structure/bika_setup/.objects index f28fa23bd2..4f486ae127 100644 --- a/src/bika/lims/profiles/default/structure/bika_setup/.objects +++ b/src/bika/lims/profiles/default/structure/bika_setup/.objects @@ -1,5 +1,4 @@ auditlog,AuditLog -bika_analysiscategories,AnalysisCategories bika_analysisservices,AnalysisServices bika_analysisspecs,AnalysisSpecs bika_attachmenttypes,AttachmentTypes diff --git a/src/bika/lims/profiles/default/structure/bika_setup/.preserve b/src/bika/lims/profiles/default/structure/bika_setup/.preserve index ec85888661..948669bdd0 100644 --- a/src/bika/lims/profiles/default/structure/bika_setup/.preserve +++ b/src/bika/lims/profiles/default/structure/bika_setup/.preserve @@ -1,5 +1,4 @@ auditlog -bika_analysiscategories bika_analysisservices bika_analysisspecs bika_artemplates diff --git a/src/bika/lims/profiles/default/structure/bika_setup/bika_analysiscategories/.objects b/src/bika/lims/profiles/default/structure/bika_setup/bika_analysiscategories/.objects deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/bika/lims/profiles/default/structure/bika_setup/bika_analysiscategories/.properties b/src/bika/lims/profiles/default/structure/bika_setup/bika_analysiscategories/.properties deleted file mode 100644 index f3ae50c561..0000000000 --- a/src/bika/lims/profiles/default/structure/bika_setup/bika_analysiscategories/.properties +++ /dev/null @@ -1,4 +0,0 @@ -[DEFAULT] -description = -title = Analysis Categories - diff --git a/src/bika/lims/profiles/default/types.xml b/src/bika/lims/profiles/default/types.xml index 0bd7ca9aed..66854c258c 100644 --- a/src/bika/lims/profiles/default/types.xml +++ b/src/bika/lims/profiles/default/types.xml @@ -6,8 +6,6 @@ - - diff --git a/src/bika/lims/profiles/default/types/AnalysisCategories.xml b/src/bika/lims/profiles/default/types/AnalysisCategories.xml deleted file mode 100644 index cdb87fae88..0000000000 --- a/src/bika/lims/profiles/default/types/AnalysisCategories.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - Analysis Categories - - senaite_theme/icon/category - AnalysisCategories - bika.lims - addAnalysisCategories - - - False - True - - - - False - False - - - - - - diff --git a/src/bika/lims/profiles/default/types/AnalysisCategory.xml b/src/bika/lims/profiles/default/types/AnalysisCategory.xml deleted file mode 100644 index 94616042e9..0000000000 --- a/src/bika/lims/profiles/default/types/AnalysisCategory.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - Analysis Category - - senaite_theme/icon/category - AnalysisCategory - bika.lims - addAnalysisCategory - - - False - False - - False - False - - - - - - - - - - - - - - diff --git a/src/senaite/core/browser/controlpanel/analysiscategories/__init__.py b/src/senaite/core/browser/controlpanel/analysiscategories/__init__.py new file mode 100644 index 0000000000..b0d48c9ed7 --- /dev/null +++ b/src/senaite/core/browser/controlpanel/analysiscategories/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2024 by it's authors. +# Some rights reserved, see README and LICENSE. diff --git a/src/senaite/core/browser/controlpanel/analysiscategories/configure.zcml b/src/senaite/core/browser/controlpanel/analysiscategories/configure.zcml new file mode 100644 index 0000000000..0506f9a138 --- /dev/null +++ b/src/senaite/core/browser/controlpanel/analysiscategories/configure.zcml @@ -0,0 +1,13 @@ + + + + + diff --git a/src/senaite/core/browser/controlpanel/analysiscategories/view.py b/src/senaite/core/browser/controlpanel/analysiscategories/view.py new file mode 100644 index 0000000000..5e8f10e88c --- /dev/null +++ b/src/senaite/core/browser/controlpanel/analysiscategories/view.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2024 by it's authors. +# Some rights reserved, see README and LICENSE. + +import collections + +from bika.lims import api +from bika.lims import bikaMessageFactory as _ +from bika.lims.utils import get_link_for +from senaite.core.i18n import translate +from senaite.core.catalog import SETUP_CATALOG +from senaite.core.permissions import AddAnalysisCategory +from senaite.app.listing import ListingView + + +class AnalysisCategoriesView(ListingView): + + def __init__(self, context, request): + super(AnalysisCategoriesView, self).__init__(context, request) + + self.catalog = SETUP_CATALOG + + self.contentFilter = { + "portal_type": "AnalysisCategory", + "sort_on": "sortable_title", + "sort_order": "ascending", + "path": { + "query": api.get_path(self.context), + "depth": 1, + }, + } + + self.context_actions = { + _("listing_analysiscategories_action_add", default="Add"): { + "url": "++add++AnalysisCategory", + "permission": AddAnalysisCategory, + "icon": "senaite_theme/icon/plus" + } + } + + self.title = translate(_( + "listing_analysiscategories_title", + default="Analysis Categories") + ) + self.description = "" + self.icon = "{}/{}".format( + self.portal_url, + "/++resource++bika.lims.images/category_big.png" + ) + + self.show_select_row = False + self.show_select_column = True + self.pagesize = 25 + + self.columns = collections.OrderedDict(( + ("Title", { + "title": _( + "listing_analysiscategories_column_title", + default="Category", + ), + "index": "sortable_title"}), + ("Description", { + "title": _( + "listing_analysiscategories_column_description", + default="Description", + ), + "index": "Description", + "toggle": True, + }), + ("Department", { + "title": _( + "listing_analysiscategories_column_department", + default="Department", + ), + "index": "department_title", + }), + ("SortKey", { + "title": _( + "listing_analysiscategories_column_sort_key", + default="Sort Key", + ), + "sortable": True + }), + )) + + self.review_states = [ + { + "id": "default", + "title": _( + "listing_analysiscategories_state_active", + default="Active", + ), + "contentFilter": {"is_active": True}, + "columns": self.columns.keys(), + }, { + "id": "inactive", + "title": _( + "listing_analysiscategories_state_inactive", + default="Inactive", + ), + "contentFilter": {'is_active': False}, + "columns": self.columns.keys(), + }, { + "id": "all", + "title": _( + "listing_analysiscategories_state_all", + default="All", + ), + "contentFilter": {}, + "columns": self.columns.keys(), + }, + ] + + def folderitem(self, obj, item, index): + """Service triggered each time an item is iterated in folderitems. + The use of this service prevents the extra-loops in child objects. + :obj: the instance of the class to be foldered + :item: dict containing the properties of the object to be used by + the template + :index: current index of the item + """ + obj = api.get_object(obj) + + item["replace"]["Title"] = get_link_for(obj) + item["Description"] = obj.Description() + item["SortKey"] = obj.getSortKey() + + department = obj.getDepartment() + if department: + item["replace"]["Department"] = get_link_for(department) + + return item diff --git a/src/senaite/core/browser/controlpanel/configure.zcml b/src/senaite/core/browser/controlpanel/configure.zcml index d7ee176061..325bf5b6db 100644 --- a/src/senaite/core/browser/controlpanel/configure.zcml +++ b/src/senaite/core/browser/controlpanel/configure.zcml @@ -20,6 +20,7 @@ layer="senaite.core.interfaces.ISenaiteCore"/> + diff --git a/src/senaite/core/catalog/indexer/senaitesetup.py b/src/senaite/core/catalog/indexer/senaitesetup.py index afc975697a..7e3ccfe451 100644 --- a/src/senaite/core/catalog/indexer/senaitesetup.py +++ b/src/senaite/core/catalog/indexer/senaitesetup.py @@ -20,7 +20,6 @@ from bika.lims import api from bika.lims.interfaces import IAnalysisService -from bika.lims.interfaces import IHaveAnalysisCategory from bika.lims.interfaces import IHaveDepartment from bika.lims.interfaces import IHaveInstrument from bika.lims.interfaces import IHavePrice @@ -31,6 +30,7 @@ from senaite.core.catalog import SETUP_CATALOG from senaite.core.catalog.utils import get_searchable_text_tokens from senaite.core.interfaces import ISetupCatalog +from senaite.core.interfaces import IHaveAnalysisCategory @indexer(ISampleTypeAwareMixin, ISetupCatalog) diff --git a/src/senaite/core/content/analysiscategories.py b/src/senaite/core/content/analysiscategories.py new file mode 100644 index 0000000000..a0ce0fd561 --- /dev/null +++ b/src/senaite/core/content/analysiscategories.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2024 by it's authors. +# Some rights reserved, see README and LICENSE. + +from bika.lims.interfaces import IDoNotSupportSnapshots +from plone.dexterity.content import Container +from plone.supermodel import model +from senaite.core.interfaces import IHideActionsMenu +from senaite.core.interfaces import IAnalysisCategories +from zope.interface import implementer + + +class IAnalysisCategoriesSchema(model.Schema): + """Schema interface + """ + + +@implementer(IAnalysisCategories, IAnalysisCategoriesSchema, + IDoNotSupportSnapshots, IHideActionsMenu) +class AnalysisCategories(Container): + """A container for analysis categories + """ diff --git a/src/senaite/core/content/analysiscategory.py b/src/senaite/core/content/analysiscategory.py new file mode 100644 index 0000000000..d15dc46845 --- /dev/null +++ b/src/senaite/core/content/analysiscategory.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2024 by it's authors. +# Some rights reserved, see README and LICENSE. + +from AccessControl import ClassSecurityInfo +from Products.CMFCore import permissions +from bika.lims import senaiteMessageFactory as _ +from bika.lims.interfaces import IDeactivable +from senaite.core.catalog import SETUP_CATALOG +from senaite.core.content.base import Container +from senaite.core.interfaces import IAnalysisCategory +from senaite.core.schema import UIDReferenceField +from senaite.core.z3cform.widgets.uidreference import UIDReferenceWidgetFactory +from plone.autoform import directives +from plone.supermodel import model +from zope import schema +from zope.interface import implementer + + +class IAnalysisCategorySchema(model.Schema): + """Schema interface + """ + + title = schema.TextLine( + title=_( + "title_analysiscategory_title", + default="Name" + ), + required=True, + ) + + description = schema.Text( + title=_( + "title_analysiscategory_description", + default="Description" + ), + required=False, + ) + + comments = schema.Text( + title=_( + "title_analysiscategory_comments", + default="Comments", + ), + description=_( + "description_analysiscategory_comments", + default="To be displayed below each Analysis Category " + "section on results reports.", + ), + required=False, + ) + + # Department reference + directives.widget( + "department", + UIDReferenceWidgetFactory, + catalog=SETUP_CATALOG, + query="get_department_query", + columns="get_department_default_columns", + limit=5, + ) + department = UIDReferenceField( + title=_( + "title_analysiscategory_department", + default="Department", + ), + description=_( + "description_analysiscategory_department", + default="Select the responsible department", + ), + allowed_types=("Department",), + multi_valued=False, + required=True, + ) + + sort_key = schema.Float( + title=_( + "title_analysiscategory_sort_key", + default="Sort Key", + ), + description=_( + "description_analysiscategory_sort_key", + default="Float value from 0.0 - 1000.0 indicating the sort order. " + "Duplicate values are ordered alphabetically.", + ), + required=False, + ) + + +@implementer(IAnalysisCategory, IAnalysisCategorySchema, IDeactivable) +class AnalysisCategory(Container): + """A container for analysis category + """ + _catalogs = [SETUP_CATALOG] + + security = ClassSecurityInfo() + + @security.protected(permissions.View) + def getComments(self): + accessor = self.accessor("comments") + return accessor(self) + + @security.protected(permissions.ModifyPortalContent) + def setComments(self, value): + mutator = self.mutator("comments") + mutator(self, value) + + # BBB: AT schema field property + Comments = property(getComments, setComments) + + @security.protected(permissions.View) + def getDepartment(self): + accessor = self.accessor("department") + return accessor(self) + + @security.protected(permissions.ModifyPortalContent) + def setDepartment(self, value): + mutator = self.mutator("department") + mutator(self, value) + + # BBB: AT schema field property + Department = property(getDepartment, setDepartment) + + @security.protected(permissions.View) + def getSortKey(self): + accessor = self.accessor("sort_key") + return accessor(self) + + @security.protected(permissions.ModifyPortalContent) + def setSortKey(self, value): + mutator = self.mutator("sort_key") + mutator(self, value) + + # BBB: AT schema field property + SortKey = property(getSortKey, setSortKey) + + @security.private + def get_department_query(self): + """Return the query for the department field + """ + return { + "portal_type": "Department", + "is_active": True, + "sort_on": "title", + "sort_order": "ascending", + } + + @security.private + def get_department_default_columns(self): + """Returns the default columns for the reference dropdown + """ + return [ + { + "name": "Title", + "label": _( + "search_result_column_title_title", + default="Department Name", + ), + }, { + "name": "getDepartmentID", + "label": _( + "search_result_column_title_department_id", + default="Department ID", + ), + }, + ] diff --git a/src/senaite/core/exportimport/setupdata/__init__.py b/src/senaite/core/exportimport/setupdata/__init__.py index e57e6a529a..6c7cf6bf52 100644 --- a/src/senaite/core/exportimport/setupdata/__init__.py +++ b/src/senaite/core/exportimport/setupdata/__init__.py @@ -1250,29 +1250,35 @@ def Import(self): class Analysis_Categories(WorksheetImporter): def Import(self): - folder = self.context.bika_setup.bika_analysiscategories - bsc = getToolByName(self.context, SETUP_CATALOG) + container = self.context.setup.analysiscategories + setup_tool = getToolByName(self.context, SETUP_CATALOG) for row in self.get_rows(3): - department = None - if row.get('Department_title', None): - department = self.get_object(bsc, 'Department', - row.get('Department_title')) - if row.get('title', None) and department: - obj = _createObjectByType("AnalysisCategory", folder, tmpID()) - obj.edit( - title=row['title'], - description=row.get('description', '')) - obj.setDepartment(department) - obj.unmarkCreationFlag() - renameAfterCreation(obj) - notify(ObjectInitializedEvent(obj)) - elif not row.get('title', None): - logger.warning("Error in in " + self.sheetname + ". Missing Title field") - elif not row.get('Department_title', None): - logger.warning("Error in " + self.sheetname + ". Department field missing.") - else: - logger.warning("Error in " + self.sheetname + ". Department " - + row.get('Department_title') + "is wrong.") + title = row.get("title") + if not title: + logger.warning("Error in in {}. Missing Title field." + .format(self.sheetname)) + continue + + department_title = row.get("Department_title", None) + if not department_title: + logger.warning("Error in {}. Department field missing." + .format(self.sheetname)) + continue + + department = self.get_object(setup_tool, "Department", + title=department_title) + if not department: + logger.warning("Error in {}. Department '{}' is wrong." + .format(self.sheetname, department_title)) + continue + + description = row.get("description", "") + comments = row.get("comments", "") + api.create(container, "AnalysisCategory", + title=title, + description=description, + comments=comments, + department=department) class Methods(WorksheetImporter): diff --git a/src/senaite/core/interfaces/__init__.py b/src/senaite/core/interfaces/__init__.py index 8bef5762db..91a308a0b1 100644 --- a/src/senaite/core/interfaces/__init__.py +++ b/src/senaite/core/interfaces/__init__.py @@ -178,6 +178,33 @@ class IAnalysisProfiles(Interface): """ +class IAnalysisCategory(Interface): + """Marker interface for an Analysis Category + """ + + +class IAnalysisCategories(Interface): + """Marker interface for Analysis Categories + """ + + +class IHaveAnalysisCategory(Interface): + """Marker interface for objects that have AnalysisCategory(ies) assigned + """ + + def getCategory(self): + """Returns the category(ies) assigned to this instance + """ + + def getCategoryUID(self): + """Returns the UID of the category(ies) assigned to this instance + """ + + def getCategoryTitle(self): + """Returns the title of the category(ies) assigned to this instance + """ + + class ISampleContainers(Interface): """Marker interface for sample container setup folder """ diff --git a/src/senaite/core/profiles/default/metadata.xml b/src/senaite/core/profiles/default/metadata.xml index c31b292f67..3813505406 100644 --- a/src/senaite/core/profiles/default/metadata.xml +++ b/src/senaite/core/profiles/default/metadata.xml @@ -1,6 +1,6 @@ - 2624 + 2625 profile-Products.ATContentTypes:base profile-Products.CMFEditions:CMFEditions diff --git a/src/senaite/core/profiles/default/types.xml b/src/senaite/core/profiles/default/types.xml index cbe356bcc0..bf2fb2d19d 100644 --- a/src/senaite/core/profiles/default/types.xml +++ b/src/senaite/core/profiles/default/types.xml @@ -60,4 +60,8 @@ + + + + diff --git a/src/senaite/core/profiles/default/types/AnalysisCategories.xml b/src/senaite/core/profiles/default/types/AnalysisCategories.xml new file mode 100644 index 0000000000..8e27104336 --- /dev/null +++ b/src/senaite/core/profiles/default/types/AnalysisCategories.xml @@ -0,0 +1,91 @@ + + + + + AnalysisCategories + + + + senaite_theme/icon/category + + + AnalysisCategories + + + + string:${folder_url}/++add++AnalysisCategories + + + + view + + + True + + + True + + + + + + False + + + view + + + + + False + + + cmf.AddPortalContent + + + senaite.core.content.analysiscategories.IAnalysisCategoriesSchema + senaite.core.content.analysiscategories.AnalysisCategories + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/senaite/core/profiles/default/types/AnalysisCategory.xml b/src/senaite/core/profiles/default/types/AnalysisCategory.xml new file mode 100644 index 0000000000..7f00eb6adc --- /dev/null +++ b/src/senaite/core/profiles/default/types/AnalysisCategory.xml @@ -0,0 +1,88 @@ + + + + + AnalysisCategory + + + + senaite_theme/icon/category + + + AnalysisCategory + + + + string:${folder_url}/++add++AnalysisCategory + + + + view + + + False + + + True + + + + + False + + + view + + + + + False + + + cmf.AddPortalContent + + + senaite.core.content.analysiscategory.IAnalysisCategorySchema + senaite.core.content.analysiscategory.AnalysisCategory + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/senaite/core/setuphandlers.py b/src/senaite/core/setuphandlers.py index c2b4881af7..c47a131cbc 100644 --- a/src/senaite/core/setuphandlers.py +++ b/src/senaite/core/setuphandlers.py @@ -254,6 +254,7 @@ def add_senaite_setup_items(portal): ("sampletemplates", "Sample Templates", "SampleTemplates"), ("manufacturers", "Manufacturers", "Manufacturers"), ("containertypes", "Container Types", "ContainerTypes"), + ("analysiscategories", "Analysis Categories", "Analysis Categories"), ] setup = api.get_senaite_setup() add_dexterity_items(setup, items) diff --git a/src/senaite/core/tests/doctests/API.rst b/src/senaite/core/tests/doctests/API.rst index c470040452..313650bc34 100644 --- a/src/senaite/core/tests/doctests/API.rst +++ b/src/senaite/core/tests/doctests/API.rst @@ -720,7 +720,7 @@ manual merging and sorting of the results afterwards. Thus, we fail here: Catalog queries w/o any `portal_type`, default to the `uid_catalog`:: - >>> analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = senaite_setup.analysiscategories >>> analysiscategory1 = api.create(analysiscategories, "AnalysisCategory", title="AC-1") >>> analysiscategory2 = api.create(analysiscategories, "AnalysisCategory", title="AC-2") >>> analysiscategory3 = api.create(analysiscategories, "AnalysisCategory", title="AC-3") diff --git a/src/senaite/core/tests/doctests/API_analysis.rst b/src/senaite/core/tests/doctests/API_analysis.rst index ac8bfab96d..57cd4119b5 100644 --- a/src/senaite/core/tests/doctests/API_analysis.rst +++ b/src/senaite/core/tests/doctests/API_analysis.rst @@ -54,7 +54,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), DuplicateVariation="0.5") >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID(), DuplicateVariation="0.5") diff --git a/src/senaite/core/tests/doctests/ARAnalysesField.rst b/src/senaite/core/tests/doctests/ARAnalysesField.rst index ae9991336e..9ff45bff14 100644 --- a/src/senaite/core/tests/doctests/ARAnalysesField.rst +++ b/src/senaite/core/tests/doctests/ARAnalysesField.rst @@ -57,7 +57,7 @@ Variables:: >>> calculations = setup.bika_calculations >>> sampletypes = setup.bika_sampletypes >>> samplepoints = portal.setup.samplepoints - >>> analysiscategories = setup.bika_analysiscategories + >>> analysiscategories = portal.setup.analysiscategories >>> analysisspecs = setup.bika_analysisspecs >>> analysisservices = setup.bika_analysisservices >>> labcontacts = setup.bika_labcontacts @@ -110,7 +110,7 @@ Create an Analysis Category: >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + Create Analysis Service for PH (Keyword: `PH`): diff --git a/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst b/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst index 5be8e66c87..002c41c102 100644 --- a/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst +++ b/src/senaite/core/tests/doctests/ARAnalysesFieldWithPartitions.rst @@ -63,7 +63,7 @@ Create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/AbbottM2000rtImportInterface.rst b/src/senaite/core/tests/doctests/AbbottM2000rtImportInterface.rst index a9fed62a04..0b7cc7d491 100644 --- a/src/senaite/core/tests/doctests/AbbottM2000rtImportInterface.rst +++ b/src/senaite/core/tests/doctests/AbbottM2000rtImportInterface.rst @@ -39,9 +39,10 @@ Variables: >>> portal = self.portal >>> request = self.request >>> bika_setup = portal.bika_setup + >>> senaite_setup = portal.setup >>> bika_instruments = bika_setup.bika_instruments >>> bika_sampletypes = bika_setup.bika_sampletypes - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = senaite_setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices >>> bika_calculations = bika_setup.bika_calculations @@ -106,9 +107,9 @@ This service matches the service specified in the file from which the import wil ~~ code:: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + >>> analysisservice = api.create(bika_analysisservices, ... "AnalysisService", ... title="HIV06ml", diff --git a/src/senaite/core/tests/doctests/AnalysisProfile.rst b/src/senaite/core/tests/doctests/AnalysisProfile.rst index 9ad0ae9ac6..7ec370a14b 100644 --- a/src/senaite/core/tests/doctests/AnalysisProfile.rst +++ b/src/senaite/core/tests/doctests/AnalysisProfile.rst @@ -70,7 +70,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/AnalysisRequestInvalidate.rst b/src/senaite/core/tests/doctests/AnalysisRequestInvalidate.rst index 0b5125e9ea..0b718db79f 100644 --- a/src/senaite/core/tests/doctests/AnalysisRequestInvalidate.rst +++ b/src/senaite/core/tests/doctests/AnalysisRequestInvalidate.rst @@ -39,7 +39,7 @@ Variables: >>> setup = portal.setup >>> bika_setup = portal.bika_setup >>> bika_sampletypes = bika_setup.bika_sampletypes - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices >>> bika_labcontacts = bika_setup.bika_labcontacts >>> bika_storagelocations = bika_setup.bika_storagelocations @@ -88,9 +88,9 @@ A `SamplePoint` defines the location, where a `Sample` was taken: An `AnalysisCategory` categorizes different `AnalysisServices`: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + An `AnalysisService` defines a analysis service offered by the laboratory: diff --git a/src/senaite/core/tests/doctests/AnalysisRequestRetract.rst b/src/senaite/core/tests/doctests/AnalysisRequestRetract.rst index f45b62a221..866ee4f6a4 100644 --- a/src/senaite/core/tests/doctests/AnalysisRequestRetract.rst +++ b/src/senaite/core/tests/doctests/AnalysisRequestRetract.rst @@ -40,7 +40,7 @@ Variables:: >>> bika_setup = portal.bika_setup >>> bika_sampletypes = bika_setup.bika_sampletypes >>> samplepoints = setup.samplepoints - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices >>> bika_labcontacts = bika_setup.bika_labcontacts >>> bika_storagelocations = bika_setup.bika_storagelocations @@ -89,9 +89,9 @@ A `SamplePoint` defines the location, where a `Sample` was taken:: An `AnalysisCategory` categorizes different `AnalysisServices`:: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + An `AnalysisService` defines a analysis service offered by the laboratory:: diff --git a/src/senaite/core/tests/doctests/AnalysisRequests.rst b/src/senaite/core/tests/doctests/AnalysisRequests.rst index 79b892c741..e376ece811 100644 --- a/src/senaite/core/tests/doctests/AnalysisRequests.rst +++ b/src/senaite/core/tests/doctests/AnalysisRequests.rst @@ -44,7 +44,7 @@ Variables:: >>> bika_setup = portal.bika_setup >>> bika_sampletypes = bika_setup.bika_sampletypes >>> samplepoints = setup.samplepoints - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices >>> bika_labcontacts = bika_setup.bika_labcontacts >>> bika_storagelocations = bika_setup.bika_storagelocations @@ -93,9 +93,9 @@ A `SamplePoint` defines the location, where a `Sample` was taken:: An `AnalysisCategory` categorizes different `AnalysisServices`:: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + An `AnalysisService` defines a analysis service offered by the laboratory:: diff --git a/src/senaite/core/tests/doctests/AnalysisServiceInactivation.rst b/src/senaite/core/tests/doctests/AnalysisServiceInactivation.rst index 04d3cbc4c6..0c85c8bb95 100644 --- a/src/senaite/core/tests/doctests/AnalysisServiceInactivation.rst +++ b/src/senaite/core/tests/doctests/AnalysisServiceInactivation.rst @@ -42,7 +42,7 @@ Variables: >>> request = self.request >>> setup = portal.setup >>> bikasetup = portal.bika_setup - >>> bika_analysiscategories = bikasetup.bika_analysiscategories + >>> analysiscategories = setup.analysiscategories >>> bika_analysisservices = bikasetup.bika_analysisservices >>> bika_calculations = bikasetup.bika_calculations >>> bika_suppliers = bikasetup.bika_suppliers @@ -52,7 +52,7 @@ We need to create some basic objects for the test: >>> setRoles(portal, TEST_USER_ID, ['LabManager',]) >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bika_suppliers, "Supplier", Name="Naralabs") >>> Ca = api.create(bika_analysisservices, "AnalysisService", title="Calcium", Keyword="Ca", Price="15", Category=category.UID()) >>> Mg = api.create(bika_analysisservices, "AnalysisService", title="Magnesium", Keyword="Mg", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/AnalysisTurnaroundTime.rst b/src/senaite/core/tests/doctests/AnalysisTurnaroundTime.rst index 032958048b..5e3f333a5a 100644 --- a/src/senaite/core/tests/doctests/AnalysisTurnaroundTime.rst +++ b/src/senaite/core/tests/doctests/AnalysisTurnaroundTime.rst @@ -69,7 +69,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), DuplicateVariation="0.5") >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID(), DuplicateVariation="0.5") >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID(), DuplicateVariation="0.5") diff --git a/src/senaite/core/tests/doctests/AutoImportResults.rst b/src/senaite/core/tests/doctests/AutoImportResults.rst index 4efefc33c6..cdeb684d9b 100644 --- a/src/senaite/core/tests/doctests/AutoImportResults.rst +++ b/src/senaite/core/tests/doctests/AutoImportResults.rst @@ -72,7 +72,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/CobasIntegra400plusImportInterface.rst b/src/senaite/core/tests/doctests/CobasIntegra400plusImportInterface.rst index 328e5b1293..5d90c8a92f 100644 --- a/src/senaite/core/tests/doctests/CobasIntegra400plusImportInterface.rst +++ b/src/senaite/core/tests/doctests/CobasIntegra400plusImportInterface.rst @@ -36,7 +36,7 @@ Variables:: >>> bika_setup = portal.bika_setup >>> bika_instruments = bika_setup.bika_instruments >>> bika_sampletypes = bika_setup.bika_sampletypes - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = portal.setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices We need certain permissions to create and access objects used in this test, @@ -89,9 +89,9 @@ a `SampleType`:: Create an `AnalysisCategory` (which categorizes different `AnalysisServices`), and add to it some of the `AnalysisServices` that are found in the results file:: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + >>> analysisservice_1 = api.create(bika_analysisservices, ... "AnalysisService", ... title="WBC", diff --git a/src/senaite/core/tests/doctests/DataManagerAnalysis.rst b/src/senaite/core/tests/doctests/DataManagerAnalysis.rst index e9c5492a9a..684348078e 100644 --- a/src/senaite/core/tests/doctests/DataManagerAnalysis.rst +++ b/src/senaite/core/tests/doctests/DataManagerAnalysis.rst @@ -77,7 +77,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/DataManagerSample.rst b/src/senaite/core/tests/doctests/DataManagerSample.rst index 71d9f4346f..3c9a80a7d0 100644 --- a/src/senaite/core/tests/doctests/DataManagerSample.rst +++ b/src/senaite/core/tests/doctests/DataManagerSample.rst @@ -74,7 +74,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/DuplicateResultsRange.rst b/src/senaite/core/tests/doctests/DuplicateResultsRange.rst index bc88d75057..292496b570 100644 --- a/src/senaite/core/tests/doctests/DuplicateResultsRange.rst +++ b/src/senaite/core/tests/doctests/DuplicateResultsRange.rst @@ -61,7 +61,7 @@ Create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID()) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/DynamicAnalysisSpec.rst b/src/senaite/core/tests/doctests/DynamicAnalysisSpec.rst index d1373ff420..5452f4ac42 100644 --- a/src/senaite/core/tests/doctests/DynamicAnalysisSpec.rst +++ b/src/senaite/core/tests/doctests/DynamicAnalysisSpec.rst @@ -134,7 +134,7 @@ First we build some basic setup structure: >>> contact = api.create(client, "Contact", Firstname="Rita", Lastname="Mohale") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> method_a = api.create(portal.methods, "Method", title="Method A") >>> method_b = api.create(portal.methods, "Method", title="Method B") diff --git a/src/senaite/core/tests/doctests/IDServer.rst b/src/senaite/core/tests/doctests/IDServer.rst index edaff50e05..ce444c65d2 100644 --- a/src/senaite/core/tests/doctests/IDServer.rst +++ b/src/senaite/core/tests/doctests/IDServer.rst @@ -67,7 +67,7 @@ Variables: >>> setup = portal.bika_setup >>> bika_sampletypes = setup.bika_sampletypes >>> samplepoints = portal.setup.samplepoints - >>> bika_analysiscategories = setup.bika_analysiscategories + >>> analysiscategories = portal.setup.analysiscategories >>> bika_analysisservices = setup.bika_analysisservices >>> bika_labcontacts = setup.bika_labcontacts >>> bika_storagelocations = setup.bika_storagelocations @@ -118,7 +118,7 @@ A `SamplePoint` defines the location, where a `Sample` was taken: An `AnalysisCategory` categorizes different `AnalysisServices`: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory <...analysiscategory-1> diff --git a/src/senaite/core/tests/doctests/InstrumentsImportInterface.rst b/src/senaite/core/tests/doctests/InstrumentsImportInterface.rst index 3dd86f0e2c..984623a7b5 100644 --- a/src/senaite/core/tests/doctests/InstrumentsImportInterface.rst +++ b/src/senaite/core/tests/doctests/InstrumentsImportInterface.rst @@ -62,7 +62,7 @@ Variables:: >>> bika_setup = portal.bika_setup >>> bika_instruments = bika_setup.bika_instruments >>> bika_sampletypes = bika_setup.bika_sampletypes - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = portal.setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices >>> bika_calculations = bika_setup.bika_calculations @@ -97,9 +97,9 @@ a `SampleType`:: Create an `AnalysisCategory` (which categorizes different `AnalysisServices`), and add to it an `AnalysisService`. This service matches the service specified in the file from which the import will be performed:: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + >>> analysisservice1 = api.create(bika_analysisservices, ... "AnalysisService", ... title="HIV06ml", diff --git a/src/senaite/core/tests/doctests/InternalUse.rst b/src/senaite/core/tests/doctests/InternalUse.rst index 7555edc40b..5f3bb1336c 100644 --- a/src/senaite/core/tests/doctests/InternalUse.rst +++ b/src/senaite/core/tests/doctests/InternalUse.rst @@ -71,7 +71,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/Listings.rst b/src/senaite/core/tests/doctests/Listings.rst index fd4cdc8599..7b4537a5d2 100644 --- a/src/senaite/core/tests/doctests/Listings.rst +++ b/src/senaite/core/tests/doctests/Listings.rst @@ -56,7 +56,7 @@ Setupitems: >>> clients = portal.clients >>> sampletypes = setup.bika_sampletypes >>> samplepoints = portal.setup.samplepoints - >>> analysiscategories = setup.bika_analysiscategories + >>> analysiscategories = portal.setup.analysiscategories >>> analysisservices = setup.bika_analysisservices >>> setup.setSamplingWorkflowEnabled(True) diff --git a/src/senaite/core/tests/doctests/QCAnalysesWithInterimFieldsOnAWorksheet.rst b/src/senaite/core/tests/doctests/QCAnalysesWithInterimFieldsOnAWorksheet.rst index 25b911f794..a8c7208066 100644 --- a/src/senaite/core/tests/doctests/QCAnalysesWithInterimFieldsOnAWorksheet.rst +++ b/src/senaite/core/tests/doctests/QCAnalysesWithInterimFieldsOnAWorksheet.rst @@ -50,7 +50,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> interim_calc = api.create(bika_calculations, 'Calculation', title='Test-Total-Pest') diff --git a/src/senaite/core/tests/doctests/RemoveAnalysesFromAnalysisRequest.rst b/src/senaite/core/tests/doctests/RemoveAnalysesFromAnalysisRequest.rst index 369cc48b6c..af81f4248f 100644 --- a/src/senaite/core/tests/doctests/RemoveAnalysesFromAnalysisRequest.rst +++ b/src/senaite/core/tests/doctests/RemoveAnalysesFromAnalysisRequest.rst @@ -62,7 +62,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/ResultOptions.rst b/src/senaite/core/tests/doctests/ResultOptions.rst index 1749e9c8e2..914a0bac50 100644 --- a/src/senaite/core/tests/doctests/ResultOptions.rst +++ b/src/senaite/core/tests/doctests/ResultOptions.rst @@ -71,7 +71,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/SampleAutoReceive.rst b/src/senaite/core/tests/doctests/SampleAutoReceive.rst index 753a45196b..a5b855e4d8 100644 --- a/src/senaite/core/tests/doctests/SampleAutoReceive.rst +++ b/src/senaite/core/tests/doctests/SampleAutoReceive.rst @@ -52,7 +52,7 @@ Create some baseline objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/SampleAutoVerify.rst b/src/senaite/core/tests/doctests/SampleAutoVerify.rst index 9b47fa2e72..3fb10edcdf 100644 --- a/src/senaite/core/tests/doctests/SampleAutoVerify.rst +++ b/src/senaite/core/tests/doctests/SampleAutoVerify.rst @@ -62,7 +62,7 @@ Create some baseline objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/SampleTemplate.rst b/src/senaite/core/tests/doctests/SampleTemplate.rst index 3e4835cf51..b7b211b131 100644 --- a/src/senaite/core/tests/doctests/SampleTemplate.rst +++ b/src/senaite/core/tests/doctests/SampleTemplate.rst @@ -72,7 +72,7 @@ We need to create some basic objects for the test: >>> preservation = api.create(setup.samplepreservations, "SamplePreservation", title=u"Chill at 4°C") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) diff --git a/src/senaite/core/tests/doctests/SecondaryAnalysisRequest.rst b/src/senaite/core/tests/doctests/SecondaryAnalysisRequest.rst index 9b75e751ee..ced0038d2b 100644 --- a/src/senaite/core/tests/doctests/SecondaryAnalysisRequest.rst +++ b/src/senaite/core/tests/doctests/SecondaryAnalysisRequest.rst @@ -35,7 +35,7 @@ Some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/SenaiteSetup.rst b/src/senaite/core/tests/doctests/SenaiteSetup.rst index 634d4b1196..6deb847aec 100644 --- a/src/senaite/core/tests/doctests/SenaiteSetup.rst +++ b/src/senaite/core/tests/doctests/SenaiteSetup.rst @@ -68,7 +68,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/ServicesCalculationRecursion.rst b/src/senaite/core/tests/doctests/ServicesCalculationRecursion.rst index cf370631c2..39ff1a7df0 100644 --- a/src/senaite/core/tests/doctests/ServicesCalculationRecursion.rst +++ b/src/senaite/core/tests/doctests/ServicesCalculationRecursion.rst @@ -32,7 +32,7 @@ Create some basic objects for the test: >>> setRoles(portal, TEST_USER_ID, ['Manager',]) >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) Creation of Service with a Calculation that refers to itself diff --git a/src/senaite/core/tests/doctests/ShowPrices.rst b/src/senaite/core/tests/doctests/ShowPrices.rst index 02150ad30a..3afe41a3c0 100644 --- a/src/senaite/core/tests/doctests/ShowPrices.rst +++ b/src/senaite/core/tests/doctests/ShowPrices.rst @@ -64,7 +64,7 @@ Now we need to create some basic content for our tests: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="409.17", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="208.20", Category=category.UID()) >>> profile = api.create(setup.analysisprofiles, "AnalysisProfile", title="Profile") diff --git a/src/senaite/core/tests/doctests/SpecificationAndResultsRanges.rst b/src/senaite/core/tests/doctests/SpecificationAndResultsRanges.rst index 16b8b3bdc1..3afdedce62 100644 --- a/src/senaite/core/tests/doctests/SpecificationAndResultsRanges.rst +++ b/src/senaite/core/tests/doctests/SpecificationAndResultsRanges.rst @@ -74,7 +74,7 @@ Create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID()) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/StringResult.rst b/src/senaite/core/tests/doctests/StringResult.rst index eb30b1dcc2..7cc6f9b59f 100644 --- a/src/senaite/core/tests/doctests/StringResult.rst +++ b/src/senaite/core/tests/doctests/StringResult.rst @@ -71,7 +71,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID()) >>> Cu.setStringResult(True) diff --git a/src/senaite/core/tests/doctests/SysmexXTi1800ImportInterface.rst b/src/senaite/core/tests/doctests/SysmexXTi1800ImportInterface.rst index 93f341daf9..7c65b64c13 100644 --- a/src/senaite/core/tests/doctests/SysmexXTi1800ImportInterface.rst +++ b/src/senaite/core/tests/doctests/SysmexXTi1800ImportInterface.rst @@ -36,7 +36,7 @@ Variables:: >>> bika_setup = portal.bika_setup >>> bika_instruments = bika_setup.bika_instruments >>> bika_sampletypes = bika_setup.bika_sampletypes - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = portal.setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices We need certain permissions to create and access objects used in this test, @@ -90,9 +90,9 @@ a `SampleType`:: Create an `AnalysisCategory` (which categorizes different `AnalysisServices`), and add to it some of the `AnalysisServices` that are found in the results file:: - >>> analysiscategory = api.create(bika_analysiscategories, "AnalysisCategory", title="Water") + >>> analysiscategory = api.create(analysiscategories, "AnalysisCategory", title="Water") >>> analysiscategory - + >>> analysisservice_1 = api.create(bika_analysisservices, ... "AnalysisService", ... title="WBC", diff --git a/src/senaite/core/tests/doctests/SysmexXTi4000ImportInterface.rst b/src/senaite/core/tests/doctests/SysmexXTi4000ImportInterface.rst index 144d9c5b89..a77d28f9a7 100644 --- a/src/senaite/core/tests/doctests/SysmexXTi4000ImportInterface.rst +++ b/src/senaite/core/tests/doctests/SysmexXTi4000ImportInterface.rst @@ -41,7 +41,7 @@ Variables:: >>> bika_setup = portal.bika_setup >>> bika_instruments = bika_setup.bika_instruments >>> bika_sampletypes = bika_setup.bika_sampletypes - >>> bika_analysiscategories = bika_setup.bika_analysiscategories + >>> analysiscategories = portal.setup.analysiscategories >>> bika_analysisservices = bika_setup.bika_analysisservices We need certain permissions to create and access objects used in this test, diff --git a/src/senaite/core/tests/doctests/TextResult.rst b/src/senaite/core/tests/doctests/TextResult.rst index 5af9df580c..adb2b1051d 100644 --- a/src/senaite/core/tests/doctests/TextResult.rst +++ b/src/senaite/core/tests/doctests/TextResult.rst @@ -70,7 +70,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID()) >>> Cu.setResultType("text") diff --git a/src/senaite/core/tests/doctests/Uncertainties.rst b/src/senaite/core/tests/doctests/Uncertainties.rst index d7aa73c327..ef348b245a 100644 --- a/src/senaite/core/tests/doctests/Uncertainties.rst +++ b/src/senaite/core/tests/doctests/Uncertainties.rst @@ -71,7 +71,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisAssign.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisAssign.rst index eae73b55e6..f7fd609d52 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisAssign.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisAssign.rst @@ -73,7 +73,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisMultiVerify.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisMultiVerify.rst index 0fdeb023a5..df9c63b750 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisMultiVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisMultiVerify.rst @@ -80,7 +80,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisPublish.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisPublish.rst index 86bd6f5ced..bb72f12437 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisPublish.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisPublish.rst @@ -84,7 +84,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisReject.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisReject.rst index 31c868cca9..c795657132 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisReject.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisReject.rst @@ -94,7 +94,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCancel.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCancel.rst index c15639213a..bccb9e82a2 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCancel.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCancel.rst @@ -65,7 +65,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCreatePartitions.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCreatePartitions.rst index 17be598413..9aecd93e33 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCreatePartitions.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestCreatePartitions.rst @@ -54,7 +54,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestInvalidate.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestInvalidate.rst index 4119d3145a..995aaaf546 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestInvalidate.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestInvalidate.rst @@ -54,7 +54,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestSample.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestSample.rst index dcfee370c3..402adcbc76 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestSample.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestSample.rst @@ -94,7 +94,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestToBeSampled.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestToBeSampled.rst index 43bae00466..7b2ba4086e 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisRequestToBeSampled.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisRequestToBeSampled.rst @@ -59,7 +59,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisRetest.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisRetest.rst index 46ef0263fe..2342c8a481 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisRetest.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisRetest.rst @@ -65,7 +65,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisRetract.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisRetract.rst index 590a597416..22fbaee646 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisRetract.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisRetract.rst @@ -80,7 +80,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisSubmit.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisSubmit.rst index f57e259974..2fb2867bcc 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisSubmit.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisSubmit.rst @@ -68,7 +68,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisUnassign.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisUnassign.rst index 4a85ae5fbc..64be2c2eff 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisUnassign.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisUnassign.rst @@ -82,7 +82,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowAnalysisVerify.rst b/src/senaite/core/tests/doctests/WorkflowAnalysisVerify.rst index 5e0991a543..b458b23528 100644 --- a/src/senaite/core/tests/doctests/WorkflowAnalysisVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowAnalysisVerify.rst @@ -80,7 +80,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisAssign.rst b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisAssign.rst index 1eed2e0510..6380d4636f 100644 --- a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisAssign.rst +++ b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisAssign.rst @@ -73,7 +73,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisMultiVerify.rst b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisMultiVerify.rst index aa736f141a..a165c1abea 100644 --- a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisMultiVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisMultiVerify.rst @@ -86,7 +86,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisRetract.rst b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisRetract.rst index 3cb435d5e8..308ebe452b 100644 --- a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisRetract.rst +++ b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisRetract.rst @@ -92,7 +92,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisSubmit.rst b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisSubmit.rst index d3e9989e9d..b32756edf8 100644 --- a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisSubmit.rst +++ b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisSubmit.rst @@ -85,7 +85,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisVerify.rst b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisVerify.rst index 858200764d..4bb6ddedee 100644 --- a/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowDuplicateAnalysisVerify.rst @@ -86,7 +86,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankAssign.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankAssign.rst index 28c70c39b5..27955718ae 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankAssign.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankAssign.rst @@ -73,7 +73,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankMultiVerify.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankMultiVerify.rst index 333570c011..8f35bc87f5 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankMultiVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankMultiVerify.rst @@ -88,7 +88,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankRetract.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankRetract.rst index 5bb2bfc3bd..5be07a675a 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankRetract.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankRetract.rst @@ -81,7 +81,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankSubmit.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankSubmit.rst index 62bc0cbac6..4fd58f3fa2 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankSubmit.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankSubmit.rst @@ -87,7 +87,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankVerify.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankVerify.rst index 387d8d122a..c4d64d9de4 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisBlankVerify.rst @@ -88,7 +88,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlAssign.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlAssign.rst index 391d5ea231..3cd9b05c12 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlAssign.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlAssign.rst @@ -73,7 +73,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlMultiVerify.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlMultiVerify.rst index 3ecfee6361..adfac88ef8 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlMultiVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlMultiVerify.rst @@ -88,7 +88,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlRetract.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlRetract.rst index 39e5330ab9..611ea21743 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlRetract.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlRetract.rst @@ -94,7 +94,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlSubmit.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlSubmit.rst index 553d9e460c..6472b31d3b 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlSubmit.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlSubmit.rst @@ -89,7 +89,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlVerify.rst b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlVerify.rst index 025207a8c4..c014c19e6a 100644 --- a/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlVerify.rst +++ b/src/senaite/core/tests/doctests/WorkflowReferenceAnalysisControlVerify.rst @@ -88,7 +88,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowSampleDispatch.rst b/src/senaite/core/tests/doctests/WorkflowSampleDispatch.rst index 2007bac136..5b5d8c9435 100644 --- a/src/senaite/core/tests/doctests/WorkflowSampleDispatch.rst +++ b/src/senaite/core/tests/doctests/WorkflowSampleDispatch.rst @@ -64,7 +64,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowWorksheetAutotransitions.rst b/src/senaite/core/tests/doctests/WorkflowWorksheetAutotransitions.rst index e92e0c144e..7cfd424144 100644 --- a/src/senaite/core/tests/doctests/WorkflowWorksheetAutotransitions.rst +++ b/src/senaite/core/tests/doctests/WorkflowWorksheetAutotransitions.rst @@ -54,7 +54,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowWorksheetRemove.rst b/src/senaite/core/tests/doctests/WorkflowWorksheetRemove.rst index 1013ab0ea9..69b2da28c9 100644 --- a/src/senaite/core/tests/doctests/WorkflowWorksheetRemove.rst +++ b/src/senaite/core/tests/doctests/WorkflowWorksheetRemove.rst @@ -54,7 +54,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorkflowWorksheetRetract.rst b/src/senaite/core/tests/doctests/WorkflowWorksheetRetract.rst index c85ee984a4..a08358d1b1 100644 --- a/src/senaite/core/tests/doctests/WorkflowWorksheetRetract.rst +++ b/src/senaite/core/tests/doctests/WorkflowWorksheetRetract.rst @@ -75,7 +75,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) >>> Au = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Gold", Keyword="Au", Price="20", Category=category.UID()) diff --git a/src/senaite/core/tests/doctests/WorksheetApplyTemplate.rst b/src/senaite/core/tests/doctests/WorksheetApplyTemplate.rst index 9bfca3298b..99897b07f2 100644 --- a/src/senaite/core/tests/doctests/WorksheetApplyTemplate.rst +++ b/src/senaite/core/tests/doctests/WorksheetApplyTemplate.rst @@ -66,7 +66,7 @@ We need to create some basic objects for the test: >>> sampletype = api.create(bikasetup.bika_sampletypes, "SampleType", title="Water", Prefix="W") >>> labcontact = api.create(bikasetup.bika_labcontacts, "LabContact", Firstname="Lab", Lastname="Manager") >>> department = api.create(setup.departments, "Department", title="Chemistry", Manager=labcontact) - >>> category = api.create(bikasetup.bika_analysiscategories, "AnalysisCategory", title="Metals", Department=department) + >>> category = api.create(setup.analysiscategories, "AnalysisCategory", title="Metals", Department=department) >>> supplier = api.create(bikasetup.bika_suppliers, "Supplier", Name="Naralabs") >>> Cu = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Copper", Keyword="Cu", Price="15", Category=category.UID(), Accredited=True) >>> Fe = api.create(bikasetup.bika_analysisservices, "AnalysisService", title="Iron", Keyword="Fe", Price="10", Category=category.UID()) diff --git a/src/senaite/core/upgrade/v02_06_000.py b/src/senaite/core/upgrade/v02_06_000.py index 24e6393875..1d05e28951 100644 --- a/src/senaite/core/upgrade/v02_06_000.py +++ b/src/senaite/core/upgrade/v02_06_000.py @@ -77,6 +77,8 @@ "Manufacturers", "ContainerType", "ContainerTypes", + "AnalysisCategory", + "AnalysisCategories", ] CONTENT_ACTIONS = [ @@ -1062,6 +1064,57 @@ def migrate_manufacturers_to_dx(tool): logger.info("Convert Manufacturers to Dexterity [DONE]") +@upgradestep(product, version) +def migrate_analysiscategories_to_dx(tool): + """Converts existing analysis categories to Dexterity + """ + logger.info("Convert Analysis Categories to Dexterity ...") + + # ensure old AT types are flushed first + remove_at_portal_types(tool) + + # run required import steps + tool.runImportStepFromProfile(profile, "typeinfo") + tool.runImportStepFromProfile(profile, "workflow") + + # get the old container + origin = api.get_setup().get("bika_analysiscategories") + if not origin: + # old container is already gone + return + + # get the destination container + destination = get_setup_folder("analysiscategories") + + # un-catalog the old container + uncatalog_object(origin) + + # Mapping from schema field name to a tuple of + # (accessor, target field name, default value) + schema_mapping = { + "title": ("Title", "title", ""), + "description": ("Description", "description", ""), + "Comments": ("Comments", "comments", ""), + "Department": ("Department", "department", ""), + "SortKey": ("SortKey", "sort_key", ""), + } + + # migrate the contents from the old AT container to the new one + migrate_to_dx("AnalysisCategory", + origin, destination, schema_mapping) + + # copy snapshots for the container + copy_snapshots(origin, destination) + + # remove old AT folder + if len(origin) == 0: + delete_object(origin) + else: + logger.warn("Cannot remove {}. Is not empty".format(origin)) + + logger.info("Convert Analysis Categories to Dexterity [DONE]") + + def migrate_samplepoint_to_dx(src, destination=None): """Migrates a Sample Point to DX in destination folder diff --git a/src/senaite/core/upgrade/v02_06_000.zcml b/src/senaite/core/upgrade/v02_06_000.zcml index 2221985835..11212c52b3 100644 --- a/src/senaite/core/upgrade/v02_06_000.zcml +++ b/src/senaite/core/upgrade/v02_06_000.zcml @@ -3,6 +3,14 @@ xmlns:genericsetup="http://namespaces.zope.org/genericsetup" i18n_domain="senaite.core"> + + Date: Fri, 17 May 2024 21:17:00 +0700 Subject: [PATCH 02/13] fix typo into upgrade --- src/senaite/core/setuphandlers.py | 2 +- src/senaite/core/upgrade/v02_06_000.zcml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/senaite/core/setuphandlers.py b/src/senaite/core/setuphandlers.py index c47a131cbc..7b7d4c6722 100644 --- a/src/senaite/core/setuphandlers.py +++ b/src/senaite/core/setuphandlers.py @@ -254,7 +254,7 @@ def add_senaite_setup_items(portal): ("sampletemplates", "Sample Templates", "SampleTemplates"), ("manufacturers", "Manufacturers", "Manufacturers"), ("containertypes", "Container Types", "ContainerTypes"), - ("analysiscategories", "Analysis Categories", "Analysis Categories"), + ("analysiscategories", "Analysis Categories", "AnalysisCategories"), ] setup = api.get_senaite_setup() add_dexterity_items(setup, items) diff --git a/src/senaite/core/upgrade/v02_06_000.zcml b/src/senaite/core/upgrade/v02_06_000.zcml index 11212c52b3..ccffb00baa 100644 --- a/src/senaite/core/upgrade/v02_06_000.zcml +++ b/src/senaite/core/upgrade/v02_06_000.zcml @@ -4,8 +4,8 @@ i18n_domain="senaite.core"> Date: Fri, 31 May 2024 21:02:47 +0700 Subject: [PATCH 03/13] 1. update changelog; 2. fix after merge. --- CHANGES.rst | 1 + src/bika/lims/controlpanel/configure.zcml | 16 ---------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 76f10b5fb7..ea14b632b2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,7 @@ Changelog 2.6.0 (unreleased) ------------------ +- #2567 Migrate AnalysisCategories to Dexterity - #2566 Migrate SamplePoint Latitude and Longitude fields to Location - #2552 Migrate SamplingDeviations to Dexterity - #2564 Flush dependent fields in sample add form only if the current value is not allowed diff --git a/src/bika/lims/controlpanel/configure.zcml b/src/bika/lims/controlpanel/configure.zcml index a732326977..cee9cb3ff9 100644 --- a/src/bika/lims/controlpanel/configure.zcml +++ b/src/bika/lims/controlpanel/configure.zcml @@ -52,14 +52,6 @@ layer="bika.lims.interfaces.IBikaLIMS" /> - - - - Date: Fri, 31 May 2024 21:04:26 +0700 Subject: [PATCH 04/13] update 'todo'about migration --- src/bika/lims/content/analysiscategory.py | 2 +- src/bika/lims/controlpanel/bika_analysiscategories.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bika/lims/content/analysiscategory.py b/src/bika/lims/content/analysiscategory.py index 3ccc5fc95a..ec4943d57b 100644 --- a/src/bika/lims/content/analysiscategory.py +++ b/src/bika/lims/content/analysiscategory.py @@ -96,7 +96,7 @@ schema['description'].schemata = 'default' -# TODO: Migrated to DX - https://github.com/senaite/senaite.core/pull/ +# TODO: Migrated to DX - https://github.com/senaite/senaite.core/pull/2567 class AnalysisCategory(BaseContent): implements(IAnalysisCategory, IHaveDepartment, IDeactivable) security = ClassSecurityInfo() diff --git a/src/bika/lims/controlpanel/bika_analysiscategories.py b/src/bika/lims/controlpanel/bika_analysiscategories.py index 0c6b9867e2..d0191ba33d 100644 --- a/src/bika/lims/controlpanel/bika_analysiscategories.py +++ b/src/bika/lims/controlpanel/bika_analysiscategories.py @@ -31,7 +31,7 @@ schema = ATFolderSchema.copy() -# TODO: Migrated to DX - https://github.com/senaite/senaite.core/pull/ +# TODO: Migrated to DX - https://github.com/senaite/senaite.core/pull/2567 class AnalysisCategories(ATFolder): implements(IAnalysisCategories, IHideActionsMenu) displayContentsTab = False From f75cf9228f8370484af09d771875f6d7a5293915 Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Fri, 31 May 2024 21:17:05 +0700 Subject: [PATCH 05/13] fixed typo in test --- src/senaite/core/tests/doctests/InstrumentResultsImport.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/senaite/core/tests/doctests/InstrumentResultsImport.rst b/src/senaite/core/tests/doctests/InstrumentResultsImport.rst index 5102c7c2ee..d3760cd22b 100644 --- a/src/senaite/core/tests/doctests/InstrumentResultsImport.rst +++ b/src/senaite/core/tests/doctests/InstrumentResultsImport.rst @@ -92,7 +92,7 @@ Variables: >>> bikasetup = api.get_bika_setup() >>> setup = api.get_senaite_setup() - >>> analysiscategories = bikasetup.bika_analysiscategories + >>> analysiscategories = setup.analysiscategories >>> analysisservices = bikasetup.bika_analysisservices >>> calculations = bikasetup.bika_calculations >>> departments = setup.departments From 57df71c4e6f7fff4960794e1004698a6f255c569 Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Mon, 3 Jun 2024 15:33:10 +0700 Subject: [PATCH 06/13] test guard for analysis category --- .../workflow/analysiscategory/__init__.py | 19 +++++++++++ .../lims/workflow/analysiscategory/events.py | 34 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/bika/lims/workflow/analysiscategory/__init__.py create mode 100644 src/bika/lims/workflow/analysiscategory/events.py diff --git a/src/bika/lims/workflow/analysiscategory/__init__.py b/src/bika/lims/workflow/analysiscategory/__init__.py new file mode 100644 index 0000000000..b0d48c9ed7 --- /dev/null +++ b/src/bika/lims/workflow/analysiscategory/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2024 by it's authors. +# Some rights reserved, see README and LICENSE. diff --git a/src/bika/lims/workflow/analysiscategory/events.py b/src/bika/lims/workflow/analysiscategory/events.py new file mode 100644 index 0000000000..51eeceb717 --- /dev/null +++ b/src/bika/lims/workflow/analysiscategory/events.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2024 by it's authors. +# Some rights reserved, see README and LICENSE. + +from bika.lims import api +from bika.lims.catalog.bikasetup_catalog import SETUP_CATALOG + + +def before_deactivate(analysis_category): + """Function triggered before a 'deactivate' transition for + the analysis category passed in is performed. + """ + + # Analysis Category can't be deactivated if it contains services + query = dict(portal_type="AnalysisService", + category_uid=analysis_category.UID()) + brains = api.search(query, SETUP_CATALOG) + return not brains From 4888b3f8189150c39cfe4445af37b97399e43a78 Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Mon, 3 Jun 2024 17:06:36 +0700 Subject: [PATCH 07/13] changed default columns for result of search departments. fixed guard for analysis category --- .../analysiscategory/{events.py => guards.py} | 5 +-- src/senaite/core/content/analysiscategory.py | 23 +--------- .../workflow/analysiscategory/__init__.py | 19 -------- .../core/workflow/analysiscategory/events.py | 45 ------------------- 4 files changed, 4 insertions(+), 88 deletions(-) rename src/bika/lims/workflow/analysiscategory/{events.py => guards.py} (87%) delete mode 100644 src/senaite/core/workflow/analysiscategory/__init__.py delete mode 100644 src/senaite/core/workflow/analysiscategory/events.py diff --git a/src/bika/lims/workflow/analysiscategory/events.py b/src/bika/lims/workflow/analysiscategory/guards.py similarity index 87% rename from src/bika/lims/workflow/analysiscategory/events.py rename to src/bika/lims/workflow/analysiscategory/guards.py index 51eeceb717..2da6f7e627 100644 --- a/src/bika/lims/workflow/analysiscategory/events.py +++ b/src/bika/lims/workflow/analysiscategory/guards.py @@ -22,9 +22,8 @@ from bika.lims.catalog.bikasetup_catalog import SETUP_CATALOG -def before_deactivate(analysis_category): - """Function triggered before a 'deactivate' transition for - the analysis category passed in is performed. +def guard_deactivate(analysis_category): + """Return whether the transition "deactivate" can be performed or not. """ # Analysis Category can't be deactivated if it contains services diff --git a/src/senaite/core/content/analysiscategory.py b/src/senaite/core/content/analysiscategory.py index d15dc46845..aa1ff6748a 100644 --- a/src/senaite/core/content/analysiscategory.py +++ b/src/senaite/core/content/analysiscategory.py @@ -23,6 +23,7 @@ from bika.lims import senaiteMessageFactory as _ from bika.lims.interfaces import IDeactivable from senaite.core.catalog import SETUP_CATALOG +from senaite.core.config.widgets import get_default_columns from senaite.core.content.base import Container from senaite.core.interfaces import IAnalysisCategory from senaite.core.schema import UIDReferenceField @@ -72,7 +73,7 @@ class IAnalysisCategorySchema(model.Schema): UIDReferenceWidgetFactory, catalog=SETUP_CATALOG, query="get_department_query", - columns="get_department_default_columns", + columns=get_default_columns, limit=5, ) department = UIDReferenceField( @@ -160,23 +161,3 @@ def get_department_query(self): "sort_on": "title", "sort_order": "ascending", } - - @security.private - def get_department_default_columns(self): - """Returns the default columns for the reference dropdown - """ - return [ - { - "name": "Title", - "label": _( - "search_result_column_title_title", - default="Department Name", - ), - }, { - "name": "getDepartmentID", - "label": _( - "search_result_column_title_department_id", - default="Department ID", - ), - }, - ] diff --git a/src/senaite/core/workflow/analysiscategory/__init__.py b/src/senaite/core/workflow/analysiscategory/__init__.py deleted file mode 100644 index b0d48c9ed7..0000000000 --- a/src/senaite/core/workflow/analysiscategory/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of SENAITE.CORE. -# -# SENAITE.CORE is free software: you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Copyright 2018-2024 by it's authors. -# Some rights reserved, see README and LICENSE. diff --git a/src/senaite/core/workflow/analysiscategory/events.py b/src/senaite/core/workflow/analysiscategory/events.py deleted file mode 100644 index e2a202bb95..0000000000 --- a/src/senaite/core/workflow/analysiscategory/events.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of SENAITE.CORE. -# -# SENAITE.CORE is free software: you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Copyright 2018-2024 by it's authors. -# Some rights reserved, see README and LICENSE. - -import transaction - -from bika.lims import api -from bika.lims import bikaMessageFactory as _ -from bika.lims.catalog.bikasetup_catalog import SETUP_CATALOG - -from Products.CMFCore.WorkflowCore import WorkflowException - - -def before_deactivate(analysis_category): - """Function triggered before a 'deactivate' transition for - the analysis category passed in is performed. - """ - - # Analysis Category can't be deactivated if it contains services - query = dict(portal_type="AnalysisService", - category_uid=analysis_category.UID()) - brains = api.search(query, SETUP_CATALOG) - if brains: - pu = api.get_tool("plone_utils") - message = _("Category cannot be deactivated because it contains " - "Analysis Services") - pu.addPortalMessage(message, 'error') - transaction.abort() - raise WorkflowException From 714394900f46da45be0593fc2509e577b0418550 Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Wed, 5 Jun 2024 19:25:48 +0700 Subject: [PATCH 08/13] udpate demo-data --- .../core/tests/setup_tool-demodata.tar.gz | Bin 75673 -> 75702 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/senaite/core/tests/setup_tool-demodata.tar.gz b/src/senaite/core/tests/setup_tool-demodata.tar.gz index aaeffed0a8b44426277a2efed72a1a4b89249a8b..7748ad95abc3475183ee2d36d540588fb487b40f 100644 GIT binary patch literal 75702 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 literal 75673 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 QB93hPc4Pv<115t10kjd=CIA2c From 83559bfb589fdc5843e23bd2197155d8fafec55a Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Wed, 5 Jun 2024 19:29:36 +0700 Subject: [PATCH 09/13] added 'u' converter --- .../controlpanel/analysiscategories/view.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/senaite/core/browser/controlpanel/analysiscategories/view.py b/src/senaite/core/browser/controlpanel/analysiscategories/view.py index f99cde7aeb..97c967d643 100644 --- a/src/senaite/core/browser/controlpanel/analysiscategories/view.py +++ b/src/senaite/core/browser/controlpanel/analysiscategories/view.py @@ -64,29 +64,29 @@ def __init__(self, context, request): self.columns = collections.OrderedDict(( ("Title", { "title": _( - "listing_analysiscategories_column_title", - default="Category", + u"listing_analysiscategories_column_title", + default=u"Category", ), "index": "sortable_title"}), ("Description", { "title": _( - "listing_analysiscategories_column_description", - default="Description", + u"listing_analysiscategories_column_description", + default=u"Description", ), "index": "Description", "toggle": True, }), ("Department", { "title": _( - "listing_analysiscategories_column_department", - default="Department", + u"listing_analysiscategories_column_department", + default=u"Department", ), "index": "department_title", }), ("SortKey", { "title": _( - "listing_analysiscategories_column_sort_key", - default="Sort Key", + u"listing_analysiscategories_column_sort_key", + default=u"Sort Key", ), "sortable": True }), @@ -96,24 +96,24 @@ def __init__(self, context, request): { "id": "default", "title": _( - "listing_analysiscategories_state_active", - default="Active", + u"listing_analysiscategories_state_active", + default=u"Active", ), "contentFilter": {"is_active": True}, "columns": self.columns.keys(), }, { "id": "inactive", "title": _( - "listing_analysiscategories_state_inactive", - default="Inactive", + u"listing_analysiscategories_state_inactive", + default=u"Inactive", ), "contentFilter": {'is_active': False}, "columns": self.columns.keys(), }, { "id": "all", "title": _( - "listing_analysiscategories_state_all", - default="All", + u"listing_analysiscategories_state_all", + default=u"All", ), "contentFilter": {}, "columns": self.columns.keys(), From 984ccea4d0991e23daae81e516bc380dd8faa6dd Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Mon, 10 Jun 2024 13:18:17 +0700 Subject: [PATCH 10/13] fixed: missing validator for sort_key field --- src/senaite/core/content/analysiscategory.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/senaite/core/content/analysiscategory.py b/src/senaite/core/content/analysiscategory.py index aa1ff6748a..dd1b37d8b8 100644 --- a/src/senaite/core/content/analysiscategory.py +++ b/src/senaite/core/content/analysiscategory.py @@ -31,7 +31,9 @@ from plone.autoform import directives from plone.supermodel import model from zope import schema +from zope.interface import Invalid from zope.interface import implementer +from zope.interface import invariant class IAnalysisCategorySchema(model.Schema): @@ -103,6 +105,20 @@ class IAnalysisCategorySchema(model.Schema): required=False, ) + @invariant + def validate_sort_key(data): + """Checks if the department ID is unique + """ + try: + value = float(data.sort_key) + except Exception: + msg = _("Validation failed: value must be float") + raise Invalid(msg) + + if value < 0 or value > 1000: + msg = _("Validation failed: value must be between 0 and 1000") + raise Invalid(msg) + @implementer(IAnalysisCategory, IAnalysisCategorySchema, IDeactivable) class AnalysisCategory(Container): From 238661286fa36998a16d4857d748db5e9d834a91 Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Mon, 10 Jun 2024 13:31:15 +0700 Subject: [PATCH 11/13] validate sortk_key if value exist --- src/senaite/core/content/analysiscategory.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/senaite/core/content/analysiscategory.py b/src/senaite/core/content/analysiscategory.py index dd1b37d8b8..bbbbf0a829 100644 --- a/src/senaite/core/content/analysiscategory.py +++ b/src/senaite/core/content/analysiscategory.py @@ -107,8 +107,12 @@ class IAnalysisCategorySchema(model.Schema): @invariant def validate_sort_key(data): - """Checks if the department ID is unique + """Checks sort_key field for float value if exist """ + sort_key = getattr(data, "sort_key", None) + if sort_key is None: + return + try: value = float(data.sort_key) except Exception: From 6df8add7f998210980bad697dbdbb1244642b37d Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Tue, 11 Jun 2024 16:46:07 +0700 Subject: [PATCH 12/13] fixed after review: use 'u' converter; changed import for senaite catalog; deleted dfault limit. --- .../lims/workflow/analysiscategory/guards.py | 2 +- src/senaite/core/content/analysiscategory.py | 35 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/bika/lims/workflow/analysiscategory/guards.py b/src/bika/lims/workflow/analysiscategory/guards.py index 2da6f7e627..cba0487bbc 100644 --- a/src/bika/lims/workflow/analysiscategory/guards.py +++ b/src/bika/lims/workflow/analysiscategory/guards.py @@ -19,7 +19,7 @@ # Some rights reserved, see README and LICENSE. from bika.lims import api -from bika.lims.catalog.bikasetup_catalog import SETUP_CATALOG +from senaite.core.catalog import SETUP_CATALOG def guard_deactivate(analysis_category): diff --git a/src/senaite/core/content/analysiscategory.py b/src/senaite/core/content/analysiscategory.py index bbbbf0a829..1cd396b838 100644 --- a/src/senaite/core/content/analysiscategory.py +++ b/src/senaite/core/content/analysiscategory.py @@ -42,28 +42,28 @@ class IAnalysisCategorySchema(model.Schema): title = schema.TextLine( title=_( - "title_analysiscategory_title", - default="Name" + u"title_analysiscategory_title", + default=u"Name" ), required=True, ) description = schema.Text( title=_( - "title_analysiscategory_description", - default="Description" + u"title_analysiscategory_description", + default=u"Description" ), required=False, ) comments = schema.Text( title=_( - "title_analysiscategory_comments", - default="Comments", + u"title_analysiscategory_comments", + default=u"Comments", ), description=_( - "description_analysiscategory_comments", - default="To be displayed below each Analysis Category " + u"description_analysiscategory_comments", + default=u"To be displayed below each Analysis Category " "section on results reports.", ), required=False, @@ -76,16 +76,15 @@ class IAnalysisCategorySchema(model.Schema): catalog=SETUP_CATALOG, query="get_department_query", columns=get_default_columns, - limit=5, ) department = UIDReferenceField( title=_( - "title_analysiscategory_department", - default="Department", + u"title_analysiscategory_department", + default=u"Department", ), description=_( - "description_analysiscategory_department", - default="Select the responsible department", + u"description_analysiscategory_department", + default=u"Select the responsible department", ), allowed_types=("Department",), multi_valued=False, @@ -94,13 +93,13 @@ class IAnalysisCategorySchema(model.Schema): sort_key = schema.Float( title=_( - "title_analysiscategory_sort_key", - default="Sort Key", + u"title_analysiscategory_sort_key", + default=u"Sort Key", ), description=_( - "description_analysiscategory_sort_key", - default="Float value from 0.0 - 1000.0 indicating the sort order. " - "Duplicate values are ordered alphabetically.", + u"description_analysiscategory_sort_key", + default=u"Float value from 0.0 - 1000.0 indicating the sort order." + " Duplicate values are ordered alphabetically.", ), required=False, ) From bd5f3387bde2967df717521311caffdd33c7e4d6 Mon Sep 17 00:00:00 2001 From: Anton Zhuchkov Date: Tue, 11 Jun 2024 17:00:07 +0700 Subject: [PATCH 13/13] fix after review: added subscriber for modified analysis category --- .../core/subscribers/analysiscategory.py | 44 +++++++++++++++++++ src/senaite/core/subscribers/configure.zcml | 6 +++ 2 files changed, 50 insertions(+) create mode 100644 src/senaite/core/subscribers/analysiscategory.py diff --git a/src/senaite/core/subscribers/analysiscategory.py b/src/senaite/core/subscribers/analysiscategory.py new file mode 100644 index 0000000000..50c1d4a931 --- /dev/null +++ b/src/senaite/core/subscribers/analysiscategory.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2024 by it's authors. +# Some rights reserved, see README and LICENSE. + +from bika.lims import api +from senaite.core.catalog import ANALYSIS_CATALOG +from senaite.core.catalog import SETUP_CATALOG + + +def on_analysis_category_modified(analysis_category, event): + """Re-indexing all services and analyses if modified Title of + analysis category + """ + uid = api.get_uid(analysis_category) + + # re-index all analysis services + query = dict(category_uid=uid, portal_type="AnalysisService") + brains = api.search(query, SETUP_CATALOG) + for brain in brains: + ob = api.get_object(brain) + ob.reindexObject() + + # re-index analyses + query = dict(getCategoryUID=uid) + brains = api.search(query, ANALYSIS_CATALOG) + for brain in brains: + ob = api.get_object(brain) + ob.reindexObject() diff --git a/src/senaite/core/subscribers/configure.zcml b/src/senaite/core/subscribers/configure.zcml index fe085fc054..c41ea00c7e 100644 --- a/src/senaite/core/subscribers/configure.zcml +++ b/src/senaite/core/subscribers/configure.zcml @@ -18,4 +18,10 @@ handler=".client.on_client_created" /> + + +