12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- from odoo import fields, models
- from odoo.exceptions import ValidationError
- """
- odoo会自动为模型添加一些特殊字段:
- - id: 主键,自动生成
- - create_uid: 创建者的用户ID
- - create_date: 创建时间
- - write_uid: 最后修改者的用户ID
- - write_date: 最后修改时间
- - display_name: 显示名称,通常是name字段的值
- - __last_update:一个计算字段 ,不在数据库中存储,用于做并发检测
- """
- class Book(models.Model):
- # UID,仅模型名用点号.分隔关键词
- _name = 'library.book'
- # 模型记录显示名
- _description = 'Book'
- # 以下声明模型字段
- # name和active均为特殊字段名。默认对Odoo有特殊用途。
- # name默认用作记录显示名,在另一个模型引用它时显示。active字段用于在用户界面中过滤掉无效记录。
- name = fields.Char('Title', required=True)
- isbn = fields.Char('ISBN')
- active = fields.Boolean('Active?', default=True)
- date_published = fields.Date()
- image = fields.Binary('Cover')
- # Many2one表示一对多关系,Many2many表示多对多关系
- publisher_id = fields.Many2one('res.partner', string='Publisher')
- author_ids = fields.Many2many('res.partner', string='Authors')
- def button_check_isbn(self):
- """检查ISBN的有效性"""
- # 遍历当前记录集中的每一条记录
- for book in self:
- if not book.isbn:
- raise ValidationError('Please provide an ISBN for %s' % book.name)
- if book.isbn and not book._check_isbn():
- raise ValidationError('%s is an invalid ISBN' % book.isbn)
- return True
-
- def _check_isbn(self):
- """检查ISBN是否有效"""
- # 确保当前记录集只有一条记录
- self.ensure_one()
- isbn = self.isbn.replace('-', '') # 为保持兼容性自行添加
- digits = [int(x) for x in isbn if x.isdigit()]
- if len(digits) == 13:
- ponderations = [1, 3] * 6
- terms = [a * b for a,b in zip(digits[:12], ponderations)]
- remain = sum(terms) % 10
- check = 10 - remain if remain !=0 else 0
- return digits[-1] == check
|