Serves Demo Scene 4: mc.attendance (student x date x session, unique constraint so resubmission can never duplicate) plus a bulk-marking wizard - pick a batch/date/session, the roster loads pre-filled Present (or whatever was already recorded, if reopening), tap to change an exception, Submit. Submitting again for the same batch/date/session updates the same rows rather than creating duplicates - verified with a real test that marks a batch present, then reopens and corrects one student, then asserts there are still exactly two rows, not three. The "teachers may only mark their own batches" rule is a record rule (ir.rule scoped to group_teacher via batch_id.class_teacher_id. user_id), not a UI check, per CLAUDE.md sec 3 and the O4 spec line verbatim. Verified for real, not just declared: a teacher user who is not the class teacher of a batch gets AccessError on create *and* on reading an existing attendance row by id directly (the actual "cannot open another teacher's batch by editing the URL" scenario), while Administrator remains unrestricted since the rule's `groups` field scopes it to teacher only. Caught two Odoo 19 search-view schema changes while installing against a live odoo:19.0 container - a plain read of the view XML wouldn't have caught these, only trying to actually load it did: neither the group-by `<group>` element nor the filter groups inside a `<search>` view accept a `string` or `expand` attribute anymore (confirmed against hr's own search views, which use bare `<group>`). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1.4 KiB
1.4 KiB
| 1 | id | name | model_id:id | group_id:id | perm_read | perm_write | perm_create | perm_unlink |
|---|---|---|---|---|---|---|---|---|
| 2 | access_mc_attendance_administrator | mc.attendance.administrator | model_mc_attendance | mc_education_base.group_school_administrator | 1 | 1 | 1 | 1 |
| 3 | access_mc_attendance_staff | mc.attendance.staff | model_mc_attendance | mc_education_base.group_school_staff | 1 | 1 | 1 | 0 |
| 4 | access_mc_attendance_teacher | mc.attendance.teacher | model_mc_attendance | mc_education_base.group_teacher | 1 | 1 | 1 | 0 |
| 5 | access_mc_attendance_bulk_wizard_administrator | mc.attendance.bulk.wizard.administrator | model_mc_attendance_bulk_wizard | mc_education_base.group_school_administrator | 1 | 1 | 1 | 1 |
| 6 | access_mc_attendance_bulk_wizard_staff | mc.attendance.bulk.wizard.staff | model_mc_attendance_bulk_wizard | mc_education_base.group_school_staff | 1 | 1 | 1 | 1 |
| 7 | access_mc_attendance_bulk_wizard_teacher | mc.attendance.bulk.wizard.teacher | model_mc_attendance_bulk_wizard | mc_education_base.group_teacher | 1 | 1 | 1 | 1 |
| 8 | access_mc_attendance_bulk_wizard_line_administrator | mc.attendance.bulk.wizard.line.administrator | model_mc_attendance_bulk_wizard_line | mc_education_base.group_school_administrator | 1 | 1 | 1 | 1 |
| 9 | access_mc_attendance_bulk_wizard_line_staff | mc.attendance.bulk.wizard.line.staff | model_mc_attendance_bulk_wizard_line | mc_education_base.group_school_staff | 1 | 1 | 1 | 1 |
| 10 | access_mc_attendance_bulk_wizard_line_teacher | mc.attendance.bulk.wizard.line.teacher | model_mc_attendance_bulk_wizard_line | mc_education_base.group_teacher | 1 | 1 | 1 | 1 |