mirror of
https://gitlab.com/flectra-community/partner-contact.git
synced 2024-11-15 10:42:06 +00:00
109 lines
3.5 KiB
Python
109 lines
3.5 KiB
Python
|
# Copyright 2016 Nicolas Bessi, Camptocamp SA
|
||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||
|
|
||
|
from flectra import api, fields, models, _
|
||
|
from flectra.exceptions import ValidationError
|
||
|
|
||
|
|
||
|
class BetterZip(models.Model):
|
||
|
'''City/locations completion object'''
|
||
|
|
||
|
_name = "res.better.zip"
|
||
|
_description = __doc__
|
||
|
_order = "name asc"
|
||
|
|
||
|
name = fields.Char('ZIP')
|
||
|
code = fields.Char(
|
||
|
'City Code',
|
||
|
size=64,
|
||
|
help="The official code for the city"
|
||
|
)
|
||
|
city = fields.Char('City', required=True)
|
||
|
city_id = fields.Many2one(
|
||
|
'res.city',
|
||
|
'City',
|
||
|
)
|
||
|
state_id = fields.Many2one(
|
||
|
'res.country.state',
|
||
|
'State',
|
||
|
)
|
||
|
country_id = fields.Many2one('res.country', 'Country')
|
||
|
enforce_cities = fields.Boolean(
|
||
|
related='country_id.enforce_cities',
|
||
|
readonly=True,
|
||
|
)
|
||
|
latitude = fields.Float()
|
||
|
longitude = fields.Float()
|
||
|
|
||
|
|
||
|
@api.depends('name', 'city', 'state_id', 'country_id')
|
||
|
def name_get(self):
|
||
|
result = []
|
||
|
for rec in self:
|
||
|
name = []
|
||
|
if rec.name:
|
||
|
name.append('%(name)s' % {'name': rec.name})
|
||
|
name.append('%(name)s' % {'name': rec.city})
|
||
|
if rec.state_id:
|
||
|
name.append('%(name)s' % {'name': rec.state_id.name})
|
||
|
if rec.country_id:
|
||
|
name.append('%(name)s' % {'name': rec.country_id.name})
|
||
|
result.append((rec.id, ", ".join(name)))
|
||
|
return result
|
||
|
|
||
|
@api.model
|
||
|
def name_search(self, name='', args=None, operator='ilike', limit=100):
|
||
|
args = list(args or [])
|
||
|
args += ['|', ('city', operator, name),
|
||
|
'|', ('name', operator, name), ('code', operator, name)]
|
||
|
recs = self.search(args, limit=limit)
|
||
|
return recs.name_get()
|
||
|
|
||
|
@api.onchange('country_id')
|
||
|
def _onchange_country_id(self):
|
||
|
if self.state_id.country_id != self.country_id:
|
||
|
self.state_id = False
|
||
|
if self.city_id.country_id != self.country_id:
|
||
|
self.city_id = False
|
||
|
if self.country_id:
|
||
|
domain = [('country_id', '=', self.country_id.id)]
|
||
|
else:
|
||
|
domain = []
|
||
|
return {
|
||
|
'domain': {
|
||
|
'state_id': domain,
|
||
|
'city_id': domain,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@api.onchange('city_id')
|
||
|
def _onchange_city_id(self):
|
||
|
if self.city_id:
|
||
|
self.city = self.city_id.name
|
||
|
self.country_id = self.city_id.country_id
|
||
|
self.state_id = self.city_id.state_id
|
||
|
|
||
|
@api.onchange('state_id')
|
||
|
def _onchange_state_id(self):
|
||
|
if self.state_id:
|
||
|
self.country_id = self.state_id.country_id
|
||
|
|
||
|
@api.constrains('state_id', 'country_id', 'city_id')
|
||
|
def constrains_country(self):
|
||
|
for rec in self:
|
||
|
if rec.state_id and rec.state_id.country_id != \
|
||
|
rec.country_id:
|
||
|
raise ValidationError(_(
|
||
|
"The country of the state differs from the country in "
|
||
|
"location %s") % rec.name)
|
||
|
if rec.city_id and rec.city_id.country_id \
|
||
|
!= rec.country_id:
|
||
|
raise ValidationError(_(
|
||
|
"The country of the city differs from the country in "
|
||
|
"location %s") % rec.name)
|
||
|
if rec.city_id and rec.city_id.state_id \
|
||
|
!= rec.state_id:
|
||
|
raise ValidationError(_(
|
||
|
"The state of the city differs from the state in "
|
||
|
"location %s") % rec.name)
|