Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce conflict errors on number generation #2258

Merged
merged 7 commits into from
Feb 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Changelog
2.4.0 (unreleased)
------------------

- #2258 Reduce conflict errors on number generation
- #2256 Do not keep DX UID reference field back-references per default
- #2257 Fix UnicodeEncode error when viewing report objects
- #2254 Fix attachments to be ignored are included in email results view
Expand Down
5 changes: 0 additions & 5 deletions src/bika/lims/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,4 @@
layer="bika.lims.interfaces.IBikaLIMS"
/>

<utility
provides="bika.lims.interfaces.INumberGenerator"
factory=".numbergenerator.NumberGenerator"
/>

</configure>
2 changes: 1 addition & 1 deletion src/bika/lims/content/bikasetup.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
from bika.lims.config import WEEKDAYS
from bika.lims.content.bikaschema import BikaFolderSchema
from bika.lims.interfaces import IBikaSetup
from bika.lims.numbergenerator import INumberGenerator
from bika.lims.vocabularies import getStickerTemplates as _getStickerTemplates
from plone.app.folder import folder
from Products.Archetypes.atapi import BooleanField
Expand All @@ -61,6 +60,7 @@
from senaite.core.api import geo
from senaite.core.browser.fields.records import RecordsField
from senaite.core.interfaces import IHideActionsMenu
from senaite.core.interfaces import INumberGenerator
from senaite.core.p3compat import cmp
from zope.component import getUtility
from zope.interface import implements
Expand Down
7 changes: 4 additions & 3 deletions src/bika/lims/idserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@

import itertools
import re
from datetime import datetime

import six

import transaction
from bika.lims import api
from bika.lims import logger
Expand All @@ -36,15 +39,13 @@
from bika.lims.interfaces import IIdServer
from bika.lims.interfaces import IIdServerTypeID
from bika.lims.interfaces import IIdServerVariables
from bika.lims.numbergenerator import INumberGenerator
from DateTime import DateTime
from datetime import datetime
from Products.ATContentTypes.utils import DT2dt
from senaite.core.interfaces import INumberGenerator
from zope.component import getAdapters
from zope.component import getUtility
from zope.component import queryAdapter


AR_TYPES = [
"AnalysisRequest",
"AnalysisRequestRetest",
Expand Down
5 changes: 0 additions & 5 deletions src/bika/lims/interfaces/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -873,11 +873,6 @@ def get_front_page_url(self):
"""


class INumberGenerator(Interface):
"""A utility to generates unique numbers by key
"""


class ITopRightHTMLComponentsHook(Interface):
"""Marker interface to hook html components in bikalisting
"""
Expand Down
2 changes: 1 addition & 1 deletion src/senaite/core/browser/idserver/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
from bika.lims import api
from bika.lims import bikaMessageFactory as _
from bika.lims.idserver import get_config
from bika.lims.numbergenerator import INumberGenerator
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from senaite.core.interfaces import INumberGenerator
from zope.component import getUtility
from zope.interface import Interface
from zope.interface import implements
Expand Down
1 change: 1 addition & 0 deletions src/senaite/core/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<include package=".registry" />
<include package=".schema" />
<include package=".upgrade" />
<include package=".utilities" />
<include package=".z3cform" />

<!-- portal skins -->
Expand Down
5 changes: 5 additions & 0 deletions src/senaite/core/interfaces/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ def modified(data):
"""


class INumberGenerator(Interface):
"""A utility to generates unique numbers by key
"""


class IContainer(Interface):
"""SENAITE Base Container
"""
Expand Down
4 changes: 2 additions & 2 deletions src/senaite/core/tests/doctests/IDServer.rst
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Needed Imports:
>>> from bika.lims import alphanumber as alpha
>>> from bika.lims import api
>>> from bika.lims import idserver
>>> from bika.lims.interfaces import INumberGenerator
>>> from senaite.core.interfaces import INumberGenerator
>>> from bika.lims.utils.analysisrequest import create_analysisrequest
>>> from bika.lims.workflow import doActionFor as do_action_for

Expand Down Expand Up @@ -225,7 +225,7 @@ Change ID formats and create new `AnalysisRequest`:
Re-seed and create a new `Batch`:

>>> from zope.component import getUtility
>>> from bika.lims.numbergenerator import INumberGenerator
>>> from senaite.core.interfaces import INumberGenerator
>>> ng = getUtility(INumberGenerator)
>>> seed = ng.set_number("batch-BA", 10)

Expand Down
Empty file.
10 changes: 10 additions & 0 deletions src/senaite/core/utilities/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser">

<utility
provides="senaite.core.interfaces.INumberGenerator"
factory=".numbergenerator.NumberGenerator"
/>

</configure>
Original file line number Diff line number Diff line change
Expand Up @@ -19,33 +19,33 @@
# Some rights reserved, see README and LICENSE.

import thread
import logging
from bika.lims.interfaces import INumberGenerator

from bika.lims import logger
from BTrees.OIBTree import OIBTree
from plone import api
from senaite.core.interfaces import INumberGenerator
from zope.annotation.interfaces import IAnnotations
from zope.interface import implements



lock = thread.allocate_lock()

logger = logging.getLogger("bika.lims.idserver")
STORAGE_KEY = "bika.lims.numbercounter"
NUMBER_STORAGE = "bika.lims.consecutive_numbers_storage"

STORAGE_KEY = "bika.lims.numbercounter"
STORAGE_HASH = "bika.lims.numbercounter.hash"

NUMBER_STORAGE = "bika.lims.consecutive_numbers_storage"
def get_portal():
return api.portal.getSite()


def get_storage_location():
""" get the portal with the plone.api
"""
location = api.portal.getSite()
location = get_portal()
if location.get('bika_setup', False):
location = location['bika_setup']
return location


def get_portal_annotation():
""" annotation storage bound to the portal
"""
Expand All @@ -63,7 +63,7 @@ def storage(self):
"""
annotation = get_portal_annotation()
if annotation.get(NUMBER_STORAGE) is None:
annotation[NUMBER_STORAGE] = OIBTree()
annotation[NUMBER_STORAGE] = OIBTree()
return annotation[NUMBER_STORAGE]

def flush(self):
Expand Down Expand Up @@ -97,43 +97,35 @@ def get(self, key, default=None):
def get_number(self, key):
""" get the next consecutive number
"""
storage = self.storage

logger.debug("NUMBER before => %s" % storage.get(key, '-'))
logger.debug("NUMBER before => %s" % self.storage.get(key, '-'))
try:
logger.debug("*** consecutive number lock acquire ***")
lock.acquire()
try:
counter = storage[key]
storage[key] = counter + 1
counter = self.storage[key]
self.storage[key] = counter + 1
except KeyError:
storage[key] = 1
self.storage[key] = 1
finally:
logger.debug("*** consecutive number lock release ***")
self.storage._p_changed = True
lock.release()

logger.debug("NUMBER after => %s" % storage.get(key, '-'))
return storage[key]
logger.debug("NUMBER after => %s" % self.storage.get(key, '-'))
return self.storage[key]

def set_number(self, key, value):
""" set a key's value
"""
storage = self.storage

if not isinstance(value, int):
logger.error("set_number: Value must be an integer")
return

try:
lock.acquire()
storage[key] = value
self.storage[key] = value
finally:
self.storage._p_changed = True
lock.release()

return storage[key]

return self.storage[key]

def generate_number(self, key="default"):
""" get a number
Expand Down