Serves Demo Scene 6. mc.grading.scale + mc.grading.interval are pure
data (threshold/letter/point/description rows) - CBSE, ICSE, IB,
Cambridge, Ontario and a plain percentage scale all shipped as data
in data/mc_grading_scale_data.xml, noupdate="1" so a school's own
edits survive a module upgrade. mc.mark.grade resolves via
mc.program.grading_scale_id (new field on mc.program, since grading
board is a per-program concept already carrying "board" from O1) -
the moment this needed an `if board == "CBSE"` anywhere, per
shared/DOMAIN_MODEL.md sec 5, it would have been the wrong design;
verified instead that swapping a program's scale recomputes an
existing mark's grade with zero code involved
(test_changing_scale_recomputes_existing_marks).
Grid mark entry ("whole class on one screen, tab between fields,
keyboard only") is a plain editable list on mc.mark, filtered to one
exam - that native Odoo behavior already gives real Tab-key
navigation with no custom widget. mc.exam.action_enter_marks()
pre-creates a row per actively-enrolled student before opening it
(mirroring O4's bulk-attendance idempotency: creating it again never
duplicates or resets an already-entered mark).
The report card is a real rendered PDF, not just a template read by
inspection - rendered it for Aditya via odoo shell
(report._render_qweb_pdf), pulled the bytes out of the container, and
read the actual PDF: one A4 page, no clipped columns, correct grades
per subject matching the CBSE scale (92->A1, 85->A2, 78->B1, 67->B2,
58->C1), signature block, term correctly resolved. That last part
exposed a real logic bug before it shipped: the term-resolution
method originally preferred "today's date" over "the term with
marks", which would have shown an empty Term 1 when generating the
card *today* even though the demo's graded marks are all in Term 2 -
a report card is generated to review a term's results, typically
after that term's exams are done (often during the *next* term), so
marks-with-data now wins over the calendar, falling back to today's
date only for a student with nothing graded yet.
Attendance summary on the report degrades to None when
mc_education_attendance isn't installed (checked directly, not
assumed) - this module depends on mc_education_base only, matching
"each mc_education_* module installs independently" (CLAUDE.md sec
1.4), while still showing the real summary when both are installed
together for the actual demo.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
103 lines
5.2 KiB
XML
103 lines
5.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<!-- Grade 8 is CBSE-boarded per mc_education_base's own demo data
|
|
(board="CBSE"); Grade 5 uses a plain percentage scale here, to
|
|
actually demonstrate two programs computing grades differently
|
|
from the same mc.mark model with no code difference between them. -->
|
|
<record id="mc_education_base.demo_program_grade8" model="mc.program">
|
|
<field name="grading_scale_id" ref="scale_cbse"/>
|
|
</record>
|
|
<record id="mc_education_base.demo_program_grade5" model="mc.program">
|
|
<field name="grading_scale_id" ref="scale_percentage"/>
|
|
</record>
|
|
|
|
<record id="demo_exam_g8a_math_t2" model="mc.exam">
|
|
<field name="name">Term 2 Exam</field>
|
|
<field name="term_id" ref="mc_education_base.demo_term_2026_27_t2"/>
|
|
<field name="batch_id" ref="mc_education_base.demo_batch_grade8_a"/>
|
|
<field name="subject_id" ref="mc_education_base.demo_subject_math"/>
|
|
<field name="max_marks">100</field>
|
|
<field name="pass_marks">35</field>
|
|
<field name="date">2026-10-20</field>
|
|
</record>
|
|
<record id="demo_exam_g8a_english_t2" model="mc.exam">
|
|
<field name="name">Term 2 Exam</field>
|
|
<field name="term_id" ref="mc_education_base.demo_term_2026_27_t2"/>
|
|
<field name="batch_id" ref="mc_education_base.demo_batch_grade8_a"/>
|
|
<field name="subject_id" ref="mc_education_base.demo_subject_english"/>
|
|
<field name="max_marks">100</field>
|
|
<field name="pass_marks">35</field>
|
|
<field name="date">2026-10-21</field>
|
|
</record>
|
|
<record id="demo_exam_g8a_science_t2" model="mc.exam">
|
|
<field name="name">Term 2 Exam</field>
|
|
<field name="term_id" ref="mc_education_base.demo_term_2026_27_t2"/>
|
|
<field name="batch_id" ref="mc_education_base.demo_batch_grade8_a"/>
|
|
<field name="subject_id" ref="mc_education_base.demo_subject_science"/>
|
|
<field name="max_marks">100</field>
|
|
<field name="pass_marks">35</field>
|
|
<field name="date">2026-10-22</field>
|
|
</record>
|
|
<record id="demo_exam_g8a_sst_t2" model="mc.exam">
|
|
<field name="name">Term 2 Exam</field>
|
|
<field name="term_id" ref="mc_education_base.demo_term_2026_27_t2"/>
|
|
<field name="batch_id" ref="mc_education_base.demo_batch_grade8_a"/>
|
|
<field name="subject_id" ref="mc_education_base.demo_subject_social_studies"/>
|
|
<field name="max_marks">100</field>
|
|
<field name="pass_marks">35</field>
|
|
<field name="date">2026-10-23</field>
|
|
</record>
|
|
<record id="demo_exam_g8a_hindi_t2" model="mc.exam">
|
|
<field name="name">Term 2 Exam</field>
|
|
<field name="term_id" ref="mc_education_base.demo_term_2026_27_t2"/>
|
|
<field name="batch_id" ref="mc_education_base.demo_batch_grade8_a"/>
|
|
<field name="subject_id" ref="mc_education_base.demo_subject_hindi"/>
|
|
<field name="max_marks">100</field>
|
|
<field name="pass_marks">35</field>
|
|
<field name="date">2026-10-24</field>
|
|
</record>
|
|
|
|
<record id="demo_mark_aditya_math_t2" model="mc.mark">
|
|
<field name="exam_id" ref="demo_exam_g8a_math_t2"/>
|
|
<field name="student_id" ref="mc_education_base.demo_student_aditya_krishnan"/>
|
|
<field name="marks_obtained">92</field>
|
|
</record>
|
|
<record id="demo_mark_aditya_english_t2" model="mc.mark">
|
|
<field name="exam_id" ref="demo_exam_g8a_english_t2"/>
|
|
<field name="student_id" ref="mc_education_base.demo_student_aditya_krishnan"/>
|
|
<field name="marks_obtained">85</field>
|
|
</record>
|
|
<record id="demo_mark_aditya_science_t2" model="mc.mark">
|
|
<field name="exam_id" ref="demo_exam_g8a_science_t2"/>
|
|
<field name="student_id" ref="mc_education_base.demo_student_aditya_krishnan"/>
|
|
<field name="marks_obtained">78</field>
|
|
</record>
|
|
<record id="demo_mark_aditya_sst_t2" model="mc.mark">
|
|
<field name="exam_id" ref="demo_exam_g8a_sst_t2"/>
|
|
<field name="student_id" ref="mc_education_base.demo_student_aditya_krishnan"/>
|
|
<field name="marks_obtained">67</field>
|
|
</record>
|
|
<record id="demo_mark_aditya_hindi_t2" model="mc.mark">
|
|
<field name="exam_id" ref="demo_exam_g8a_hindi_t2"/>
|
|
<field name="student_id" ref="mc_education_base.demo_student_aditya_krishnan"/>
|
|
<field name="marks_obtained">58</field>
|
|
</record>
|
|
|
|
<!-- A smaller slice for Ananya (Grade 5-B, percentage scale) so her
|
|
side of the data is not empty either. -->
|
|
<record id="demo_exam_g5b_english_t2" model="mc.exam">
|
|
<field name="name">Term 2 Exam</field>
|
|
<field name="term_id" ref="mc_education_base.demo_term_2026_27_t2"/>
|
|
<field name="batch_id" ref="mc_education_base.demo_batch_grade5_b"/>
|
|
<field name="subject_id" ref="mc_education_base.demo_subject_english"/>
|
|
<field name="max_marks">100</field>
|
|
<field name="pass_marks">35</field>
|
|
<field name="date">2026-10-20</field>
|
|
</record>
|
|
<record id="demo_mark_ananya_english_t2" model="mc.mark">
|
|
<field name="exam_id" ref="demo_exam_g5b_english_t2"/>
|
|
<field name="student_id" ref="mc_education_base.demo_student_ananya_krishnan"/>
|
|
<field name="marks_obtained">88</field>
|
|
</record>
|
|
</odoo>
|