Skip to content

Commit

Permalink
MDL-83542 core_completion: Add hooks for cm completion
Browse files Browse the repository at this point in the history
* Add hooks for events that lead to session_cache_reset
  • Loading branch information
laurentdavid committed Nov 13, 2024
1 parent 1ffdd57 commit 65a9574
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 6 deletions.
7 changes: 7 additions & 0 deletions .upgradenotes/MDL-83542-2024111110390227.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
issueNumber: MDL-83542
notes:
core_completion:
- message: >-
Add hook after_cm_completion_updated triggered when an activity
completion is updated.
type: improved
44 changes: 44 additions & 0 deletions completion/classes/hook/after_cm_completion_updated.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

namespace core_completion\hook;

/**
* Hook after course module creation.
*
* This hook will be dispatched after a course module is created and events are fired.
*
* @package core_completion
* @copyright 2024 Laurent David <laurent.david@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
#[\core\attribute\label('Allows plugins or features to perform actions after completion is updated.')]
#[\core\attribute\tags('cm_completion')]
class after_cm_completion_updated {
/**
* Constructor for the hook
*
* @param \cm_info $cm The course module info
* @param \stdClass $data completion data
*/
public function __construct(
/** @var \cm_info The course module info */
public readonly \cm_info $cm,
/** @var \stdClass completion data */
public readonly \stdClass $data
) {
}
}
15 changes: 15 additions & 0 deletions course/format/classes/hook_listener.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,19 @@ public static function after_role_switched(
base::session_cache_reset(get_course($coursecontext->instanceid));
}
}

/**
* Reset cache for the current user when the course completion has been updated.
*
* @param \core_completion\hook\after_cm_completion_updated $hook The role switched hook.
*/
public static function after_cm_completion_updated(
\core_completion\hook\after_cm_completion_updated $hook,
): void {
// The activity completion alters the course state cache for this particular user.
$course = get_course($hook->cm->course);
if ($course) {
base::session_cache_reset($course);
}
}
}
19 changes: 13 additions & 6 deletions lib/completionlib.php
Original file line number Diff line number Diff line change
Expand Up @@ -623,12 +623,6 @@ public function update_state($cm, $possibleresult=COMPLETION_UNKNOWN, $userid=0,
return;
}

// The activity completion alters the course state cache for this particular user.
$course = get_course($cm->course);
if ($course) {
course_format::session_cache_reset($course);
}

// For auto tracking, if the status is overridden to 'COMPLETION_COMPLETE', then disallow further changes,
// unless processing another override.
// Basically, we want those activities which have been overridden to COMPLETE to hold state, and those which have been
Expand Down Expand Up @@ -659,6 +653,19 @@ public function update_state($cm, $possibleresult=COMPLETION_UNKNOWN, $userid=0,
$current->timemodified = time();
$current->overrideby = $override ? $USER->id : null;
$this->internal_set_data($cm, $current, $isbulkupdate);

// Dispatch the hook for course content update.
// The activity completion alters the course state cache for this particular user.
$course = get_course($cm->course);
if ($course) {
$modinfo = get_fast_modinfo($course);
$cminfo = $modinfo->get_cm($cm->id);
$hook = new \core_completion\hook\after_cm_completion_updated(
cm: $cminfo,
data: $current,
);
\core\di::get(\core\hook\manager::class)->dispatch($hook);
}
}
}

Expand Down
4 changes: 4 additions & 0 deletions lib/db/hooks.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@
'hook' => core\hook\access\after_role_switched::class,
'callback' => \core_courseformat\hook_listener::class . '::after_role_switched',
],
[
'hook' => \core_completion\hook\after_cm_completion_updated::class,
'callback' => \core_courseformat\hook_listener::class . '::after_cm_completion_updated',
],
[
'hook' => \core_course\hook\after_course_created::class,
'callback' => \core_communication\hook_listener::class . '::create_course_communication',
Expand Down

0 comments on commit 65a9574

Please sign in to comment.