oca-technical/odoo-bringout-oca-ddmrp-ddmrp_warning/ddmrp_warning/models/stock_buffer.py
2025-08-29 15:43:03 +02:00

79 lines
2.9 KiB
Python

# Copyright 2021 ForgeFlow S.L. (https://www.forgeflow.com)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
import logging
import threading
from odoo import api, fields, models
from odoo.tools.misc import split_every
_logger = logging.getLogger(__name__)
class Buffer(models.Model):
_inherit = "stock.buffer"
ddmrp_warning_item_ids = fields.One2many(
comodel_name="ddmrp.warning.item",
inverse_name="buffer_id",
readonly=True,
)
def _generate_ddmrp_warnings(self):
definitions = self.env["ddmrp.warning.definition"].search([])
item_model = self.env["ddmrp.warning.item"]
for rec in self:
for d in definitions:
existing = item_model.search(
[("buffer_id", "=", rec.id), ("warning_definition_id", "=", d.id)]
)
warning_applicable = d._is_warning_applicable(rec)
if warning_applicable:
warning_raised = d.evaluate_definition(rec)
if warning_raised and not existing:
item_model.create(
{"buffer_id": rec.id, "warning_definition_id": d.id}
)
elif not warning_raised and existing:
existing.unlink()
elif not warning_applicable and existing:
existing.unlink()
def action_generate_warnings(self):
self._generate_ddmrp_warnings()
return True
@api.model
def cron_generate_ddmrp_warnings(self, automatic=False):
auto_commit = not getattr(threading.current_thread(), "testing", False)
buffer_ids = self.search([]).ids
i = 0
j = len(buffer_ids)
for buffer_chunk_ids in split_every(self.CRON_DDMRP_CHUNKS, buffer_ids):
for b in self.browse(buffer_chunk_ids).exists():
try:
i += 1
_logger.debug(
"ddmrp cron_generate_ddmrp_warnings: {}. ({}/{})".format(
b.name, i, j
)
)
if automatic:
with self.env.cr.savepoint():
b._generate_ddmrp_warnings()
else:
b._generate_ddmrp_warnings()
except Exception:
_logger.exception("Fail to compute Warnings for buffer %s", b.name)
if not automatic:
raise
if auto_commit:
self._cr.commit() # pylint: disable=E8102
return True
def write(self, vals):
# Unlink warning items when buffer is archived
res = super().write(vals)
if "active" in vals and not vals.get("active"):
self.ddmrp_warning_item_ids.unlink()
return res