odoo_dev 开发培训作业:图书管理系统
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

126 lines
4.2KB

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