Class Groups, Years & Subgroups

Class Groups, Years & Subgroups

Timetabler has one entity for "a group of students" — the Class Group — and it's organized as a tree via an optional Parent Group, rather than having separate "Year" and "Subgroup" entities. What a given Class Group is depends entirely on where it sits in that tree:

  • No parent, has children → it behaves like a "Year" (e.g. Year 10 containing 10A, 10B).
  • Has a parent, no children → an ordinary class (10A) or a subgroup (10A-French, a child of 10A for students taking French instead of German).
  • No parent, no children → a plain standalone class, if your school doesn't use the Year-grouping level at all.

There's no depth limit — a subgroup can itself have children if you need finer splitting than one level.

Size

A leaf group (no children) has a real, directly-entered size — the number of students in it.

A group with children doesn't take a size input at all; the page shows its effective size, computed as the sum of all its leaf descendants' sizes, and that's also what the solver uses everywhere size matters (room capacity checks, the quick checks before generating, and so on). The number you originally typed into a parent row's own size field when it had no children yet is simply ignored once it has children — don't rely on it for anything.

Bulk import note: if you're importing a Year-level (parent) row via CSV, the size column still has to be a positive number even though it's never actually used — any placeholder value works. This tripped up this project's own import template once; see Bulk Import via CSV.

Parallel siblings vs. parent/child conflicts

Two sibling subgroups (e.g. 10A-French and 10A-German, both children of 10A) don't conflict with each other — they represent different, non-overlapping students, so the solver is free to schedule lessons for both at the same time in different rooms.

A subgroup does conflict with its own ancestors, though — 10A-French's students are also part of 10A, so a lesson targeting 10A directly and a lesson targeting 10A-French can't be scheduled at the same time; they'd be double-booking the same real students.

Choosing a parent when editing

The parent picker on this page excludes the class you're currently editing and all of its own descendants — you can't nest a group inside itself or inside one of its own children. This is enforced on the server too, not just hidden from the dropdown.

Deleting

A Class Group can't be deleted while it still has children — remove or reparent the children first. (Lessons referencing a deleted Class Group aren't protected the same way — see the note on dangling references in Creating Lessons.)