diff --git a/mod/data/lib.php b/mod/data/lib.php index 05bbb02519a..4498ca6e836 100644 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -4174,3 +4174,41 @@ function mod_data_get_fontawesome_icon_map() { 'mod_data:field/url' => 'fa-link', ]; } + +/* + * Check if the module has any update that affects the current user since a given time. + * + * @param cm_info $cm course module data + * @param int $from the time to check updates from + * @param array $filter if we need to check only specific updates + * @return stdClass an object with the different type of areas indicating if they were updated or not + * @since Moodle 3.2 + */ +function data_check_updates_since(cm_info $cm, $from, $filter = array()) { + global $DB, $CFG; + require_once($CFG->dirroot . '/mod/data/locallib.php'); + + $updates = course_check_module_updates_since($cm, $from, array(), $filter); + + // Check for new entries. + $updates->entries = (object) array('updated' => false); + + $data = $DB->get_record('data', array('id' => $cm->instance), '*', MUST_EXIST); + $searcharray = []; + $searcharray[DATA_TIMEMODIFIED] = new stdClass(); + $searcharray[DATA_TIMEMODIFIED]->sql = ''; + $searcharray[DATA_TIMEMODIFIED]->params = array(); + $searcharray[DATA_TIMEMODIFIED]->field = 'r.timemodified'; + $searcharray[DATA_TIMEMODIFIED]->data = $from; + + $currentgroup = groups_get_activity_group($cm); + list($entries, $maxcount, $totalcount, $page, $nowperpage, $sort, $mode) = + data_search_entries($data, $cm, $cm->context, 'list', $currentgroup, '', null, null, 0, 0, true, $searcharray); + + if (!empty($entries)) { + $updates->entries->updated = true; + $updates->entries->itemids = array_keys($entries); + } + + return $updates; +} diff --git a/mod/data/tests/lib_test.php b/mod/data/tests/lib_test.php index 37b8de3fef2..57527f9e958 100644 --- a/mod/data/tests/lib_test.php +++ b/mod/data/tests/lib_test.php @@ -921,4 +921,77 @@ class mod_data_lib_testcase extends advanced_testcase { $completiondata = $completion->get_data($cm); $this->assertEquals(1, $completiondata->completionstate); } + + /** + * Test check_updates_since callback. + */ + public function test_check_updates_since() { + global $DB; + $this->resetAfterTest(); + $this->setAdminUser(); + $course = $this->getDataGenerator()->create_course(); + // Create user. + $student = self::getDataGenerator()->create_user(); + // User enrolment. + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id, 'manual'); + $this->setCurrentTimeStart(); + $record = array( + 'course' => $course->id, + ); + $data = $this->getDataGenerator()->create_module('data', $record); + $cm = get_coursemodule_from_instance('data', $data->id, $course->id); + $cm = cm_info::create($cm); + $this->setUser($student); + + // Check that upon creation, the updates are only about the new configuration created. + $onehourago = time() - HOURSECS; + $updates = data_check_updates_since($cm, $onehourago); + foreach ($updates as $el => $val) { + if ($el == 'configuration') { + $this->assertTrue($val->updated); + $this->assertTimeCurrent($val->timeupdated); + } else { + $this->assertFalse($val->updated); + } + } + + // Add a couple of entries. + $datagenerator = $this->getDataGenerator()->get_plugin_generator('mod_data'); + $fieldtypes = array('checkbox', 'date'); + + $count = 1; + // Creating test Fields with default parameter values. + foreach ($fieldtypes as $fieldtype) { + // Creating variables dynamically. + $fieldname = 'field-' . $count; + $record = new StdClass(); + $record->name = $fieldname; + $record->type = $fieldtype; + $record->required = 1; + + ${$fieldname} = $datagenerator->create_field($record, $data); + $count++; + } + + $fields = $DB->get_records('data_fields', array('dataid' => $data->id), 'id'); + + $contents = array(); + $contents[] = array('opt1', 'opt2', 'opt3', 'opt4'); + $contents[] = '01-01-2037'; // It should be lower than 2038, to avoid failing on 32-bit windows. + $count = 0; + $fieldcontents = array(); + foreach ($fields as $fieldrecord) { + $fieldcontents[$fieldrecord->id] = $contents[$count++]; + } + + $datarecor1did = $datagenerator->create_entry($data, $fieldcontents); + $datarecor2did = $datagenerator->create_entry($data, $fieldcontents); + $records = $DB->get_records('data_records', array('dataid' => $data->id)); + $this->assertCount(2, $records); + // Check we received the entries updated. + $updates = data_check_updates_since($cm, $onehourago); + $this->assertTrue($updates->entries->updated); + $this->assertEquals([$datarecor1did, $datarecor2did], $updates->entries->itemids, '', 0, 10, true); + } }