- Published
- February 11, 2026
- Last Updated
- February 19, 2026
- Author
- FdR
Programs: How We Structure Learning
Set up academic programs that group courses, define how students are assessed, and control what appears on your website.
Programs: How We Structure Learning
A program is simply a container for a complete course of study. Whether you're running an IB Diploma, a national curriculum track, or a vocational certificate, the Program DocType is where you define what students will learn, how they'll be assessed, and who oversees the whole thing.
We know schools are complex. Some programs run across multiple campuses. Some have strict prerequisite chains. Some need detailed websites for prospective families, while others are internal-only. This system handles all of that without making you jump through hoops.
What a Program Actually Contains
Think of a program as the blueprint for a student's academic journey. It holds:
- The courses that make up the program — what's required, what's optional, what can be repeated
- How students are assessed — points-based grades, pass/fail, criteria-based, or simple observations
- Who's in charge — program coordinators who can manage enrollments and see reports
- What the public sees — website pages, gallery images, self-enrollment options
Did you know? Programs can be nested. You might have a "High School" parent program containing "Grade 9," "Grade 10," and so on. This keeps things organized without creating a mess of separate records.
Setting Up a Program (For Admins)
Step 1: Create the Basic Record
Start with the essentials:
- Program Name — what everyone calls it (e.g., "IB Diploma Programme")
- Abbreviation — for reports and tight spaces (e.g., "IB-DP")
- Parent Program — if this belongs inside a larger structure
- Grade Scale — the default grading scheme (you can override per assessment)
Mark it as a Group if this is just a container (like "High School") that won't have its own courses directly.
Step 2: Define How You'll Assess
Here's where you set the rules for grading. A program can use multiple assessment types:
| Type | When to use it |
|---|---|
| Points | Traditional percentage or point-based grading with weighted categories |
| Binary | Simple Complete/Incomplete or Pass/Fail |
| Criteria | Standards-based grading against specific learning criteria |
| Observations | Comments-only feedback without numeric scores |
You can combine types. Many schools use Points for academic work but Criteria for soft skills or project-based assessments. The system handles both.
If You're Using Points
When you enable Points, you'll set up Assessment Categories — things like "Exams," "Coursework," "Participation." Each gets a weight that adds up to 100%.
The system tracks this for you. As you add or adjust weights, a live counter shows your running total. Go over 100% and it turns red. Hit exactly 100% and it turns green. No surprises at report card time.
Inheriting from a parent: If your program is part of a larger structure, you can copy assessment categories from the parent program with one click. Set it up once, use it everywhere.
Step 3: Add Your Courses
The Courses table is where you list what belongs to this program:
- Which courses are required vs. optional
- What subject group each belongs to (useful for scheduling)
- Whether a course can be repeated if a student doesn't pass
- Whether it's a core program requirement or an elective
The system won't let you add the same course twice, and it only shows you active courses — no accidentally adding something you've retired.
Step 4: Set Prerequisites (If Needed)
Some programs have entry requirements. Maybe students need to complete "Introduction to Programming" before taking "Advanced Computer Science."
You define these in the Prerequisites table. The system supports alternative paths — for example, students can enter the Advanced program if they've completed EITHER "Intro to Programming" OR "Fundamentals of Coding." Just give those two courses the same group number.
Step 5: Assign Coordinators
Program Coordinators are your go-to people for this program. They can:
- See all enrollments and reports
- Manage program-specific settings
- Access coordinator-only dashboards
Add them in the Program Coordinators table. They don't need to be system administrators — just give them the coordinator role for this specific program.
Publishing to Your Website
When you're ready to show this program to the world (or just to prospective families):
- Check "Is Published" — this makes it visible
- Set a URL Slug — the web address (e.g., "ib-diploma" becomes
yourschool.edu/ib-diploma) - Add the content — description, aims, intro video, gallery images
- Decide on self-enrollment — can families apply directly through the website?
- Mark it featured — highlight it on your homepage?
Archived programs can't be published. If a program is no longer running, check the Archive box. This keeps historical records intact but prevents accidental new enrollments.
Website Profiles
Each published program needs a Program Website Profile for each school that delivers it. This links the program to your school's branding and handles school-specific details like contact information and location.
The profile's publish status automatically syncs with the main program — no double-handling.
How Assessment Categories Work
Assessment Categories deserve their own explanation because they trip people up.
When you use Points grading, you typically have different types of work:
- Exams (40% of the grade)
- Coursework (30%)
- Class participation (20%)
- Homework (10%)
In the system, you:
- Create these categories in the Assessment Category master list
- Add them to your program with their default weights
- Override colors if you want different visuals on reports
- Mark them active or inactive
The system validates that your active weights don't exceed 100%. It also prevents you from adding the same category twice — one less thing to worry about.
Color coding: Each assessment category can have a color. These appear on dashboards and reports, making it easy to spot patterns — like if a student consistently struggles with "Exams" but excels at "Coursework."
Tree Structure: Keeping Organized
Programs can be nested, which is useful for:
- Grouping by level (Primary → Elementary → Upper Elementary)
- Grouping by type (Academic → Sciences → Biology)
- Separating campuses or divisions
The system uses a nested-set structure, which is just a fancy way of saying "it handles the hierarchy automatically." You set the parent; the system handles the rest.
What Links to Programs
Programs sit at the center of your academic ecosystem. Here's what connects to them:
Student-facing:
- Program Offerings — specific instances of a program at a specific school in a specific year
- Program Enrollments — a student's registration in an offering
- Student Logs — pastoral and academic notes can reference a student's current program
Staff-facing:
- Courses — linked through the program's course list
- Assessment Categories — defined per program
- Instructor Logs — teaching activity tied to a program
- Student Groups — class groupings filtered by program
Public-facing:
- Website Profiles — school-specific program pages
- Self-enrollment — applications coming through your website
Administrative:
- Reports — enrollment trends, attendance summaries, term reports
- Billing — tuition invoices linked to program offerings
- Communication — messages and interactions tracked by program
Common Workflows
Setting Up a New Academic Year
- Copy your existing program or use the same one (programs persist across years)
- Create a new Program Offering for this year
- Set capacity and seat policies
- Open enrollment
Updating Assessment Methods
- Edit the program
- Adjust your assessment categories or weights
- The system validates totals before letting you save
- Existing student grades aren't affected — this only applies going forward
Archiving an Old Program
- Check the Archive box
- The program immediately unpublishes from the website
- Existing enrollments and records remain intact
- New offerings can't be created for archived programs
Reports and Dashboards
Once you have programs set up, you'll want to see how they're performing:
Enrollment Reports
- How many students in each program by school and year
- Trends over time — are your STEM programs growing?
- Gap analysis — which students should be enrolled but aren't?
Academic Reports
- Student term reports include program context
- Attendance summaries by program
- Referral patterns — are certain programs seeing more pastoral issues?
Dashboard Cards
- Total programs at your institution
- Current enrollment by program (visual chart)
- Quick links to active offerings
> Screenshot: The Current Enrollment Dashboard showing program breakdown by school
Technical Details (For IT)
DocType Structure
- Core DocType:
Program(ifitwala_ed/curriculum/doctype/program/) - Tree Configuration:
is_tree = true,nsm_parent_field = "parent_program" - Autoname:
field:program_name - Child Tables:
Program Course— course listings with required/repeatable flagsProgram Assessment Category— weighted categories with color overridesProgram Coordinator— assigned staffProgram Course Prerequisite— prerequisite rules with OR-group supportGallery Image— website gallery
Key Backend Logic
Validation (validate method):
- Duplicate course guard — prevents adding same course twice
- Active course guard — only "Active" status courses allowed
- Publication guard — archived programs cannot be published; published requires slug
- Assessment category default colors — auto-fetched from master if not overridden
- Assessment category validation — duplicate guard, weight bounds [0-100], points-specific rules (at least one active, sum ≤ 100)
Server Method (inherit_assessment_categories):
- Whitelisted method for copying parent program's categories
- Deduplicates by assessment category link
- Optional overwrite (default true)
- Returns counts of inherited rows
Client Interactions
Field Queries (onload):
- Course link filtered to exclude already-picked courses, status = "Active"
- Assessment category link filtered to exclude already-selected categories
UI Enhancements (onload_post_render):
- Multiple add enabled for courses table
- "Inherit from Parent" button (blue primary) in assessment categories toolbar
- Live weight tracking badge in toolbar
- Red if total > 100
- Green if points enabled and total = 100
- Grey otherwise
- Weight clamping [0-100] on all default_weight fields
Dashboard Warnings (refresh):
- Published + Archived conflict
- Published without slug
- Published without website profile
Client Validation (before_save):
- Repeats server-side validation for points mode
- Prevents save if validations fail
Ecosystem Connections
Downstream DocTypes:
Program Offering— concrete delivery instancesProgram Enrollment— student registrationsProgram Website Profile— school-specific public pagesStudent Log— pastoral notes via enrollmentSales Invoice— tuition billing via offeringInstructor Log,Student Group,Course Enrollment Tool,Program Enrollment ToolStudent Applicant,Registration of Interest— admissionsStudent Attendance,Student Term Report,Referral Case— student services
Upstream References:
Course— via Program Course child table (active-only)Assessment Category— via Program Assessment Category child tableGrade Scale— grading scheme for programSchool,Academic Year— via offerings
Integration Points
Enrollment Engine (schedule/enrollment_engine.py):
- Validates offering courses against program catalog
- Evaluates Program Course Prerequisite rules (AND within groups, OR between groups)
- Enforces repeatability rules (Program Course
repeatable,max_attempts)
Website Integration:
- Route auto-generated from
program_slug - Program Website Profile status syncs with
is_published - Self-enrollment portal respects
allow_self_enrolland offering seat policies
Permissions:
- Tree-aware access via nested-set
- Coordinator access via
program_coordinatorschild table - School-scoped visibility via offerings and profiles
API Endpoints
program_course_options— catalog rows for offering-course selectionhydrate_catalog_rows— map course names to Program Course defaultsinherit_assessment_categories— copy parent categories (whitelisted)compute_program_offering_defaults— compute dates and title from abbreviation