MDL-71410 mod_lesson: Cache lesson times in modinfo for performance

We update the dates with user/group overrides. The calculation of
the override in the lesson module is different from the assignment
module as the lesson_overrides table des not have a sortorder column.
See lesson::update_effective_access().
This commit is contained in:
Shamim Rezaie
2021-04-27 14:33:49 +10:00
parent 04e6d285d8
commit 5f9ca816f4
+65 -1
View File
@@ -1552,7 +1552,7 @@ function lesson_get_coursemodule_info($coursemodule) {
global $DB;
$dbparams = ['id' => $coursemodule->instance];
$fields = 'id, name, intro, introformat, completionendreached, completiontimespent';
$fields = 'id, name, intro, introformat, completionendreached, completiontimespent, available, deadline';
if (!$lesson = $DB->get_record('lesson', $dbparams, $fields)) {
return false;
}
@@ -1571,9 +1571,73 @@ function lesson_get_coursemodule_info($coursemodule) {
$result->customdata['customcompletionrules']['completiontimespent'] = $lesson->completiontimespent;
}
// Populate some other values that can be used in calendar or on dashboard.
if ($lesson->available) {
$result->customdata['available'] = $lesson->available;
}
if ($lesson->deadline) {
$result->customdata['deadline'] = $lesson->deadline;
}
return $result;
}
/**
* Sets dynamic information about a course module
*
* This function is called from cm_info when displaying the module
*
* @param cm_info $cm
*/
function mod_lesson_cm_info_dynamic(cm_info $cm) {
global $USER;
$cache = cache::make('mod_lesson', 'overrides');
$override = $cache->get("{$cm->instance}_u_{$USER->id}");
if (!$override) {
$override = (object) [
'available' => null,
'deadline' => null,
];
}
// No need to look for group overrides if there are user overrides for both available and deadline.
if (is_null($override->available) || is_null($override->deadline)) {
$availables = [];
$deadlines = [];
$groupings = groups_get_user_groups($cm->course, $USER->id);
foreach ($groupings[0] as $groupid) {
$groupoverride = $cache->get("{$cm->instance}_g_{$groupid}");
if (isset($groupoverride->available)) {
$availables[] = $groupoverride->available;
}
if (isset($groupoverride->deadline)) {
$deadlines[] = $groupoverride->deadline;
}
}
// If there is a user override for a setting, ignore the group override.
if (is_null($override->available) && count($availables)) {
$override->available = min($availables);
}
if (is_null($override->deadline) && count($deadlines)) {
if (in_array(0, $deadlines)) {
$override->deadline = 0;
} else {
$override->deadline = max($deadlines);
}
}
}
// Populate some other values that can be used in calendar or on dashboard.
if (!is_null($override->available)) {
$cm->override_customdata('available', $override->available);
}
if (!is_null($override->deadline)) {
$cm->override_customdata('deadline', $override->deadline);
}
}
/**
* Callback which returns human-readable strings describing the active completion custom rules for the module instance.
*