From 98239b2df84dc9af5ea551c30522507a98fc047a Mon Sep 17 00:00:00 2001 From: Jun Pataleta Date: Wed, 11 Jan 2017 11:16:03 +0800 Subject: [PATCH] MDL-55956 mod: Set event priority for activity overrides Set the event priority of the following activity overrides: * mod_assign * mod_lesson * mod_quiz Always create separate events for start and end dates of activities. --- mod/assign/db/upgrade.php | 13 ++++++++ mod/assign/lib.php | 57 +++++++++++++++----------------- mod/assign/locallib.php | 16 ++++++++- mod/assign/upgrade.txt | 3 ++ mod/assign/version.php | 2 +- mod/lesson/lib.php | 65 +++++++++++++++++++++---------------- mod/lesson/overrideedit.php | 9 ++++- mod/quiz/lib.php | 65 +++++++++++++++++++++---------------- mod/quiz/overrideedit.php | 8 ++++- 9 files changed, 148 insertions(+), 90 deletions(-) diff --git a/mod/assign/db/upgrade.php b/mod/assign/db/upgrade.php index 193b330f60d..48157274282 100644 --- a/mod/assign/db/upgrade.php +++ b/mod/assign/db/upgrade.php @@ -233,5 +233,18 @@ function xmldb_assign_upgrade($oldversion) { // Automatically generated Moodle v3.2.0 release upgrade line. // Put any upgrade step following this. + if ($oldversion < 2017021500) { + // Fix event types of assign events. + $params = [ + 'modulename' => 'assign', + 'eventtype' => 'close' + ]; + $select = "modulename = :modulename AND eventtype = :eventtype"; + $DB->set_field_select('event', 'eventtype', 'due', $select, $params); + + // Assign savepoint reached. + upgrade_mod_savepoint(true, 2017021500, 'assign'); + } + return true; } diff --git a/mod/assign/lib.php b/mod/assign/lib.php index 81f13c9a834..791ebcd62dc 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -226,10 +226,9 @@ function assign_update_events($assign, $override = null) { } $oldevents = $DB->get_records('event', $conds); - // Now make a todo list of all that needs to be updated. + // Now make a to-do list of all that needs to be updated. if (empty($override)) { - // We are updating the primary settings for the assign, so we - // need to add all the overrides. + // We are updating the primary settings for the assign, so we need to add all the overrides. $overrides = $DB->get_records('assign_overrides', array('assignid' => $assign->id)); // As well as the original assign (empty override). $overrides[] = new stdClass(); @@ -268,8 +267,9 @@ function assign_update_events($assign, $override = null) { $event->visible = instance_is_visible('assign', $assign); $event->eventtype = 'open'; - // Determine the event name. + // Determine the event name and priority. if ($groupid) { + // Group override event. $params = new stdClass(); $params->assign = $assign->get_context()->name; $params->group = groups_get_group_name($groupid); @@ -278,48 +278,45 @@ function assign_update_events($assign, $override = null) { continue; } $eventname = get_string('overridegroupeventname', 'assign', $params); + // Set group override priority. + if (isset($current->sortorder)) { + $event->priority = $current->sortorder; + } } else if ($userid) { + // User override event. $params = new stdClass(); $params->assign = $assign->get_context()->name; $eventname = get_string('overrideusereventname', 'assign', $params); + // Set user override priority. + $event->priority = CALENDAR_EVENT_USER_OVERRIDE_PRIORITY; } else { + // The parent event. $eventname = $assign->name; } + if ($addopen or $addclose) { - if ($duedate and $allowsubmissionsfromdate and $event->timeduration <= ASSIGN_MAX_EVENT_LENGTH) { - // Single event for the whole assign. + // Separate start and end events. + $event->timeduration = 0; + if ($allowsubmissionsfromdate && $addopen) { if ($oldevent = array_shift($oldevents)) { $event->id = $oldevent->id; } else { unset($event->id); } - $event->name = $eventname; + $event->name = $eventname.' ('.get_string('open', 'assign').')'; // The method calendar_event::create will reuse a db record if the id field is set. calendar_event::create($event); - } else { - // Separate start and end events. - $event->timeduration = 0; - if ($allowsubmissionsfromdate && $addopen) { - if ($oldevent = array_shift($oldevents)) { - $event->id = $oldevent->id; - } else { - unset($event->id); - } - $event->name = $eventname.' ('.get_string('open', 'assign').')'; - // The method calendar_event::create will reuse a db record if the id field is set. - calendar_event::create($event); - } - if ($duedate && $addclose) { - if ($oldevent = array_shift($oldevents)) { - $event->id = $oldevent->id; - } else { - unset($event->id); - } - $event->name = $eventname.' ('.get_string('duedate', 'assign').')'; - $event->timestart = $duedate; - $event->eventtype = 'close'; - calendar_event::create($event); + } + if ($duedate && $addclose) { + if ($oldevent = array_shift($oldevents)) { + $event->id = $oldevent->id; + } else { + unset($event->id); } + $event->name = $eventname.' ('.get_string('duedate', 'assign').')'; + $event->timestart = $duedate; + $event->eventtype = 'due'; + calendar_event::create($event); } } } diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index ae287f06666..2db982eea55 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -1160,8 +1160,14 @@ class assign { if ($instance->duedate) { $event = new stdClass(); + // Fetch the original due date event. It will have a non-zero course ID and a zero group ID. + $select = "modulename = :modulename + AND instance = :instance + AND eventtype = :eventtype + AND groupid = 0 + AND courseid <> 0"; $params = array('modulename' => 'assign', 'instance' => $instance->id, 'eventtype' => $eventtype); - $event->id = $DB->get_field('event', 'id', $params); + $event->id = $DB->get_field_select('event', 'id', $select, $params); $event->name = $instance->name; $event->timestart = $instance->duedate; @@ -8818,6 +8824,14 @@ function reorder_group_overrides($assignid) { $f->id = $override->id; $f->sortorder = $i++; $DB->update_record('assign_overrides', $f); + + // Update priorities of group overrides. + $params = [ + 'modulename' => 'assign', + 'instance' => $override->assignid, + 'groupid' => $override->groupid + ]; + $DB->set_field('event', 'priority', $f->sortorder, $params); } } } diff --git a/mod/assign/upgrade.txt b/mod/assign/upgrade.txt index 381692ffb4a..f49b2b9b514 100644 --- a/mod/assign/upgrade.txt +++ b/mod/assign/upgrade.txt @@ -1,5 +1,8 @@ This files describes API changes in the assign code. +=== 3.3 === +* Fixed calendar event types for overridden due dates from 'close' to 'due'. + === 3.2 === * External function mod_assign_external::get_assignments now returns additional optional fields: - preventsubmissionnotingroup: Prevent submission not in group. diff --git a/mod/assign/version.php b/mod/assign/version.php index 6bdbfc7c8f2..f920e1ffd1d 100644 --- a/mod/assign/version.php +++ b/mod/assign/version.php @@ -25,6 +25,6 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'mod_assign'; // Full name of the plugin (used for diagnostics). -$plugin->version = 2016120500; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2017021500; // The current module version (Date: YYYYMMDDXX). $plugin->requires = 2016112900; // Requires this Moodle version. $plugin->cron = 60; diff --git a/mod/lesson/lib.php b/mod/lesson/lib.php index 42b894ab36f..5ead9c15aa2 100644 --- a/mod/lesson/lib.php +++ b/mod/lesson/lib.php @@ -123,10 +123,9 @@ function lesson_update_events($lesson, $override = null) { } $oldevents = $DB->get_records('event', $conds); - // Now make a todo list of all that needs to be updated. + // Now make a to-do list of all that needs to be updated. if (empty($override)) { - // We are updating the primary settings for the lesson, so we - // need to add all the overrides. + // We are updating the primary settings for the lesson, so we need to add all the overrides. $overrides = $DB->get_records('lesson_overrides', array('lessonid' => $lesson->id)); // As well as the original lesson (empty override). $overrides[] = new stdClass(); @@ -135,6 +134,9 @@ function lesson_update_events($lesson, $override = null) { $overrides = array($override); } + // Get group override priorities. + $grouppriorities = lesson_get_group_override_priorities($lesson->id); + foreach ($overrides as $current) { $groupid = isset($current->groupid) ? $current->groupid : 0; $userid = isset($current->userid) ? $current->userid : 0; @@ -164,8 +166,9 @@ function lesson_update_events($lesson, $override = null) { $event->visible = instance_is_visible('lesson', $lesson); $event->eventtype = 'open'; - // Determine the event name. + // Determine the event name and priority. if ($groupid) { + // Group override event. $params = new stdClass(); $params->lesson = $lesson->name; $params->group = groups_get_group_name($groupid); @@ -174,48 +177,54 @@ function lesson_update_events($lesson, $override = null) { continue; } $eventname = get_string('overridegroupeventname', 'lesson', $params); + // Set group override priority. + if ($grouppriorities !== null) { + $openpriorities = $grouppriorities['open']; + if (isset($openpriorities[$available])) { + $event->priority = $openpriorities[$available]; + } + } } else if ($userid) { + // User override event. $params = new stdClass(); $params->lesson = $lesson->name; $eventname = get_string('overrideusereventname', 'lesson', $params); + // Set user override priority. + $event->priority = CALENDAR_EVENT_USER_OVERRIDE_PRIORITY; } else { + // The parent event. $eventname = $lesson->name; } + if ($addopen or $addclose) { - if ($deadline and $available and $event->timeduration <= LESSON_MAX_EVENT_LENGTH) { - // Single event for the whole lesson. + // Separate start and end events. + $event->timeduration = 0; + if ($available && $addopen) { if ($oldevent = array_shift($oldevents)) { $event->id = $oldevent->id; } else { unset($event->id); } - $event->name = $eventname; + $event->name = $eventname.' ('.get_string('lessonopens', 'lesson').')'; // The method calendar_event::create will reuse a db record if the id field is set. calendar_event::create($event); - } else { - // Separate start and end events. - $event->timeduration = 0; - if ($available && $addopen) { - if ($oldevent = array_shift($oldevents)) { - $event->id = $oldevent->id; - } else { - unset($event->id); - } - $event->name = $eventname.' ('.get_string('lessonopens', 'lesson').')'; - // The method calendar_event::create will reuse a db record if the id field is set. - calendar_event::create($event); + } + if ($deadline && $addclose) { + if ($oldevent = array_shift($oldevents)) { + $event->id = $oldevent->id; + } else { + unset($event->id); } - if ($deadline && $addclose) { - if ($oldevent = array_shift($oldevents)) { - $event->id = $oldevent->id; - } else { - unset($event->id); + $event->name = $eventname.' ('.get_string('lessoncloses', 'lesson').')'; + $event->timestart = $deadline; + $event->eventtype = 'close'; + if ($groupid && $grouppriorities !== null) { + $closepriorities = $grouppriorities['close']; + if (isset($closepriorities[$deadline])) { + $event->priority = $closepriorities[$deadline]; } - $event->name = $eventname.' ('.get_string('lessoncloses', 'lesson').')'; - $event->timestart = $deadline; - $event->eventtype = 'close'; - calendar_event::create($event); } + calendar_event::create($event); } } } diff --git a/mod/lesson/overrideedit.php b/mod/lesson/overrideedit.php index 8db1b3805d9..0268b35e8f6 100644 --- a/mod/lesson/overrideedit.php +++ b/mod/lesson/overrideedit.php @@ -196,7 +196,14 @@ if ($mform->is_cancelled()) { $event->trigger(); } - lesson_update_events($lesson, $fromform); + if ($groupmode) { + // Priorities may have shifted, so we need to update all of the calendar events for group overrides. + lesson_update_events($lesson); + } else { + // User override. We only need to update the calendar event for this user override. + lesson_update_events($lesson, $fromform); + } + if (!empty($fromform->submitbutton)) { redirect($overridelisturl); diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index 3c1fb68192e..d3148b67cfe 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -1202,10 +1202,9 @@ function quiz_update_events($quiz, $override = null) { } $oldevents = $DB->get_records('event', $conds); - // Now make a todo list of all that needs to be updated. + // Now make a to-do list of all that needs to be updated. if (empty($override)) { - // We are updating the primary settings for the quiz, so we - // need to add all the overrides. + // We are updating the primary settings for the lesson, so we need to add all the overrides. $overrides = $DB->get_records('quiz_overrides', array('quiz' => $quiz->id)); // As well as the original quiz (empty override). $overrides[] = new stdClass(); @@ -1214,6 +1213,9 @@ function quiz_update_events($quiz, $override = null) { $overrides = array($override); } + // Get group override priorities. + $grouppriorities = quiz_get_group_override_priorities($quiz->id); + foreach ($overrides as $current) { $groupid = isset($current->groupid)? $current->groupid : 0; $userid = isset($current->userid)? $current->userid : 0; @@ -1243,8 +1245,9 @@ function quiz_update_events($quiz, $override = null) { $event->visible = instance_is_visible('quiz', $quiz); $event->eventtype = 'open'; - // Determine the event name. + // Determine the event name and priority. if ($groupid) { + // Group override event. $params = new stdClass(); $params->quiz = $quiz->name; $params->group = groups_get_group_name($groupid); @@ -1253,48 +1256,54 @@ function quiz_update_events($quiz, $override = null) { continue; } $eventname = get_string('overridegroupeventname', 'quiz', $params); + // Set group override priority. + if ($grouppriorities !== null) { + $openpriorities = $grouppriorities['open']; + if (isset($openpriorities[$timeopen])) { + $event->priority = $openpriorities[$timeopen]; + } + } } else if ($userid) { + // User override event. $params = new stdClass(); $params->quiz = $quiz->name; $eventname = get_string('overrideusereventname', 'quiz', $params); + // Set user override priority. + $event->priority = CALENDAR_EVENT_USER_OVERRIDE_PRIORITY; } else { + // The parent event. $eventname = $quiz->name; } + if ($addopen or $addclose) { - if ($timeclose and $timeopen and $event->timeduration <= QUIZ_MAX_EVENT_LENGTH) { - // Single event for the whole quiz. + // Separate start and end events. + $event->timeduration = 0; + if ($timeopen && $addopen) { if ($oldevent = array_shift($oldevents)) { $event->id = $oldevent->id; } else { unset($event->id); } - $event->name = $eventname; + $event->name = $eventname.' ('.get_string('quizopens', 'quiz').')'; // The method calendar_event::create will reuse a db record if the id field is set. calendar_event::create($event); - } else { - // Separate start and end events. - $event->timeduration = 0; - if ($timeopen && $addopen) { - if ($oldevent = array_shift($oldevents)) { - $event->id = $oldevent->id; - } else { - unset($event->id); - } - $event->name = $eventname.' ('.get_string('quizopens', 'quiz').')'; - // The method calendar_event::create will reuse a db record if the id field is set. - calendar_event::create($event); + } + if ($timeclose && $addclose) { + if ($oldevent = array_shift($oldevents)) { + $event->id = $oldevent->id; + } else { + unset($event->id); } - if ($timeclose && $addclose) { - if ($oldevent = array_shift($oldevents)) { - $event->id = $oldevent->id; - } else { - unset($event->id); + $event->name = $eventname.' ('.get_string('quizcloses', 'quiz').')'; + $event->timestart = $timeclose; + $event->eventtype = 'close'; + if ($groupid && $grouppriorities !== null) { + $closepriorities = $grouppriorities['close']; + if (isset($closepriorities[$timeclose])) { + $event->priority = $closepriorities[$timeclose]; } - $event->name = $eventname.' ('.get_string('quizcloses', 'quiz').')'; - $event->timestart = $timeclose; - $event->eventtype = 'close'; - calendar_event::create($event); } + calendar_event::create($event); } } } diff --git a/mod/quiz/overrideedit.php b/mod/quiz/overrideedit.php index b72e02c76cd..ef1f416e7b4 100644 --- a/mod/quiz/overrideedit.php +++ b/mod/quiz/overrideedit.php @@ -198,7 +198,13 @@ if ($mform->is_cancelled()) { } quiz_update_open_attempts(array('quizid'=>$quiz->id)); - quiz_update_events($quiz, $fromform); + if ($groupmode) { + // Priorities may have shifted, so we need to update all of the calendar events for group overrides. + quiz_update_events($quiz); + } else { + // User override. We only need to update the calendar event for this user override. + quiz_update_events($quiz, $fromform); + } if (!empty($fromform->submitbutton)) { redirect($overridelisturl);