OCA reporting engine fork for dev and update.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.7 KiB

  1. # Copyright 2019 ACSONE SA/NV
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo import fields, models, api, _
  4. from odoo.exceptions import ValidationError
  5. class ActionsReportSubstitutionRule(models.Model):
  6. _name = 'ir.actions.report.substitution.rule'
  7. _description = 'Action Report Substitution Rule'
  8. _order = 'sequence ASC'
  9. sequence = fields.Integer(default=10)
  10. action_report_id = fields.Many2one(
  11. comodel_name="ir.actions.report",
  12. string="Report Action",
  13. required=True,
  14. ondelete="cascade",
  15. )
  16. model = fields.Char(related="action_report_id.model", store=True)
  17. domain = fields.Char(string="Domain", required=True, default="[]")
  18. substitution_action_report_id = fields.Many2one(
  19. comodel_name="ir.actions.report",
  20. string="Substitution Report Action",
  21. required=True,
  22. ondelete="cascade",
  23. domain="[('model', '=', model)]",
  24. )
  25. @api.constrains('substitution_action_report_id', 'action_report_id')
  26. def _check_substitution_infinite_loop(self):
  27. def _check_infinite_loop(original_report, substitution_report):
  28. if original_report == substitution_report:
  29. raise ValidationError(_("Substitution infinite loop detected"))
  30. for (
  31. substitution_rule
  32. ) in substitution_report.action_report_substitution_rule_ids:
  33. _check_infinite_loop(
  34. original_report,
  35. substitution_rule.substitution_action_report_id,
  36. )
  37. for rec in self:
  38. _check_infinite_loop(
  39. rec.action_report_id, rec.substitution_action_report_id
  40. )