from odoo import api, fields, models from odoo.exceptions import ValidationError class DanceLeaveRequest(models.Model): _name = "dance.leave.request" _description = "Dance Leave Request" _order = "from_date desc, id desc" _inherit = ["mail.thread", "mail.activity.mixin"] name = fields.Char(compute="_compute_name", store=True) student_id = fields.Many2one( "res.partner", string="Student", required=True, domain="[('is_student', '=', True)]", ondelete="restrict", tracking=True, ) guardian_id = fields.Many2one( "res.partner", string="Guardian", required=True, domain="[('is_student', '=', False)]", ondelete="restrict", tracking=True, ) from_date = fields.Date(required=True, tracking=True) to_date = fields.Date(required=True, tracking=True) reason = fields.Text(required=True) status = fields.Selection( [ ("pending", "Pending"), ("approved", "Approved"), ("rejected", "Rejected"), ], default="pending", required=True, tracking=True, ) reviewed_by_id = fields.Many2one( "res.users", string="Reviewed By", readonly=True, ondelete="set null", ) reviewed_on = fields.Datetime(readonly=True) admin_note = fields.Text(string="Admin Note") @api.depends("student_id", "from_date", "to_date") def _compute_name(self): for leave in self: if leave.student_id and leave.from_date: leave.name = "%s leave: %s to %s" % ( leave.student_id.display_name, leave.from_date, leave.to_date or leave.from_date, ) else: leave.name = "New Leave Request" @api.constrains("student_id", "guardian_id") def _check_guardian_can_request(self): for leave in self: if not leave.student_id or not leave.guardian_id: continue allowed_guardians = leave.student_id.guardian_id | leave.student_id.guardian_ids if leave.guardian_id not in allowed_guardians: raise ValidationError("Guardian must be linked to the selected student.") @api.constrains("from_date", "to_date") def _check_dates(self): for leave in self: if leave.from_date and leave.to_date and leave.to_date < leave.from_date: raise ValidationError("To Date cannot be before From Date.") def action_approve(self): self.write( { "status": "approved", "reviewed_by_id": self.env.user.id, "reviewed_on": fields.Datetime.now(), } ) return True def action_reject(self): self.write( { "status": "rejected", "reviewed_by_id": self.env.user.id, "reviewed_on": fields.Datetime.now(), } ) return True