Merge branch 'MDL-11369_m32v2' of https://github.com/sbourget/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 12 Jul 2016 13:58:59 +0000 (15:58 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 12 Jul 2016 13:58:59 +0000 (15:58 +0200)
mod/choice/lang/en/choice.php
mod/choice/lib.php
mod/choice/locallib.php [new file with mode: 0644]

index bdfa60a..8e259b0 100644 (file)
@@ -27,6 +27,8 @@ $string['addmorechoices'] = 'Add more choices';
 $string['allowupdate'] = 'Allow choice to be updated';
 $string['allowmultiple'] = 'Allow more than one choice to be selected';
 $string['answered'] = 'Answered';
+$string['calendarend'] = 'Choice {$a} closes';
+$string['calendarstart'] = 'Choice {$a} opens';
 $string['cannotsubmit'] = 'Sorry, there was a problem submitting your choice. Please try again.';
 $string['closebeforeopen'] = 'You have specified a close date before the open date.';
 $string['completionsubmit'] = 'Show as complete when user makes a choice';
index 54c01b6..4e799c8 100644 (file)
@@ -112,7 +112,8 @@ function choice_user_complete($course, $user, $mod, $choice) {
  * @return int
  */
 function choice_add_instance($choice) {
-    global $DB;
+    global $DB, $CFG;
+    require_once($CFG->dirroot.'/mod/choice/locallib.php');
 
     $choice->timemodified = time();
 
@@ -137,6 +138,9 @@ function choice_add_instance($choice) {
         }
     }
 
+    // Add calendar events if necessary.
+    choice_set_events($choice);
+
     return $choice->id;
 }
 
@@ -150,7 +154,8 @@ function choice_add_instance($choice) {
  * @return bool
  */
 function choice_update_instance($choice) {
-    global $DB;
+    global $DB, $CFG;
+    require_once($CFG->dirroot.'/mod/choice/locallib.php');
 
     $choice->id = $choice->instance;
     $choice->timemodified = time();
@@ -185,6 +190,9 @@ function choice_update_instance($choice) {
         }
     }
 
+    // Add calendar events if necessary.
+    choice_set_events($choice);
+
     return $DB->update_record('choice', $choice);
 
 }
@@ -592,6 +600,10 @@ function choice_delete_instance($id) {
     if (! $DB->delete_records("choice", array("id"=>"$choice->id"))) {
         $result = false;
     }
+    // Remove old calendar events.
+    if (! $DB->delete_records('event', array('modulename' => 'choice', 'instance' => $choice->id))) {
+        $result = false;
+    }
 
     return $result;
 }
@@ -1069,3 +1081,34 @@ function choice_get_availability_status($choice) {
     // Choice is available.
     return array($available, $warnings);
 }
+
+/**
+ * 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 chat event in the site is checked, else
+ * only chat 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 choice_refresh_events($courseid = 0) {
+    global $DB, $CFG;
+    require_once($CFG->dirroot.'/mod/choice/locallib.php');
+
+    if ($courseid) {
+        if (! $choices = $DB->get_records("choice", array("course" => $courseid))) {
+            return true;
+        }
+    } else {
+        if (! $choices = $DB->get_records("choice")) {
+            return true;
+        }
+    }
+
+    foreach ($choices as $choice) {
+        choice_set_events($choice);
+    }
+    return true;
+}
+
diff --git a/mod/choice/locallib.php b/mod/choice/locallib.php
new file mode 100644 (file)
index 0000000..b3291ba
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+/**
+ * Internal library of functions for choice module.
+ *
+ * All the choice specific functions, needed to implement the module
+ * logic, should go here. Never include this file from your lib.php!
+ *
+ * @package   mod_choice
+ * @copyright 2016 Stephen Bourget
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * This creates new calendar events given as timeopen and timeclose by $choice.
+ *
+ * @param stdClass $choice
+ * @return void
+ */
+function choice_set_events($choice) {
+    global $DB, $CFG;
+
+    require_once($CFG->dirroot.'/calendar/lib.php');
+
+    // Get CMID if not sent as part of $choice.
+    if (!isset($choice->coursemodule)) {
+        $cm = get_coursemodule_from_instance('choice', $choice->id, $choice->course);
+        $choice->coursemodule = $cm->id;
+    }
+    // Choice start calendar events.
+    $event = new stdClass();
+    if ($event->id = $DB->get_field('event', 'id',
+            array('modulename' => 'choice', 'instance' => $choice->id, 'eventtype' => 'open'))) {
+        if ($choice->timeopen > 0) {
+            // Calendar event exists so update it.
+            $event->name         = get_string('calendarstart', 'choice', $choice->name);
+            $event->description  = format_module_intro('choice', $choice, $choice->coursemodule);
+            $event->timestart    = $choice->timeopen;
+            $event->visible      = instance_is_visible('choice', $choice);
+            $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 ($choice->timeopen > 0) {
+            $event->name         = get_string('calendarstart', 'choice', $choice->name);
+            $event->description  = format_module_intro('choice', $choice, $choice->coursemodule);
+            $event->courseid     = $choice->course;
+            $event->groupid      = 0;
+            $event->userid       = 0;
+            $event->modulename   = 'choice';
+            $event->instance     = $choice->id;
+            $event->eventtype    = 'open';
+            $event->timestart    = $choice->timeopen;
+            $event->visible      = instance_is_visible('choice', $choice);
+            $event->timeduration = 0;
+            calendar_event::create($event);
+        }
+    }
+
+    // Choice end calendar events.
+    $event = new stdClass();
+    if ($event->id = $DB->get_field('event', 'id',
+            array('modulename' => 'choice', 'instance' => $choice->id, 'eventtype' => 'close'))) {
+        if ($choice->timeclose > 0) {
+            // Calendar event exists so update it.
+            $event->name         = get_string('calendarend', 'choice', $choice->name);
+            $event->description  = format_module_intro('choice', $choice, $choice->coursemodule);
+            $event->timestart    = $choice->timeclose;
+            $event->visible      = instance_is_visible('choice', $choice);
+            $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 ($choice->timeclose > 0) {
+            $event = new stdClass();
+            $event->name         = get_string('calendarend', 'choice', $choice->name);
+            $event->description  = format_module_intro('choice', $choice, $choice->coursemodule);
+            $event->courseid     = $choice->course;
+            $event->groupid      = 0;
+            $event->userid       = 0;
+            $event->modulename   = 'choice';
+            $event->instance     = $choice->id;
+            $event->eventtype    = 'close';
+            $event->timestart    = $choice->timeclose;
+            $event->visible      = instance_is_visible('choice', $choice);
+            $event->timeduration = 0;
+            calendar_event::create($event);
+        }
+    }
+}