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.

134 lines
4.5KB

  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. @api.model
  20. def _default_stage(self):
  21. Stage = self.env['library.checkout.stage']
  22. return Stage.search([], limit=1)
  23. @api.model
  24. def _group_expand_stage_id(self, stages, domain, order):
  25. return stages.search([], order=order)
  26. stage_id = fields.Many2one(
  27. 'library.checkout.stage',
  28. default=_default_stage,
  29. group_expand='_group_expand_stage_id')
  30. state = fields.Selection(related='stage_id.state')
  31. @api.onchange('member_id')
  32. def onchange_member_id(self):
  33. today = fields.Date.today()
  34. if self.request_date != today:
  35. self.request_date = fields.Date.today()
  36. return {
  37. 'warning':{
  38. 'title': 'Changed Request Date',
  39. 'message': 'Request date changed to today.'
  40. }
  41. }
  42. checkout_date = fields.Date(readonly=True)
  43. closed_date = fields.Date(readonly=True)
  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. # Code before write: can use `self`, wiht the old values
  60. if 'stage_id' in vals:
  61. Stage = self.env['library.checkout.stage']
  62. new_state = Stage.browse(vals['stage_id']).state
  63. if new_state == 'open' and self.state != 'open':
  64. vals['checkout_date'] = fields.Date.today()
  65. if new_state == 'done' and self.state != 'done':
  66. vals['closed_date'] = fields.Date.today()
  67. if not self.env.context.get('_library_checkout_writing'):
  68. self.with_context(_library_checkout_writing=True).write(vals)
  69. super().write(vals)
  70. # Code after write: can use `self`, with the updated values
  71. return True
  72. # jieshu anniu
  73. def button_done(self):
  74. Stage = self.env['library.checkout.stage']
  75. done_stage = Stage.search(
  76. [('state', '=', 'done')],limit=1)
  77. for checkout in self:
  78. checkout.stage_id = done_stage
  79. return True
  80. member_image = fields.Binary(related='member_id.partner_id.image_128')
  81. note = fields.Html("Note")
  82. login = fields.Char("账号")
  83. pwd = fields.Char("密码")
  84. num_other_checkouts = fields.Integer(compute='_compute_num_other_checkouts')
  85. def _compute_num_other_checkouts(self):
  86. for rec in self:
  87. domain = [
  88. ('member_id', '=', rec.member_id.id),
  89. ('state', 'in', ['open']),
  90. ('id', '!=', rec.id)]
  91. rec.num_other_checkouts = self.search_count(domain)
  92. num_books = fields.Integer(compute='_compute_num_books', store=True)
  93. @api.depends('line_ids')
  94. def _compute_num_books(self):
  95. for book in self:
  96. book.num_books = len(book.line_ids)
  97. # kanban
  98. priority = fields.Selection(
  99. [('0', 'Low'),
  100. ('1', 'Normal'),
  101. ('2', 'High'),
  102. ('3', 'Vi High')],
  103. 'Priority',
  104. default='0')
  105. kanban_state = fields.Selection(
  106. [('normal', 'In Progress'),
  107. ('blocked', 'Blocked'),
  108. ('done', 'Ready for next stage')],
  109. 'Kanban State',
  110. default='normal')
  111. color = fields.Integer('Color Index')
  112. class CheckoutLine(models.Model):
  113. _name = 'library.checkout.line'
  114. _description = 'Borrow Request Line'
  115. checkout_id = fields.Many2one('library.checkout')
  116. book_id = fields.Many2one('library.book')
上海开阖软件有限公司 沪ICP备12045867号-1