odoo_dev 开发培训作业:图书管理系统
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

109 行
3.9KB

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