[IMP] product_category_tax: set tax performance on large recordsets

1) database searching is much more efficient than py filtering
2) writing on multiple products at once is more efficient
This commit is contained in:
Ivàn Todorovich
2022-06-30 15:46:33 -03:00
parent 7bdf221081
commit 3ed4fbbddd
3 changed files with 23 additions and 10 deletions

View File

@@ -29,7 +29,12 @@ class ProductCategory(models.Model):
)
def update_product_taxes(self):
for template in self.product_template_ids.filtered(
lambda p: p.taxes_updeatable_from_category
):
template.set_tax_from_category()
products = self.env["product.template"].search(
[
("categ_id", "in", self.ids),
("taxes_updeatable_from_category", "=", True),
]
)
if not products:
return True
return products.set_tax_from_category()

View File

@@ -13,6 +13,4 @@ class ProductProduct(models.Model):
self.set_tax_from_category()
def set_tax_from_category(self):
self.ensure_one()
self.taxes_id = [(6, 0, self.categ_id.taxes_id.ids)]
self.supplier_taxes_id = [(6, 0, self.categ_id.supplier_taxes_id.ids)]
return self.product_tmpl_id.set_tax_from_category()

View File

@@ -1,6 +1,8 @@
# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from collections import defaultdict
from odoo import api, fields, models
@@ -15,6 +17,14 @@ class ProductTemplate(models.Model):
self.set_tax_from_category()
def set_tax_from_category(self):
self.ensure_one()
self.taxes_id = [(6, 0, self.categ_id.taxes_id.ids)]
self.supplier_taxes_id = [(6, 0, self.categ_id.supplier_taxes_id.ids)]
records_by_categ = defaultdict(lambda: self.browse())
for rec in self:
records_by_categ[rec.categ_id] += rec
for categ, records in records_by_categ.items():
records.write(
{
"taxes_id": [(6, 0, categ.taxes_id.ids)],
"supplier_taxes_id": [(6, 0, categ.supplier_taxes_id.ids)],
}
)
return True