Skip to content

Commit

Permalink
MDL-55157 mod_feedback: Course reset should update dates
Browse files Browse the repository at this point in the history
  • Loading branch information
sbourget committed Jul 19, 2016
1 parent 1972614 commit 887eb29
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 30 deletions.
2 changes: 2 additions & 0 deletions mod/feedback/lang/en/feedback.php
Expand Up @@ -37,6 +37,8 @@
$string['autonumbering_help'] = 'Enables or disables automated numbers for each question';
$string['average'] = 'Average';
$string['bold'] = 'Bold';
$string['calendarend'] = 'Feedback {$a} closes';
$string['calendarstart'] = 'Feedback {$a} opens';
$string['cannotaccess'] = 'You can only access this feedback from a course';
$string['cannotsavetempl'] = 'saving templates is not allowed';
$string['captcha'] = 'Captcha';
Expand Down
118 changes: 88 additions & 30 deletions mod/feedback/lib.php
Expand Up @@ -25,8 +25,6 @@

/** Include eventslib.php */
require_once($CFG->libdir.'/eventslib.php');
/** Include calendar/lib.php */
require_once($CFG->dirroot.'/calendar/lib.php');
// Include forms lib.
require_once($CFG->libdir.'/formslib.php');

Expand Down Expand Up @@ -648,6 +646,12 @@ function feedback_reset_userdata($data) {
'error'=>false);
}

// Updating dates - shift may be negative too.
if ($data->timeshift) {
$shifterror = !shift_course_mod_dates('feedback', array('timeopen', 'timeclose'), $data->timeshift, $data->courseid);
$status[] = array('component' => $componentstr, 'item' => get_string('datechanged'), 'error' => $shifterror);
}

return $status;
}

