[12.0][IMP] - Add check for substitution infinite loop
parent
b037b547c9
commit
3e57f28545
|
@ -10,7 +10,7 @@
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'author': 'ACSONE SA/NV,'
|
'author': 'ACSONE SA/NV,'
|
||||||
'Odoo Community Association (OCA)',
|
'Odoo Community Association (OCA)',
|
||||||
'website': 'https://github.com/acsone/reporting-engine',
|
'website': 'https://github.com/OCA/reporting-engine',
|
||||||
'depends': ['base', 'mail'],
|
'depends': ['base', 'mail'],
|
||||||
'data': [
|
'data': [
|
||||||
'security/ir_actions_report_substitution_rule.xml',
|
'security/ir_actions_report_substitution_rule.xml',
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
# Copyright 2019 ACSONE SA/NV
|
# Copyright 2019 ACSONE SA/NV
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import fields, models
|
from odoo import fields, models, api, _
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
class ActionsReportSubstitutionRule(models.Model):
|
class ActionsReportSubstitutionRule(models.Model):
|
||||||
|
@ -24,5 +25,23 @@ class ActionsReportSubstitutionRule(models.Model):
|
||||||
string="Substitution Report Action",
|
string="Substitution Report Action",
|
||||||
required=True,
|
required=True,
|
||||||
ondelete="cascade",
|
ondelete="cascade",
|
||||||
domain="[('model', '=', model)]"
|
domain="[('model', '=', model)]",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@api.constrains('substitution_action_report_id', 'action_report_id')
|
||||||
|
def _check_substitution_infinite_loop(self):
|
||||||
|
def _check_infinite_loop(original_report, substitution_report):
|
||||||
|
if original_report == substitution_report:
|
||||||
|
raise ValidationError(_("Substitution infinite loop detected"))
|
||||||
|
for (
|
||||||
|
substitution_rule
|
||||||
|
) in substitution_report.action_report_substitution_rule_ids:
|
||||||
|
_check_infinite_loop(
|
||||||
|
original_report,
|
||||||
|
substitution_rule.substitution_action_report_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
for rec in self:
|
||||||
|
_check_infinite_loop(
|
||||||
|
rec.action_report_id, rec.substitution_action_report_id
|
||||||
|
)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo.tests.common import TransactionCase
|
from odoo.tests.common import TransactionCase
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
class TestReportSubstitute(TransactionCase):
|
class TestReportSubstitute(TransactionCase):
|
||||||
|
@ -64,3 +65,16 @@ class TestReportSubstitute(TransactionCase):
|
||||||
res['report_name'],
|
res['report_name'],
|
||||||
self.substitution_rule.substitution_action_report_id.report_name,
|
self.substitution_rule.substitution_action_report_id.report_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_substitution_infinite_loop(self):
|
||||||
|
with self.assertRaises(ValidationError):
|
||||||
|
self.env['ir.actions.report.substitution.rule'].create(
|
||||||
|
{
|
||||||
|
'action_report_id': self.env.ref(
|
||||||
|
'report_substitute.substitution_report_print'
|
||||||
|
).id,
|
||||||
|
'substitution_action_report_id': self.env.ref(
|
||||||
|
'base.ir_module_reference_print'
|
||||||
|
).id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue