diff --git a/partner_account_multicompany_default/models/partner.py b/partner_account_multicompany_default/models/partner.py index 7ab0bbf0ca8..f0d76d04f72 100644 --- a/partner_account_multicompany_default/models/partner.py +++ b/partner_account_multicompany_default/models/partner.py @@ -1,7 +1,7 @@ # Copyright 2023 Moduon Team S.L. # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0) -from odoo import api, models +from odoo import models class Partner(models.Model): @@ -31,25 +31,15 @@ def propagate_multicompany_payment_term_id(self): def propagate_multicompany_supplier_payment_term_id(self): self._propagate_multicompany_field("property_supplier_payment_term_id") - @api.model_create_multi - def create(self, vals_list): - """Propagate accounts to other companies always, on creation.""" - res = super().create(vals_list) - multicompany_partners = res - res.filtered("company_id") - payable_partners = multicompany_partners.filtered("property_account_payable_id") - receivable_partners = multicompany_partners.filtered( - "property_account_receivable_id" - ) - position_partners = multicompany_partners.filtered( - "property_account_position_id" - ) - payment_term_partners = multicompany_partners.filtered( - "property_payment_term_id" - ) - payment_term_partners = multicompany_partners.filtered( - "property_payment_term_id" - ) - supplier_payment_term_partners = multicompany_partners.filtered( + def _propagate_property_fields(self): + """Propagate accounts to other companies always.""" + super()._propagate_property_fields() + payable_partners = self.filtered("property_account_payable_id") + receivable_partners = self.filtered("property_account_receivable_id") + position_partners = self.filtered("property_account_position_id") + payment_term_partners = self.filtered("property_payment_term_id") + payment_term_partners = self.filtered("property_payment_term_id") + supplier_payment_term_partners = self.filtered( "property_supplier_payment_term_id" ) if ( @@ -60,15 +50,14 @@ def create(self, vals_list): and not payment_term_partners and not supplier_payment_term_partners ): - return res + return # Skip if user has access to only one company alien_user_companies = self.env.user.company_ids - self.env.company if not alien_user_companies: - return res + return # Propagate account to other companies by default payable_partners.propagate_multicompany_account_payable() receivable_partners.propagate_multicompany_account_receivable() position_partners.propagate_multicompany_account_position() payment_term_partners.propagate_multicompany_payment_term_id() supplier_payment_term_partners.propagate_multicompany_supplier_payment_term_id() - return res diff --git a/partner_base_multicompany_default/models/partner.py b/partner_base_multicompany_default/models/partner.py index 0ef25140263..64ca586cdf9 100644 --- a/partner_base_multicompany_default/models/partner.py +++ b/partner_base_multicompany_default/models/partner.py @@ -7,7 +7,7 @@ from itertools import groupby from operator import itemgetter, or_ -from odoo import _, models +from odoo import _, api, models from odoo.exceptions import UserError from odoo.osv import expression @@ -145,3 +145,24 @@ def _propagate_multicompany_field(self, field): sorted_partners._propagate_multicompany_m2o(field) else: sorted_partners._propagate_multicompany_value(field) + + def _propagate_property_fields(self): + return + + @api.model_create_multi + def create(self, vals_list): + """Propagate property values on creation to other companies.""" + res = super().create(vals_list) + multicompany_partners = res - res.filtered("company_id") + multicompany_partners._propagate_property_fields() + return res + + def write(self, vals): + """If forced, propagate property values on update to other companies.""" + res = super().write(vals) + # Allow opt-in for progagation on write using context + # Useful for data import to update records + if self.env.context.get("force_property_propagation"): + multicompany_partners = self - self.filtered("company_id") + multicompany_partners._propagate_property_fields() + return res diff --git a/partner_delivery_multicompany_default/models/partner.py b/partner_delivery_multicompany_default/models/partner.py index 846257fac2d..d04a095675d 100644 --- a/partner_delivery_multicompany_default/models/partner.py +++ b/partner_delivery_multicompany_default/models/partner.py @@ -1,7 +1,7 @@ # Copyright 2023 Moduon Team S.L. # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0) -from odoo import api, models +from odoo import models class Partner(models.Model): @@ -13,21 +13,19 @@ def _get_multicompany_delivery_carrier_key(self): def propagate_multicompany_delivery_carrier(self): self._propagate_multicompany_field("property_delivery_carrier_id") - @api.model_create_multi - def create(self, vals_list): + def _propagate_property_fields(self): """Propagate delivery carrier to other companies always, on creation.""" - res = super().create(vals_list) - multicompany_partners = res - res.filtered("company_id") + super()._propagate_property_fields() + multicompany_partners = self - self.filtered("company_id") delivery_partners = multicompany_partners.filtered( "property_delivery_carrier_id" ) # Skip if no delivery was selected if not delivery_partners: - return res + return # Skip if user has access to only one company alien_user_companies = self.env.user.company_ids - self.env.company if not alien_user_companies: - return res + return # Propagate delivery carrier to other companies by default delivery_partners.propagate_multicompany_delivery_carrier() - return res diff --git a/partner_product_multicompany_default/models/partner.py b/partner_product_multicompany_default/models/partner.py index d9f51f4b258..a2a8b368728 100644 --- a/partner_product_multicompany_default/models/partner.py +++ b/partner_product_multicompany_default/models/partner.py @@ -1,7 +1,7 @@ # Copyright 2023 Moduon Team S.L. # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0) -from odoo import api, models +from odoo import models class Partner(models.Model): @@ -13,21 +13,19 @@ def _get_multicompany_product_pricelist_key(self): def propagate_multicompany_product_pricelist(self): self._propagate_multicompany_field("property_product_pricelist") - @api.model_create_multi - def create(self, vals_list): + def _propagate_property_fields(self): """Propagate product pricelist to other companies always, on creation.""" - res = super().create(vals_list) - multicompany_partners = res - res.filtered("company_id") + super()._propagate_property_fields() + multicompany_partners = self - self.filtered("company_id") pricelist_partners = multicompany_partners.filtered( "property_product_pricelist" ) # Skip if no pricelist was selected if not pricelist_partners: - return res + return # Skip if user has access to only one company alien_user_companies = self.env.user.company_ids - self.env.company if not alien_user_companies: - return res + return # Propagate pricelist to other companies by default pricelist_partners.propagate_multicompany_product_pricelist() - return res diff --git a/partner_purchase_multicompany_default/models/partner.py b/partner_purchase_multicompany_default/models/partner.py index b58d70b804d..18fbbbe67d6 100644 --- a/partner_purchase_multicompany_default/models/partner.py +++ b/partner_purchase_multicompany_default/models/partner.py @@ -1,7 +1,7 @@ # Copyright 2023 Moduon Team S.L. # Copyright 2024 Camptocamp SA # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0) -from odoo import api, models +from odoo import models class Partner(models.Model): @@ -11,21 +11,19 @@ def propagate_multicompany_purchase_currency(self): # currency are shared acrosse companies self._propagate_multicompany_field("property_purchase_currency_id") - @api.model_create_multi - def create(self, vals_list): + def _propagate_property_fields(self): """Propagate accounts to other companies always, on creation.""" - res = super().create(vals_list) - multicompany_partners = res - res.filtered("company_id") + super()._propagate_property_fields() + multicompany_partners = self - self.filtered("company_id") purchase_currency_partners = multicompany_partners.filtered( "property_purchase_currency_id" ) # Skip if no currency was selected if not purchase_currency_partners: - return res + return # Skip if user has access to only one company alien_user_companies = self.env.user.company_ids - self.env.company if not alien_user_companies: - return res + return # Propagate account to other companies by default purchase_currency_partners.propagate_multicompany_purchase_currency() - return res diff --git a/product_account_multicompany_default/models/product.py b/product_account_multicompany_default/models/product.py index 62d0890f9bf..1c2d63d1c54 100644 --- a/product_account_multicompany_default/models/product.py +++ b/product_account_multicompany_default/models/product.py @@ -84,23 +84,36 @@ def propagate_multicompany_account_income(self): def propagate_multicompany_account_expense(self): self._propagate_multicompany_account("property_account_expense_id") - @api.model_create_multi - def create(self, vals_list): - """Propagate accounts to other companies always, on creation.""" - res = super().create(vals_list) - multicompany_products = res - res.filtered("company_id") - income_products = multicompany_products.filtered("property_account_income_id") - expense_products = multicompany_products.filtered("property_account_expense_id") + def _propagate_property_fields(self): + income_products = self.filtered("property_account_income_id") + expense_products = self.filtered("property_account_expense_id") # Skip if no account was selected if not income_products and not expense_products: - return res + return # Skip if user has access to only one company alien_user_companies = self.env.user.company_ids - self.env.company if not alien_user_companies: - return res + return # Propagate account to other companies by default income_products.propagate_multicompany_account_income() expense_products.propagate_multicompany_account_expense() + + @api.model_create_multi + def create(self, vals_list): + """Propagate accounts to other companies always, on creation.""" + res = super().create(vals_list) + multicompany_products = res - res.filtered("company_id") + multicompany_products._propagate_property_fields() + return res + + def write(self, vals): + """If forced, propagate property values on write to other companies.""" + res = super().write(vals) + # Allow opt-in for progagation on write using context + # Useful for data import to update records + if self.env.context.get("force_property_propagation"): + multicompany_products = self - self.filtered("company_id") + multicompany_products._propagate_property_fields() return res