From 2c804c3ab2ad682148f7e3b418460f2fe0210d30 Mon Sep 17 00:00:00 2001 From: Amaia Anabitarte Date: Thu, 6 Jun 2024 19:03:36 +0200 Subject: [PATCH] MDL-79971 completion: Don't assume a completed activity is viewed --- lib/completionlib.php | 7 ++++--- lib/tests/completionlib_test.php | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/completionlib.php b/lib/completionlib.php index 95ed97a4f12..b18d4768b58 100644 --- a/lib/completionlib.php +++ b/lib/completionlib.php @@ -1631,11 +1631,12 @@ class completion_info { $data->coursemoduleid = $data->cmvcoursemoduleid; $data->userid = $data->cmvuserid; } + // When reseting all state in the completion, we need to keep current view state. + // We cannot assume the activity has been viewed, so we should check if there is any course_modules_viewed already. + $data->viewed = is_null($data->cmvuserid) ? 0 : 1; + unset($data->cmvcoursemoduleid); unset($data->cmvuserid); - - // When reseting all state in the completion, we need to keep current view state. - $data->viewed = 1; } return (array)$data; diff --git a/lib/tests/completionlib_test.php b/lib/tests/completionlib_test.php index fe93eed5e79..77cf230f4c8 100644 --- a/lib/tests/completionlib_test.php +++ b/lib/tests/completionlib_test.php @@ -876,6 +876,7 @@ class completionlib_test extends advanced_testcase { * @covers ::get_completion_data */ public function test_get_completion_data(): void { + $this->setAdminUser(); $this->setup_data(); $choicegenerator = $this->getDataGenerator()->get_plugin_generator('mod_choice'); $choice = $choicegenerator->create_instance([ @@ -905,6 +906,11 @@ class completionlib_test extends advanced_testcase { $this->assertEquals(0, $completiondatabeforeview['viewed']); $this->assertEquals($cm->id, $completiondatabeforeview['coursemoduleid']); + // Mark as completed before viewing it. + $completioninfo->update_state($cm, COMPLETION_COMPLETE, $this->user->id, true); + $completiondatabeforeview = $completioninfo->get_completion_data($cm->id, $this->user->id, $defaultdata); + $this->assertEquals(0, $completiondatabeforeview['viewed']); + // Set viewed. $completioninfo->set_module_viewed($cm, $this->user->id);