library_book.py 2.2 KB

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