Here, in C++ notation, is the OKI model:
class CourseManagementManager {
// single instance class
set<CanonicalCourse> canonicalCourses;
set<CourseGroup> courseGroups;
set<Type> courseGroupTypes;
set<Type> courseTypes;
set<Type> gradeTypes;
set<Type> offeringTypes;
set<Type> sectionTypes;
set<Type> statusTypes;
set<Type> studentTypes;
set<Term> terms;
set<Type> termTypes;
} theCourseManagementManager;
class CanonicalCourse {
set<CanonicalCourse> canonicalCourses;
set<CourseOffering> courseOfferings;
set<CanonicalCourse>& equivalentCourses; // could be a CourseGroup
set<String> topics;
float credits
String description;
String number;
String title;
// also needed
set<CanonicalCourse> prerequisites; // or course gp. Omitted by OKI
};
class CourseOffering {
Id assetId;
const CanonicalCourse canonicalCourse; // shouldn't this be a set of eqvs
set<CourseSection> courseSections;
Type status;
String description;
Type gradingOptionType;
String number;
const Term term;
String title;
};
class CourseSection {
Type status; // open, closed, etc. Omitted by OKI.
Id assetId; // rooms, labs, etc. Should be set
String description;
Serializable location;
String number;
set<Agent> roster;
set<ScheduleItem> schedule;
String title;
set<CourseOffering> courseOfferings;
// also need
enrollment limits etc.
};
class Term {
set<ScheduleItem> schedule;
};
class GradeRecord {
const Agent& agent;
const CourseOffering& courseOffering;
Serializable grade;
};
class CourseGroup {
set<CanonicalCourse> courses; // a set of references.
};
// Grading
class GradingManager {
set<Assignment> assignments;
set<GradeRecord> gradeRecords;
set<Type> gradeRecordTypes;
set<Type> gradeScales;
set<Type> gradeTypes;
set<Type> scoringDefinitions;
};
class Assignment {
const CourseSection& courseSectionId;
String description;
String displayName;
const GradableObject& gradableObject; // what's assigned to be graded
const Type gradeScale;
const Type gradeType;
const Type scoringDefinition;
};
class GradeRecord {
const Agent& agent;
const Assignment& assignmentId;
Serializable gradeValue;
const Agent& modifiedBy;
const Calendar modifiedDate;
const Type gradeType;
};
// Assessments
class AssessmentManager{
set<Assessment> assessments;
set<AssessmentPublished> assessmentsPublished;
set<AssessmentTaken> assessmentsTaken;
set<Evaluation> evaluations;
set<Item> items;
set<Section> sections;
set<Type> assessmentTypes;
set<Type> evaluationTypes;
set<Type> sectionTypes;
set<Type> itemTypes;
};
class Assessment {
set<Section> section;
Serializable data;
String description;
String displayName;
String topic;
};
class AssessmentPublished {
const Assessment assessment;
set<AssessmentTaken> assessmentsTaken;
CourseSection& courseSection;
Serializable data;
const Calendar date;
String description;
String displayName;
Id gradingAssignment;
};
class AssessmentTaken {
set<Evaluation> evaluations; // summative from per-sections evals
set<SectionTaken> sectionsTaken;
const AssessmentPublished& assessmentPublished;
const Agent& agent; // student
Serializable data;
const Calendar date
};
class Evaluation {
Serializable data;
const Agent& modifiedBy; // these should be expanded to lists
const Calendar modifiedDate;
const ObjectTaken& objectTaken; // the item, section, or assessment
// being evaluated
};
class Item {
Serializable data; // answer, rubric, etc.
String description;
String displayName;
};
class ItemTaken {
Serializable data;
set<Evaluation> evaluations;
const Item& item; // master copy of this item
const SectionTaken& sectionTaken;
};
class Section {
set<Item> items; // questions/problems
set<Section> sections; // subsections
Serializable data; // whatever
String description;
String displayName;
};
class SectionTaken {
const Section& section; // master copy of this section
set<Evaluation> evaluations; // from evals of items & subsections taken
Serializable data; // ?? grading formulae?
set<ItemTaken> itemsTaken;
set<SectionTaken> sectionsTaken; // subsections taken
const AssessmentTaken& assessmentTaken; // ? parent section or assessment
};