42 lines
1.9 KiB
Python
42 lines
1.9 KiB
Python
# pyrefly: ignore [missing-import]
|
|
from odoo import api, fields, models
|
|
# pyrefly: ignore [missing-import]
|
|
from odoo.exceptions import ValidationError
|
|
|
|
class EducationTransportAttendance(models.Model):
|
|
_name = 'education.transport.attendance'
|
|
_description = 'Transport Attendance'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
|
|
trip_id = fields.Many2one('education.transport.trip', string='Trip', required=True, ondelete='cascade', tracking=True)
|
|
student_id = fields.Many2one('education.student', string='Student', required=True, tracking=True)
|
|
stop_id = fields.Many2one('education.transport.stop', string='Stop', tracking=True)
|
|
|
|
boarding_time = fields.Datetime(string='Boarding Time', tracking=True)
|
|
drop_time = fields.Datetime(string='Drop Time', tracking=True)
|
|
|
|
status = fields.Selection([
|
|
('boarded', 'Boarded'),
|
|
('absent', 'Absent'),
|
|
('dropped', 'Dropped'),
|
|
('missed', 'Missed')
|
|
], string='Status', required=True, tracking=True)
|
|
|
|
notes = fields.Text(string='Notes')
|
|
|
|
company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.company)
|
|
|
|
@api.constrains('student_id', 'trip_id')
|
|
def _check_student_assignment(self):
|
|
for rec in self:
|
|
if rec.student_id and rec.trip_id:
|
|
if self.search_count([('student_id', '=', rec.student_id.id), ('trip_id', '=', rec.trip_id.id), ('id', '!=', rec.id)]):
|
|
raise ValidationError('A student can only have one attendance record per trip!')
|
|
assignment = self.env['education.transport.assignment'].search([
|
|
('student_id', '=', rec.student_id.id),
|
|
('route_id', '=', rec.trip_id.route_id.id),
|
|
('status', '=', 'active')
|
|
])
|
|
if not assignment:
|
|
raise ValidationError('Student does not have an active assignment for this route!')
|