Browse Source

[10.0][MIG] base_cron_exclusion (#1105)

* [9.0][ADD] base_cron_exclusion

* [10.0][MIG] base_cron_exclusion
pull/1160/head
Lois Rilo 7 years ago
committed by Joël Grand-Guillaume
parent
commit
110f47f4c7
  1. 64
      base_cron_exclusion/README.rst
  2. 4
      base_cron_exclusion/__init__.py
  3. 22
      base_cron_exclusion/__manifest__.py
  4. 4
      base_cron_exclusion/models/__init__.py
  5. 63
      base_cron_exclusion/models/ir_cron.py
  6. 21
      base_cron_exclusion/views/ir_cron_view.xml

64
base_cron_exclusion/README.rst

@ -0,0 +1,64 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl
:alt: License: AGPL-3
===================
Base Cron Exclusion
===================
This module extends the functionality of scheduled actions to allow you to
select the ones that should not run simultaneously.
Usage
=====
To use this module, you need to:
#. Go to *Settings > Technical > Automation > Scheduled Actions*.
#. In the form view go to the tab *Mutually Exclusive Scheduled Actions*.
#. Fill it with the actions that should be blocked while running the action
you are editing. Note that this is mutual and the selected actions will
block the initial action when running.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/149/10.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/server-tools/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smash it by providing detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Lois Rilo <lois.rilo@eficent.com>
* Jordi Ballester <jordi.ballester@eficent.com>
Do not contact contributors directly about support or help with technical issues.
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

4
base_cron_exclusion/__init__.py

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import models

22
base_cron_exclusion/__manifest__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Base Cron Exclusion",
"summary": "Allow you to select scheduled actions that should not run "
"simultaneously.",
"version": "10.0.1.0.0",
"author": "Eficent, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/server-tools",
"category": "Tools",
"depends": [
"base",
],
"data": [
"views/ir_cron_view.xml",
],
"license": "AGPL-3",
'installable': True,
}

4
base_cron_exclusion/models/__init__.py

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import ir_cron

63
base_cron_exclusion/models/ir_cron.py

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
import logging
from odoo import sql_db
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class IrCron(models.Model):
_inherit = "ir.cron"
@api.one
@api.constrains('mutually_exclusive_cron_ids')
def _check_auto_exclusion(self):
if self in self.mutually_exclusive_cron_ids:
raise ValidationError(_(
"You can not mutually exclude a scheduled actions with "
"itself."))
mutually_exclusive_cron_ids = fields.Many2many(
comodel_name="ir.cron", relation="ir_cron_exclusion",
column1="ir_cron1_id", column2="ir_cron2_id",
string="Mutually Exclusive Scheduled Actions")
@staticmethod
def _lock_mutually_exclusive_cron(db, job_id):
lock_cr = db.cursor()
lock_cr.execute("""
WITH Q1 AS (SELECT ir_cron2_id as cron_id FROM ir_cron_exclusion
WHERE ir_cron1_id=%s
UNION ALL
SELECT ir_cron1_id as cron_id FROM ir_cron_exclusion
WHERE ir_cron2_id=%s)
SELECT * FROM Q1
GROUP BY cron_id;""", (job_id, job_id))
locked_ids = tuple([row[0] for row in lock_cr.fetchall()])
if locked_ids:
lock_cr.execute("""SELECT *
FROM ir_cron
WHERE numbercall != 0
AND active
AND id IN %s
FOR UPDATE NOWAIT""",
(locked_ids,), log_exceptions=False)
lock_cr.fetchall()
return lock_cr
@classmethod
def _process_job(cls, job_cr, job, cron_cr):
db = sql_db.db_connect(cls.pool._db.dbname)
locked_crons = cls._lock_mutually_exclusive_cron(db, job['id'])
try:
res = super(IrCron, cls)._process_job(job_cr, job, cron_cr)
finally:
locked_crons.close()
_logger.debug("released blocks for cron job %s" % job['name'])
return res

21
base_cron_exclusion/views/ir_cron_view.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2017 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<record id="ir_cron_view" model="ir.ui.view">
<field name="name">ir.cron.form - base_cron_exclusion</field>
<field name="model">ir.cron</field>
<field name="inherit_id" ref="base.ir_cron_view"/>
<field name="arch" type="xml">
<notebook position="inside">
<page name="exclusive_cron" groups="base.group_no_one"
string="Mutually Exclusive Scheduled Actions">
<field name="mutually_exclusive_cron_ids"/>
</page>
</notebook>
</field>
</record>
</odoo>
Loading…
Cancel
Save