diff options
| author | Thibault Delavallée <tde@odoo.com> | 2020-01-07 13:37:34 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2020-01-07 14:45:48 +0000 |
| commit | 7943b71af39bdd5eeae2dcf84c8faf8aa56a2232 (patch) | |
| tree | 428e7cef0985418ce5ad7d2960963707bd31bee7 | |
| parent | e582500c4bd316711d55948d0cb820bd7f71d34a (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.py | 11 | ||||
| -rw-r--r-- | odoo/addons/base/models/res_company.py | 29 |
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): |
