diff --git a/mod/assign/backup/moodle2/backup_assign_stepslib.php b/mod/assign/backup/moodle2/backup_assign_stepslib.php
index be6b6dcea2192..0fe4b005af409 100644
--- a/mod/assign/backup/moodle2/backup_assign_stepslib.php
+++ b/mod/assign/backup/moodle2/backup_assign_stepslib.php
@@ -91,6 +91,8 @@ protected function define_structure() {
'maxattempts',
'markingworkflow',
'markingallocation',
+ 'markercount',
+ 'multimarkmethod',
'markinganonymous',
'preventsubmissionnotingroup',
'activity',
@@ -106,8 +108,25 @@ protected function define_structure() {
'mailed',
'locked',
'extensionduedate',
- 'workflowstate',
- 'allocatedmarker'));
+ 'workflowstate'));
+
+ $allocatedmarkers = new backup_nested_element('allocatedmarkers');
+
+ $allocatedmarker = new backup_nested_element('allocatedmarker',
+ array('id'),
+ array('student',
+ 'assignment',
+ 'marker'));
+
+ $marks = new backup_nested_element('marks');
+
+ $mark = new backup_nested_element('mark',
+ array('id'),
+ array('assignment',
+ 'gradeid',
+ 'timecreated',
+ 'timemodified',
+ 'marker'));
$submissions = new backup_nested_element('submissions');
@@ -146,6 +165,10 @@ protected function define_structure() {
// Build the tree.
$assign->add_child($userflags);
$userflags->add_child($userflag);
+ $assign->add_child($allocatedmarkers);
+ $allocatedmarkers->add_child($allocatedmarker);
+ $assign->add_child($marks);
+ $marks->add_child($mark);
$assign->add_child($submissions);
$submissions->add_child($submission);
$assign->add_child($grades);
@@ -166,6 +189,11 @@ protected function define_structure() {
if ($userinfo) {
$userflag->set_source_table('assign_user_flags',
array('assignment' => backup::VAR_PARENTID));
+ $allocatedmarker->set_source_table('assign_allocated_marker',
+ array('assignment' => backup::VAR_PARENTID));
+
+ $mark->set_source_table('assign_mark',
+ array('assignment' => backup::VAR_PARENTID));
$submissionparams = array('assignment' => backup::VAR_PARENTID);
if (!$groupinfo) {
@@ -192,7 +220,9 @@ protected function define_structure() {
// Define id annotations.
$userflag->annotate_ids('user', 'userid');
- $userflag->annotate_ids('user', 'allocatedmarker');
+ $allocatedmarker->annotate_ids('user', 'student');
+ $allocatedmarker->annotate_ids('user', 'marker');
+ $mark->annotate_ids('user', 'marker');
$submission->annotate_ids('user', 'userid');
$submission->annotate_ids('group', 'groupid');
$grade->annotate_ids('user', 'userid');
diff --git a/mod/assign/backup/moodle2/restore_assign_stepslib.php b/mod/assign/backup/moodle2/restore_assign_stepslib.php
index 403e879d92596..9e333a2a5c0b3 100644
--- a/mod/assign/backup/moodle2/restore_assign_stepslib.php
+++ b/mod/assign/backup/moodle2/restore_assign_stepslib.php
@@ -65,6 +65,12 @@ protected function define_structure() {
$userflag = new restore_path_element('assign_userflag',
'/activity/assign/userflags/userflag');
$paths[] = $userflag;
+ $allocatedmarker = new restore_path_element('assign_allocatedmarker',
+ '/activity/assign/allocatedmarkers/allocatedmarker');
+ $paths[] = $allocatedmarker;
+ $mark = new restore_path_element('assign_mark',
+ '/activity/assign/marks/mark');
+ $paths[] = $mark;
}
$paths[] = new restore_path_element('assign_override', '/activity/assign/overrides/override');
@@ -125,6 +131,9 @@ protected function process_assign($data) {
if (!isset($data->markingallocation)) {
$data->markingallocation = 0;
}
+ if (!isset($data->markercount)) {
+ $data->markercount = 1;
+ }
if (!isset($data->markinganonymous)) {
$data->markinganonymous = 0;
}
@@ -202,9 +211,6 @@ protected function process_assign_userflag($data) {
$data->assignment = $this->get_new_parentid('assign');
$data->userid = $this->get_mappingid('user', $data->userid);
- if (!empty($data->allocatedmarker)) {
- $data->allocatedmarker = $this->get_mappingid('user', $data->allocatedmarker);
- }
if (!empty($data->extensionduedate)) {
$data->extensionduedate = $this->apply_date_offset($data->extensionduedate);
} else {
@@ -215,6 +221,41 @@ protected function process_assign_userflag($data) {
$newitemid = $DB->insert_record('assign_user_flags', $data);
}
+ /**
+ * Process an allocated_marker restore.
+ * @param object $data The data in object form.
+ * @return void
+ */
+ protected function process_assign_allocatedmarker($data) {
+ global $DB;
+
+ $data = (object)$data;
+
+ $data->assignment = $this->get_new_parentid('assign');
+
+ $data->student = $this->get_mappingid('user', $data->student);
+ $data->marker = $this->get_mappingid('user', $data->marker);
+
+ $DB->insert_record('assign_allocated_marker', $data);
+ }
+
+ /**
+ * Process mark restore.
+ * @param object $data The data in object form.
+ * @return void
+ */
+ protected function process_assign_mark($data) {
+ global $DB;
+
+ $data = (object)$data;
+
+ $data->assignment = $this->get_new_parentid('assign');
+
+ $data->marker = $this->get_mappingid('user', $data->marker);
+
+ $DB->insert_record('assign_mark', $data);
+ }
+
/**
* Process a grade restore
* @param object $data The data in object form
diff --git a/mod/assign/batchsetallocatedmarkerform.php b/mod/assign/batchsetallocatedmarkerform.php
index e01f78083fa64..4d5ab7ddc8cb2 100644
--- a/mod/assign/batchsetallocatedmarkerform.php
+++ b/mod/assign/batchsetallocatedmarkerform.php
@@ -46,7 +46,23 @@ public function definition() {
$mform->addElement('static', 'userslist', get_string('selectedusers', 'assign'), $params['usershtml']);
$options = $params['markers'];
- $mform->addElement('select', 'allocatedmarker', get_string('allocatedmarker', 'assign'), $options);
+
+ if (empty($params['markercount'])) {
+ $markercount = 1;
+ } else {
+ $markercount = $params['markercount'];
+ }
+
+ $markerids = array_keys($options);
+
+ for ($i = 1; $i <= $markercount; $i++) {
+ $mform->addElement('select', "allocatedmarker{$i}", get_string('allocatedmarker', 'assign'), $options);
+ // With more than one marker set the default for each marker for
+ // that teacher's position in the options so that we don't have the
+ // same (first) teacher as the default for each marker.
+ $mform->getElement("allocatedmarker{$i}")->setSelected($markerids[$i - 1]);
+ }
+
$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);
diff --git a/mod/assign/db/install.xml b/mod/assign/db/install.xml
index 63ecc90ff20aa..192131abdc101 100644
--- a/mod/assign/db/install.xml
+++ b/mod/assign/db/install.xml
@@ -169,6 +169,7 @@
+
@@ -185,9 +186,9 @@
-
-
-
+
+
+
diff --git a/mod/assign/db/upgrade.php b/mod/assign/db/upgrade.php
index c0b7ed03a6db9..91a72c03cf341 100644
--- a/mod/assign/db/upgrade.php
+++ b/mod/assign/db/upgrade.php
@@ -227,5 +227,41 @@ function xmldb_assign_upgrade($oldversion) {
upgrade_mod_savepoint(true, 2024100700.08, 'assign');
}
+ if ($oldversion < 2024100700.09) {
+ // Define table assign_allocated_marker to be modified.
+ $table = new xmldb_table('assign_allocated_marker');
+
+ $field = new xmldb_field('studentid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $dbman->rename_field($table, $field, 'student');
+
+ $field = new xmldb_field('assignid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $dbman->rename_field($table, $field, 'assignment');
+
+ $field = new xmldb_field('markerid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $dbman->rename_field($table, $field, 'marker');
+
+ // Define table assign_mark to be modified.
+ $table = new xmldb_table('assign_mark');
+
+ // Add field assignment. This field is just so that rows are
+ // associated with the corresponding assignment during backup/restore.
+ $field = new xmldb_field('assignment', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'id');
+
+ // Conditionally launch add field assignment.
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ $DB->execute("UPDATE {assign_mark} am
+ JOIN {assign_grades} ag ON am.gradeid = ag.id
+ SET am.assignment = ag.assignment");
+
+ $field = new xmldb_field('assignment', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
+ $dbman->change_field_notnull($table, $field);
+
+ // Assign savepoint reached.
+ upgrade_mod_savepoint(true, 2024100700.09, 'assign');
+ }
+
return true;
}
diff --git a/mod/assign/gradingtable.php b/mod/assign/gradingtable.php
index 643a18310842b..c968f7014efb1 100644
--- a/mod/assign/gradingtable.php
+++ b/mod/assign/gradingtable.php
@@ -344,9 +344,9 @@ public function __construct(assign $assignment,
$where .= ' AND am.markerid IS NULL';
} else {
$from .= 'LEFT JOIN {assign_allocated_marker} am
- ON u.id = am.studentid
- AND am.assignid = :assignmentid4 ';
- $where .= " AND am.markerid = :markerid";
+ ON u.id = am.student
+ AND am.assignment = :assignmentid4 ';
+ $where .= " AND am.marker = :markerid";
$params['assignmentid4'] = (int)$this->assignment->get_instance()->id;
$params['markerid'] = $markerfilter;
@@ -699,7 +699,7 @@ public function col_allocatedmarker(stdClass $row, int $markerpos = 1) {
static $markers = null;
static $markerlist = array();
- $markers2 = $DB->get_fieldset('assign_allocated_marker', 'markerid', ['studentid' => $row->userid, 'assignid' => $this->assignment->get_instance()->id]);
+ $markers2 = $DB->get_fieldset('assign_allocated_marker', 'marker', ['student' => $row->userid, 'assignment' => $this->assignment->get_instance()->id]);
if (!empty($row) && !empty($markers2)) {
$marker1 = fullname(\core_user::get_user($markers2[$markerpos - 1])); // FIXME $marker1 variable name.
}
@@ -1068,10 +1068,10 @@ public function col_marker(stdClass $row, int $col): string {
$this->assignment->get_instance()->markingallocation) {
// Allocated markers are enabled: get the mark corresponding to
// the marker for this column.
- $markers = array_values($DB->get_records('assign_allocated_marker', ['studentid' => $row->userid, 'assignid' => $this->assignment->get_instance()->id], 'id'));
+ $markers = array_values($DB->get_records('assign_allocated_marker', ['student' => $row->userid, 'assignment' => $this->assignment->get_instance()->id], 'id'));
if (count($markers) > $col - 1) {
- $mark = $DB->get_field('assign_mark', 'mark', ['gradeid' => $row->gradeid, 'marker' => $markers[$col - 1]->markerid]);
+ $mark = $DB->get_field('assign_mark', 'mark', ['gradeid' => $row->gradeid, 'marker' => $markers[$col - 1]->marker]);
if ($mark !== false) {
$displaymark = $this->display_grade($mark, $this->quickgrading && !$gradingdisabled, $row->userid, $row->timemarked);
}
@@ -1122,7 +1122,8 @@ public function col_marker(stdClass $row, int $col): string {
$this->assignment->get_instance()->markingallocation) {
// If allocated marking is enabled is this user the marker for
// this column?
- if ($markers = $DB->get_fieldset('assign_allocated_marker', 'markerid', ['studentid' => $row->userid, 'assignid' => $this->assignment->get_instance()->id])) {
+ $markers = $DB->get_fieldset('assign_allocated_marker', 'marker', ['student' => $row->userid, 'assignment' => $this->assignment->get_instance()->id]);
+ if ($markers = $DB->get_fieldset('assign_allocated_marker', 'marker', ['student' => $row->userid, 'assignment' => $this->assignment->get_instance()->id])) {
$isallocatedmarker = ($markers[$col - 1] == $USER->id);
}
} else if (((count($existingmarkers) >= $col) && ($existingmarkers[$col]->marker == $USER->id)) ||
diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php
index 99eb902139c30..62ce063f614d9 100644
--- a/mod/assign/locallib.php
+++ b/mod/assign/locallib.php
@@ -2347,9 +2347,9 @@ public function list_participants($currentgroup, $idsonly, $tablesort = false) {
has_capability('mod/assign:grade', $this->get_context())) {
$additionaljoins .= ' LEFT JOIN {assign_allocated_marker} am
- ON u.id = am.studentid
- AND am.assignid = :assignmentid3';
- $additionalfilters .= " AND am.markerid = :markerid";
+ ON u.id = am.student
+ AND am.assignment = :assignmentid3';
+ $additionalfilters .= " AND am.marker = :markerid";
$params['assignmentid3'] = $instance->id;
$params['markerid'] = $USER->id;
}
@@ -3055,9 +3055,7 @@ public function update_grade($grade, $reopenattempt = false) {
/**
* Add or update an mdl_assign_mark record.
- * @param int $gradeid The corresponding mdl_assign_grades record for this
- * mark, that is, the record where the grade field will be populated when
- * all necessary marks are awarded allowing the grade to be set.
+ * @param stdClass $grade a grade record.
* @param int $marker The user ID of this marker.
* @param float $mark The mark awarded by this marker, for example, 55.2.
* @param FIXME $workflowstate
@@ -3072,6 +3070,7 @@ public function update_mark($grade, $mark, $workflowstate) {
$DB->update_record('assign_mark', $record);
} else {
$record = new stdClass();
+ $record->assignment = $grade->assignment;
$record->gradeid = $grade->id;
$record->timecreated = $record->timemodified = time();
$record->marker = $grade->grader;
@@ -8538,12 +8537,12 @@ protected function process_set_batch_marking_allocation() {
continue; // Allocated marker can only be changed in certain workflow states.
}
- $DB->delete_records('assign_allocated_marker', ['studentid' => $userid, 'assignid' => $flags->assignment]);
+ $DB->delete_records('assign_allocated_marker', ['student' => $userid, 'assignment' => $flags->assignment]);
foreach ($markers as $marker) {
$record = new stdClass();
- $record->studentid = $userid;
- $record->assignid = $flags->assignment;
- $record->markerid = $marker;
+ $record->student = $userid;
+ $record->assignment = $flags->assignment;
+ $record->marker = $marker;
$DB->insert_record('assign_allocated_marker', $record);
}
}
diff --git a/mod/assign/version.php b/mod/assign/version.php
index d47e7b6b431c7..1d033dc7d09bf 100644
--- a/mod/assign/version.php
+++ b/mod/assign/version.php
@@ -25,5 +25,5 @@
defined('MOODLE_INTERNAL') || die();
$plugin->component = 'mod_assign'; // Full name of the plugin (used for diagnostics).
-$plugin->version = 2024100700.08; // The current module version (Date: YYYYMMDDXX).
+$plugin->version = 2024100700.09; // The current module version (Date: YYYYMMDDXX).
$plugin->requires = 2024100100; // Requires this Moodle version.