580 likes | 696 Vues
This presentation discusses the Enterprise Integration of Course Management into Sakai, focusing on design and architecture, APIs, and implementation. Key topics include overcoming course-site mismatches, clarifying definitions and structures in course data, and the importance of user-centered design. Attendees will learn about the Course Management Working Group’s collaborative efforts and iterative development process, as well as how to engage with the academic community to refine and enhance the system. Strategies for integrating diverse institutional needs into a cohesive platform will also be addressed.
E N D
Josh Holtzman, UC Berkeley Duffy Gillman, U. of Arizona Enterprise Integration Through the Course Management Service
Agenda • CM Overview • Design & Architecture • Course Management API & Impl(s) • Fitting CM into Sakai • Where we are • Where we’re going
CM Project Goals • Bring enrollment and course data into Sakai • Flexible enough to support many different course structures • Concrete enough to build tools and services upon • Solve course-site mismatch issue • Courses are not sites • Sites are not courses • More later… • Deliver new site admin tools
Designing Course Management • Previous Work • OSID • 1.5 – 2.0 Design • Enterprise Integration DG • User-Centered Design Research • See: “User-Centered Design Process for the Course Management Project”, Marc Brierly and Daphne Ogle, Weds. 3:00-4:30pm (Grand A) • Lots of haggling over code
Course Management Working Group • Initiated in January • Coordinating UI design and SW design teams • Agile(-ish) Development Methodology • Iterative • Incremental • Use-Case Driven • Frequent Contact • Test Driven
Course Management Working Group (continued) Working Members
Course Management Working Group (continued) ReviewTeam
Course Management Working Group (continued) Resources: • Collab site: WG Course Management • Email list • Community welcome • Confluence Space: http://bugs.sakaiproject.org/confluence/display/CM/Home • Our Processes • Design Documents • Meeting Archives • Community has read and comment • Weekly Phone Meetings • Space limited • Contact collab list to request involvement • Agenda/minutes posted to Confluence Community welcome, input encouraged
Agenda • CM Overview • Design & Architecture • Course Management API & Impl(s) • Fitting CM into Sakai • Where we are • Where we’re going
Course Data • Three problems to solve • Definitions vary widely among institutions • Structures vary widely within institutions! • Business rules vary widely
Problem #1: Definitions vary widely among institutions Semester = Quarter = Term = Session Section = Class = Course = Course Offering Our Solution: Use vague terms
Problem #2: Structures vary widely within institutions Our Solution: (Hopefully) Flexible API
Problem #3: Business rules vary widely Our Solution: Punt
Sakai <= 2.2 Integration • Group Provider • Maps external group IDs to sites and groups • Custom string globbing enables mapping multiple external groups to a Sakai site/group • Legacy CourseManagementProvider • Provides external group names and IDs for use in the Site Info tool
Sakai <= 2.2 Integration (continued) • Course • Id, Title, Subject, Cross-listed, Members, Term • CourseManagementService • getInstructorCourses() – from Provider • getTerms() – from sakai.properties • GroupProvider • Access to external groups (like courses) • CourseManagementProvider • Some duplication of GroupProvider
Course Management WG Solution • Effort in preliminary stages • An attempt to code ‘what we know so far’ • Engagement of community is critical • User-centered research • Integrator experimentation with APIs • Current work best viewed as a first draft to gather feedback
CM-based Integration • Course Management API • Institutional structure • Institutional roles, memberships, and status • CM-Mapping • Explicit mapping between Sakai sites/groups and CM entities • Allows for a CM-Mapping based GroupProvider implementation • Course-Site-Admin • Manipulates CM/Site/Group mappings • Site and Group creation
Agenda • CM Overview • Design & Architecture • Course Management API & Impl(s) • Fitting CM into Sakai • Where we are • Where we’re going
Course Management API • Seeks a common abstraction for course data across institutions • Essential data: Enrollment in institutionally recognized units • Design Abstraction • Avoiding model lock-in before enough community input is gathered • Intentionally anemic model
Course Management API (continued) • Parts • Two service interfaces • Read-only • Writable • Business objects • Anemic model by design • Factoring “for the wire” • Cross-service dependencies • Simplification of persistence layer caching/session management
AcademicSession Read-only properties: Eid Title Description StartDate EndDate Provides a time-based context for CourseOfferings within a CanonicalCourse. This will generally reflect semesters or terms (e.g. Fall and Spring), but may be used to represent any time-based ordering of CourseOfferings Used for time-based ordering and determining which course data is current
CanonicalCourse Read-only properties: Eid Title Description Reflects a curriculum or academic program that is offered repeatedly.
CourseOffering Read-only properties: Eid Title Description AcademicSession StartDate EndDate Represents an instance of a CanonicalCourse offered during an AcademicSession. Enables CourseOfferings to have unique schedule.* *Roadmap plans to abstract dates into Schedule object where AcademicSession and CourseOffering would each have a Schedule.
CourseSet Read-only properties: Eid Title Description Category Parent Model a related group of CanonicalCourse or CourseOffering objects. Used in API to group child course objects. [hierarchy] Institution-specific metadata for filtering/searching
Enrollment Represents the enrollment of a single student in a single CourseOffering or Section. Read-only properties: UserId EnrollmentStatus Credits GradingScheme
Membership Relates a user to a particular role within a course data unit. e.g . Department Admin (CourseSet), T.A. (CourseOffering), lecturer (CourseOffering), Default Instructor (CanonicalCourse) Read-only properties: UserId Role
EnrollmentSet Read-only properties: Eid Title Description Category DefaultEnrollmentCredits OfficialInstructors Contains Enrollments for a particular Section or CourseOffering and metadata about enrollment in general. Separated from Section as some institutions have Sections that do not carry credit themselves. [compare use cases? Look into marc’s use cases] Institution-specific metadata (e.g. lab, lecture, …) Some registrars provide this data in aggregate; this applies to all contained enrollments.
Section Read-only properties: Eid Title Description Category Parent EnrollmentSet Represents a cohort or group within a CourseOffering. There may be multiple Sections related to a CourseOffering. Sections may also contain other Sections as subsections.
Service Management Interfaces • Contain semantic ‘glue’ of the APIs • Two interfaces • CourseManagementService (read-only) • CourseManagementAdministration (writeable)
Set getChildCourseSets(StringparentEid); Set getCourseSets(); Set getCourseSetMemberships(Stringeid); CanonicalCourse getCanonicalCourse(String eid); Set getEquivalentCanonicalCourses(String canonicalCourseEid); Set getCanonicalCourses(String courseSetEid; List getAcademicSessions(); ListgetCurrentAcademicSessions(); AcademicSession getAcademicSession(String eid); CourseOffering getCourseOffering(String eid); SetgetEquivalentCourseOfferings(StringcourseOfferingEid); Set getCourseOfferingMemberships(String courseOfferingEid); SetgetCourseOfferings(String courseSetEid); SetfindCourseOfferings(String courseSetEid, String academicSessionEid); CourseManagementService
Set findCurrentlyEnrolledEnrollmentSets(String userId); Set findCurrentlyInstructingEnrollmentSets (String userId); Set findInstructingSections(String userId); Set findInstructingSections(String userId, String academicSessionEid); Set findCurrentSectionsWithMember(String userId); CourseManagementService (continued)
List findCourseSets(String category); boolean isEmpty(String courseSetEid); Section getSection(String eid); Set getSections(String courseOfferingEid); Set getChildSections(String parentSectionEid); Set getSectionMemberships(String sectionEid); String getSectionRole(String sectionEid, String userId); EnrollmentSet getEnrollmentSet(String eid); Set getEnrollmentSets(String courseOfferingEid); Set getEnrollments(String enrollmentSetEid); Set getInstructorsOfRecordIds(String enrollmentSetEid); boolean isEnrolled(String userId, Set enrollmentSetEids); boolean isEnrolled(String userId, String eid); Enrollment findEnrollment(String userId, String eid); CourseManagementService (continued)
boolean removeCourseOfferingFromCourseSet(String csEid, String coEid); void createEnrollmentSet(String eid, String title, String description, String category, …); void updateEnrollmentSet(EnrollmentSet enrollmentSet); void addOrUpdateEnrollment(String userId, String enrollmentSetEid, String enrollmentStatus, String credits, String gradingScheme); boolean removeEnrollment(String userId, String enrollmentSetEid); public void createSection(String eid, String title, String description, String category, String parentSectionEid, String …); public void updateSection(Section section); void addOrUpdateCourseSetMembership(String userId, String role, String courseSetEid); boolean removeCourseSetMembership(String userId, String courseSetEid); void addOrUpdateCourseOfferingMembership (String userId, String role, String courseOfferingEid); CourseManagementAdministration
public boolean removeCourseOfferingMembership(String userId, String courseOfferingEid); public void addOrUpdateSectionMembership(String userId, String role, String sectionEid); public boolean removeSectionMembership(String userId, String sectionEid); void createAcademicSession(String eid, String title, String description, Date startDate, Date endDate); void updateAcademicSession(AcademicSession academicSession); void createCourseSet(String eid, String title, String description, String category, String parentCourseSetEid); void updateCourseSet(CourseSet courseSet); void createCanonicalCourse(String eid, String title, String description); void updateCanonicalCourse(CanonicalCourse canonicalCourse); void addCanonicalCourseToCourseSet(String courseSetEid, String canonicalCourseEid); boolean removeCanonicalCourseFromCourseSet(String courseSetEid, String canonicalCourseEid); CourseManagementAdministration (continued)
void setEquivalentCanonicalCourses(Set canonicalCourses); boolean removeEquivalency(CanonicalCourse canonicalCourse); void createCourseOffering(String eid, String title, String description, String academicSessionEid, String canonicalCourseEid, Date startDate, Date endDate); void updateCourseOffering(CourseOffering courseOffering); void setEquivalentCourseOfferings(Set courseOfferings); boolean removeEquivalency(CourseOffering courseOffering); void addCourseOfferingToCourseSet(String courseSetEid, String courseOfferingEid); CourseManagementAdministration (continued)
Default Implementation • Stand-alone • Hibernate • Population • Using CourseManagementAdministration • Batch Import
Agenda • CM Overview • Design & Architecture • Course Management API & Impl(s) • Fitting CM into Sakai • Where we are • Where we’re going
Service Level: CM-Mapping (continued) • Maps CM Entities to Sakai context(s) • Multiple sections can be mapped to multiple sakai sites/groups • public Set getMappedSectionEids(String sakaiRef) • public Set getSakaiReferences(String sectionEid) • Current API is simple… adding anything other than sections makes it very complex!
Tool Level: Course-Site-Admin • Alternative for Site Info/Site Setup • Intended to match use cases uncovered in User-Centered research • First release pending
Use Cases: Currently Identified • Simple • Large Lecture • One instructor, multiple lectures and sections • Multiple instructors, lectures and sections • One instructor, multiple section types • Cross-listed (multiple types) • Language Course • Shared site • Independent site • Professional School Course • No-Term Course See User-Centered Design Presentation: 3:00pm (Grand D)