summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2020-01-07 13:37:34 +0000
committerThibault Delavallée <tde@odoo.com>2020-01-07 14:45:48 +0000
commit7943b71af39bdd5eeae2dcf84c8faf8aa56a2232 (patch)
tree428e7cef0985418ce5ad7d2960963707bd31bee7
parente582500c4bd316711d55948d0cb820bd7f71d34a (diff)
[FIX] base(_address_extended): correctly update company street information at write
Currently when writing on street field of company model, its sub-fields (notably street_name, street_number and street_number2) are not correctly computed again in cache. Indeed address sub fields have no direct trigger as it depends on its partner_id and its partner_id children (see ``res_partner.address_get()`` and ``res_company._compute_address()``). When writing on address fields from the company record, we then invalidate all address fields cache in order to force their computation. This commit adds a new tool method giving the list of fields coming from the address partner to copy upon the company. Task ID 2158302 PR #42678
-rw-r--r--addons/base_address_extended/models/base_address_extended.py11
-rw-r--r--odoo/addons/base/models/res_company.py29
2 files changed, 20 insertions, 20 deletions
diff --git a/addons/base_address_extended/models/base_address_extended.py b/addons/base_address_extended/models/base_address_extended.py
index 173e45abb3d..5f5a9c643ef 100644
--- a/addons/base_address_extended/models/base_address_extended.py
+++ b/addons/base_address_extended/models/base_address_extended.py
@@ -158,14 +158,9 @@ class Company(models.Model):
street_number2 = fields.Char('Door Number', compute='_compute_address',
inverse='_inverse_street_number2')
- def _get_company_address_fields(self, partner):
- address_fields = super(Company, self)._get_company_address_fields(partner)
- address_fields.update({
- 'street_name': partner.street_name,
- 'street_number': partner.street_number,
- 'street_number2': partner.street_number2,
- })
- return address_fields
+ def _get_company_address_field_names(self):
+ fields_matching = super(Company, self)._get_company_address_field_names()
+ return list(set(fields_matching + ['street_name', 'street_number', 'street_number2']))
def _inverse_street_name(self):
for company in self:
diff --git a/odoo/addons/base/models/res_company.py b/odoo/addons/base/models/res_company.py
index 71ecfd4dd6b..240a4b8de97 100644
--- a/odoo/addons/base/models/res_company.py
+++ b/odoo/addons/base/models/res_company.py
@@ -104,7 +104,6 @@ class Company(models.Model):
('name_uniq', 'unique (name)', 'The company name must be unique !')
]
-
def init(self):
for company in self.search([('paperformat_id', '=', False)]):
paperformat_euro = self.env.ref('base.paperformat_euro', False)
@@ -114,15 +113,14 @@ class Company(models.Model):
if hasattr(sup, 'init'):
sup.init()
- def _get_company_address_fields(self, partner):
- return {
- 'street' : partner.street,
- 'street2' : partner.street2,
- 'city' : partner.city,
- 'zip' : partner.zip,
- 'state_id' : partner.state_id,
- 'country_id' : partner.country_id,
- }
+ def _get_company_address_field_names(self):
+ """ Return a list of fields coming from the address partner to match
+ on company address fields. Fields are labeled same on both models. """
+ return ['street', 'street2', 'city', 'zip', 'state_id', 'country_id']
+
+ def _get_company_address_update(self, partner):
+ return dict((fname, partner[fname])
+ for fname in self._get_company_address_field_names())
# TODO @api.depends(): currently now way to formulate the dependency on the
# partner's contact address
@@ -131,7 +129,7 @@ class Company(models.Model):
address_data = company.partner_id.sudo().address_get(adr_pref=['contact'])
if address_data['contact']:
partner = company.partner_id.browse(address_data['contact']).sudo()
- company.update(company._get_company_address_fields(partner))
+ company.update(company._get_company_address_update(partner))
def _inverse_street(self):
for company in self:
@@ -247,7 +245,14 @@ class Company(models.Model):
if not currency.active:
currency.write({'active': True})
- return super(Company, self).write(values)
+ res = super(Company, self).write(values)
+
+ # invalidate company cache to recompute address based on updated partner
+ company_address_fields = self._get_company_address_field_names()
+ company_address_fields_upd = set(company_address_fields) & set(values.keys())
+ if company_address_fields_upd:
+ self.invalidate_cache(fnames=company_address_fields)
+ return res
@api.constrains('parent_id')
def _check_parent_id(self):