38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
import re
|
||
|
|
||
|
from odoo import models, fields, api, _
|
||
|
from odoo.exceptions import ValidationError
|
||
|
|
||
|
|
||
|
class L10nBrZipRange(models.Model):
|
||
|
_name = "l10n_br.zip.range"
|
||
|
_description = "Brazilian city zip range"
|
||
|
|
||
|
city_id = fields.Many2one("res.city", string="City", required=True)
|
||
|
start = fields.Char(string="From", required=True)
|
||
|
end = fields.Char(string="To", required=True)
|
||
|
|
||
|
_sql_constraints = [
|
||
|
("uniq_start", "unique(start)", 'The "from" zip must be unique'),
|
||
|
("uniq_end", 'unique("end")', 'The "to" zip must be unique.'),
|
||
|
]
|
||
|
|
||
|
@api.constrains("start", "end")
|
||
|
def _check_range(self):
|
||
|
zip_format = re.compile(r"\d{5}-\d{3}")
|
||
|
for zip_range in self:
|
||
|
if not zip_format.fullmatch(zip_range.start) or not zip_format.fullmatch(zip_range.end):
|
||
|
raise ValidationError(
|
||
|
_(
|
||
|
"Invalid zip range format: %(start)s %(end)s. It should follow this format: 01000-001",
|
||
|
start=zip_range.start,
|
||
|
end=zip_range.end,
|
||
|
)
|
||
|
)
|
||
|
|
||
|
if zip_range.start >= zip_range.end:
|
||
|
raise ValidationError(
|
||
|
_("Start should be less than end: %(start)s %(end)s", start=zip_range.start, end=zip_range.end)
|
||
|
)
|