diff --git a/bi_sql_editor_aggregate/__init__.py b/bi_sql_editor_aggregate/__init__.py new file mode 100644 index 00000000..83e553ac --- /dev/null +++ b/bi_sql_editor_aggregate/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/bi_sql_editor_aggregate/__manifest__.py b/bi_sql_editor_aggregate/__manifest__.py new file mode 100644 index 00000000..ac3766f0 --- /dev/null +++ b/bi_sql_editor_aggregate/__manifest__.py @@ -0,0 +1,20 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'BI SQL Editor Aggregate', + 'summary': 'BI SQL Editor Aggregation', + 'version': '12.0.1.0.0', + 'license': 'AGPL-3', + 'category': 'Reporting', + 'author': 'Richard deMeester,Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/reporting-engine', + 'depends': [ + 'bi_sql_editor', + ], + 'data': [ + 'views/view_bi_sql_view.xml', + ], + 'demo': [ + ], + 'installable': True, +} diff --git a/bi_sql_editor_aggregate/description/icon.png b/bi_sql_editor_aggregate/description/icon.png new file mode 100644 index 00000000..c72ba5ca Binary files /dev/null and b/bi_sql_editor_aggregate/description/icon.png differ diff --git a/bi_sql_editor_aggregate/models/__init__.py b/bi_sql_editor_aggregate/models/__init__.py new file mode 100644 index 00000000..ef99aabc --- /dev/null +++ b/bi_sql_editor_aggregate/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import bi_sql_view +from . import bi_sql_view_field +from . import ir_model diff --git a/bi_sql_editor_aggregate/models/bi_sql_view.py b/bi_sql_editor_aggregate/models/bi_sql_view.py new file mode 100644 index 00000000..ceab2a34 --- /dev/null +++ b/bi_sql_editor_aggregate/models/bi_sql_view.py @@ -0,0 +1,38 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, tools + + +class BiSQLView(models.Model): + _inherit = 'bi.sql.view' + + def check_manual_fields(self, model): + # check the fields we need are defined on self, to stop it going + # early on install / startup - particularly problematic during upgrade + if 'group_operator' in tools.table_columns( + self.env.cr, 'bi_sql_view_field') and\ + model._name.startswith(self._model_prefix): + # Use SQL instead of ORM, as ORM might not be fully initialised - + # we have no control over the order that fields are defined! + # We are not concerned about user security rules. + self.env.cr.execute( + """ +SELECT + f.name, + f.ttype, + f.group_operator +FROM + bi_sql_view v + LEFT JOIN bi_sql_view_field f ON f.bi_sql_view_id = v.id +WHERE + v.model_name = %s +; + """, (model._name,) + ) + sql_fields = self.env.cr.fetchall() + + for sql_field in sql_fields: + if sql_field[0] in model._fields and\ + sql_field[1] in ('integer', 'float') and\ + sql_field[2]: + model._fields[sql_field[0]].group_operator = sql_field[2] diff --git a/bi_sql_editor_aggregate/models/bi_sql_view_field.py b/bi_sql_editor_aggregate/models/bi_sql_view_field.py new file mode 100644 index 00000000..00efc454 --- /dev/null +++ b/bi_sql_editor_aggregate/models/bi_sql_view_field.py @@ -0,0 +1,25 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models + + +class BiSQLViewField(models.Model): + _inherit = 'bi.sql.view.field' + + _GROUP_OPERATOR_SELECTION = [ + ('sum', 'Sum'), + ('avg', 'Average'), + ('min', 'Minimum'), + ('max', 'Maximum'), + ] + + _GRAPH_TYPE_SELECTION = [ + ('col', 'Column'), + ('row', 'Row'), + ('measure', 'Measure'), + ] + + group_operator = fields.Selection( + string='Group Operator', selection=_GROUP_OPERATOR_SELECTION, + help="By default, Odoo will sum the values when grouping. If you wish" + " to alter the behaviour, choose an alternate Group Operator") diff --git a/bi_sql_editor_aggregate/models/ir_model.py b/bi_sql_editor_aggregate/models/ir_model.py new file mode 100644 index 00000000..6ec21d50 --- /dev/null +++ b/bi_sql_editor_aggregate/models/ir_model.py @@ -0,0 +1,14 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class IrModelFields(models.Model): + _inherit = 'ir.model.fields' + + def _add_manual_fields(self, model): + super()._add_manual_fields(model) + if 'bi.sql.view' in self.env: + Sql = self.env['bi.sql.view'] + if hasattr(Sql, 'check_manual_fields'): + Sql.check_manual_fields(model) diff --git a/bi_sql_editor_aggregate/views/view_bi_sql_view.xml b/bi_sql_editor_aggregate/views/view_bi_sql_view.xml new file mode 100644 index 00000000..f81f62dc --- /dev/null +++ b/bi_sql_editor_aggregate/views/view_bi_sql_view.xml @@ -0,0 +1,19 @@ + + + + + + + bi.sql.view + + + + + + + + +