diff --git a/CHANGES.rst b/CHANGES.rst index 514e9d1d79..64d38ab898 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,14 @@ Changelog ========= +1.3.5 (unreleased) +------------------ + +**Fixed** + +- #1617 Fix writing methods on read when reindexing services + + 1.3.4 (2020-08-11) ------------------ diff --git a/bika/lims/content/analysisservice.py b/bika/lims/content/analysisservice.py index 9ac730b41a..20dc9e75d7 100644 --- a/bika/lims/content/analysisservice.py +++ b/bika/lims/content/analysisservice.py @@ -496,7 +496,8 @@ def getAvailableMethodUIDs(self): Returns the UIDs of the available methods. it is used as a vocabulary to fill the selection list of 'Methods' field. """ - method_uids = self.getRawMethods() + # N.B. we return a copy of the list to avoid accidental writes + method_uids = self.getRawMethods()[:] if self.getInstrumentEntryOfResults(): for instrument in self.getInstruments(): method_uids.extend(instrument.getRawMethods()) diff --git a/bika/lims/upgrade/configure.zcml b/bika/lims/upgrade/configure.zcml index 4e56ee73c3..06a0368cb3 100644 --- a/bika/lims/upgrade/configure.zcml +++ b/bika/lims/upgrade/configure.zcml @@ -199,4 +199,11 @@ handler="bika.lims.upgrade.v01_03_004.upgrade" profile="bika.lims:default"/> + + diff --git a/bika/lims/upgrade/v01_03_005.py b/bika/lims/upgrade/v01_03_005.py new file mode 100644 index 0000000000..b964930b68 --- /dev/null +++ b/bika/lims/upgrade/v01_03_005.py @@ -0,0 +1,76 @@ +# -*- 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-2020 by it's authors. +# Some rights reserved, see README and LICENSE. + +from bika.lims import api +from bika.lims import logger +from bika.lims.catalog import CATALOG_ANALYSIS_REQUEST_LISTING +from bika.lims.catalog import SETUP_CATALOG +from bika.lims.config import PROJECTNAME as product +from bika.lims.upgrade import upgradestep +from bika.lims.upgrade.utils import UpgradeUtils + +version = "1.3.5" # Remember version number in metadata.xml and setup.py +profile = "profile-{0}:default".format(product) + + +@upgradestep(product, version) +def upgrade(tool): + portal = tool.aq_inner.aq_parent + setup = portal.portal_setup + ut = UpgradeUtils(portal) + ver_from = ut.getInstalledVersion(product) + + if ut.isOlderVersion(product, version): + logger.info("Skipping upgrade of {0}: {1} > {2}".format( + product, ver_from, version)) + return True + + logger.info("Upgrading {0}: {1} -> {2}".format(product, ver_from, version)) + + # -------- ADD YOUR STUFF BELOW -------- + + # Fix writing methods on read when reindexing services + # https://github.com/senaite/senaite.core/pull/1617 + remove_duplicate_methods_in_services(portal) + + logger.info("{0} upgraded to version {1}".format(product, version)) + return True + + +def remove_duplicate_methods_in_services(portal): + """A bug caused duplicate methods stored in services which need to be fixed + """ + logger.info("Remove duplicate methods from services...") + + cat = api.get_tool(SETUP_CATALOG) + services = cat({"portal_type": "AnalysisService"}) + total = len(services) + + for num, service in enumerate(services): + if num and num % 10 == 0: + logger.info("Processed {}/{} Services".format(num, total)) + obj = api.get_object(service) + methods = list(set(obj.getRawMethods())) + if not methods: + continue + obj.setMethods(methods) + obj.reindexObject() + + logger.info("Remove duplicate methods from services [DONE]") diff --git a/setup.py b/setup.py index 3645a40d11..75dd088be3 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ from setuptools import setup, find_packages -version = '1.3.4' +version = '1.3.5' setup( name='senaite.core',