diff --git a/public/mod/assign/lang/en/assign.php b/public/mod/assign/lang/en/assign.php index 0a4554a385f..3101a5de8e9 100644 --- a/public/mod/assign/lang/en/assign.php +++ b/public/mod/assign/lang/en/assign.php @@ -385,8 +385,16 @@ $string['locksubmissions'] = 'Lock submissions'; $string['manageassignfeedbackplugins'] = 'Manage assignment feedback plugins'; $string['manageassignsubmissionplugins'] = 'Manage assignment submission plugins'; $string['marker'] = 'Marker'; +$string['markercount'] = 'Markers'; +$string['markercount_help'] = 'Number of markers for the assignment.'; $string['markerfilter'] = 'Marker filter'; $string['markerfilternomarker'] = 'No marker'; +$string['markgradeaverage'] = 'Average mark'; +$string['markgradeaverage_help'] = 'Grade will be calculated as the average of all marks given.'; +$string['markgrademanual'] = 'Manual'; +$string['markgrademanual_help'] = 'Grade will need to be manually entered, it won\'t be calculated automatically.'; +$string['markgrademaximum'] = 'Maximum mark'; +$string['markgrademaximum_help'] = 'Grade will be calculated as the highest of the marks given.'; $string['markingallocation'] = 'Use marking allocation'; $string['markingallocation_help'] = 'If enabled together with marking workflow, markers can be allocated to particular students.'; $string['markinganonymous'] = 'Allow partial release of grades while marking anonymously'; @@ -409,6 +417,18 @@ $string['markingworkflowstatenotmarked'] = 'Not marked'; $string['markingworkflowstatereadyforreview'] = 'Marking completed'; $string['markingworkflowstatereadyforrelease'] = 'Ready for release'; $string['markingworkflowstatereleased'] = 'Released'; +$string['multimarkmethod'] = 'Calculate grade'; +$string['multimarkmethod_help'] = 'How the grade will be calculated when there are multiple markers'; +$string['multimarkrounding'] = 'Rounding'; +$string['multimarkrounding_help'] = 'Whether to round up, down, naturally, or not at all when calculating an average mark'; +$string['multimarkrounding:down'] = 'Round down'; +$string['multimarkrounding:down_help'] = 'Average mark will be rounded down to the nearest whole number.'; +$string['multimarkrounding:natural'] = 'Natural rounding'; +$string['multimarkrounding:natural_help'] = 'Average mark will be rounded up or down naturally to the nearest whole number.'; +$string['multimarkrounding:none'] = 'No rounding'; +$string['multimarkrounding:none_help'] = 'Average mark will not be rounded.'; +$string['multimarkrounding:up'] = 'Round up'; +$string['multimarkrounding:up_help'] = 'Average mark will be rounded up to the nearest whole number.'; $string['maxattempts'] = 'Allowed attempts'; $string['maxattempts_help'] = 'The maximum number of submission attempts that can be made by a student. After this number has been reached, the submission can no longer be reopened.'; $string['maxgrade'] = 'Maximum grade'; diff --git a/public/mod/assign/locallib.php b/public/mod/assign/locallib.php index a5f2945aa2f..8e0feff5e9a 100644 --- a/public/mod/assign/locallib.php +++ b/public/mod/assign/locallib.php @@ -84,6 +84,19 @@ define('ASSIGN_EVENT_TYPE_OPEN', 'open'); define('ASSIGN_EVENT_TYPE_CLOSE', 'close'); define('ASSIGN_EVENT_TYPE_EXTENSION', 'extension'); +define('ASSIGN_MULTIMARKING_METHOD_MANUAL', 'manual'); +define('ASSIGN_MULTIMARKING_METHOD_MAX', 'maximum'); +define('ASSIGN_MULTIMARKING_METHOD_AVERAGE', 'average'); +define('ASSIGN_MULTIMARKING_METHOD_FIRST', 'first'); + +define('ASSIGN_MULTIMARKING_AVERAGE_ROUND_NONE', 0); +define('ASSIGN_MULTIMARKING_AVERAGE_ROUND_NATURAL', 1); +define('ASSIGN_MULTIMARKING_AVERAGE_ROUND_DOWN', 2); +define('ASSIGN_MULTIMARKING_AVERAGE_ROUND_UP', 3); + +define('ASSIGN_MULTIMARKING_MAX_MARKERS', 10); +define('ASSIGN_MULTIMARKING_DEFAULT_MARKERS', 2); + require_once($CFG->libdir . '/accesslib.php'); require_once($CFG->libdir . '/formslib.php'); require_once($CFG->dirroot . '/repository/lib.php'); @@ -798,6 +811,19 @@ class assign { // Grade penalties. $update->gradepenalty = $formdata->gradepenalty ?? 0; + // If we are using simple grading and we specify a markercount, update the multi marking values. + if (property_exists($formdata, 'markercount') && property_exists($formdata, 'multimarkmethod')) { + $update->markercount = $formdata->markercount; + if ($formdata->markercount > 1) { + $update->multimarkmethod = $formdata->multimarkmethod; + if (property_exists($formdata, 'multimarkrounding')) { + $update->multimarkrounding = $formdata->multimarkrounding; + } + } + } else { + $update->markercount = 1; + } + $returnid = $DB->insert_record('assign', $update); $this->instance = $DB->get_record('assign', array('id'=>$returnid), '*', MUST_EXIST); // Cache the course record. @@ -895,6 +921,8 @@ class assign { $DB->delete_records('assign_plugin_config', array('assignment' => $this->get_instance()->id)); $DB->delete_records('assign_user_flags', array('assignment' => $this->get_instance()->id)); $DB->delete_records('assign_user_mapping', array('assignment' => $this->get_instance()->id)); + $DB->delete_records('assign_allocated_marker', ['assignment' => $this->get_instance()->id]); + $DB->delete_records('assign_mark', ['assignment' => $this->get_instance()->id]); // Delete items from the gradebook. if (! $this->delete_grades()) { @@ -1591,6 +1619,24 @@ class assign { // Grade penalties. $update->gradepenalty = $formdata->gradepenalty ?? 0; + // If we are using simple grading and we specify a markercount, update the multi marking values. + if ( + property_exists($formdata, 'markercount') + && property_exists($formdata, 'advancedgradingmethod_submissions') + && $formdata->advancedgradingmethod_submissions === '' + ) { + $update->markercount = $formdata->markercount; + if ($formdata->markercount > 1) { + $update->multimarkmethod = $formdata->multimarkmethod; + $update->multimarkrounding = $formdata->multimarkrounding ?? null; + } + } else { + // If we don't specify a markercount, or we switched the grading type, return to defaults. + $update->markercount = 1; + $update->multimarkmethod = null; + $update->multimarkrounding = null; + } + $result = $DB->update_record('assign', $update); $this->instance = $DB->get_record('assign', array('id'=>$update->id), '*', MUST_EXIST); diff --git a/public/mod/assign/mod_form.php b/public/mod/assign/mod_form.php index f4ea6d45ee2..ecc81dbe149 100644 --- a/public/mod/assign/mod_form.php +++ b/public/mod/assign/mod_form.php @@ -243,6 +243,82 @@ class mod_assign_mod_form extends moodleform_mod { $mform->addHelpButton('markingallocation', 'markingallocation', 'assign'); $mform->hideIf('markingallocation', 'markingworkflow', 'eq', 0); + $name = get_string('markercount', 'assign'); + $markercount = range(1, ASSIGN_MULTIMARKING_MAX_MARKERS); + $mform->addElement('select', 'markercount', $name, array_combine($markercount, $markercount)); + $mform->addHelpButton('markercount', 'markercount', 'assign'); + $mform->disabledIf('markercount', 'advancedgradingmethod_submissions', 'neq', ''); + $mform->hideIf('markercount', 'advancedgradingmethod_submissions', 'neq', ''); + $mform->hideIf('markercount', 'markingallocation', 'neq', '1'); + $mform->hideIf('markercount', 'markingworkflow', 'neq', '1'); + + $name = get_string('multimarkmethod', 'assign'); + $options = new core\output\choicelist(); + $options->add_option( + ASSIGN_MULTIMARKING_METHOD_MANUAL, + get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_MANUAL, 'assign'), + [ + 'description' => get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_MANUAL . '_help', 'assign'), + ] + ); + $options->add_option( + ASSIGN_MULTIMARKING_METHOD_MAX, + get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_MAX, 'assign'), + [ + 'description' => get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_MAX . '_help', 'assign'), + ] + ); + $options->add_option( + ASSIGN_MULTIMARKING_METHOD_AVERAGE, + get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_AVERAGE, 'assign'), + [ + 'description' => get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_AVERAGE . '_help', 'assign'), + ] + ); + $mform->addElement('choicedropdown', 'multimarkmethod', $name, $options); + $mform->hideIf('multimarkmethod', 'markingallocation', 'eq', '0'); + $mform->hideIf('multimarkmethod', 'markercount', 'eq', '1'); + $mform->disabledIf('multimarkmethod', 'advancedgradingmethod_submissions', 'neq', ''); + $mform->hideIf('multimarkmethod', 'advancedgradingmethod_submissions', 'neq', ''); + + $name = get_string('multimarkrounding', 'assign'); + $options = new core\output\choicelist(); + $options->add_option( + ASSIGN_MULTIMARKING_AVERAGE_ROUND_NONE, + get_string('multimarkrounding:none', 'assign'), + [ + 'description' => get_string('multimarkrounding:none_help', 'assign'), + ] + ); + $options->add_option( + ASSIGN_MULTIMARKING_AVERAGE_ROUND_NATURAL, + get_string('multimarkrounding:natural', 'assign'), + [ + 'description' => get_string('multimarkrounding:natural_help', 'assign'), + ] + ); + $options->add_option( + ASSIGN_MULTIMARKING_AVERAGE_ROUND_DOWN, + get_string('multimarkrounding:down', 'assign'), + [ + 'description' => get_string('multimarkrounding:down_help', 'assign'), + ] + ); + $options->add_option( + ASSIGN_MULTIMARKING_AVERAGE_ROUND_UP, + get_string('multimarkrounding:up', 'assign'), + [ + 'description' => get_string('multimarkrounding:up_help', 'assign'), + ] + ); + $mform->addElement('choicedropdown', 'multimarkrounding', $name, $options); + $mform->hideIf('multimarkrounding', 'markingallocation', 'eq', '0'); + $mform->hideIf('multimarkrounding', 'markercount', 'eq', '1'); + $mform->hideIf('multimarkrounding', 'multimarkmethod', 'neq', 'average'); + $mform->disabledIf('multimarkrounding', 'multimarkmethod', 'neq', 'average'); + $mform->disabledIf('multimarkrounding', 'advancedgradingmethod_submissions', 'neq', ''); + $mform->hideIf('multimarkrounding', 'advancedgradingmethod_submissions', 'neq', ''); + $name = get_string('markinganonymous', 'assign'); $mform->addElement('selectyesno', 'markinganonymous', $name); $mform->addHelpButton('markinganonymous', 'markinganonymous', 'assign'); diff --git a/public/mod/assign/settings.php b/public/mod/assign/settings.php index 312a008ce7a..b9739f5659e 100644 --- a/public/mod/assign/settings.php +++ b/public/mod/assign/settings.php @@ -360,6 +360,62 @@ if ($ADMIN->fulltree) { $setting->set_locked_flag_options(admin_setting_flag::ENABLED, false); $settings->add($setting); + // Default setting for number of markers. + $name = new lang_string('markercount', 'mod_assign'); + $description = new lang_string('markercount_help', 'mod_assign'); + $setting = new admin_setting_configselect( + 'assign/markercount', + $name, + $description, + ASSIGN_MULTIMARKING_DEFAULT_MARKERS, + array_combine( + range(1, ASSIGN_MULTIMARKING_MAX_MARKERS), + range(1, ASSIGN_MULTIMARKING_MAX_MARKERS) + ), + ); + $setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false); + $setting->set_locked_flag_options(admin_setting_flag::ENABLED, false); + $settings->add($setting); + + // Default setting for multi-marking method (e.g. manual, max, etc...). + $name = new lang_string('multimarkmethod', 'mod_assign'); + $description = new lang_string('multimarkmethod_help', 'mod_assign'); + $options = [ + ASSIGN_MULTIMARKING_METHOD_MANUAL => get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_MANUAL, 'assign'), + ASSIGN_MULTIMARKING_METHOD_MAX => get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_MAX, 'assign'), + ASSIGN_MULTIMARKING_METHOD_AVERAGE => get_string('markgrade' . ASSIGN_MULTIMARKING_METHOD_AVERAGE, 'assign'), + ]; + $setting = new admin_setting_configselect( + 'assign/multimarkmethod', + $name, + $description, + ASSIGN_MULTIMARKING_METHOD_MANUAL, + $options, + ); + $setting->set_advanced_flag_options(admin_setting_flag::ENABLED, false); + $setting->set_locked_flag_options(admin_setting_flag::ENABLED, false); + $settings->add($setting); + + // Default setting for multi-marking rounding (e.g. up, down, none). + $name = new lang_string('multimarkrounding', 'mod_assign'); + $description = new lang_string('multimarkrounding_help', 'mod_assign'); + $options = [ + ASSIGN_MULTIMARKING_AVERAGE_ROUND_NONE => get_string('multimarkrounding:none', 'assign'), + ASSIGN_MULTIMARKING_AVERAGE_ROUND_NATURAL => get_string('multimarkrounding:natural', 'assign'), + ASSIGN_MULTIMARKING_AVERAGE_ROUND_DOWN => get_string('multimarkrounding:down', 'assign'), + ASSIGN_MULTIMARKING_AVERAGE_ROUND_UP => get_string('multimarkrounding:up', 'assign'), + ]; + $setting = new admin_setting_configselect( + 'assign/multimarkrounding', + $name, + $description, + ASSIGN_MULTIMARKING_AVERAGE_ROUND_NONE, + $options, + ); + $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('markinganonymous', 'mod_assign'); $description = new lang_string('markinganonymous_help', 'mod_assign'); $setting = new admin_setting_configcheckbox('assign/markinganonymous',