# pyrefly: ignore [missing-import] from odoo import api, fields, models from odoo.exceptions import ValidationError class EducationAttendanceLine(models.Model): _name = 'education.attendance.line' _description = 'Attendance Line Detail' _order = 'id asc' session_id = fields.Many2one('education.attendance.session', string='Session', required=True, ondelete='cascade', index=True) student_id = fields.Many2one('education.student', string='Student', required=True, index=True) status = fields.Selection([ ('present', 'Present'), ('absent', 'Absent'), ('late', 'Late'), ('medical_leave', 'Medical Leave'), ('on_duty', 'On Duty') ], string='Status', default='present', required=True, index=True) remarks = fields.Char(string='Remarks') time_in = fields.Datetime(string='Time In') time_out = fields.Datetime(string='Time Out') active = fields.Boolean(default=True) company_id = fields.Many2one( 'res.company', related='session_id.company_id', store=True, index=True, ) _uniq_session_student = models.Constraint( 'unique(session_id, student_id)', 'A student cannot be added twice to the same attendance session!' ) def write(self, vals): for rec in self: if rec.session_id.state == 'completed': if not self.env.user.has_group('education_attendance.group_attendance_manager'): raise ValidationError("Only an Attendance Manager can modify attendance lines for a completed session.") # Sync correction to permanent history if 'status' in vals or 'remarks' in vals: history = self.env['education.attendance'].search([ ('session_id', '=', rec.session_id.id), ('student_id', '=', rec.student_id.id), ], limit=1) if history: hist_vals = {} if 'status' in vals: hist_vals['status'] = vals['status'] if 'remarks' in vals: hist_vals['remarks'] = vals['remarks'] history.write(hist_vals) res = super().write(vals) if any(rec.session_id.state == 'completed' for rec in self): self.mapped('student_id').invalidate_recordset() return res def unlink(self): for rec in self: if rec.session_id.state == 'completed' and not self.env.user.has_group('education_attendance.group_attendance_manager'): raise ValidationError("Cannot delete attendance lines of a completed session. Revert the session to draft first.") return super().unlink()