From 75f87a57956fd4168929908d5dc428c84d6b8b3d Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Mon, 7 May 2012 13:01:50 +0800 Subject: [PATCH] MDL-31414: Separate settings to control notifications for submissions, late submissions and submission receipts This adds separate controls for the sending of notifications from the mod_assign. The separate notifications are: student submission receipt (for students), feedback available (for students) and submission updated (for graders). The grader notifications can be enabled for all submissions or just late ones. Added code to reset the message providers on upgrade (only applies for a 2.3 dev version) --- .../backup/moodle2/backup_assign_stepslib.php | 1 + mod/assign/db/install.xml | 5 +- mod/assign/db/messages.php | 8 +- mod/assign/db/upgrade.php | 3 + mod/assign/lang/en/assign.php | 37 ++- mod/assign/lib.php | 3 +- mod/assign/locallib.php | 277 ++++++++++++++---- mod/assign/mod_form.php | 4 + mod/assign/settings.php | 6 +- mod/assign/version.php | 2 +- 10 files changed, 273 insertions(+), 73 deletions(-) diff --git a/mod/assign/backup/moodle2/backup_assign_stepslib.php b/mod/assign/backup/moodle2/backup_assign_stepslib.php index 6ddee76b5c7..fa972085109 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 'preventlatesubmissions', 'submissiondrafts', 'sendnotifications', + 'sendlatenotifications', 'duedate', 'allowsubmissionsfromdate', 'grade', diff --git a/mod/assign/db/install.xml b/mod/assign/db/install.xml index 273486b93b9..797451640f3 100644 --- a/mod/assign/db/install.xml +++ b/mod/assign/db/install.xml @@ -15,8 +15,9 @@ - - + + + diff --git a/mod/assign/db/messages.php b/mod/assign/db/messages.php index 1df087fd406..2f4d6bac934 100644 --- a/mod/assign/db/messages.php +++ b/mod/assign/db/messages.php @@ -24,8 +24,12 @@ $messageproviders = array ( -// Ordinary assignment submissions - 'assign_updates' => array ( +/// Ordinary assignment submissions + 'assign_student_notification' => array ( + 'capability' => 'mod/assign:submit' + ), + 'assign_grader_notification' => array ( + 'capability' => 'mod/assign:grade' ) ); diff --git a/mod/assign/db/upgrade.php b/mod/assign/db/upgrade.php index 03ee8f4e633..14dafc057f3 100644 --- a/mod/assign/db/upgrade.php +++ b/mod/assign/db/upgrade.php @@ -28,6 +28,9 @@ * @return bool */ function xmldb_assign_upgrade($oldversion) { + if ($oldversion < 2012051700) { + message_update_providers('mod_assign'); + } return true; } diff --git a/mod/assign/lang/en/assign.php b/mod/assign/lang/en/assign.php index ace9fab2824..e083b94b9c0 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -90,23 +90,34 @@ $string['duedatereached'] = 'The due date for this assignment has now passed'; $string['duedatevalidation'] = 'Due date must be after the allow submissions from date.'; $string['editsubmission'] = 'Edit my submission'; $string['editaction'] = 'Actions...'; -$string['emailgradermail'] = '{$a->username} has updated their assignment submission +$string['gradersubmissionupdatedtext'] = '{$a->username} has updated their assignment submission for \'{$a->assignment}\' at {$a->timeupdated} It is available here: {$a->url}'; -$string['emailgradermailhtml'] = '{$a->username} has updated their assignment submission +$string['gradersubmissionupdatedhtml'] = '{$a->username} has updated their assignment submission for \'{$a->assignment}\' at {$a->timeupdated}

It is available on the web site.'; +$string['gradersubmissionupdatedsmall'] = '{$a->username} has updated their submission for assignment {$a->assignment}.'; $string['enabled'] = 'Enabled'; $string['errornosubmissions'] = 'There are no submissions to download'; $string['errorquickgradingvsadvancedgrading'] = 'The grades were not saved because this assignment is currently using advanced grading'; $string['errorrecordmodified'] = 'The grades were not saved because someone has modified one or more records more recently than when you loaded the page.'; -$string['feedbackcomments'] = 'Feedback comments'; $string['feedback'] = 'Feedback'; +$string['feedbackavailabletext'] = '{$a->username} has posted some feedback on your +assignment submission for \'{$a->assignment}\' + +You can see it appended to your assignment submission: + + {$a->url}'; +$string['feedbackavailablehtml'] = '{$a->username} has posted some feedback on your +assignment submission for \'{$a->assignment}\'

+You can see it appended to your assignment submission.'; +$string['feedbackavailablesmall'] = '{$a->username} has given feedback for assignment {$a->assignment}'; $string['feedbackplugins'] = 'Feedback plugins'; $string['feedbackpluginforgradebook'] = 'Feedback plugin that will push comments to the gradebook'; +$string['feedbackpluginforgradebook_help'] = 'Only one assignment feedback plugin can push feedback into the gradebook.'; $string['feedbackplugin'] = 'Feedback plugin'; $string['feedbacksettings'] = 'Feedback settings'; $string['filesubmissions'] = 'File submissions'; @@ -139,7 +150,8 @@ $string['locksubmissionforstudent'] = 'Prevent any more submissions for student: $string['locksubmissions'] = 'Lock submissions'; $string['manageassignfeedbackplugins'] = 'Manage assignment feedback plugins'; $string['manageassignsubmissionplugins'] = 'Manage assignment submission plugins'; -$string['messageprovider:assign_updates'] = 'Assignment notifications'; +$string['messageprovider:assign_student_notification'] = 'Assignment student notifications'; +$string['messageprovider:assign_grader_notification'] = 'Assignment grader notifications'; $string['modulename'] = 'Assignment'; $string['modulename_help'] = 'The assignment activity module enables a teacher to assess students’ learning by setting work and then reviewing it and providing feedback and grades. @@ -160,6 +172,7 @@ $string['notgradedyet'] = 'Not graded yet'; $string['notsubmittedyet'] = 'Not submitted yet'; $string['notifications'] = 'Notifications'; $string['nousersselected'] = 'No users selected'; +$string['notification'] = 'Notification'; $string['numberofdraftsubmissions'] = 'Drafts'; $string['numberofparticipants'] = 'Participants'; $string['numberofsubmittedassignments'] = 'Submitted'; @@ -186,9 +199,13 @@ $string['reviewed'] = 'Reviewed'; $string['savechanges'] = 'Save changes'; $string['saveallchanges'] = 'Save all changes'; $string['savenext'] = 'Save and show next'; -$string['sendnotifications'] = 'Send notifications to graders'; +$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...'; +$string['sendlatenotifications'] = 'Notify graders about late submissions'; +$string['sendlatenotifications_help'] = 'If enabled, graders (usually teachers) receive a message whenever a student submits an assignment late. Message methods are configurable.'; +$string['sendsubmissionreceipts'] = 'Send submission receipt to students'; +$string['sendsubmissionreceipts_help'] = 'This switch will enable submission receipts for students. Students will receive a notification every time they successfully submit an assignment'; $string['settings'] = 'Assignment settings'; $string['showrecentsubmissions'] = 'Show recent submissions'; $string['submissiondrafts'] = 'Require students click submit button'; @@ -196,6 +213,16 @@ $string['submissiondrafts_help'] = 'If enabled, students will have to click a Su $string['submissionnotready'] = 'This assignment is not ready to submit:'; $string['submissionplugins'] = 'Submission plugins'; $string['submissionreceipts'] = 'Send submission receipts'; +$string['submissionreceipttext'] = 'You have submitted an +assignment submission for \'{$a->assignment}\' + +You can see the status of your assignment submission: + + {$a->url}'; +$string['submissionreceipthtml'] = 'You have submitted an +assignment submission for \'{$a->assignment}\'

+You can the status of your assignment submission.'; +$string['submissionreceiptsmall'] = 'You have submitted your assignment submission for {$a->assignment}'; $string['submissionslocked'] = 'This assignment is not accepting submissions'; $string['submissionslockedshort'] = 'Submission changes not allowed'; $string['submissions'] = 'Submissions'; diff --git a/mod/assign/lib.php b/mod/assign/lib.php index 61c97730223..b9e71a1c9bf 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -674,7 +674,8 @@ function assign_cron() { global $CFG; require_once($CFG->dirroot . '/mod/assign/locallib.php'); - //assignment::cron(); + assign::cron(); + $plugins = get_plugin_list('assignsubmission'); foreach ($plugins as $name => $plugin) { diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 0e55f453d3c..6e4460fad1a 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -419,6 +419,7 @@ class assign { $update->preventlatesubmissions = $formdata->preventlatesubmissions; $update->submissiondrafts = $formdata->submissiondrafts; $update->sendnotifications = $formdata->sendnotifications; + $update->sendlatenotifications = $formdata->sendlatenotifications; $update->duedate = $formdata->duedate; $update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate; $update->grade = $formdata->grade; @@ -636,6 +637,7 @@ class assign { $update->preventlatesubmissions = $formdata->preventlatesubmissions; $update->submissiondrafts = $formdata->submissiondrafts; $update->sendnotifications = $formdata->sendnotifications; + $update->sendlatenotifications = $formdata->sendlatenotifications; $update->duedate = $formdata->duedate; $update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate; $update->grade = $formdata->grade; @@ -1068,7 +1070,6 @@ class assign { return false; } - /** * Cron function to be run periodically according to the moodle cron * Finds all assignment notifications that have yet to be mailed out, and mails them @@ -1076,8 +1077,93 @@ class assign { * @return bool */ static function cron() { - global $CFG, $USER, $DB; + global $CFG, $DB; + // used to cache DB lookups + $croncache = array(); + + // only ever send a max of one days worth of updates + $yesterday = time() - (24 * 3600); + $timenow = time(); + + // email students about new feedback + $submissions = $DB->get_records_sql("SELECT s.*, a.course, a.name, g.*, g.id as gradeid, g.timemodified as lastmodified + FROM {assign} a + JOIN {assign_grades} g ON g.assignment = a.id + LEFT JOIN {assign_submission} s ON s.assignment = a.id AND s.userid = g.userid + WHERE g.timemodified >= :yesterday + AND g.timemodified <= :today + AND g.mailed = 0", array('yesterday'=>$yesterday, 'today'=>$timenow)); + + mtrace('Processing ' . count($submissions) . ' assignment submissions ...'); + + foreach ($submissions as $submission) { + + mtrace("Processing assignment submission $submission->id ..."); + + // do not cache user lookups - could be too many + if (! $user = $DB->get_record("user", array("id"=>$submission->userid))) { + mtrace("Could not find user $submission->userid"); + continue; + } + + // use a cache to prevent the same DB queries happening over and over + if (! $course = array_search('course_' . $submission->course, $croncache)) { + if (! $course = $DB->get_record("course", array("id"=>$submission->course))) { + mtrace("Could not find course $submission->course"); + continue; + } + $croncache['course_' . $submission->course] = $course; + } + + /// Override the language and timezone of the "current" user, so that + /// mail is customised for the receiver. + cron_setup_user($user, $course); + + // context lookups are already cached + $coursecontext = context_course::instance($submission->course); + $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext)); + if (!is_enrolled($coursecontext, $user->id)) { + mtrace(fullname($user)." not an active participant in " . $courseshortname); + continue; + } + + if (! $grader = $DB->get_record("user", array("id"=>$submission->grader))) { + mtrace("Could not find grader $submission->grader"); + continue; + } + + + if (! $mod = array_search('mod_' . $submission->assignment, $croncache)) { + if (! $mod = get_coursemodule_from_instance("assign", $submission->assignment, $course->id)) { + mtrace("Could not find course module for assignment id $submission->assignment"); + continue; + } + $croncache['mod_' . $submission->assignment] = $mod; + } + + // context lookups are already cached + $contextmodule = context_module::instance($mod->id); + + if (! $mod->visible) { /// Hold mail notification for hidden assignments until later + continue; + } + + // need to send this to the student + self::send_assignment_notification($grader, $user, 'feedbackavailable', 'assign_student_notification', $submission->lastmodified, $mod, $contextmodule, $course, get_string('modulename', 'assign'), $submission->name); + + $grade = new stdClass(); + $grade->id = $submission->gradeid; + $grade->mailed = 1; + $DB->update_record('assign_grades', $grade); + + mtrace('Done'); + } + mtrace('Done processing ' . count($submissions) . ' assignment submissions'); + + cron_setup_user(); + // free up memory + unset($croncache); return true; } @@ -2162,19 +2248,19 @@ class assign { /** * Returns a list of teachers that should be grading given submission * - * @param stdClass $user + * @param int $userid * @return array */ - private function get_graders(stdClass $user) { + private function get_graders($userid) { //potential graders - $potentialgraders = get_users_by_capability($this->context, 'mod/assign:grade', '', '', '', '', '', '', false, false); + $potentialgraders = get_enrolled_users($this->context, "mod/assign:grade"); $graders = array(); if (groups_get_activity_groupmode($this->get_course_module()) == SEPARATEGROUPS) { // Separate groups are being used - if ($groups = groups_get_all_groups($this->get_course()->id, $user->id)) { // Try to find all groups + if ($groups = groups_get_all_groups($this->get_course()->id, $userid)) { // Try to find all groups foreach ($groups as $group) { foreach ($potentialgraders as $grader) { - if ($grader->id == $user->id) { + if ($grader->id == $userid) { continue; // do not send self } if (groups_is_member($group->id, $grader->id)) { @@ -2185,7 +2271,7 @@ class assign { } else { // user not in group, try to find graders without group foreach ($potentialgraders as $grader) { - if ($grader->id == $user->id) { + if ($grader->id == $userid) { continue; // do not send self } if (!groups_has_membership($this->get_course_module(), $grader->id)) { @@ -2195,7 +2281,7 @@ class assign { } } else { foreach ($potentialgraders as $grader) { - if ($grader->id == $user->id) { + if ($grader->id == $userid) { continue; // do not send self } // must be enrolled @@ -2208,88 +2294,158 @@ class assign { } /** - * Creates the text content for emails to grader + * Format a notification based on it's type * - * @param array $info The info used by the 'emailgradermail' language string - * @return string + * @param string $messagetype + * @param stdClass $info + * @param stdClass $course + * @param stdClass $context + * @param string $modulename + * @param string $assignmentname */ - private function format_email_grader_text($info) { - $posttext = format_string($this->get_course()->shortname, true, array('context' => $this->get_course_context())).' -> '. - $this->get_module_name().' -> '. - format_string($this->get_instance()->name, true, array('context' => $this->context))."\n"; + private static function format_notification_message_text($messagetype, $info, $course, $context, $modulename, $assignmentname) { + $posttext = format_string($course->shortname, true, array('context' => $context->get_course_context())).' -> '. + $modulename.' -> '. + format_string($assignmentname, true, array('context' => $context))."\n"; $posttext .= '---------------------------------------------------------------------'."\n"; - $posttext .= get_string("emailgradermail", "assign", $info)."\n"; + $posttext .= get_string($messagetype . 'text', "assign", $info)."\n"; $posttext .= "\n---------------------------------------------------------------------\n"; return $posttext; } - /** - * Creates the html content for emails to graders + /** + * Format a notification based on it's type * - * @param array $info The info used by the 'emailgradermailhtml' language string - * @return string + * @param string $messagetype + * @param stdClass $info */ - private function format_email_grader_html($info) { + private static function format_notification_message_html($messagetype, $info, $course, $context, $modulename, $coursemodule, $assignmentname) { global $CFG; $posthtml = '

'. - ''.format_string($this->get_course()->shortname, true, array('context' => $this->get_course_context())).' ->'. - ''.$this->get_module_name().' ->'. - ''.format_string($this->get_instance()->name, true, array('context' => $this->context)).'

'; + ''.format_string($course->shortname, true, array('context' => $context->get_course_context())).' ->'. + ''.$modulename.' ->'. + ''.format_string($assignmentname, true, array('context' => $context)).'

'; $posthtml .= '
'; - $posthtml .= '

'.get_string('emailgradermailhtml', 'assign', $info).'

'; + $posthtml .= '

'.get_string($messagetype . 'html', 'assign', $info).'

'; $posthtml .= '

'; return $posthtml; } /** - * email graders upon student submissions + * email someone about something (static so it can be called from cron) * + * @global stdClass $CFG + * @global moodle_database $DB + * @param stdClass $userfrom + * @param stdClass $userto + * @param string $messagetype + * @param string $eventtype + * @param int $updatetime + * @param stdClass $coursemodule + * @param stdClass $context + * @param stdClass $course + * @param string $modulename + * @param string $moduleplural + * @param string $assignmentname + * @return void + */ + public static function send_assignment_notification($userfrom, $userto, $messagetype, $eventtype, + $updatetime, $coursemodule, $context, $course, + $modulename, $assignmentname) { + global $CFG, $DB; + + $strnotification = get_string('notification', 'assign'); + + $info = new stdClass(); + $info->username = fullname($userfrom, true); + $info->assignment = format_string($assignmentname,true, array('context'=>$context)); + $info->url = $CFG->wwwroot.'/mod/assign/view.php?id='.$coursemodule->id; + $info->timeupdated = strftime('%c',$updatetime); + + $postsubject = get_string($messagetype . 'small', 'assign', $info); + $posttext = self::format_notification_message_text($messagetype, $info, $course, $context, $modulename, $assignmentname); + $posthtml = ($userto->mailformat == 1) ? self::format_notification_message_html($messagetype, $info, $course, $context, $modulename, $coursemodule, $assignmentname) : ''; + + $eventdata = new stdClass(); + $eventdata->modulename = 'assign'; + $eventdata->userfrom = $userfrom; + $eventdata->userto = $userto; + $eventdata->subject = $postsubject; + $eventdata->fullmessage = $posttext; + $eventdata->fullmessageformat = FORMAT_PLAIN; + $eventdata->fullmessagehtml = $posthtml; + $eventdata->smallmessage = $postsubject; + + $eventdata->name = $eventtype; + $eventdata->component = 'mod_assign'; + $eventdata->notification = 1; + $eventdata->contexturl = $info->url; + $eventdata->contexturlname = $info->assignment; + + message_send($eventdata); + + } + + /** + * email someone about something + * + * @global stdClass $CFG + * @global moodle_database $DB * @param stdClass $submission * @return void */ - private function email_graders(stdClass $submission) { - global $CFG, $DB; + public function send_notification($userfrom, $userto, $messagetype, $eventtype, $updatetime) { + self::send_assignment_notification($userfrom, $userto, $messagetype, $eventtype, $updatetime, $this->get_course_module(), $this->get_context(), $this->get_course(), $this->get_module_name(), $this->get_instance()->name); + } - if (empty($this->get_instance()->sendnotifications)) { // No need to do anything + /** + * email student upon successful submission + * + * @global stdClass $CFG + * @global moodle_database $DB + * @param stdClass $submission + * @return void + */ + private function email_student_submission_receipt(stdClass $submission) { + global $DB; + + $adminconfig = $this->get_admin_config(); + if (!$adminconfig->submissionreceipts) { // No need to do anything return; } $user = $DB->get_record('user', array('id'=>$submission->userid), '*', MUST_EXIST); - if ($teachers = $this->get_graders($user)) { + $this->send_notification($user, $user, 'submissionreceipt', 'assign_student_notification', $submission->timemodified); + } + + /** + * email graders upon student submissions + * + * @global stdClass $CFG + * @global moodle_database $DB + * @param stdClass $submission + * @return void + */ + private function email_graders(stdClass $submission) { + global $DB; + + $late = $this->get_instance()->duedate && ($this->get_instance()->duedate < time()); + + if (!$this->get_instance()->sendnotifications && !($late && $this->get_instance()->sendlatenotifications)) { // No need to do anything + return; + } + + $user = $DB->get_record('user', array('id'=>$submission->userid), '*', MUST_EXIST); + + if ($teachers = $this->get_graders($user->id)) { $strassignments = $this->get_module_name_plural(); $strassignment = $this->get_module_name(); $strsubmitted = get_string('submitted', 'assign'); foreach ($teachers as $teacher) { - $info = new stdClass(); - $info->username = fullname($user, true); - $info->assignment = format_string($this->get_instance()->name,true, array('context'=>$this->get_context())); - $info->url = $CFG->wwwroot.'/mod/assign/view.php?id='.$this->get_course_module()->id; - $info->timeupdated = strftime('%c',$submission->timemodified); - - $postsubject = $strsubmitted.': '.$info->username.' -> '.$this->get_instance()->name; - $posttext = $this->format_email_grader_text($info); - $posthtml = ($teacher->mailformat == 1) ? $this->format_email_grader_html($info) : ''; - - $eventdata = new stdClass(); - $eventdata->modulename = 'assign'; - $eventdata->userfrom = $user; - $eventdata->userto = $teacher; - $eventdata->subject = $postsubject; - $eventdata->fullmessage = $posttext; - $eventdata->fullmessageformat = FORMAT_PLAIN; - $eventdata->fullmessagehtml = $posthtml; - $eventdata->smallmessage = $postsubject; - - $eventdata->name = 'assign_updates'; - $eventdata->component = 'mod_assign'; - $eventdata->notification = 1; - $eventdata->contexturl = $info->url; - $eventdata->contexturlname = $info->assignment; - - message_send($eventdata); + $this->send_notification($user, $teacher, 'gradersubmissionupdated', 'assign_grader_notification', $submission->timemodified); } } } @@ -2318,6 +2474,7 @@ class assign { $this->update_submission($submission); $this->add_to_log('submit for grading', $this->format_submission_for_log($submission)); $this->email_graders($submission); + $this->email_student_submission_receipt($submission); } } @@ -2549,6 +2706,7 @@ class assign { $this->add_to_log('submit', $this->format_submission_for_log($submission)); if (!$this->get_instance()->submissiondrafts) { + $this->email_student_submission_receipt($submission); $this->email_graders($submission); } return true; @@ -2998,6 +3156,9 @@ class assign { } } $this->process_outcomes($userid, $formdata); + + $grade->mailed = 0; + $this->update_grade($grade); $user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST); diff --git a/mod/assign/mod_form.php b/mod/assign/mod_form.php index f00d4d3c551..8ad624c238b 100644 --- a/mod/assign/mod_form.php +++ b/mod/assign/mod_form.php @@ -92,6 +92,10 @@ class mod_assign_mod_form extends moodleform_mod { $mform->addElement('selectyesno', 'sendnotifications', get_string('sendnotifications', 'assign')); $mform->addHelpButton('sendnotifications', 'sendnotifications', 'assign'); $mform->setDefault('sendnotifications', 1); + $mform->addElement('selectyesno', 'sendlatenotifications', get_string('sendlatenotifications', 'assign')); + $mform->addHelpButton('sendlatenotifications', 'sendlatenotifications', 'assign'); + $mform->setDefault('sendlatenotifications', 1); + $mform->disabledIf('sendlatenotifications', 'sendnotifications', 'eq', 1); // plagiarism enabling form if (!empty($CFG->enableplagiarism)) { diff --git a/mod/assign/settings.php b/mod/assign/settings.php index 206cacc2353..ae3ffaad883 100644 --- a/mod/assign/settings.php +++ b/mod/assign/settings.php @@ -36,9 +36,6 @@ $ADMIN->add('assignmentplugins', new admin_category('assignfeedbackplugins', $ADMIN->add('assignfeedbackplugins', new assign_admin_page_manage_assign_plugins('assignfeedback')); -assign_plugin_manager::add_admin_assign_plugin_settings('assignsubmission', $ADMIN, $settings, $module); -assign_plugin_manager::add_admin_assign_plugin_settings('assignfeedback', $ADMIN, $settings, $module); - if ($ADMIN->fulltree) { $menu = array(); foreach (get_plugin_list('assignfeedback') as $type => $notused) { @@ -55,6 +52,7 @@ if ($ADMIN->fulltree) { $settings->add(new admin_setting_configcheckbox('assign/showrecentsubmissions', new lang_string('showrecentsubmissions', 'assign'), new lang_string('configshowrecentsubmissions', 'assign'), 0)); - + $settings->add(new admin_setting_configcheckbox('assign/submissionreceipts', + get_string('sendsubmissionreceipts', 'mod_assign'), get_string('sendsubmissionreceipts_help', 'mod_assign'), 1)); } diff --git a/mod/assign/version.php b/mod/assign/version.php index 82262a568d2..962f4d7b368 100644 --- a/mod/assign/version.php +++ b/mod/assign/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); $module->component = 'mod_assign'; -$module->version = 2012050300; +$module->version = 2012051700; $module->requires = 2012050300; // Requires this Moodle version $module->cron = 60;