hostel_room.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from odoo import models, fields, api
  2. from odoo.exceptions import UserError
  3. from odoo.tools.translate import _
  4. class HostelStudent(models.Model):
  5. _name = "hostel.student"
  6. _description = "宿舍学生信息"
  7. # 学生信息
  8. name = fields.Char("姓名", required=True)
  9. gender = fields.Selection([("male", "男"), ("female", "女")], string="性别", required=True)
  10. age = fields.Integer("年龄", required=True)
  11. active = fields.Boolean("可用", default=True, help="激活/停用 宿舍记录")
  12. room_id = fields.Many2one("hostel.room", "房间", help="选择房间号")
  13. class HostelRoom(models.Model):
  14. _name = "hostel.room"
  15. _description = "宿舍房间信息"
  16. floor_number = fields.Integer("楼层", required=True)
  17. room_name = fields.Char("房间名称", required=True)
  18. room_id = fields.Char("房间编号", required=True)
  19. currency_id = fields.Many2one('res.currency', string="货币种类") # 货币字段种类,要放到租金字段前面,否则会有None这个问题,而且不好排查
  20. rent_amount = fields.Monetary("租金", help="输入每月租金", currency_field="currency_id")
  21. hostel_id = fields.Many2one("hostel.hostel", "hostel", help='输入宿舍名称')
  22. student_ids = fields.One2many("hostel.student", "room_id", "学生")
  23. hostel_amenities_ids = fields.Many2many("hostel.amenities", "hostel_room_amenities_rel", "room_id", "amenitily_id",
  24. string="设施", domain="[('active', '=', True)]", help="选择宿舍设施")
  25. # 添加状态字段
  26. state = fields.Selection([('draft', 'Unavailable'), ('available', 'Available'), ('closed', 'Closed')],
  27. 'State', default='draft')
  28. @api.model
  29. def is_allowed_transition(self, old_state, new_state):
  30. allowed = {
  31. 'draft': ['available'],
  32. 'available': ['closed'],
  33. 'closed': []
  34. }
  35. return (old_state, new_state) in allowed
  36. @api.model
  37. def rooms_with_multiple_memebers(self, all_rooms):
  38. def predicate(room):
  39. if len(room.member_ids) > 1:
  40. return True
  41. return False
  42. return all_rooms.filter(lambda b : len(b.member_ids)>1)
  43. def change_state(self, new_state):
  44. for room in self:
  45. if room.is_allowed_transition(room.state, new_state):
  46. room.state = new_state
  47. else:
  48. msg = _("Moving from %s to %s is not allowed.") % (room.state, new_state)
  49. raise UserError(msg)
  50. def make_available(self):
  51. self.change_state('available')
  52. def make_closed(self):
  53. self.change_state('closed')
  54. def log_all_room_members(self):
  55. hostel_room_obj = self.env['hostel.room']
  56. all_members = hostel_room_obj.search([])
  57. print("宿舍房间成员信息:", all_members)
  58. return True
  59. def update_room_id(self):
  60. self.ensure_one()
  61. self.update({
  62. 'room_id':'RM002',
  63. 'room_name': '荷兰风情'
  64. })
  65. def find_room(self):
  66. domain = ['|', '&', ('name', 'ilike', 'Room Name'),
  67. ('category_id', 'ilike', 'Category name'),
  68. '&', ('name', 'ilike', 'Second Room Name'),
  69. ('category_id.name', 'ilike', 'SecondCategory Name 2')
  70. ]
  71. rooms = self.search(domain)
  72. return rooms
  73. def filter_members(self, room):
  74. all_rooms = self.search([])
  75. filtered_rooms = self.rooms_with_multiple_members(all_rooms)
  76. return filtered_rooms