diff --git a/mod/data/lang/en/data.php b/mod/data/lang/en/data.php index 842ef634c1f..0fabbfe4f9b 100644 --- a/mod/data/lang/en/data.php +++ b/mod/data/lang/en/data.php @@ -54,6 +54,8 @@ $string['availabletodatevalidation'] = 'The available to date cannot be before t $string['blank'] = 'Blank'; $string['buttons'] = 'Actions'; $string['bynameondate'] = 'by {$a->name} - {$a->date}'; +$string['calendarend'] = 'Database {$a} closes'; +$string['calendarstart'] = 'Database {$a} opens'; $string['cancel'] = 'Cancel'; $string['cannotaccesspresentsother'] = 'You are not allowed to access presets from other users'; $string['cannotadd'] = 'Can not add entries!'; diff --git a/mod/data/lib.php b/mod/data/lib.php index 090263597ac..72096268914 100644 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -904,7 +904,8 @@ function data_tags_check($dataid, $template) { * @return int intance id */ function data_add_instance($data, $mform = null) { - global $DB; + global $DB, $CFG; + require_once($CFG->dirroot.'/mod/data/locallib.php'); if (empty($data->assessed)) { $data->assessed = 0; @@ -919,6 +920,9 @@ function data_add_instance($data, $mform = null) { $data->id = $DB->insert_record('data', $data); + // Add calendar events if necessary. + data_set_events($data); + data_grade_item_update($data); return $data->id; @@ -932,7 +936,8 @@ function data_add_instance($data, $mform = null) { * @return bool */ function data_update_instance($data) { - global $DB, $OUTPUT; + global $DB, $CFG; + require_once($CFG->dirroot.'/mod/data/locallib.php'); $data->timemodified = time(); $data->id = $data->instance; @@ -952,6 +957,9 @@ function data_update_instance($data) { $DB->update_record('data', $data); + // Add calendar events if necessary. + data_set_events($data); + data_grade_item_update($data); return true; @@ -992,6 +1000,13 @@ function data_delete_instance($id) { // takes the dataid $DB->delete_records('data_records', array('dataid'=>$id)); $DB->delete_records('data_fields', array('dataid'=>$id)); + // Remove old calendar events. + $events = $DB->get_records('event', array('modulename' => 'data', 'instance' => $id)); + foreach ($events as $event) { + $event = calendar_event::load($event); + $event->delete(); + } + // Delete the instance itself $result = $DB->delete_records('data', array('id'=>$id)); @@ -3965,3 +3980,33 @@ function data_process_submission(stdClass $mod, $fields, stdClass $datarecord) { return $result; } + +/** + * This standard function will check all instances of this module + * and make sure there are up-to-date events created for each of them. + * If courseid = 0, then every data event in the site is checked, else + * only data events belonging to the course specified are checked. + * This function is used, in its new format, by restore_refresh_events() + * + * @param int $courseid + * @return bool + */ +function data_refresh_events($courseid = 0) { + global $DB, $CFG; + require_once($CFG->dirroot.'/mod/data/locallib.php'); + + if ($courseid) { + if (! $data = $DB->get_records("data", array("course" => $courseid))) { + return true; + } + } else { + if (! $data = $DB->get_records("data")) { + return true; + } + } + + foreach ($data as $datum) { + data_set_events($datum); + } + return true; +} diff --git a/mod/data/locallib.php b/mod/data/locallib.php index 9d829635f08..c836e98b354 100644 --- a/mod/data/locallib.php +++ b/mod/data/locallib.php @@ -578,3 +578,93 @@ class data_file_info_container extends file_info { return $this->browser->get_file_info($this->context); } } + +/** + * This creates new calendar events given as timeavailablefrom and timeclose by $data. + * + * @param stdClass $data + * @return void + */ +function data_set_events($data) { + global $DB, $CFG; + + require_once($CFG->dirroot.'/calendar/lib.php'); + + // Get CMID if not sent as part of $data. + if (!isset($data->coursemodule)) { + $cm = get_coursemodule_from_instance('data', $data->id, $data->course); + $data->coursemodule = $cm->id; + } + // Data start calendar events. + $event = new stdClass(); + if ($event->id = $DB->get_field('event', 'id', + array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'open'))) { + if ($data->timeavailablefrom > 0) { + // Calendar event exists so update it. + $event->name = get_string('calendarstart', 'data', $data->name); + $event->description = format_module_intro('data', $data, $data->coursemodule); + $event->timestart = $data->timeavailablefrom; + $event->visible = instance_is_visible('data', $data); + $event->timeduration = 0; + $calendarevent = calendar_event::load($event->id); + $calendarevent->update($event); + } else { + // Calendar event is on longer needed. + $calendarevent = calendar_event::load($event->id); + $calendarevent->delete(); + } + } else { + // Event doesn't exist so create one. + if (isset($data->timeavailablefrom) && $data->timeavailablefrom > 0) { + $event->name = get_string('calendarstart', 'data', $data->name); + $event->description = format_module_intro('data', $data, $data->coursemodule); + $event->courseid = $data->course; + $event->groupid = 0; + $event->userid = 0; + $event->modulename = 'data'; + $event->instance = $data->id; + $event->eventtype = 'open'; + $event->timestart = $data->timeavailablefrom; + $event->visible = instance_is_visible('data', $data); + $event->timeduration = 0; + calendar_event::create($event); + } + } + + // Data end calendar events. + $event = new stdClass(); + if ($event->id = $DB->get_field('event', 'id', + array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'close'))) { + if ($data->timeavailableto > 0) { + // Calendar event exists so update it. + $event->name = get_string('calendarend', 'data', $data->name); + $event->description = format_module_intro('data', $data, $data->coursemodule); + $event->timestart = $data->timeavailableto; + $event->visible = instance_is_visible('data', $data); + $event->timeduration = 0; + $calendarevent = calendar_event::load($event->id); + $calendarevent->update($event); + } else { + // Calendar event is on longer needed. + $calendarevent = calendar_event::load($event->id); + $calendarevent->delete(); + } + } else { + // Event doesn't exist so create one. + if (isset($data->timeavailableto) && $data->timeavailableto > 0) { + $event = new stdClass(); + $event->name = get_string('calendarend', 'data', $data->name); + $event->description = format_module_intro('data', $data, $data->coursemodule); + $event->courseid = $data->course; + $event->groupid = 0; + $event->userid = 0; + $event->modulename = 'data'; + $event->instance = $data->id; + $event->eventtype = 'close'; + $event->timestart = $data->timeavailableto; + $event->visible = instance_is_visible('data', $data); + $event->timeduration = 0; + calendar_event::create($event); + } + } +} diff --git a/mod/data/tests/lib_test.php b/mod/data/tests/lib_test.php index 7d87cde3748..c9fc50eb1c9 100644 --- a/mod/data/tests/lib_test.php +++ b/mod/data/tests/lib_test.php @@ -623,4 +623,47 @@ class mod_data_lib_testcase extends advanced_testcase { $this->assertTrue(mod_data_rating_can_see_item_ratings($params1)); } + + /** + * Tests for mod_data_refresh_events. + */ + public function test_data_refresh_events() { + global $DB; + $this->resetAfterTest(); + $this->setAdminUser(); + + $timeopen = time(); + $timeclose = time() + 86400; + + $course = $this->getDataGenerator()->create_course(); + $generator = $this->getDataGenerator()->get_plugin_generator('mod_data'); + $params['course'] = $course->id; + $params['timeavailablefrom'] = $timeopen; + $params['timeavailableto'] = $timeclose; + $data = $generator->create_instance($params); + + // Normal case, with existing course. + $this->assertTrue(data_refresh_events($course->id)); + $eventparams = array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'open'); + $openevent = $DB->get_record('event', $eventparams, '*', MUST_EXIST); + $this->assertEquals($openevent->timestart, $timeopen); + + $eventparams = array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'close'); + $closeevent = $DB->get_record('event', $eventparams, '*', MUST_EXIST); + $this->assertEquals($closeevent->timestart, $timeclose); + // In case the course ID is passed as a numeric string. + $this->assertTrue(data_refresh_events('' . $course->id)); + // Course ID not provided. + $this->assertTrue(data_refresh_events()); + $eventparams = array('modulename' => 'data'); + $events = $DB->get_records('event', $eventparams); + foreach ($events as $event) { + if ($event->modulename === 'data' && $event->instance === $data->id && $event->eventtype === 'open') { + $this->assertEquals($event->timestart, $timeopen); + } + if ($event->modulename === 'data' && $event->instance === $data->id && $event->eventtype === 'close') { + $this->assertEquals($event->timestart, $timeclose); + } + } + } }