odoo_dev 开发培训作业:图书管理系统
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

125 Zeilen
4.3KB

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