[FIX] analytic: group by with domain including analytic_distribution

To reproduce
============
on journal items add filter (Analytic contains something) and group by Account, no lines will be shown.

Problem
=======
`analytic_distribution` is a Json field stored as string in database as follows: `{"id" : "percentage"}`, which explains why no result is returned as there is no trace for Analytics name.

Solution
========
following same [fix](https://github.com/odoo/odoo/commit/bc5b72937a1c79688f7f6dc1c8aeaa7eb4cb6744), we replace `analytic_distribution` by `analytic_distribution_search` in the domain of `read_group`.

opw-3391182

closes odoo/odoo#129263

X-original-commit: 05209fd295727cbbb5bf6a316f3c8873de6b2bed
Signed-off-by: William André (wan) <wan@odoo.com>
Signed-off-by: Abdelouahab Laaroussi (abla) <abla@odoo.com>
This commit is contained in:
Abdelouahab (abla)
2023-07-24 10:14:27 +02:00
parent 24f7849d77
commit 9a2128ae35
+12 -3
View File
@@ -64,11 +64,14 @@ class AnalyticMixin(models.AbstractModel):
@api.model
def _search(self, domain, offset=0, limit=None, order=None, access_rights_uid=None):
for arg in domain:
if isinstance(arg, (list, tuple)) and arg[0] == 'analytic_distribution' and isinstance(arg[2], str):
arg[0] = 'analytic_distribution_search'
domain = self._apply_analytic_distribution_domain(domain)
return super()._search(domain, offset, limit, order, access_rights_uid)
@api.model
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
domain = self._apply_analytic_distribution_domain(domain)
return super().read_group(domain, fields, groupby, offset, limit, orderby, lazy)
def write(self, vals):
""" Format the analytic_distribution float value, so equality on analytic_distribution can be done """
decimal_precision = self.env['decimal.precision'].precision_get('Percentage Analytic')
@@ -103,3 +106,9 @@ class AnalyticMixin(models.AbstractModel):
vals['analytic_distribution'] = vals.get('analytic_distribution') and {
account_id: float_round(distribution, decimal_precision) for account_id, distribution in vals['analytic_distribution'].items()}
return vals
def _apply_analytic_distribution_domain(self, domain):
return [
('analytic_distribution_search', leaf[1], leaf[2]) if len(leaf) == 3 and leaf[0] == 'analytic_distribution' else leaf
for leaf in domain
]