Merge branch 'MDL-55157_m32v6' of https://github.com/sbourget/moodle

This commit is contained in:
David Monllao 2016-07-19 08:41:29 +02:00
commit fa8f88095c
4 changed files with 175 additions and 33 deletions

View file

@ -23,6 +23,8 @@ relateditemsdeleted,mod_feedback
separator_decimal,mod_feedback
separator_thousand,mod_feedback
saving_failed_because_missing_or_false_values,mod_feedback
start,mod_feedback
stop,mod_feedback
switch_group,mod_feedback
viewcompleted,mod_feedback
viewcompleted_help,mod_feedback

View file

@ -37,6 +37,8 @@ $string['autonumbering'] = 'Auto number questions';
$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';
@ -238,9 +240,7 @@ $string['show_entry'] = 'Show response';
$string['show_nonrespondents'] = 'Show non-respondents';
$string['site_after_submit'] = 'Site after submit';
$string['sort_by_course'] = 'Sort by course';
$string['start'] = 'Start';
$string['started'] = 'started';
$string['stop'] = 'End';
$string['subject'] = 'Subject';
$string['switch_item_to_not_required'] = 'Set as not required';
$string['switch_item_to_required'] = 'Set as required';
@ -296,3 +296,6 @@ $string['relateditemsdeleted'] = 'All responses for this question will also be d
$string['radiorated'] = 'Radiobutton (rated)';
$string['radiobutton'] = 'Multiple choice - single answer allowed (radio buttons)';
$string['radiobutton_rated'] = 'Radiobutton (rated)';
// Deprecated since Moodle 3.2.
$string['start'] = 'Start';
$string['stop'] = 'End';

View file

@ -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');
@ -633,6 +631,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;
}
@ -731,55 +735,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->timestart = $feedback->timeopen;
$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 = 'open';
$event->timestart = $feedback->timeopen;
$event->visible = instance_is_visible('feedback', $feedback);
if ($feedback->timeclose > 0) {
$event->timeduration = ($feedback->timeclose - $feedback->timeopen);
} else {
$event->timeduration = 0;
}
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->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';
$event->timestart = $feedback->timeclose;
$event->visible = instance_is_visible('feedback', $feedback);
$event->timeduration = 0;
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;
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;
}
/**

View file

@ -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);
}
}
}
}