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.

74 lines
2.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 api, fields, models
  4. from odoo.tools.safe_eval import safe_eval
  5. class IrActionReport(models.Model):
  6. _inherit = 'ir.actions.report'
  7. action_report_substitution_rule_ids = fields.One2many(
  8. comodel_name="ir.actions.report.substitution.rule",
  9. inverse_name="action_report_id",
  10. string="Substitution Rules",
  11. )
  12. @api.multi
  13. def _get_substitution_report(self, model, active_ids):
  14. self.ensure_one()
  15. model = self.env[model]
  16. for (
  17. substitution_report_rule
  18. ) in self.action_report_substitution_rule_ids:
  19. domain = safe_eval(substitution_report_rule.domain)
  20. domain.append(('id', 'in', active_ids))
  21. if set(model.search(domain).ids) == set(active_ids):
  22. return substitution_report_rule.substitution_action_report_id
  23. return False
  24. @api.multi
  25. def get_substitution_report(self, active_ids):
  26. self.ensure_one()
  27. action_report = self
  28. substitution_report = action_report
  29. while substitution_report:
  30. action_report = substitution_report
  31. substitution_report = action_report._get_substitution_report(
  32. action_report.model, active_ids
  33. )
  34. return action_report
  35. @api.model
  36. def get_substitution_report_action(self, action, active_ids):
  37. if action.get('id'):
  38. action_report = self.browse(action['id'])
  39. substitution_report = action_report
  40. while substitution_report:
  41. action_report = substitution_report
  42. substitution_report = action_report._get_substitution_report(
  43. action_report.model, active_ids
  44. )
  45. action.update(action_report.read()[0])
  46. return action
  47. @api.multi
  48. def render(self, res_ids, data=None):
  49. substitution_report = self.get_substitution_report(res_ids)
  50. return super(IrActionReport, substitution_report).render(res_ids, data)
  51. @api.noguess
  52. def report_action(self, docids, data=None, config=True):
  53. if docids:
  54. if isinstance(docids, models.Model):
  55. active_ids = docids.ids
  56. elif isinstance(docids, int):
  57. active_ids = [docids]
  58. elif isinstance(docids, list):
  59. active_ids = docids
  60. substitution_report = self.get_substitution_report(active_ids)
  61. return super(IrActionReport, substitution_report).report_action(
  62. docids, data, config
  63. )
  64. return super().report_action(docids, data, config)