From b28753f5bfd178585df497a4f0251bc4755db168 Mon Sep 17 00:00:00 2001 From: Stephen Bourget Date: Mon, 18 Jul 2016 22:08:00 -0400 Subject: [PATCH 1/2] MDL-55157 mod_feedback: Course reset should update dates --- mod/feedback/lang/en/feedback.php | 2 + mod/feedback/lib.php | 120 ++++++++++++++++++++++-------- mod/feedback/tests/lib_test.php | 79 ++++++++++++++++++++ 3 files changed, 170 insertions(+), 31 deletions(-) create mode 100644 mod/feedback/tests/lib_test.php diff --git a/mod/feedback/lang/en/feedback.php b/mod/feedback/lang/en/feedback.php index 6e2988e7cc5..3bfe3a2b780 100644 --- a/mod/feedback/lang/en/feedback.php +++ b/mod/feedback/lang/en/feedback.php @@ -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'; diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php index eff359aed24..a2a0b2ea327 100644 --- a/mod/feedback/lib.php +++ b/mod/feedback/lib.php @@ -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,57 +735,111 @@ 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; - - calendar_event::create($event); + 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; + + 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; +} + /** * this function is called by {@link feedback_delete_userdata()} * it drops the feedback-instance from the course_module table diff --git a/mod/feedback/tests/lib_test.php b/mod/feedback/tests/lib_test.php new file mode 100644 index 00000000000..789b74dac9e --- /dev/null +++ b/mod/feedback/tests/lib_test.php @@ -0,0 +1,79 @@ +. +/** + * 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); + } + } + } +} From 05fbbb7731f7e8d0b2bbd32f673791b309f09468 Mon Sep 17 00:00:00 2001 From: Stephen Bourget Date: Wed, 13 Jul 2016 18:26:17 -0400 Subject: [PATCH 2/2] MDL-55157 mod_feedback: Deprecate unused strings --- mod/feedback/lang/en/deprecated.txt | 2 ++ mod/feedback/lang/en/feedback.php | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mod/feedback/lang/en/deprecated.txt b/mod/feedback/lang/en/deprecated.txt index bddeea54dd9..4a0d5ef42d3 100644 --- a/mod/feedback/lang/en/deprecated.txt +++ b/mod/feedback/lang/en/deprecated.txt @@ -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 diff --git a/mod/feedback/lang/en/feedback.php b/mod/feedback/lang/en/feedback.php index 3bfe3a2b780..c5291cb0a2b 100644 --- a/mod/feedback/lang/en/feedback.php +++ b/mod/feedback/lang/en/feedback.php @@ -240,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'; @@ -298,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';