$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!';
* @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;
$data->id = $DB->insert_record('data', $data);
+ // Add calendar events if necessary.
+ data_set_events($data);
+
data_grade_item_update($data);
return $data->id;
* @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;
$DB->update_record('data', $data);
+ // Add calendar events if necessary.
+ data_set_events($data);
+
data_grade_item_update($data);
return true;
$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));
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;
+}
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);
+ }
+ }
+}
$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);
+ }
+ }
+ }
}