From c5f5c7274d36986560e914bcecb56ffcb30a0b3d Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Tue, 21 Nov 2023 15:18:34 +0100 Subject: [PATCH] [FIX] web_pivot_computed_measure: Use js eval to avoid different types operation error --- .../static/src/helpers/utils.esm.js | 27 +++++++++++++++++++ .../static/src/pivot/pivot_model.esm.js | 3 ++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 web_pivot_computed_measure/static/src/helpers/utils.esm.js diff --git a/web_pivot_computed_measure/static/src/helpers/utils.esm.js b/web_pivot_computed_measure/static/src/helpers/utils.esm.js new file mode 100644 index 000000000..c50480220 --- /dev/null +++ b/web_pivot_computed_measure/static/src/helpers/utils.esm.js @@ -0,0 +1,27 @@ +/** @odoo-module **/ +/* Copyright 2022 Tecnativa - Carlos Roca + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) */ + +/** + * Helper function to eval text for a given object + * + * @param {String} text + * @param {Object} vals + * @returns {any} + */ +export const evalOperation = (text, vals) => { + for (const variable in vals) { + if (vals.hasOwnProperty(variable)) { + const regex = new RegExp(variable, "g"); + text = text.replace(regex, vals[variable]); + } + } + try { + // eslint-disable-next-line no-eval + const res = eval(text); + return res; + } catch (error) { + console.error("Error trying to eval operation:", error); + return; + } +}; diff --git a/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js b/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js index e7172b1bd..76f02bb69 100644 --- a/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js +++ b/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js @@ -6,6 +6,7 @@ import {PivotModel} from "@web/views/pivot/pivot_model"; import {patch} from "web.utils"; import {computeReportMeasures} from "@web/views/helpers/utils"; +import {evalOperation} from "../helpers/utils.esm"; patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { /** @@ -148,7 +149,7 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { subGroupData[cm.id] = false; } else { // eslint-disable-next-line no-undef - subGroupData[cm.id] = py.eval(cm.operation, subGroupData); + subGroupData[cm.id] = evalOperation(cm.operation, subGroupData); } } },