Dave ( @eds2f ),
The short answer is that there is no easy perfect way to accomplish this using only built-in functionality.
@ryan_corris is right that module requirements and prerequisites are the built-in way of automatically accomplishing this.
If there are exactly 3 quizzes (not any 3 out of 5 for example) and you're not using modules for organizational purposes where placing just those quizzes in a single module is not precluded and you're okay with 80% for each as opposed to an average of 80% [which may be a better approach to avoid those 100%, 100%, 40% cases], then the approach works.
If you think there's a lot of ands in that sentence, yes there are.
Canvas does not allow for the average of an assignment group to be used in any scores. The averages are available in the gradebook in the columns at the end where you can see what percent each student has in each of the assignment group categories. Functionality like what you're asking for has been asked for before.
To do exactly what you want would require some kind of programming.
If you want to put those quizzes (whether 3 or 5 or 17) into an assignment group, you can get access to the average for the students using the graphQL API. To see what this could look like, go to your dashboard and add /graphiql to the end. Then paste the following into the query box and hit the run button at the top. You will need to change the course ID (12345678) to match your course ID.
query assignmentGroupScores {
course(id: "12345678") {
assignmentGroupsConnection {
nodes {
_id
name
gradesConnection {
nodes {
currentScore
state
enrollment {
user {
_id
name
}
}
}
}
}
}
}
}
You may have to mess with pagination in large classes or ones with lots of assignments groups. That query can also be done on a specific assignment group and that may be faster for large courses (it took under 400 ms to get that for my class of 19 students and 4 assignment groups).
That query returned the assignment group average percentage for every student and every assignment group with one query. I would then do the processing to decide whether or not to allow students to move on.
What does that logic look like?
The simplest way is probably to create a fake aggregate assignment for each assignment group and make it not count towards the final grade (or give the entire assignment group a weight of 0). Your program would transfer the assignment group score to that grade.
This process could be placed into a scheduled task so that it runs once an hour (more or less frequently depending on how quickly you want students to move on), You could also set up Canvas Data Services Live Events that send events whenever something happens so that you would be notified when someone completes a quiz. Unless you set up your queue, that goes to Amazon's SQS queues (not free but very, very cheap considering), but then you have to poll the queue, so it's still not immediate. That and the Live Events are not guaranteed, so you still have to poll the results periodically in case something slipped through. Canvas Data currently has a delay of 18-36 hours (and doesn't have the aggregate results), so that's out, but Canvas Data 2 is supposed to reduce the delay, but I don't know if the aggregate scores will be part of it or not. It's probably easiest to stick with the API calls.
To prevent students from moving on, you then need to make this aggregate assignment be part of a module but it can be the only requirement for completion of the module.
A complication occurs when there are more than 3 quizzes and you want the highest average of any three quizzes to be at least 80%. The assignment group grades wouldn't help since they could incorporate grades for quizzes that don't count towards the three. In this case, you would need to look at the submissions rather than the assignment groups.
If you don't have assignment groups, then you would also have to use the submissions approach and have some way of knowing which assignments went together.
Now, if modules are excluded for some reason, there are other ways to accomplish things. One such manner would be to create sections and then use differentiated assignments to assign each group of quizzes to one section. The logic of your script would then move students into new sections when they complete the requirements of the previous one. For example, the sections could be named "Chapter 1", "Chapter 2", etc., and then contain only the students that are working on that chapter.
In long, there are lots of ways to accomplish what you are asking for, but all of them require programming except the way that Ryan suggested.
This discussion post is outdated and has been archived. Please use the Community question forums and official documentation for the most current and accurate information.