Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Domain Model

This chapter summarizes principal entities; authoritative behavioral details live in the referenced chapters.

Registration

ComponentTypeDescription
Registration::CampaignActiveRecordTime‑bounded process (modes: FCFS, preference_based)
Registration::ItemActiveRecordWrapper exposing a registerable option under a campaign
Registration::UserRegistrationActiveRecord(user, item) intent + status (pending/confirmed/rejected) + optional preference_rank
Registration::PolicyActiveRecordOrdered eligibility rule (student_performance, institutional_email, prerequisite_campaign, custom_script)
Registration::CampaignableConcernEnables a model to host registration campaigns
Registration::RegisterableConcernEnables a model to be an option within a campaign
Registration::PolicyEngineServiceExecutes ordered active policies; short‑circuits on first failure
Registration::AllocationMaterializerServiceApplies confirmed allocations → registerable.materialize_allocation!

Rosters

ComponentTypeDescription
Roster::RosterableConcernUnified roster API (roster_user_ids, replace_roster!, etc.)
Roster::MaintenanceServiceServicePost-allocation admin (move/add/remove) with capacity enforcement

Assessments & Grading

ComponentTypeDescription
Assessment::AssessmentActiveRecordGradebook container for graded work (assignment, exam, talk, achievement)
Assessment::ParticipationActiveRecordPer-user totals, grade, status, submission timestamps
Assessment::TaskActiveRecordPer-assessment graded component (only if requires_points)
Assessment::TaskPointActiveRecordPer (participation, task) points + grader + submission link
Assessment::AssessableConcernEnables a model to be linked to an Assessment::Assessment
Assessment::PointableConcernExtends Assessable to enable per-task point tracking
Assessment::GradableConcernExtends Assessable to enable final grade recording
Assessment::SubmissionGraderServiceSubmission-centered fan-out to TaskPoints for team grading
SubmissionActiveRecordTeam-capable artifact optionally linked to a task

Student Performance & Certification

ComponentTypeDescription
StudentPerformance::RecordActiveRecordMaterialized factual performance data per (lecture, user): points_total, achievements_met
StudentPerformance::RuleActiveRecordConfiguration for eligibility criteria (min_points, required_achievements, assessment_types)
StudentPerformance::CertificationActiveRecordTeacher's eligibility decision per (lecture, user) with status (passed/failed/pending)
AchievementActiveRecordAssessable type for qualitative accomplishments (e.g., blackboard presentations) with Assessment infrastructure
StudentPerformance::ServiceServiceComputes and upserts Records from coursework points and achievements
StudentPerformance::EvaluatorServiceGenerates eligibility proposals by evaluating Records against Rules
Registration::Policy (kind: student_performance)IntegrationChecks Certification.status during exam registration (no runtime recomputation)

Grading Schemes

ComponentTypeDescription
GradeScheme::SchemeActiveRecordVersioned configuration for converting assessment points to final grades
GradeScheme::ApplierServiceApplies scheme to compute and persist final grades for all participations

Allocation Algorithm

ComponentTypeDescription
Registration::AllocationServiceServiceStrategy dispatcher using pluggable solvers (Min-Cost Flow, future CP-SAT)
Registration::Solvers::MinCostFlowServiceOR-Tools SimpleMinCostFlow implementation for bipartite preference allocation
Registration::Solvers::CpSatServiceFuture CP-SAT solver for advanced constraints (fairness, mutual exclusion, quotas)

Linking Concepts

What are linking concepts?

These are the "glue" entities that connect the core domain models (User, Lecture, Tutorial, etc.) to the systems above. They enable domain models to participate in registration, assessment, and eligibility tracking.

Core Domain Models:

  • User - Students, teachers, tutors who participate in the system
  • Lecture - A course offering (e.g., "Linear Algebra WS 2024/25")
  • Tutorial - A tutorial group within a lecture
  • Talk - A student presentation or seminar talk
  • Assignment - A homework assignment
  • Exam - An exam assessment

How they link to the systems:

Domain ModelLinks ToViaPurpose
LectureRegistrationRegistration::Campaignable concernHost exam registration campaigns
TutorialRegistrationRegistration::Registerable concernBecome a registerable option in tutorial allocation
ExamRegistrationRegistration::Campaignable concernHost exam registration campaigns
AssignmentAssessmentAssessment::Pointable concernTrack per-task points for homework
ExamAssessmentAssessment::Gradable concernRecord final exam grades
TalkAssessmentAssessment::Gradable concernGrade student presentations
UserAll SystemsDirect associationsStudent participates in registrations, assessments, eligibility
LectureExam EligibilityDirect associationScope eligibility records to specific lecture

Example Flows:

  1. Tutorial Registration: Lecture (campaignable) → creates Registration::Campaign → contains Registration::Item wrapping Tutorial (registerable) → students submit Registration::UserRegistration

  2. Exam Registration: Lecture (campaignable) → creates Registration::Campaign → contains Registration::Item wrapping Exam (registerable) → students submit Registration::UserRegistration → policies check eligibility

  3. Homework Grading: Assignment (pointable) → linked to Assessment::Assessment → contains Assessment::Task → tutors record Assessment::TaskPoint → aggregated into Assessment::Participation

  4. Exam Eligibility: Lecture → students complete Assignment assessments → StudentPerformance::Service aggregates points into StudentPerformance::RecordStudentPerformance::Evaluator generates proposals → teacher creates StudentPerformance::CertificationRegistration::Policy (kind: student_performance) checks Certification.status when student attempts Exam registration via the lecture's exam campaign

High-Level ERD (Simplified)

erDiagram
    USER ||--o{ REGISTRATION_USER_REGISTRATION : submits
    REGISTRATION_CAMPAIGN ||--o{ REGISTRATION_ITEM : has
    REGISTRATION_ITEM ||--o{ REGISTRATION_USER_REGISTRATION : options
    REGISTRATION_CAMPAIGN ||--o{ REGISTRATION_POLICY : guards
    REGISTRATION_ITEM }o--|| REGISTERABLE : polymorphic
    ASSESSMENT ||--o{ ASSESSMENT_PARTICIPATION : has
    ASSESSMENT ||--o{ TASK : has
    TASK ||--o{ TASK_POINT : points
    ASSESSMENT_PARTICIPATION ||--o{ TASK_POINT : aggregates
    SUBMISSION ||--o{ TASK_POINT : optional
    USER ||--o{ ASSESSMENT_PARTICIPATION : participates
    LECTURE_PERFORMANCE_RECORD }o--|| USER : "factual data"
    LECTURE_PERFORMANCE_RECORD }o--|| LECTURE : "scoped to"
    LECTURE_PERFORMANCE_CERTIFICATION }o--|| USER : "decision for"
    LECTURE_PERFORMANCE_CERTIFICATION }o--|| LECTURE : "scoped to"
    LECTURE_PERFORMANCE_CERTIFICATION }o--|| LECTURE_PERFORMANCE_RECORD : "based on (optional)"
    ACHIEVEMENT }o--|| USER : "accomplished by"
    ACHIEVEMENT }o--|| LECTURE : "belongs to"
    GRADE_SCHEME_SCHEME ||--|| ASSESSMENT : "applies to"

See details: