feat(jobs): add fp.job.node.override for per-job opt-in/out decisions

Mirror of fusion.plating.job.node.override from bridge_mrp, but
bound to fp.job. bridge_mrp's version stays alive for legacy MO
flow during the migration. Both coexist.

Adds override_ids One2many to fp.job via _inherit, plus
unique(job_id, node_id) constraint.

Note: spec-suggested _sql_constraints syntax is deprecated in
Odoo 19 ("Model attribute '_sql_constraints' is no longer
supported, please define model.Constraint on the model"). Used
the new class-attribute form: _unique_job_node = models.Constraint(...).
Verified the UNIQUE index is created on the table.

3 new tests: create, uniqueness, one2many backref.

Manifest 19.0.1.1.1 -> 19.0.1.2.0.

Part of: native job model migration (spec 2026-04-25)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-04-24 23:12:53 -04:00
parent 36b9f30528
commit 4c68327b9c
6 changed files with 107 additions and 1 deletions

View File

@@ -98,3 +98,59 @@ class TestFpJobExtensions(TransactionCase):
self.assertEqual(job.customer_spec_id, spec)
self.assertEqual(job.portal_job_id, portal)
self.assertEqual(job.delivery_id, delivery)
class TestFpJobNodeOverride(TransactionCase):
def setUp(self):
super().setUp()
self.partner = self.env['res.partner'].create({'name': 'C'})
self.product = self.env['product.product'].create({'name': 'W'})
self.job = self.env['fp.job'].create({
'partner_id': self.partner.id,
'product_id': self.product.id,
'qty': 1.0,
})
# Create a recipe + opt-in node
self.recipe = self.env['fusion.plating.process.node'].create({
'name': 'TestRecipe',
'node_type': 'recipe',
})
self.opt_in_node = self.env['fusion.plating.process.node'].create({
'name': 'OptInOp',
'node_type': 'operation',
'parent_id': self.recipe.id,
'opt_in_out': 'opt_in',
})
def test_create_override(self):
ovr = self.env['fp.job.node.override'].create({
'job_id': self.job.id,
'node_id': self.opt_in_node.id,
'included': True,
})
self.assertEqual(ovr.job_id, self.job)
self.assertTrue(ovr.included)
def test_unique_constraint(self):
from psycopg2 import IntegrityError
from odoo.tools import mute_logger
self.env['fp.job.node.override'].create({
'job_id': self.job.id,
'node_id': self.opt_in_node.id,
'included': True,
})
with self.assertRaises(IntegrityError), mute_logger('odoo.sql_db'):
with self.env.cr.savepoint():
self.env['fp.job.node.override'].create({
'job_id': self.job.id,
'node_id': self.opt_in_node.id,
'included': False,
})
def test_override_ids_one2many(self):
ovr = self.env['fp.job.node.override'].create({
'job_id': self.job.id,
'node_id': self.opt_in_node.id,
})
self.job.invalidate_recordset(['override_ids'])
self.assertIn(ovr, self.job.override_ids)