from odoo import models, fields, api from odoo.exceptions import UserError from odoo.tools.translate import _ class HostelStudent(models.Model): _name = "hostel.student" _description = "宿舍学生信息" # 学生信息 name = fields.Char("姓名", required=True) gender = fields.Selection([("male", "男"), ("female", "女")], string="性别", required=True) age = fields.Integer("年龄", required=True) active = fields.Boolean("可用", default=True, help="激活/停用 宿舍记录") room_id = fields.Many2one("hostel.room", "房间", help="选择房间号") class HostelRoom(models.Model): _name = "hostel.room" _description = "宿舍房间信息" floor_number = fields.Integer("楼层", required=True) room_name = fields.Char("房间名称", required=True) room_id = fields.Char("房间编号", required=True) currency_id = fields.Many2one('res.currency', string="货币种类") # 货币字段种类,要放到租金字段前面,否则会有None这个问题,而且不好排查 rent_amount = fields.Monetary("租金", help="输入每月租金", currency_field="currency_id") hostel_id = fields.Many2one("hostel.hostel", "hostel", help='输入宿舍名称') student_ids = fields.One2many("hostel.student", "room_id", "学生") hostel_amenities_ids = fields.Many2many("hostel.amenities", "hostel_room_amenities_rel", "room_id", "amenitily_id", string="设施", domain="[('active', '=', True)]", help="选择宿舍设施") # 添加状态字段 state = fields.Selection([('draft', 'Unavailable'), ('available', 'Available'), ('closed', 'Closed')], 'State', default='draft') @api.model def is_allowed_transition(self, old_state, new_state): allowed = { 'draft': ['available'], 'available': ['closed'], 'closed': [] } return (old_state, new_state) in allowed @api.model def rooms_with_multiple_memebers(self, all_rooms): def predicate(room): if len(room.member_ids) > 1: return True return False return all_rooms.filter(lambda b : len(b.member_ids)>1) def change_state(self, new_state): for room in self: if room.is_allowed_transition(room.state, new_state): room.state = new_state else: msg = _("Moving from %s to %s is not allowed.") % (room.state, new_state) raise UserError(msg) def make_available(self): self.change_state('available') def make_closed(self): self.change_state('closed') def log_all_room_members(self): hostel_room_obj = self.env['hostel.room'] all_members = hostel_room_obj.search([]) print("宿舍房间成员信息:", all_members) return True def update_room_id(self): self.ensure_one() self.update({ 'room_id':'RM002', 'room_name': '荷兰风情' }) def find_room(self): domain = ['|', '&', ('name', 'ilike', 'Room Name'), ('category_id', 'ilike', 'Category name'), '&', ('name', 'ilike', 'Second Room Name'), ('category_id.name', 'ilike', 'SecondCategory Name 2') ] rooms = self.search(domain) return rooms def filter_members(self, room): all_rooms = self.search([]) filtered_rooms = self.rooms_with_multiple_members(all_rooms) return filtered_rooms