From bdbda19b6df51e367237f002d3aea71dee540629 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Fri, 23 Dec 2016 13:53:14 +0100 Subject: [PATCH] [FIX] stock: prevent concurrent procurement creation When the user clicks on "Run Reordering Rules", it might create procurements. However, the cron "Run mrp scheduler" will also create procurements and might already be running in the background. Therefore, we need to make sure that both actions don't run concurrently. Note that the same check is done for the wizard "Run Schedulers". opw-695607 --- .../wizard/procurement_orderpoint_compute.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/addons/stock/wizard/procurement_orderpoint_compute.py b/addons/stock/wizard/procurement_orderpoint_compute.py index d62d94ab054..da4f6969d89 100644 --- a/addons/stock/wizard/procurement_orderpoint_compute.py +++ b/addons/stock/wizard/procurement_orderpoint_compute.py @@ -6,10 +6,12 @@ # - Order if the virtual stock of today is bellow the min of the defined order point # -from odoo import api, models +from odoo import api, models, tools +import logging import threading +_logger = logging.getLogger(__name__) class ProcurementOrderpointConfirm(models.TransientModel): _name = 'procurement.orderpoint.compute' @@ -20,6 +22,17 @@ class ProcurementOrderpointConfirm(models.TransientModel): # As this function is in a new thread, I need to open a new cursor, because the old one may be closed new_cr = self.pool.cursor() self = self.with_env(self.env(cr=new_cr)) + scheduler_cron = self.sudo().env.ref('procurement.ir_cron_scheduler_action') + # Avoid to run the scheduler multiple times in the same time + try: + with tools.mute_logger('odoo.sql_db'): + self._cr.execute("SELECT id FROM ir_cron WHERE id = %s FOR UPDATE NOWAIT", (scheduler_cron.id,)) + except Exception: + _logger.info('Attempt to run procurement scheduler aborted, as already running') + self._cr.rollback() + self._cr.close() + return {} + self.env['procurement.order']._procure_orderpoint_confirm( use_new_cursor=new_cr.dbname, company_id=self.env.user.company_id.id)