Tracking course and lesson progress

Hello All,

I’ve searched around and cannot seem to find a solution for what I want to do.

Data Types

User
Courses enrolled (list of courses)
Course
Name
Course Lesson
Lesson name
Course (Link to course)
Course Progress
Course (single course)
Lesson (single lesson)
Completed (yes/no)
Created by (User)

When the student finishes the lesson, an entry is added to the course progress data type. Everything related to storing the progress is working.

Things I want to do but can’t figure out.

  • How do I get the next lesson in the course for the student based on their progress?

In programmer brain, I would get the list of course lessons and then get the list of course progress for the user, then compare the lists to find the next lesson based on the lesson missing from course progress.

  • How can I get a list of all students that have not started (ie, not in the progress table).

Again, in programmer brain, I would get a list of users not in the list of course progress users.

I’ve spent days trying to figure out how to create the data correctly so that I could track progress for students across multiple courses and lessons and then generate reports for various progress, started, not started, etc.

I’ve also found that iterating over lists is extremely complex and doesn’t really make sense to me as a programmer. Something such as here is a list, go through it and do things based on these conditions doesn’t seem obvious or possible.

What am I missing ? Any documentation that I need to re/reread?

Thanks,

The way we do it is fairly similar to how you’re approaching it…

Our database looks like this (this is a much simplified outline):

User
Enrolled Courses (list of courses)
Course Progress Records (list of course_progress_records)

Course
Course Name
Lessons (list of lessons)

Lesson
Lesson Name
Course (link to course)
Lesson Number (number)

Course Progress Record
User (link to User)
Course (link to Course)
Lesson Progress Records (list of Lesson Progress Records)
Most Recent Lesson (link to a Lesson)

Lesson Progress Record
Course (link to Course)
Course Progress Record (link to Course Progress Record)
User (link to User)
Lesson (link to Lesson)
Lesson Video Position (number)
Lesson Video Percentage (number)
Complete (yes/no)

In our case we’re using video lessons, so the progress of each lesson is based on the most recent video play position - but the same concept can be used whatever your metric for progress.

We create a new Course Progress Record whenever a student enrols on a course, along with a Lesson Progress Record for the first lesson of the course.

Then we create a new Lesson Progress Record for each lesson as and when the student starts that lesson.

When a student opens the course content page we load the relevant Course Progress Record, and the most recent Lesson Progress Record (filtered from the Course Progress Record’s list of Lesson progress Records)- then load the relevant Lesson content from that record’s Lesson.

Any time a video is paused, skipped, or a new one is loaded we update the video position on the Lesson Progress Record.

  • How do I get the next lesson in the course for the student based on their progress?

To skip to the next lesson we just check the lesson number of the currently loaded Lesson Progress Record’s Lesson, and compare it to the course’s lessons lesson numbers (adding 1 to get the next lesson).

  • How can I get a list of all students that have not started (ie, not in the progress table).

If you mean showing a list of student’s who’ve enrolled on the course but not started it, in our case we could do a search for Course Progress Records who’s most recent Lesson is the first lesson, then filter it further to show only records who’s first lesson video position is zero (assuming you’re using videos - if not then use whatever metric you use to determine progress). Then just get each item’s Student (User): unique items.

With all that data we can easily show reports of individual lesson progress, as well as overall course progress for any given User.

The actual processes we use are a bit more complicated than the basic outline above - but that’s the general gist of it - it works well for us (no doubt there are other ways to do the same thing as always)

I’ve also found that iterating over lists is extremely complex and doesn’t really make sense to me as a programmer. Something such as here is a list, go through it and do things based on these conditions doesn’t seem obvious or possible.

Depending on what you’re trying to do with lists, and whether you’re doing things on the front or back end, you might want to check out the ListShifter and/or ListPopper Plugins if you haven’t already.

2 Likes

Thanks @adamhholmes

I’ve implemented some of your recommendations, and I’m now working through getting the course progress working. Mine is also video based, however to complete each lesson they have to complete a quiz.

For now I have the next lesson being set via a button until I can get all the base course progress working.

Thanks again and if I get stuck I’m sure you’ll be hearing from me.

cheers,

1 Like

Can you share your data structure to record quiz answrs?