diff --git a/bi_sql_editor/models/__init__.py b/bi_sql_editor/models/__init__.py
index e27e52a8..ef99aabc 100644
--- a/bi_sql_editor/models/__init__.py
+++ b/bi_sql_editor/models/__init__.py
@@ -2,3 +2,4 @@
from . import bi_sql_view
from . import bi_sql_view_field
+from . import ir_model
diff --git a/bi_sql_editor/models/bi_sql_view.py b/bi_sql_editor/models/bi_sql_view.py
index 3adec90e..6c5627f7 100644
--- a/bi_sql_editor/models/bi_sql_view.py
+++ b/bi_sql_editor/models/bi_sql_view.py
@@ -9,7 +9,7 @@ from psycopg2 import ProgrammingError
from odoo import SUPERUSER_ID, _, api, fields, models
from odoo.exceptions import UserError
-from odoo.tools import pycompat, sql
+from odoo.tools import pycompat, sql, table_columns
from odoo.tools.safe_eval import safe_eval
from odoo.addons.base.models.ir_model import IrModel
@@ -726,6 +726,40 @@ class BiSQLView(models.Model):
self._log_execute(req)
sql_view.size = self.env.cr.fetchone()[0]
+ 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 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]
+
def button_preview_sql_expression(self):
self.button_validate_sql_expression()
res = self._execute_sql_request()
diff --git a/bi_sql_editor/models/bi_sql_view_field.py b/bi_sql_editor/models/bi_sql_view_field.py
index 95cecb85..1689f7a3 100644
--- a/bi_sql_editor/models/bi_sql_view_field.py
+++ b/bi_sql_editor/models/bi_sql_view_field.py
@@ -49,6 +49,13 @@ class BiSQLViewField(models.Model):
"timestamp without time zone": "datetime",
}
+ _GROUP_OPERATOR_SELECTION = [
+ ("sum", "Sum"),
+ ("avg", "Average"),
+ ("min", "Minimum"),
+ ("max", "Maximum"),
+ ]
+
name = fields.Char(string="Name", required=True, readonly=True)
sql_type = fields.Char(
@@ -114,6 +121,13 @@ class BiSQLViewField(models.Model):
help="For 'Many2one' Odoo field.\n" " Comodel of the field.",
)
+ 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",
+ )
+
# Constrains Section
@api.constrains("is_index")
def _check_index_materialized(self):
diff --git a/bi_sql_editor/models/ir_model.py b/bi_sql_editor/models/ir_model.py
new file mode 100644
index 00000000..e3d7ed1f
--- /dev/null
+++ b/bi_sql_editor/models/ir_model.py
@@ -0,0 +1,9 @@
+from odoo import models
+
+
+class IrModelFields(models.Model):
+ _inherit = "ir.model.fields"
+
+ def _add_manual_fields(self, model):
+ super()._add_manual_fields(model)
+ self.env["bi.sql.view"].check_manual_fields(model)
diff --git a/bi_sql_editor/readme/CONTRIBUTORS.rst b/bi_sql_editor/readme/CONTRIBUTORS.rst
index 6837a2b2..1b4d1c03 100644
--- a/bi_sql_editor/readme/CONTRIBUTORS.rst
+++ b/bi_sql_editor/readme/CONTRIBUTORS.rst
@@ -1,4 +1,6 @@
* Sylvain LE GAL (https://twitter.com/legalsylvain)
+* Richard deMeester, WilldooIT (http://www.willdooit.com/)
+* David James, WilldooIT (http://www.willdooit.com/)
* This module is highly inspired by the work of
* Onestein: (http://www.onestein.nl/)
diff --git a/bi_sql_editor/views/view_bi_sql_view.xml b/bi_sql_editor/views/view_bi_sql_view.xml
index bbbd1a0b..f2b127ee 100644
--- a/bi_sql_editor/views/view_bi_sql_view.xml
+++ b/bi_sql_editor/views/view_bi_sql_view.xml
@@ -149,6 +149,11 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+