MDL-55158 mod_data: Add calendar events for database activities
authorStephen Bourget <steve.bourget@sau19.org>
Mon, 18 Jul 2016 22:35:37 +0000 (18:35 -0400)
committerStephen Bourget <steve.bourget@sau19.org>
Mon, 18 Jul 2016 22:35:37 +0000 (18:35 -0400)
mod/data/lang/en/data.php
mod/data/lib.php
mod/data/locallib.php
mod/data/tests/lib_test.php

index 842ef63..0fabbfe 100644 (file)
@@ -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!';
index 0902635..7209626 100644 (file)
@@ -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;
+}
index 9d82963..c836e98 100644 (file)
@@ -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);
+        }
+    }
+}
index 7d87cde..c9fc50e 100644 (file)
@@ -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);
+            }
+        }
+    }
 }