diff --git a/src/senaite/core/profiles/default/metadata.xml b/src/senaite/core/profiles/default/metadata.xml index f61f429289..c7cbbb94f2 100644 --- a/src/senaite/core/profiles/default/metadata.xml +++ b/src/senaite/core/profiles/default/metadata.xml @@ -1,6 +1,6 @@ - 2520 + 2521 profile-Products.ATContentTypes:base profile-Products.CMFEditions:CMFEditions diff --git a/src/senaite/core/upgrade/v02_05_000.py b/src/senaite/core/upgrade/v02_05_000.py index 30c8b6adcd..2a4f6b5eff 100644 --- a/src/senaite/core/upgrade/v02_05_000.py +++ b/src/senaite/core/upgrade/v02_05_000.py @@ -21,7 +21,10 @@ import transaction from Acquisition import aq_base from bika.lims import api +from bika.lims.interfaces import IReceived +from bika.lims.utils import changeWorkflowState from senaite.core import logger +from senaite.core.api import security from senaite.core.api.catalog import add_index from senaite.core.api.catalog import del_column from senaite.core.api.catalog import del_index @@ -34,17 +37,21 @@ from senaite.core.catalog import SETUP_CATALOG from senaite.core.config import PROJECTNAME as product from senaite.core.permissions import ManageBika +from senaite.core.permissions import TransitionReceiveSample from senaite.core.registry import get_registry_record -from senaite.core.setuphandlers import CATALOG_MAPPINGS from senaite.core.setuphandlers import _run_import_step from senaite.core.setuphandlers import add_dexterity_items +from senaite.core.setuphandlers import CATALOG_MAPPINGS from senaite.core.setuphandlers import setup_auditlog_catalog_mappings from senaite.core.setuphandlers import setup_catalog_mappings from senaite.core.setuphandlers import setup_core_catalogs from senaite.core.setuphandlers import setup_portal_catalog from senaite.core.upgrade import upgradestep -from senaite.core.upgrade.utils import UpgradeUtils from senaite.core.upgrade.utils import uncatalog_brain +from senaite.core.upgrade.utils import UpgradeUtils +from senaite.core.workflow import ANALYSIS_WORKFLOW +from senaite.core.workflow import SAMPLE_WORKFLOW +from zope.interface import alsoProvides PORTAL_CATALOG = "portal_catalog" @@ -482,3 +489,62 @@ def reindex_control_analyses(tool): obj._p_deactivate() logger.info("Reindexing control analyses [DONE]") + + +def fix_samples_registered(tool): + """Transitions the samples in "registered" status to a suitable status, + either "sample_due", "recieved", or "to_be_sampled" + """ + logger.info("Fixing samples in 'registered' status ...") + + setup = api.get_setup() + auto_receive = setup.getAutoreceiveSamples() + query = {"review_state": "sample_registered"} + brains = api.search(query, SAMPLE_CATALOG) + total = len(brains) + for num, brain in enumerate(brains): + if num and num % 100 == 0: + logger.info("Fixing samples in 'registered' status: {}/{}" + .format(num, total)) + + sample = api.get_object(brain) + + creator = sample.Creator() + if sample.getSamplingRequired(): + # sample has not been collected yet + changeWorkflowState(sample, SAMPLE_WORKFLOW, "to_be_sampled", + actor=creator, action="to_be_sampled") + sample._p_deactivate() + continue + + if auto_receive: + user = security.get_user(sample.creator()) + if user.has_permission(TransitionReceiveSample, sample): + # Change status to sample_received + changeWorkflowState(sample, SAMPLE_WORKFLOW, "sample_received", + actor=creator, action="receive") + + # Mark the secondary as received + alsoProvides(sample, IReceived) + + # Set same received date as created + created = api.get_creation_date(sample) + sample.setDateReceived(created) + + # Initialize analyses + for obj in sample.objectValues(): + if obj.portal_type != "Analysis": + continue + if api.get_review_status(obj) != "registered": + continue + changeWorkflowState(obj, ANALYSIS_WORKFLOW, "unassigned", + actor=creator, action="initialize") + sample._p_deactivate() + continue + + # sample_due is the default initial status of the sample + changeWorkflowState(sample, SAMPLE_WORKFLOW, "sample_due", + actor=creator, action="no_sampling_workflow") + sample._p_deactivate() + + logger.info("Fixing samples in 'registered' status [DONE]") diff --git a/src/senaite/core/upgrade/v02_05_000.zcml b/src/senaite/core/upgrade/v02_05_000.zcml index 39704dcfe0..b8c0655395 100644 --- a/src/senaite/core/upgrade/v02_05_000.zcml +++ b/src/senaite/core/upgrade/v02_05_000.zcml @@ -3,6 +3,14 @@ xmlns:genericsetup="http://namespaces.zope.org/genericsetup" i18n_domain="senaite.core"> + +