From d61396fe9c99e26ab5994bc7b594d5ebd7515bed Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Fri, 5 Jun 2026 10:05:52 +0700 Subject: [PATCH] feat: implement analytic distribution sanitization and cleaning via analytic_mixin inheritance --- models/__init__.py | 1 + models/account_move.py | 10 ++++++++++ models/analytic_mixin.py | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 models/analytic_mixin.py diff --git a/models/__init__.py b/models/__init__.py index bdd3b05..e3d9504 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -7,4 +7,5 @@ from . import pos_session from . import pos_order from . import account_move from . import res_company +from . import analytic_mixin diff --git a/models/account_move.py b/models/account_move.py index e6c1759..de75274 100644 --- a/models/account_move.py +++ b/models/account_move.py @@ -84,3 +84,13 @@ class AccountMove(models.Model): print(f" Parent Move Posted: {parent_move.name}") return res + + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + def _related_analytic_distribution(self): + res = super()._related_analytic_distribution() + if res: + return self.env['analytic.mixin']._clean_analytic_distribution(res) + return res diff --git a/models/analytic_mixin.py b/models/analytic_mixin.py new file mode 100644 index 0000000..90e5594 --- /dev/null +++ b/models/analytic_mixin.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from odoo import models, api + +class AnalyticMixin(models.AbstractModel): + _inherit = 'analytic.mixin' + + def _sanitize_values(self, vals, decimal_precision): + if 'analytic_distribution' in vals: + dist = vals.get('analytic_distribution') + if dist: + if isinstance(dist, str): + import json + try: + dist = json.loads(dist) + except Exception: + dist = {} + vals['analytic_distribution'] = self._clean_analytic_distribution(dist) or False + else: + vals['analytic_distribution'] = False + return super()._sanitize_values(vals, decimal_precision) + + @api.model + def _clean_analytic_distribution(self, dist): + if not dist or not isinstance(dist, dict): + return {} + clean_dist = {} + for key, val in dist.items(): + str_key = str(key) + if str_key == '__update__': + clean_dist[str_key] = val + elif str_key: + if all(part.isdigit() for part in str_key.split(',')): + try: + clean_dist[str_key] = float(val) + except (TypeError, ValueError): + pass + return clean_dist