Expand Down Expand Up @@ -746,55 +750,109 @@ function feedback_get_editor_options() {
* @return void
*/
function feedback_set_events($feedback) {
global $DB;
global $DB, $CFG;

// adding the feedback to the eventtable (I have seen this at quiz-module)
$DB->delete_records('event', array('modulename'=>'feedback', 'instance'=>$feedback->id));
// Include calendar/lib.php.
require_once($CFG->dirroot.'/calendar/lib.php');

// Get CMID if not sent as part of $feedback.
if (!isset($feedback->coursemodule)) {
$cm = get_coursemodule_from_id('feedback', $feedback->id);
$cm = get_coursemodule_from_instance('feedback', $feedback->id, $feedback->course);
$feedback->coursemodule = $cm->id;
}

// the open-event
if ($feedback->timeopen > 0) {
// Feedback start calendar events.
$eventid = $DB->get_field('event', 'id',
array('modulename' => 'feedback', 'instance' => $feedback->id, 'eventtype' => 'open'));

if (isset($feedback->timeopen) && $feedback->timeopen > 0) {
$event = new stdClass();
$event->name = get_string('start', 'feedback').' '.$feedback->name;
$event->name = get_string('calendarstart', 'feedback', $feedback->name);
$event->description = format_module_intro('feedback', $feedback, $feedback->coursemodule);
$event->courseid = $feedback->course;
$event->groupid = 0;
$event->userid = 0;
$event->modulename = 'feedback';
$event->instance = $feedback->id;
$event->eventtype = 'open';
$event->timestart = $feedback->timeopen;
$event->visible = instance_is_visible('feedback', $feedback);
if ($feedback->timeclose > 0) {
$event->timeduration = ($feedback->timeclose - $feedback->timeopen);
$event->timeduration = 0;
if ($eventid) {
// Calendar event exists so update it.
$event->id = $eventid;
$calendarevent = calendar_event::load($event->id);
$calendarevent->update($event);
} else {
$event->timeduration = 0;
// Event doesn't exist so create one.
$event->courseid = $feedback->course;
$event->groupid = 0;
$event->userid = 0;
$event->modulename = 'feedback';
$event->instance = $feedback->id;
$event->eventtype = 'open';
calendar_event::create($event);
}

calendar_event::create($event);
} else if ($eventid) {
// Calendar event is on longer needed.
$calendarevent = calendar_event::load($eventid);
$calendarevent->delete();
}

// the close-event
if ($feedback->timeclose > 0) {
// Feedback close calendar events.
$eventid = $DB->get_field('event', 'id',
array('modulename' => 'feedback', 'instance' => $feedback->id, 'eventtype' => 'close'));

if (isset($feedback->timeclose) && $feedback->timeclose > 0) {
$event = new stdClass();
$event->name = get_string('stop', 'feedback').' '.$feedback->name;
$event->name = get_string('calendarend', 'feedback', $feedback->name);
$event->description = format_module_intro('feedback', $feedback, $feedback->coursemodule);
$event->courseid = $feedback->course;
$event->groupid = 0;
$event->userid = 0;
$event->modulename = 'feedback';
$event->instance = $feedback->id;
$event->eventtype = 'close';
$event->timestart = $feedback->timeclose;
$event->visible = instance_is_visible('feedback', $feedback);
$event->timeduration = 0;
if ($eventid) {
// Calendar event exists so update it.
$event->id = $eventid;
$calendarevent = calendar_event::load($event->id);
$calendarevent->update($event);
} else {
// Event doesn't exist so create one.
$event->courseid = $feedback->course;
$event->groupid = 0;
$event->userid = 0;
$event->modulename = 'feedback';
$event->instance = $feedback->id;
$event->eventtype = 'close';
calendar_event::create($event);
}
} else if ($eventid) {
// Calendar event is on longer needed.
$calendarevent = calendar_event::load($eventid);
$calendarevent->delete();
}
}

/**
* 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 feedback event in the site is checked, else
* only feedback 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 feedback_refresh_events($courseid = 0) {
global $DB;

calendar_event::create($event);
if ($courseid) {
if (! $feedbacks = $DB->get_records("feedback", array("course" => $courseid))) {
return true;
}
} else {
if (! $feedbacks = $DB->get_records("feedback")) {
return true;
}
}

foreach ($feedbacks as $feedback) {
feedback_set_events($feedback);
}
return true;
}

/**
Expand Down
79 changes: 79 additions & 0 deletions mod/feedback/tests/lib_test.php
@@ -0,0 +1,79 @@
<?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/>.
/**
* Unit tests for (some of) mod/feedback/lib.php.
*
* @package mod_feedback
* @copyright 2016 Stephen Bourget
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/mod/feedback/lib.php');

/**
* Unit tests for (some of) mod/feedback/lib.php.
*
* @copyright 2016 Stephen Bourget
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class mod_feedback_lib_testcase extends advanced_testcase {

/**
* Tests for mod_feedback_refresh_events.
*/
public function test_feedback_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_feedback');
$params['course'] = $course->id;
$params['timeopen'] = $timeopen;
$params['timeclose'] = $timeclose;
$feedback = $generator->create_instance($params);
$cm = get_coursemodule_from_instance('feedback', $feedback->id);
$context = context_module::instance($cm->id);

// Normal case, with existing course.
$this->assertTrue(feedback_refresh_events($course->id));
$eventparams = array('modulename' => 'feedback', 'instance' => $feedback->id, 'eventtype' => 'open');
$openevent = $DB->get_record('event', $eventparams, '*', MUST_EXIST);
$this->assertEquals($openevent->timestart, $timeopen);

$eventparams = array('modulename' => 'feedback', 'instance' => $feedback->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(feedback_refresh_events('' . $course->id));
// Course ID not provided.
$this->assertTrue(feedback_refresh_events());
$eventparams = array('modulename' => 'feedback');
$events = $DB->get_records('event', $eventparams);
foreach ($events as $event) {
if ($event->modulename === 'feedback' && $event->instance === $feedback->id && $event->eventtype === 'open') {
$this->assertEquals($event->timestart, $timeopen);
}
if ($event->modulename === 'feedback' && $event->instance === $feedback->id && $event->eventtype === 'close') {
$this->assertEquals($event->timestart, $timeclose);
}
}
}
}

0 comments on commit 887eb29

Please sign in to comment.