You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

80 lines
3.0 KiB

# 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 odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class ResPartner(models.Model):
_inherit = "res.partner"
zip_id = fields.Many2one("res.city.zip", "ZIP Location")
@api.onchange("city_id")
def _onchange_city_id(self):
if not self.zip_id:
super()._onchange_city_id()
if self.zip_id and self.city_id != self.zip_id.city_id:
self.update({"zip_id": False, "zip": False, "city": False})
if self.city_id and self.country_enforce_cities:
return {"domain": {"zip_id": [("city_id", "=", self.city_id.id)]}}
return {"domain": {"zip_id": []}}
@api.onchange("country_id")
def _onchange_country_id(self):
res = super()._onchange_country_id()
if self.zip_id and self.zip_id.city_id.country_id != self.country_id:
self.zip_id = False
return res
@api.onchange("zip_id")
def _onchange_zip_id(self):
if self.zip_id:
vals = {
"city_id": self.zip_id.city_id,
"zip": self.zip_id.name,
"city": self.zip_id.city_id.name,
}
if self.zip_id.city_id.country_id:
vals.update({"country_id": self.zip_id.city_id.country_id})
if self.zip_id.city_id.state_id:
vals.update({"state_id": self.zip_id.city_id.state_id})
self.update(vals)
elif not self.country_enforce_cities:
self.city_id = False
@api.constrains("zip_id", "country_id", "city_id", "state_id")
def _check_zip(self):
if self.env.context.get("skip_check_zip"):
return
for rec in self:
if not rec.zip_id:
continue
if rec.zip_id.city_id.state_id != rec.state_id:
raise ValidationError(
_("The state of the partner %s differs from that in " "location %s")
% (rec.name, rec.zip_id.name)
)
if rec.zip_id.city_id.country_id != rec.country_id:
raise ValidationError(
_(
"The country of the partner %s differs from that in "
"location %s"
)
% (rec.name, rec.zip_id.name)
)
if rec.zip_id.city_id != rec.city_id:
raise ValidationError(
_("The city of partner %s differs from that in " "location %s")
% (rec.name, rec.zip_id.name)
)
@api.onchange("state_id")
def _onchange_state_id(self):
vals = {}
if self.state_id.country_id:
vals.update({"country_id": self.state_id.country_id})
if self.zip_id and self.state_id != self.zip_id.city_id.state_id:
vals.update({"zip_id": False, "zip": False, "city": False})
self.update(vals)