ProductAcademics

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 is is_current per 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 year

Structure 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 AcademicYearInUse when classes, students, enrollments, terms, fee structures, transport records, or holidays reference it (with per-table counts).
  • Subject codes are unique per tenant; unknown subject_type values 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, overview
  • academic_programmes/ — programmes
  • grades/ — grade levels
  • mediums/ — languages of instruction
  • religions/ — religion lookup
  • subjects/ — subject catalog
  • subject_contexts/ — subject grouping
  • holidays/ — holiday calendar
  • school_units/ — campuses/branches
  • school_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.