mirror of
https://gitlab.com/flectra-community/partner-contact.git
synced 2024-12-25 05:41:47 +00:00
71 lines
2.6 KiB
Python
71 lines
2.6 KiB
Python
|
# Copyright 2016 Nicolas Bessi, Camptocamp SA
|
||
|
# Copyright 2018 Tecnativa - Pedro M. Baeza
|
||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||
|
|
||
|
from flectra import models, fields, api
|
||
|
|
||
|
|
||
|
class ResCompany(models.Model):
|
||
|
_inherit = 'res.company'
|
||
|
|
||
|
city_id = fields.Many2one(
|
||
|
'res.city',
|
||
|
compute='_compute_address',
|
||
|
inverse='_inverse_city_id',
|
||
|
string="City"
|
||
|
)
|
||
|
zip_id = fields.Many2one(
|
||
|
'res.better.zip',
|
||
|
string='ZIP Location',
|
||
|
compute='_compute_address',
|
||
|
inverse='_inverse_zip_id',
|
||
|
oldname="better_zip_id",
|
||
|
help='Use the city name or the zip code to search the location',
|
||
|
)
|
||
|
# In order to keep the same logic used in flectra, fields must be computed
|
||
|
# and inversed, not related. This way, we can ensure that it works
|
||
|
# correctly on changes and inconsistencies cannot happen.
|
||
|
# When you make the fields related, the constrains added in res.partner
|
||
|
# will fail. because when you change the city_id in the company, you are
|
||
|
# effectively changing it in the partner. The constrains on the partner
|
||
|
# are evaluated before the inverse methods update the other fields (city,
|
||
|
# etc..). And we need constrains in the partner to ensure consistency.
|
||
|
# So, as a conclusion, address fields are very related to each other.
|
||
|
# Either you make them all related to the partner in company, or you
|
||
|
# don't for all of them. But mixing methods produces inconsistencies.
|
||
|
|
||
|
country_enforce_cities = fields.Boolean(
|
||
|
related='country_id.enforce_cities'
|
||
|
)
|
||
|
|
||
|
def _get_company_address_fields(self, partner):
|
||
|
res = super(ResCompany, self)._get_company_address_fields(partner)
|
||
|
res['city_id'] = partner.city_id
|
||
|
res['zip_id'] = partner.zip_id
|
||
|
return res
|
||
|
|
||
|
def _inverse_city_id(self):
|
||
|
for company in self:
|
||
|
company.partner_id.city_id = company.city_id
|
||
|
|
||
|
def _inverse_zip_id(self):
|
||
|
for company in self:
|
||
|
company.partner_id.zip_id = company.zip_id
|
||
|
|
||
|
@api.onchange('zip_id')
|
||
|
def _onchange_zip_id(self):
|
||
|
if self.zip_id:
|
||
|
self.zip = self.zip_id.name
|
||
|
self.city_id = self.zip_id.city_id
|
||
|
self.city = self.zip_id.city
|
||
|
self.country_id = self.zip_id.country_id
|
||
|
if self.country_id.enforce_cities:
|
||
|
self.state_id = self.city_id.state_id
|
||
|
else:
|
||
|
self.state_id = self.zip_id.state_id
|
||
|
|
||
|
@api.onchange('state_id')
|
||
|
def onchange_state_id(self):
|
||
|
if self.state_id.country_id:
|
||
|
self.country_id = self.state_id.country_id.id
|