odoo_dev 开发培训作业:图书管理系统
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

127 lines
3.8KB

  1. from odoo import api, fields, models
  2. from odoo.exceptions import UserError
  3. class Checkout(models.Model):
  4. _name = 'library.checkout'
  5. _description = 'Library Checkout'
  6. _inherit = ['mail.thread', 'mail.activity.mixin']
  7. @api.onchange('member_id')
  8. def onchange_member_id(self):
  9. today = fields.Date.today()
  10. if self.request_date != today:
  11. self.request_date = today
  12. return {
  13. 'warning': {
  14. 'title': 'Changed Request Date',
  15. 'message': 'Request date changed to today'
  16. }
  17. }
  18. @api.model
  19. def create(self, vals):
  20. if 'stage_id' in vals:
  21. Stage = self.env['library.checkout.stage']
  22. new_state = Stage.browse(vals['stage_id']).state
  23. if new_state == 'open':
  24. vals['checkout_date'] = fields.Date.today()
  25. new_record = super().create(vals)
  26. if new_record.state == 'done':
  27. raise UserError(
  28. 'Not allowed to create a checkout in the done state.'
  29. )
  30. return new_record
  31. def write(self, vals):
  32. if 'stage_id' in vals:
  33. Stage = self.env['library.checkout.stage']
  34. new_state = Stage.browse(vals['stage_id']).state
  35. if new_state == 'open' and self.state != 'open':
  36. vals['checkout_date'] = fields.Date.today()
  37. if new_state == 'done' and self.state != 'done':
  38. vals['closed_date'] = fields.Date.today()
  39. super().write(vals)
  40. return True
  41. def _compute_num_other_checkouts(self):
  42. for rec in self:
  43. domain = [
  44. ('member_id', '=', rec.member_id.id),
  45. ('state', '!=', ['open']),
  46. ('id', '!=', rec.id)
  47. ]
  48. rec.num_other_checkouts = self.search_count(domain)
  49. num_other_checkouts = fields.Integer(
  50. compute='_compute_num_other_checkouts'
  51. )
  52. def _compute_num_books(self):
  53. for rec in self:
  54. rec.num_books = len(self.line_ids)
  55. num_books = fields.Integer(
  56. compute='_compute_num_books'
  57. )
  58. member_id = fields.Many2one(
  59. 'library.member',
  60. required=True
  61. )
  62. user_id = fields.Many2one(
  63. 'res.users',
  64. 'Librarian',
  65. default=lambda s: s.env.uid
  66. )
  67. request_date = fields.Date(
  68. default=lambda s: fields.Date.today()
  69. )
  70. line_ids = fields.One2many(
  71. 'library.checkout.line',
  72. 'checkout_id',
  73. string='Borrowed Books'
  74. )
  75. @api.model
  76. def _default_stage(self):
  77. Stage = self.env['library.checkout.stage']
  78. return Stage.search([], limit=1)
  79. @api.model
  80. def _group_expand_stage_id(self, stages, domain, order):
  81. return stages.search([], order=order)
  82. stage_id = fields.Many2one(
  83. 'library.checkout.stage',
  84. default=_default_stage,
  85. group_expand='_group_expand_stage_id'
  86. )
  87. state = fields.Selection(related='stage_id.state')
  88. checkout_date = fields.Date(readonly=True)
  89. closed_date = fields.Date(readonly=True)
  90. priority = fields.Selection(
  91. [('0', 'Low'),
  92. ('1', 'Normal'),
  93. ('2', 'High')],
  94. 'Priority',
  95. default = '1'
  96. )
  97. kanban_state = fields.Selection(
  98. [('normal', 'In Progress'),
  99. ('blocked', 'Blocked'),
  100. ('done', 'Ready for next stage')],
  101. 'Kanban State',
  102. default='normal'
  103. )
  104. color = fields.Char('Color')
  105. class CheckoutLine(models.Model):
  106. _name = 'library.checkout.line'
  107. _description = 'Borrow Request Line'
  108. checkout_id = fields.Many2one('library.checkout')
  109. book_id = fields.Many2one('library.book')
上海开阖软件有限公司 沪ICP备12045867号-1