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.

115 lines
4.6 KiB

  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'),
  28. ('avg', 'Average'),
  29. ], string='List Attribute', default='sum')
  30. view_field_type = fields.Char(compute='_compute_view_field_type')
  31. @api.depends('row', 'column', 'measure')
  32. def _compute_view_field_type(self):
  33. for line in self:
  34. row = line.row and 'row'
  35. column = line.column and 'col'
  36. measure = line.measure and 'measure'
  37. line.view_field_type = row or column or measure
  38. @api.constrains('row', 'column', 'measure')
  39. def _constrains_options_check(self):
  40. measure_types = ['float', 'integer', 'monetary']
  41. for line in self.filtered(lambda l: l.row or l.column):
  42. if line.join_model_id or line.ttype in measure_types:
  43. err_msg = _('This field cannot be a row or a column.')
  44. raise ValidationError(err_msg)
  45. for line in self.filtered(lambda l: l.measure):
  46. if line.join_model_id or line.ttype not in measure_types:
  47. err_msg = _('This field cannot be a measure.')
  48. raise ValidationError(err_msg)
  49. @api.constrains('table_alias', 'field_id')
  50. def _constrains_unique_fields_check(self):
  51. seen = set()
  52. for line in self.mapped('bve_view_id.field_ids'):
  53. if (line.table_alias, line.field_id.id, ) not in seen:
  54. seen.add((line.table_alias, line.field_id.id, ))
  55. else:
  56. raise ValidationError(_('Field %s/%s is duplicated.\n'
  57. 'Please remove the duplications.') % (
  58. line.field_id.model, line.field_id.name
  59. ))
  60. @api.depends('field_id', 'sequence')
  61. def _compute_name(self):
  62. for line in self.filtered(lambda l: l.field_id):
  63. field_name = line.field_id.name
  64. line.name = 'x_bve_%s_%s' % (line.table_alias, field_name,)
  65. @api.depends('model_id')
  66. def _compute_model_name(self):
  67. for line in self.filtered(lambda l: l.model_id):
  68. line.model_name = line.model_id.model
  69. @api.depends('field_id')
  70. def _compute_model_field_name(self):
  71. for line in self.filtered(lambda l: l.field_id):
  72. field_name = line.description
  73. model_name = line.model_name
  74. line.field_name = '%s (%s)' % (field_name, model_name, )
  75. def _prepare_field_vals(self):
  76. vals_list = []
  77. for line in self:
  78. field = line.field_id
  79. vals = {
  80. 'name': line.name,
  81. 'complete_name': field.complete_name,
  82. 'model': line.bve_view_id.model_name,
  83. 'relation': field.relation,
  84. 'field_description': line.description,
  85. 'ttype': field.ttype,
  86. 'selection': field.selection,
  87. 'size': field.size,
  88. 'state': 'manual',
  89. 'readonly': True,
  90. 'groups': [(6, 0, field.groups.ids)],
  91. }
  92. if vals['ttype'] == 'monetary':
  93. vals.update({'ttype': 'float'})
  94. if field.ttype == 'selection' and not field.selection:
  95. model_obj = self.env[field.model_id.model]
  96. selection = model_obj._fields[field.name].selection
  97. if callable(selection):
  98. selection_domain = selection(model_obj)
  99. else:
  100. selection_domain = selection
  101. vals.update({'selection': str(selection_domain)})
  102. vals_list.append(vals)
  103. return vals_list