MDL-86006 mod_assign: Add multimarking config and plugin settings

- Add config setting to define max number of markers
- Add instance settings to assignment form to select number of markers
and agreement method
This commit is contained in:
Conn Warwicker
2026-03-05 14:52:27 +11:00
committed by David Woloszyn
parent 25498c62b4
commit a47646f775
4 changed files with 198 additions and 0 deletions
+20
View File
@@ -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';
+46
View File
@@ -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);
+76
View File
@@ -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');
+56
View File
@@ -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',