Academics
One-line: This page covers the academic backbone of a school on NexSchool — academic years and terms, subjects, grades, mediums, religions, the holiday calendar, and the campus/school structure that everything else hangs off.
What it does
Academics is the foundational structure layer. Almost every other feature — classes, timetable, attendance, fees — is scoped to an academic year and built on this shared master data. It lets a school define what years and terms it runs, what subjects and grades it offers, how many campuses it has, and which holidays it observes.
Who uses it
- School admins / office staff set up years, terms, grades, subjects, units, and holidays.
- PMs / onboarding operators seed this structure for a new tenant (white-glove or wizard).
- Teachers, students, parents consume it indirectly — the subjects they see, the calendar, the active year.
Key concepts
- Academic year — top-level unit (e.g.
2024-25); only one isis_currentper tenant; nearly all data is scoped to it. - Term — subdivision of a year (Term 1/2/3 or semesters), with its own date range.
- Subject — tenant subject catalog entry (
subject_type: core, elective, language, activity, co_curricular, other); linked to classes. - Subject context — groups subjects by category (Science, Languages, Social Studies).
- Grade — ordered grade level (Nursery → Grade 12) via a
sequence. - Medium / language — language of instruction for a class, subject, or student preference.
- Religion lookup — master list backing the student religion field.
- Holiday — dated calendar entry (optionally recurring), scoped to a year; excluded from attendance and scheduling.
- School unit — a campus/branch of the tenant (multiple campuses share one subscription; classes link to a unit).
- Academic programme — named track (Science, Commerce, CBSE, ICSE) that a class can belong to.
How it works
1. Create the academic year (start/end dates, mark current)
2. Add terms inside the year
3. Define grades in sequence, then subjects (+ optional subject contexts)
4. Set up school units (campuses) and programmes
5. Add holidays for the yearStructure is modelled as tenant → school unit(s) → grades/programmes → classes. Subjects attach to classes via class_subjects; a subject context can derive per-class subjects from each class’s (programme, grade). New tenants complete a setup wizard (school info → year → grades → optional classes) before full access is unlocked.
Rules & edge cases
- Tenant scoping — every entity carries
tenant_id; all data is isolated per tenant. - One current year — only one academic year per tenant is marked current.
- No overlapping years — a new/edited year is rejected (
400 DateRangeOverlap) if its dates overlap an existing year, even by a single shared day. - Deletion guarded — deleting a year returns
409 AcademicYearInUsewhen classes, students, enrollments, terms, fee structures, transport records, or holidays reference it (with per-table counts). - Subject codes are unique per tenant; unknown
subject_typevalues are rejected. - Branch scope — branch-restricted sub-admins only see their allowed school units.
- Rollover — there is no automatic year-to-year rollover; each new academic year’s structure is created fresh (via wizard or the seed script).
Where it lives
Server modules (all under server/modules/):
academics/— years, terms, overviewacademic_programmes/— programmesgrades/— grade levelsmediums/— languages of instructionreligions/— religion lookupsubjects/— subject catalogsubject_contexts/— subject groupingholidays/— holiday calendarschool_units/— campuses/branchesschool_setup/— setup wizard + scripted seeding
Admin-web pages: /academics, /grades, /subjects, /programmes, /school-units, /holidays, and /school-setup (wizard, feature-flagged off by default). Note: academic structure does not roll over automatically — it is re-created per year, and new tenants are typically seeded via server/scripts/seed_school.py.