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.