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.

123 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. 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. stage_id = fields.Many2one(
  20. 'library.checkout.stage',
  21. default='_default_stage',
  22. group_expand='_group_expand_stage_id')
  23. state = fields.Selection(related='stage_id.state')
  24. checkout_date = fields.Date(readonly=True)
  25. closed_date = fields.Date(readonly=True)
  26. member_image = fields.Binary(related='member_id.partner_id.image_128')
  27. num_other_checkouts = fields.Integer(
  28. compute='_compute_num_other_checkouts')
  29. num_books = fields.Integer(compute='_compute_num_books',store=True)
  30. priority = fields.Selection(
  31. [('0', 'Low'),
  32. ('1', 'Normal'),
  33. ('2', 'High')],
  34. 'Priority',
  35. default='1')
  36. kanban_state = fields.Selection(
  37. [('normal', 'In Progress'),
  38. ('blocked', 'Blocked'),
  39. ('done', 'Ready for next stage')],
  40. 'Kanban State',
  41. default='normal')
  42. color = fields.Integer('Color Index')
  43. @api.depends('line_ids')
  44. def _compute_num_books(self):
  45. for book in self:
  46. book.num_books = len(book.line_ids)
  47. def _compute_num_other_checkouts(self):
  48. for rec in self:
  49. domain = [
  50. ('member_id', '=', rec.member_id.id),
  51. ('state', 'in', ['open']),
  52. ('id', '!=', rec.id)]
  53. rec.num_other_checkouts = self.search_count(domain)
  54. @api.model
  55. def create(self, vals):
  56. # Code before create: should use the `vals` dict
  57. if 'stage_id' in vals:
  58. Stage = self.env['library.checkout.stage']
  59. new_state = Stage.browse(vals['stage_id']).state
  60. if new_state == 'open':
  61. vals['checkout_date'] = fields.Date.today()
  62. new_record = super().create(vals)
  63. # Code after create: can use the `new_record` created
  64. if new_record.state == 'done':
  65. raise exceptions.UserError(
  66. 'Not allowed to create a checkout in the done state.')
  67. return new_record
  68. def write(self, vals):
  69. # Code before write: can use `self`, with the old values
  70. if 'stage_id' in vals:
  71. Stage = self.env['library.checkout.stage']
  72. new_state = Stage.browse(vals['stage_id']).state
  73. if new_state == 'open' and self.state != 'open':
  74. vals['checkout_date'] = fields.Date.today()
  75. if new_state == 'done' and self.state != 'done':
  76. vals['closed_date'] = fields.Date.today()
  77. super().write(vals)
  78. # Code after write: can use `self`, with the updated values
  79. return True
  80. @api.model
  81. def _default_stage(self):
  82. Stage = self.env['library.checkout.stage']
  83. return Stage.search([], limit=1)
  84. @api.model
  85. def _group_expand_stage_id(self, stages, domain, order):
  86. return stages.search([], order=order)
  87. @api.onchange('member_id')
  88. def onchange_member_id(self):
  89. today = fields.Date.today()
  90. if self.request_date != today:
  91. self.request_date = fields.Date.today()
  92. return {
  93. 'warning':{
  94. 'title': 'Changed Request Date',
  95. 'message': 'Request date changed to today.'
  96. }
  97. }
  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