diff --git a/mod/assign/backup/moodle2/backup_assign_stepslib.php b/mod/assign/backup/moodle2/backup_assign_stepslib.php index 0373e33a0f2..3d07191f318 100644 --- a/mod/assign/backup/moodle2/backup_assign_stepslib.php +++ b/mod/assign/backup/moodle2/backup_assign_stepslib.php @@ -51,6 +51,7 @@ class backup_assign_activity_structure_step extends backup_activity_structure_st 'submissiondrafts', 'sendnotifications', 'sendlatenotifications', + 'sendstudentnotifications', 'duedate', 'cutoffdate', 'allowsubmissionsfromdate', diff --git a/mod/assign/db/install.xml b/mod/assign/db/install.xml index 4cd7e49ef24..7befb9c1cd2 100644 --- a/mod/assign/db/install.xml +++ b/mod/assign/db/install.xml @@ -1,5 +1,5 @@ - @@ -32,6 +32,7 @@ + @@ -135,4 +136,4 @@ - + \ No newline at end of file diff --git a/mod/assign/db/upgrade.php b/mod/assign/db/upgrade.php index b8e3eac2015..53142f00436 100644 --- a/mod/assign/db/upgrade.php +++ b/mod/assign/db/upgrade.php @@ -462,5 +462,27 @@ function xmldb_assign_upgrade($oldversion) { // Moodle v2.6.0 release upgrade line. // Put any upgrade step following this. + if ($oldversion < 2014010801) { + + // Define field sendstudentnotifications to be added to assign. + $table = new xmldb_table('assign'); + $field = new xmldb_field('sendstudentnotifications', + XMLDB_TYPE_INTEGER, + '2', + null, + XMLDB_NOTNULL, + null, + '1', + 'markingallocation'); + + // Conditionally launch add field sendstudentnotifications. + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Assign savepoint reached. + upgrade_mod_savepoint(true, 2014010801, 'assign'); + } + return true; } diff --git a/mod/assign/externallib.php b/mod/assign/externallib.php index cf582ce86d8..fd28223c4cc 100644 --- a/mod/assign/externallib.php +++ b/mod/assign/externallib.php @@ -312,11 +312,29 @@ class mod_assign_external extends external_api { unset($courses[$id]); } } - $extrafields='m.id as assignmentid, m.course, m.nosubmissions, m.submissiondrafts, m.sendnotifications, '. - 'm.sendlatenotifications, m.duedate, m.allowsubmissionsfromdate, m.grade, m.timemodified, '. - 'm.completionsubmit, m.cutoffdate, m.teamsubmission, m.requireallteammemberssubmit, '. - 'm.teamsubmissiongroupingid, m.blindmarking, m.revealidentities, m.attemptreopenmethod, '. - 'm.maxattempts, m.markingworkflow, m.markingallocation, m.requiresubmissionstatement'; + $extrafields='m.id as assignmentid, ' . + 'm.course, ' . + 'm.nosubmissions, ' . + 'm.submissiondrafts, ' . + 'm.sendnotifications, '. + 'm.sendlatenotifications, ' . + 'm.sendstudentnotifications, ' . + 'm.duedate, ' . + 'm.allowsubmissionsfromdate, '. + 'm.grade, ' . + 'm.timemodified, '. + 'm.completionsubmit, ' . + 'm.cutoffdate, ' . + 'm.teamsubmission, ' . + 'm.requireallteammemberssubmit, '. + 'm.teamsubmissiongroupingid, ' . + 'm.blindmarking, ' . + 'm.revealidentities, ' . + 'm.attemptreopenmethod, '. + 'm.maxattempts, ' . + 'm.markingworkflow, ' . + 'm.markingallocation, ' . + 'm.requiresubmissionstatement'; $coursearray = array(); foreach ($courses as $id => $course) { $assignmentarray = array(); @@ -359,6 +377,7 @@ class mod_assign_external extends external_api { 'submissiondrafts' => $module->submissiondrafts, 'sendnotifications' => $module->sendnotifications, 'sendlatenotifications' => $module->sendlatenotifications, + 'sendstudentnotifications' => $module->sendstudentnotifications, 'duedate' => $module->duedate, 'allowsubmissionsfromdate' => $module->allowsubmissionsfromdate, 'grade' => $module->grade, @@ -412,6 +431,7 @@ class mod_assign_external extends external_api { 'submissiondrafts' => new external_value(PARAM_INT, 'submissions drafts'), 'sendnotifications' => new external_value(PARAM_INT, 'send notifications'), 'sendlatenotifications' => new external_value(PARAM_INT, 'send notifications'), + 'sendstudentnotifications' => new external_value(PARAM_INT, 'send student notifications (default)'), 'duedate' => new external_value(PARAM_INT, 'assignment due date'), 'allowsubmissionsfromdate' => new external_value(PARAM_INT, 'allow submissions from date'), 'grade' => new external_value(PARAM_INT, 'grade type'), diff --git a/mod/assign/lang/en/assign.php b/mod/assign/lang/en/assign.php index 2c61ed01aee..b677b200bf1 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -312,6 +312,10 @@ $string['savegradingresult'] = 'Grade'; $string['saveallquickgradingchanges'] = 'Save all quick grading changes'; $string['savenext'] = 'Save and show next'; $string['scale'] = 'Scale'; +$string['sendstudentnotificationsdefault'] = 'Default setting for "Notify students"'; +$string['sendstudentnotificationsdefault_help'] = 'Set the default value for the "Notify students" checkbox on the grading form.'; +$string['sendstudentnotifications'] = 'Notify students'; +$string['sendstudentnotifications_help'] = 'If enabled, students receive a message about the updated grade or feedback.'; $string['sendnotifications'] = 'Notify graders about submissions'; $string['sendnotifications_help'] = 'If enabled, graders (usually teachers) receive a message whenever a student submits an assignment, early, on time and late. Message methods are configurable.'; $string['selectlink'] = 'Select...'; diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 2d5acfdfe37..3b97b7bfbe1 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -538,6 +538,7 @@ class assign { */ public function add_instance(stdClass $formdata, $callplugins) { global $DB; + $adminconfig = $this->get_admin_config(); $err = ''; @@ -555,6 +556,10 @@ class assign { $update->requiresubmissionstatement = $formdata->requiresubmissionstatement; $update->sendnotifications = $formdata->sendnotifications; $update->sendlatenotifications = $formdata->sendlatenotifications; + $update->sendstudentnotifications = $adminconfig->sendstudentnotifications; + if (isset($formdata->sendstudentnotifications)) { + $update->sendstudentnotifications = $formdata->sendstudentnotifications; + } $update->duedate = $formdata->duedate; $update->cutoffdate = $formdata->cutoffdate; $update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate; @@ -878,6 +883,7 @@ class assign { */ public function update_instance($formdata) { global $DB; + $adminconfig = $this->get_admin_config(); $update = new stdClass(); $update->id = $formdata->instance; @@ -891,6 +897,10 @@ class assign { $update->requiresubmissionstatement = $formdata->requiresubmissionstatement; $update->sendnotifications = $formdata->sendnotifications; $update->sendlatenotifications = $formdata->sendlatenotifications; + $update->sendstudentnotifications = $adminconfig->sendstudentnotifications; + if (isset($formdata->sendstudentnotifications)) { + $update->sendstudentnotifications = $formdata->sendstudentnotifications; + } $update->duedate = $formdata->duedate; $update->cutoffdate = $formdata->cutoffdate; $update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate; @@ -3107,7 +3117,9 @@ class assign { if ($showquickgrading && $quickgrading) { $gradingtable = new assign_grading_table($this, $perpage, $filter, 0, true); $table = $this->get_renderer()->render($gradingtable); - $quickformparams = array('cm'=>$this->get_course_module()->id, 'gradingtable'=>$table); + $quickformparams = array('cm'=>$this->get_course_module()->id, + 'gradingtable'=>$table, + 'sendstudentnotifications'=>$this->get_instance()->sendstudentnotifications); $quickgradingform = new mod_assign_quick_grading_form(null, $quickformparams); $o .= $this->get_renderer()->render(new assign_form('quickgradingform', $quickgradingform)); @@ -4928,7 +4940,10 @@ class assign { $this->update_user_flags($flags); } $this->update_grade($grade); - $this->notify_grade_modified($grade); + // Allow teachers to skip sending notifications. + if (optional_param('sendstudentnotifications', true, PARAM_BOOL)) { + $this->notify_grade_modified($grade); + } // Save outcomes. if ($CFG->enableoutcomes) { @@ -5720,6 +5735,8 @@ class assign { $mform->setDefault('addattempt', 0); } } + $mform->addElement('selectyesno', 'sendstudentnotifications', get_string('sendstudentnotifications', 'assign')); + $mform->setDefault('sendstudentnotifications', $this->get_instance()->sendstudentnotifications); $mform->addElement('hidden', 'action', 'submitgrade'); $mform->setType('action', PARAM_ALPHA); @@ -6215,7 +6232,11 @@ class assign { } } $this->update_grade($grade); - $this->notify_grade_modified($grade); + // Note the default if not provided for this option is true (e.g. webservices). + // This is for backwards compatibility. + if (!isset($formdata->sendstudentnotifications) || $formdata->sendstudentnotifications) { + $this->notify_grade_modified($grade); + } $addtolog = $this->add_to_log('grade submission', $this->format_grade_for_log($grade), '', true); $params = array( diff --git a/mod/assign/mod_form.php b/mod/assign/mod_form.php index 1cd183ca0a0..eead2ae799c 100644 --- a/mod/assign/mod_form.php +++ b/mod/assign/mod_form.php @@ -159,6 +159,10 @@ class mod_assign_mod_form extends moodleform_mod { $mform->addHelpButton('sendlatenotifications', 'sendlatenotifications', 'assign'); $mform->disabledIf('sendlatenotifications', 'sendnotifications', 'eq', 1); + $name = get_string('sendstudentnotificationsdefault', 'assign'); + $mform->addElement('selectyesno', 'sendstudentnotifications', $name); + $mform->addHelpButton('sendstudentnotifications', 'sendstudentnotificationsdefault', 'assign'); + // Plagiarism enabling form. if (!empty($CFG->enableplagiarism)) { require_once($CFG->libdir . '/plagiarismlib.php'); diff --git a/mod/assign/quickgradingform.php b/mod/assign/quickgradingform.php index 2e93df7b054..bff0294d6f2 100644 --- a/mod/assign/quickgradingform.php +++ b/mod/assign/quickgradingform.php @@ -52,6 +52,10 @@ class mod_assign_quick_grading_form extends moodleform { $mform->addElement('hidden', 'action', 'quickgrade'); $mform->setType('action', PARAM_ALPHA); + // Skip notifications option. + $mform->addElement('selectyesno', 'sendstudentnotifications', get_string('sendstudentnotifications', 'assign')); + $mform->setDefault('sendstudentnotifications', $instance['sendstudentnotifications']); + // Buttons. $savemessage = get_string('saveallquickgradingchanges', 'assign'); $mform->addElement('submit', 'savequickgrades', $savemessage); diff --git a/mod/assign/settings.php b/mod/assign/settings.php index 04575f40bec..c92378867a1 100644 --- a/mod/assign/settings.php +++ b/mod/assign/settings.php @@ -213,6 +213,16 @@ if ($ADMIN->fulltree) { $setting->set_locked_flag_options(admin_setting_flag::ENABLED, false); $settings->add($setting); + $name = new lang_string('sendstudentnotificationsdefault', 'mod_assign'); + $description = new lang_string('sendstudentnotificationsdefault_help', 'mod_assign'); + $setting = new admin_setting_configcheckbox('assign/sendstudentnotifications', + $name, + $description, + 1); + $setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false); + $setting->set_locked_flag_options(admin_setting_flag::ENABLED, false); + $settings->add($setting); + $name = new lang_string('blindmarking', 'mod_assign'); $description = new lang_string('blindmarking_help', 'mod_assign'); $setting = new admin_setting_configcheckbox('assign/blindmarking', diff --git a/mod/assign/tests/generator/lib.php b/mod/assign/tests/generator/lib.php index 2e8896659fd..07600d8d058 100644 --- a/mod/assign/tests/generator/lib.php +++ b/mod/assign/tests/generator/lib.php @@ -34,6 +34,7 @@ class mod_assign_generator extends testing_module_generator { 'submissiondrafts' => 1, 'requiresubmissionstatement' => 0, 'sendnotifications' => 0, + 'sendstudentnotifications' => 1, 'sendlatenotifications' => 0, 'duedate' => 0, 'allowsubmissionsfromdate' => 0, diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index 77c08975afe..a1ca542b740 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -527,7 +527,7 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { // Now create an assignment and add some feedback. $this->setUser($this->editingteachers[0]); - $assign = $this->create_instance(); + $assign = $this->create_instance(array('sendstudentnotifications'=>1)); // Simulate adding a grade. $this->setUser($this->teachers[0]); @@ -536,6 +536,9 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { $assign->testable_apply_grade_to_user($data, $this->students[0]->id, 0); $assign->testable_apply_grade_to_user($data, $this->students[1]->id, 0); + $data->sendstudentnotifications = false; + $assign->testable_apply_grade_to_user($data, $this->students[2]->id, 0); + // Now run cron and see that one message was sent. $this->preventResetByRollback(); $sink = $this->redirectMessages(); @@ -544,6 +547,7 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { assign::cron(); $messages = $sink->get_messages(); + // The sent count should be 2, because the 3rd one was marked as do not send notifications. $this->assertEquals(2, count($messages)); $this->assertEquals(1, $messages[0]->notification); $this->assertEquals($assign->get_instance()->name, $messages[0]->contexturlname); diff --git a/mod/assign/upgrade.txt b/mod/assign/upgrade.txt index 601d8b56c82..ec94096b175 100644 --- a/mod/assign/upgrade.txt +++ b/mod/assign/upgrade.txt @@ -1,4 +1,7 @@ This files describes API changes in the assign code. +=== 2.7 === +* Added setting sendstudentnotifications to assign DB table with admin defaults. This sets the default value for the + "Notify students" option on the grading forms. This setting can be retrieved via webservices. === 2.6.1 === diff --git a/mod/assign/version.php b/mod/assign/version.php index 60a2aa61141..a2e1f9a730a 100644 --- a/mod/assign/version.php +++ b/mod/assign/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); $module->component = 'mod_assign'; // Full name of the plugin (used for diagnostics). -$module->version = 2014010700; // The current module version (Date: YYYYMMDDXX). +$module->version = 2014010801; // The current module version (Date: YYYYMMDDXX). $module->requires = 2013110500; // Requires this Moodle version. $module->cron = 60;