Odoo_Dance_SCL/addons/dance_leave/models/dance_leave_request.py
2026-09-28 11:03:02 +05:30

96 lines
3.0 KiB
Python

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