96 lines
3.0 KiB
Python
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
|