odoo_dev 开发培训作业:图书管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 satır
4.5KB

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