Добавить проверку в моделях в Odoo - PullRequest
0 голосов
/ 27 мая 2018

У меня есть модель student со следующими полями.

class Student(models.Model):
    _name = "student"
    name = fields.Char(string='Name', required=True)
    nid = fields.Char(string='NID', required=True)

Мне нужно убедиться, что name содержит только в пределах 10-15 алфавитов и пробелов и что nid начинается с заглавной буквы , за которой следуют 12 цифр, и заканчивается заглавной буквой .Можно ли это сделать прямо в модели?

1 Ответ

0 голосов
/ 27 мая 2018

Да, вы можете добавить эти ограничения, используя decorator @ api.constrains ('field1', 'field2'), который скажет Odoo активировать этот метод, если одно из полей (в списке переданных полей) было изменено.

и использование модуля регулярного выражения (re) сэкономит много печатать в этом случае.

    import re  # for matching

    class Student(models.Model):
        _name = "student"

        name = fields.Char(string='Name', required=True)

        nid = fields.Char(string='NID', required=True)

        @api.constrains('name')
        def check_name(self):
            """ make sure name 10-15 alphabets and spaces"""
            for rec in self:
                # here i forced that the name should start with alphabets if it's not the case remove ^[a-zA-Z]
                # and just keep:  re.match(r"[ a-zA-Z]+", rec.name)
                if not 10 <= len(rec.name) <= 15 or not re.match(r"^[a-zA-Z][ a-zA-Z]*", rec.name):
                    raise exceptions.ValidationError(_('your message about 10-15 alphabets and spaces'))

        @api.constrains('nid')
        def check_nid(self):
            """ make sure nid starts with capital letter, followed by 12 numbers and ends with a capital letter"""
            for rec in self:
                if not re.match(r"^[A-Z][0-9]{12}[A-Z]$", rec.nid):
                    raise exceptions.ValidationError(_('your message about capital letter, followed'
                                                       'by 12 numbers and ends with a capital letter')
...