From 46e4949a879a944fc3a718f7a2c404f8d4ade9df Mon Sep 17 00:00:00 2001 From: Alex Walker Date: Thu, 10 Mar 2016 13:56:41 +0000 Subject: [PATCH] MDL-49673 Allow the identity of an assignment grader to be hidden from students. This patch creates a 'hidegrader' field in assign's database table and creates an entry for it in the assignment's settings page. There's also a capability, allowing certain users to see a grader's identity even when the setting is enabled. --- mod/assign/db/access.php | 9 +++++++++ mod/assign/db/install.xml | 1 + mod/assign/db/upgrade.php | 17 ++++++++++++++++ mod/assign/lang/en/assign.php | 13 +++++++++++++ mod/assign/locallib.php | 45 ++++++++++++++++++++++++++++++++++++++++--- mod/assign/mod_form.php | 4 ++++ mod/assign/settings.php | 10 ++++++++++ mod/assign/version.php | 2 +- 8 files changed, 97 insertions(+), 4 deletions(-) diff --git a/mod/assign/db/access.php b/mod/assign/db/access.php index e58da85..24e1d0f 100644 --- a/mod/assign/db/access.php +++ b/mod/assign/db/access.php @@ -178,5 +178,14 @@ $capabilities = array( 'manager' => CAP_ALLOW ) ), + 'mod/assign:showhiddengrader' => array( + 'captype' => 'read', + 'contextlevel' => CONTEXT_MODULE, + 'archetypes' => array( + 'teacher' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'manager' => CAP_ALLOW + ) + ), ); diff --git a/mod/assign/db/install.xml b/mod/assign/db/install.xml index 335ce3f..441177e 100644 --- a/mod/assign/db/install.xml +++ b/mod/assign/db/install.xml @@ -27,6 +27,7 @@ + diff --git a/mod/assign/db/upgrade.php b/mod/assign/db/upgrade.php index d5e358e..bce5a9b 100644 --- a/mod/assign/db/upgrade.php +++ b/mod/assign/db/upgrade.php @@ -196,6 +196,23 @@ function xmldb_assign_upgrade($oldversion) { // Moodle v3.0.0 release upgrade line. // Put any upgrade step following this. + + if ($oldversion < 2015111602) { + + // Define field hidegrader to be added to assign + $table = new xmldb_table('assign'); + $field = new xmldb_field('hidegrader', XMLDB_TYPE_INTEGER, '2', null, + XMLDB_NOTNULL, null, '0', 'blindmarking'); + + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + + // Assignment savepoint reached. + upgrade_mod_savepoint(true, 2015111602, 'assign'); + + } return true; } diff --git a/mod/assign/lang/en/assign.php b/mod/assign/lang/en/assign.php index 16f20b1..f7369b1 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -53,6 +53,7 @@ $string['assign:revealidentities'] = 'Reveal student identities'; $string['assign:reviewgrades'] = 'Review grades'; $string['assign:viewblinddetails'] = 'View student identities when blind marking is enabled'; $string['assign:viewgrades'] = 'View grades'; +$string['assign:showhiddengrader'] = 'See the identity of a hidden grader'; $string['assign:submit'] = 'Submit assignment'; $string['assign:view'] = 'View assignment'; $string['assignfeedback'] = 'Feedback plugin'; @@ -200,6 +201,16 @@ $string['feedbackavailablehtml'] = '{$a->username} has posted some feedback on y 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['feedbackavailableanontext'] = 'You have new feedback on your +assignment submission for \'{$a->assignment}\' + +You can see it appended to your assignment submission: + + {$a->url}'; +$string['feedbackavailableanonhtml'] = 'You have new feedback on your +assignment submission for \'{$a->assignment}\'

+You can see it appended to your assignment submission.'; +$string['feedbackavailableanonsmall'] = 'New 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.'; @@ -228,6 +239,8 @@ $string['gradingoptions'] = 'Options'; $string['gradingstatus'] = 'Grading status'; $string['gradingstudent'] = 'Grading student'; $string['gradingsummary'] = 'Grading summary'; +$string['hidegrader'] = 'Hide grader identity from students'; +$string['hidegrader_help'] = 'Hides the identity of any user who grades an assignment submission, so students can\'t see who marked their work.'; $string['hideshow'] = 'Hide/Show'; $string['hiddenuser'] = 'Participant '; $string['instructionfiles'] = 'Instruction files'; diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index ad93008..66e6fb0 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -305,6 +305,18 @@ class assign { public function is_blind_marking() { return $this->get_instance()->blindmarking && !$this->get_instance()->revealidentities; } + + /** + * Is hidden grading enabled? + * + * This just checks the assignment settings. Remember to check + * the user has the 'showhiddengrader' capability too + * + * @return bool + */ + public function is_hidden_grader() { + return $this->get_instance()->hidegrader; + } /** * Does an assignment have submission(s) or grade(s) already? @@ -625,6 +637,7 @@ class assign { $update->teamsubmissiongroupingid = $formdata->teamsubmissiongroupingid; } $update->blindmarking = $formdata->blindmarking; + $update->hidegrader = $formdata->hidegrader; $update->attemptreopenmethod = ASSIGN_ATTEMPT_REOPEN_METHOD_NONE; if (!empty($formdata->attemptreopenmethod)) { $update->attemptreopenmethod = $formdata->attemptreopenmethod; @@ -991,6 +1004,7 @@ class assign { $update->teamsubmissiongroupingid = $formdata->teamsubmissiongroupingid; } $update->blindmarking = $formdata->blindmarking; + $update->hidegrader = $formdata->hidegrader; $update->attemptreopenmethod = ASSIGN_ATTEMPT_REOPEN_METHOD_NONE; if (!empty($formdata->attemptreopenmethod)) { $update->attemptreopenmethod = $formdata->attemptreopenmethod; @@ -1738,7 +1752,7 @@ class assign { // - No previous notification has been sent. // - If marking workflow is not enabled, the grade was updated in the past 24 hours, or // if marking workflow is enabled, the workflow state is at 'released'. - $sql = "SELECT g.id as gradeid, a.course, a.name, a.blindmarking, a.revealidentities, + $sql = "SELECT g.id as gradeid, a.course, a.name, a.blindmarking, a.revealidentities, a.hidegrader, g.*, g.timemodified as lastmodified, cm.id as cmid FROM {assign} a JOIN {assign_grades} g ON g.assignment = a.id @@ -1837,8 +1851,17 @@ class assign { continue; } - // Need to send this to the student. + // Notify the student. Default to the non-anon version. $messagetype = 'feedbackavailable'; + // Message type needs 'anon' if "hidden grading" is enabled and the student + // doesn't have permission to see the grader. + if ($submission->hidegrader && !has_capability('mod/assign:showhiddengrader', $contextmodule, $user)) { + $messagetype = 'feedbackavailableanon'; + // There's no point in having an "anonymous grader" if the notification email + // comes from them. Send the email from the primary site admin instead. + $grader = get_admin(); + } + $eventtype = 'assign_notification'; $updatetime = $submission->lastmodified; $modulename = get_string('modulename', 'assign'); @@ -4086,6 +4109,19 @@ class assign { $gradingstatus, $instance->preventsubmissionnotingroup, $usergroups); + + /* + * We'll only show the grader's identity if the 'Hide Grader' setting is disabled + * or (if it's enabled) the user has the 'Show Hidden Grader' capability. + * + */ + + $showgradername = ( + has_capability('mod/assign:showhiddengrader', $this->get_context(), $user) or + !$this->is_hidden_grader() + ); + + if (has_capability('mod/assign:submit', $this->get_context(), $user)) { $o .= $this->get_renderer()->render($submissionstatus); } @@ -4159,7 +4195,10 @@ class assign { $this->get_course_module()->id, $this->get_return_action(), $this->get_return_params()); - + if(!$showgradername) { + $feedbackstatus->grader = false; + } + $o .= $this->get_renderer()->render($feedbackstatus); } diff --git a/mod/assign/mod_form.php b/mod/assign/mod_form.php index 412f72f..c99bb62 100644 --- a/mod/assign/mod_form.php +++ b/mod/assign/mod_form.php @@ -195,6 +195,10 @@ class mod_assign_mod_form extends moodleform_mod { if ($assignment->has_submissions_or_grades() ) { $mform->freeze('blindmarking'); } + + $name = get_string('hidegrader', 'assign'); + $mform->addElement('selectyesno', 'hidegrader', $name); + $mform->addHelpButton('hidegrader', 'hidegrader', 'assign'); $name = get_string('markingworkflow', 'assign'); $mform->addElement('selectyesno', 'markingworkflow', $name); diff --git a/mod/assign/settings.php b/mod/assign/settings.php index 4b1b4bc..eaf3479 100644 --- a/mod/assign/settings.php +++ b/mod/assign/settings.php @@ -242,6 +242,16 @@ if ($ADMIN->fulltree) { $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('hidegrader', 'mod_assign'); + $description = new lang_string('hidegrader_help', 'mod_assign'); + $setting = new admin_setting_configcheckbox('assign/hidegrader', + $name, + $description, + 0); + $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('markingworkflow', 'mod_assign'); $description = new lang_string('markingworkflow_help', 'mod_assign'); diff --git a/mod/assign/version.php b/mod/assign/version.php index 7e1c4b0..210e4bc 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 = 2015111601; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2015111602; // The current module version (Date: YYYYMMDDXX). $plugin->requires = 2015111000; // Requires this Moodle version. $plugin->cron = 60; -- 2.5.4 (Apple Git-61)