[FIX] account_report: change formula's update of expression

How to reproduce:
- Have a report line with a custom creation with a 'balance' label
- Replace the expression by an `account_code_formula` in the xml
=> The 'balance' expression does not exist anymore in the xml,
so the ORM removes it, and a new one is not created.

We changed the update so only 'balance' label expressions are changed:
- if we have an expression with an xml_id, we remove the expression and
recreate a new one.
- if we don't (custom created or coming already from a formula shortcut),
we just update its values.
We also created a way to remove a formula shortcut (making it falsy will
unlink the expression that was linked to it)

closes odoo/odoo#110119

X-original-commit: d01a7b76bee4471444eeedacc05bd52fe9c0399c
Signed-off-by: Olivier Colson (oco) <oco@odoo.com>
Signed-off-by: Wala Gauthier (gawa) <gawa@odoo.com>
This commit is contained in:
gawa-odoo
2023-01-17 14:16:42 +01:00
committed by oco-odoo
parent e2c082717b
commit 4f9a5a73f4
+14 -2
View File
@@ -342,6 +342,7 @@ class AccountReportLine(models.Model):
# create account.report.expression for each report line based on the formula provided to each
# engine-related field. This makes xmls a bit shorter
vals_list = []
xml_ids = self.expression_ids.filtered(lambda exp: exp.label == 'balance').get_external_id()
for report_line in self:
if engine == 'domain' and report_line.domain_formula:
subformula, formula = DOMAIN_REGEX.match(report_line.domain_formula or '').groups()
@@ -352,6 +353,10 @@ class AccountReportLine(models.Model):
elif engine == 'aggregation' and report_line.aggregation_formula:
subformula, formula = None, report_line.aggregation_formula
else:
# If we want to replace a formula shortcut with a full-syntax expression, we need to make the formula field falsy
# We can't simply remove it from the xml because it won't be updated
# If the formula field is falsy, we need to remove the expression that it generated
report_line.expression_ids.filtered(lambda exp: exp.engine == engine and exp.label == 'balance' and not xml_ids.get(exp.id)).unlink()
continue
vals = {
@@ -365,8 +370,15 @@ class AccountReportLine(models.Model):
# expressions already exists, update the first expression with the right engine
# since syntactic sugar aren't meant to be used with multiple expressions
for expression in report_line.expression_ids:
if expression.engine == engine:
expression.write(vals)
if expression.label == 'balance':
# If we had a 'balance' expression coming from the xml and are using a formula shortcut on top of it,
# we expect the shortcut to replace the original expression. The full declaration should also
# be removed from the data file, leading to the ORM deleting it automatically.
if xml_ids.get(expression.id):
expression.unlink()
vals_list.append(vals)
else:
expression.write(vals)
break
else:
# else prepare batch creation