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.

114 lines
4.6 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. # Copyright 2015-2019 Onestein (<https://www.onestein.eu>)
  2. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
  3. from odoo import _, api, fields, models
  4. from odoo.exceptions import ValidationError
  5. class BveViewLine(models.Model):
  6. _name = "bve.view.line"
  7. _description = "BI View Editor Lines"
  8. name = fields.Char(compute="_compute_name")
  9. sequence = fields.Integer(default=1)
  10. bve_view_id = fields.Many2one("bve.view", ondelete="cascade")
  11. model_id = fields.Many2one("ir.model", string="Model")
  12. model_name = fields.Char(compute="_compute_model_name", store=True)
  13. table_alias = fields.Char()
  14. join_model_id = fields.Many2one("ir.model", string="Join Model")
  15. field_id = fields.Many2one("ir.model.fields", string="Field")
  16. field_name = fields.Char(compute="_compute_model_field_name", store=True)
  17. ttype = fields.Char(string="Type")
  18. description = fields.Char(translate=True)
  19. relation = fields.Char()
  20. join_node = fields.Char()
  21. left_join = fields.Boolean()
  22. row = fields.Boolean()
  23. column = fields.Boolean()
  24. measure = fields.Boolean()
  25. in_list = fields.Boolean()
  26. list_attr = fields.Selection(
  27. [("sum", "Sum"), ("avg", "Average"),], string="List Attribute", default="sum"
  28. )
  29. view_field_type = fields.Char(compute="_compute_view_field_type")
  30. @api.depends("row", "column", "measure")
  31. def _compute_view_field_type(self):
  32. for line in self:
  33. row = line.row and "row"
  34. column = line.column and "col"
  35. measure = line.measure and "measure"
  36. line.view_field_type = row or column or measure
  37. @api.constrains("row", "column", "measure")
  38. def _constrains_options_check(self):
  39. measure_types = ["float", "integer", "monetary"]
  40. for line in self.filtered(lambda l: l.row or l.column):
  41. if line.join_model_id or line.ttype in measure_types:
  42. err_msg = _("This field cannot be a row or a column.")
  43. raise ValidationError(err_msg)
  44. for line in self.filtered(lambda l: l.measure):
  45. if line.join_model_id or line.ttype not in measure_types:
  46. err_msg = _("This field cannot be a measure.")
  47. raise ValidationError(err_msg)
  48. @api.constrains("table_alias", "field_id")
  49. def _constrains_unique_fields_check(self):
  50. seen = set()
  51. for line in self.mapped("bve_view_id.field_ids"):
  52. if (line.table_alias, line.field_id.id,) not in seen:
  53. seen.add((line.table_alias, line.field_id.id,))
  54. else:
  55. raise ValidationError(
  56. _("Field %s/%s is duplicated.\n" "Please remove the duplications.")
  57. % (line.field_id.model, line.field_id.name)
  58. )
  59. @api.depends("field_id", "sequence")
  60. def _compute_name(self):
  61. for line in self.filtered(lambda l: l.field_id):
  62. field_name = line.field_id.name
  63. line.name = "x_bve_{}_{}".format(line.table_alias, field_name)
  64. @api.depends("model_id")
  65. def _compute_model_name(self):
  66. for line in self.filtered(lambda l: l.model_id):
  67. line.model_name = line.model_id.model
  68. @api.depends("field_id")
  69. def _compute_model_field_name(self):
  70. for line in self.filtered(lambda l: l.field_id):
  71. field_name = line.description
  72. model_name = line.model_name
  73. line.field_name = "{} ({})".format(field_name, model_name)
  74. def _prepare_field_vals(self):
  75. vals_list = []
  76. for line in self:
  77. field = line.field_id
  78. vals = {
  79. "name": line.name,
  80. "complete_name": field.complete_name,
  81. "model": line.bve_view_id.model_name,
  82. "relation": field.relation,
  83. "field_description": line.description,
  84. "ttype": field.ttype,
  85. "selection": field.selection,
  86. "size": field.size,
  87. "state": "manual",
  88. "readonly": True,
  89. "groups": [(6, 0, field.groups.ids)],
  90. }
  91. if vals["ttype"] == "monetary":
  92. vals.update({"ttype": "float"})
  93. if field.ttype == "selection" and not field.selection:
  94. model_obj = self.env[field.model_id.model]
  95. selection = model_obj._fields[field.name].selection
  96. if callable(selection):
  97. selection_domain = selection(model_obj)
  98. else:
  99. selection_domain = selection
  100. vals.update({"selection": str(selection_domain)})
  101. vals_list.append(vals)
  102. return vals_list