# pyrefly: ignore [missing-import] from odoo import api, fields, models # pyrefly: ignore [missing-import] from odoo.exceptions import ValidationError class EducationHostelBed(models.Model): _name = 'education.hostel.bed' _description = 'Hostel Bed' _order = 'room_id, bed_number' room_id = fields.Many2one( 'education.hostel.room', string='Room', required=True, ondelete='cascade', index=True, ) hostel_id = fields.Many2one( 'education.hostel', string='Hostel', related='room_id.hostel_id', store=True, readonly=True, index=True, ) floor_id = fields.Many2one( 'education.hostel.floor', string='Floor', related='room_id.floor_id', store=True, readonly=True, ) bed_number = fields.Char(string='Bed Number', required=True) code = fields.Char(string='Bed Code', required=True, index=True) status = fields.Selection([ ('available', 'Available'), ('reserved', 'Reserved'), ('occupied', 'Occupied'), ('maintenance', 'Under Maintenance'), ('inactive', 'Inactive'), ], string='Status', default='available', required=True, tracking=True) active = fields.Boolean(default=True) company_id = fields.Many2one( 'res.company', string='Company', related='room_id.company_id', store=True, readonly=True, index=True, ) @api.constrains('bed_number', 'room_id') def _check_bed_number_room(self): for rec in self: if self.search_count([('bed_number', '=', rec.bed_number), ('room_id', '=', rec.room_id.id), ('id', '!=', rec.id)]): raise ValidationError('Bed number must be unique within the room.') @api.constrains('code') def _check_bed_code(self): for rec in self: if self.search_count([('code', '=', rec.code), ('id', '!=', rec.id)]): raise ValidationError('Bed code must be globally unique.') @api.constrains('status') def _check_status_vs_allocation(self): """Prevent manually clearing 'occupied' status while an active member holds this bed.""" for rec in self: if rec.status != 'occupied': # Check if any active member is still using this bed active_member = self.env['education.hostel.member'].search([ ('bed_id', '=', rec.id), ('status', '=', 'active'), ], limit=1) if active_member: raise ValidationError( f"Bed '{rec.code}' is currently occupied by student " f"'{active_member.student_id.full_name}'. " "Please exit the allocation before changing bed status." )