Session 3-A - core models: community.school.term, .level (admin-defined, so the same module fits a Grade 1-12 school or a Beginner-Advanced language school with no code change), .class (auto-creates a linked slide.channel for LMS glue), .student, .enrollment, and .attendance, plus is_teacher on res.partner. Class enrolled_count and enrollment attendance_rate are stored/non-stored computes driven by the enrollment/attendance one2many chains. Session 3-B - teacher attendance + at-risk reporting: a portal page at /school/attendance (auth='user', scoped to classes where teacher_id matches the logged-in user's partner - works whether the teacher is an internal or portal user) with a roster and batch save, built as a v19 Interaction (same pattern as event_qr_ticketing's check-in page). Marking a student absent queues a configurable notice to the parent partner. Enrollment.is_at_risk flags students below a configurable attendance threshold (School settings page, same <app>/<block>/<setting> pattern as community_membership), plus an admin pivot attendance report and an At-Risk Students list. Verified against a live Odoo 19 + Postgres 16 container: 14/14 automated tests pass (class/slide-channel creation, enrolled_count tracking incl. withdrawal, attendance_rate and at-risk computation, unique enrollment+date constraint, absence email queuing), plus a full manual live run - created a term/level/class/student/enrollment via JSON-RPC, loaded the actual /school/attendance page as the teacher, POSTed a batch save marking the student absent, and confirmed both the attendance record and the queued "Absence notice" mail.mail record. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.3 KiB
2.3 KiB
| 1 | id | name | model_id:id | group_id:id | perm_read | perm_write | perm_create | perm_unlink |
|---|---|---|---|---|---|---|---|---|
| 2 | access_community_school_term_coordinator | community.school.term coordinator | model_community_school_term | group_school_coordinator | 1 | 1 | 1 | 1 |
| 3 | access_community_school_term_teacher | community.school.term teacher read | model_community_school_term | group_school_teacher | 1 | 0 | 0 | 0 |
| 4 | access_community_school_level_coordinator | community.school.level coordinator | model_community_school_level | group_school_coordinator | 1 | 1 | 1 | 1 |
| 5 | access_community_school_level_teacher | community.school.level teacher read | model_community_school_level | group_school_teacher | 1 | 0 | 0 | 0 |
| 6 | access_community_school_class_coordinator | community.school.class coordinator | model_community_school_class | group_school_coordinator | 1 | 1 | 1 | 1 |
| 7 | access_community_school_class_teacher | community.school.class teacher read | model_community_school_class | group_school_teacher | 1 | 0 | 0 | 0 |
| 8 | access_community_school_student_coordinator | community.school.student coordinator | model_community_school_student | group_school_coordinator | 1 | 1 | 1 | 1 |
| 9 | access_community_school_student_teacher | community.school.student teacher read | model_community_school_student | group_school_teacher | 1 | 0 | 0 | 0 |
| 10 | access_community_school_enrollment_coordinator | community.school.enrollment coordinator | model_community_school_enrollment | group_school_coordinator | 1 | 1 | 1 | 1 |
| 11 | access_community_school_enrollment_teacher | community.school.enrollment teacher read | model_community_school_enrollment | group_school_teacher | 1 | 0 | 0 | 0 |
| 12 | access_community_school_attendance_coordinator | community.school.attendance coordinator | model_community_school_attendance | group_school_coordinator | 1 | 1 | 1 | 1 |
| 13 | access_community_school_attendance_teacher | community.school.attendance teacher | model_community_school_attendance | group_school_teacher | 1 | 1 | 1 | 0 |
| 14 | access_community_school_student_portal | community.school.student portal read | model_community_school_student | base.group_portal | 1 | 0 | 0 | 0 |
| 15 | access_community_school_enrollment_portal | community.school.enrollment portal read | model_community_school_enrollment | base.group_portal | 1 | 0 | 0 | 0 |
| 16 | access_community_school_attendance_portal | community.school.attendance portal read | model_community_school_attendance | base.group_portal | 1 | 0 | 0 | 0 |
| 17 | access_community_school_class_portal | community.school.class portal read | model_community_school_class | base.group_portal | 1 | 0 | 0 | 0 |