A learning platform for reusable course content, scheduled teaching runs and learner progress.
This course authoring platform case study separates the right to take a course from joining its next scheduled run. The platform keeps those two apart. An entitlement identifies the course, while an enrollment belongs to one offering with its own learners and assessment records. Authors maintain the reusable material, and instructors run the teaching built around it.
The challenge
Repeated delivery of a course needs content that can be reused, yet one group's results must never mix into another's. The access rules also depend on timing. A rule that can refuse enrollment runs before the save. A listener that only reacts once an enrollment is finished needs the event that the save produced.
What we built
Authors arrange text, video and assessments into sections and subsections, then into units and components. Libraries and item banks support reuse. XML import and export move course material in and out. Learners get courseware and discussion tools, while instructors get teaching administration and credential functions.
Enrollment checks the window, the capacity and existing membership, and returns a distinct response when it refuses access. Unenrollment changes the status and keeps the record's history.
Technical approach
Course-level entitlement identifiers and run-level enrollment keys connect records across the relational and content stores. An integration can point to one teaching period without confusing it with the learner's general right of access.
Enrollment filters can change or stop the operation before it saves. After a save succeeds, events let other components react. Plugins hook into those points, while the enrollment service keeps ownership of the operation itself.
Grading happens asynchronously, away from the request. A problem submission creates score events, and Celery tasks work out subsection results before the course grade. A policy change can trigger recalculation across batches of students. The flow waits for a newly written score before it relies on a possibly stale read. Even then, the course result shown can lag a submission for a short time. Staff preview activity stays separate from real learner results.
Authoring and delivery run as separate services, and each has its own background workers. Commerce and deployment-specific identity services stay as external integrations.
Project success
The same material can back several teaching runs, each with its own enrollment and assessment context. A local enrollment decision has a defined place before the save, and a saved change has an event path afterward. A score moves from subsection grading up to the course grade. From there it reaches the certificate events, and those records never collapse into one.
Technology stack
Application
Python, Django
Frontend
JavaScript, React
Data stores
MySQL, MongoDB
Background processing
Celery, Redis
Content and identity interfaces
Component extensions, XML, SAML, OAuth
Other engagements
Financial Transaction Processing and Balance Management
Read the case studyGPS Fleet Tracking, Geofencing and Device Management
Read the case studyRecognize the pattern?
If one of these looks like your situation, the discovery call is where we find out how close.