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:
+65
-1
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user