Skip to content

Commit

Permalink
Implement Backup API
Browse files Browse the repository at this point in the history
Also fixed missing changes to batchsetallocatedmarkerform.php (needed to
actually allocate multiple markers).
  • Loading branch information
leonstr committed Feb 7, 2025
1 parent f552f7b commit 92a552c
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 28 deletions.
36 changes: 33 additions & 3 deletions mod/assign/backup/moodle2/backup_assign_stepslib.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ protected function define_structure() {
'maxattempts',
'markingworkflow',
'markingallocation',
'markercount',
'multimarkmethod',
'markinganonymous',
'preventsubmissionnotingroup',
'activity',
Expand All @@ -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');

Expand Down Expand Up @@ -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);
Expand All @@ -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) {
Expand All @@ -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');
Expand Down
47 changes: 44 additions & 3 deletions mod/assign/backup/moodle2/restore_assign_stepslib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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 {
Expand All @@ -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
Expand Down
18 changes: 17 additions & 1 deletion mod/assign/batchsetallocatedmarkerform.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 4 additions & 3 deletions mod/assign/db/install.xml
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@
<TABLE NAME="assign_mark" COMMENT="Marks from multiple markers for a single submission">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="assignment" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The ID of the assignment this mark applies to"/>
<FIELD NAME="gradeid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The ID of an assign_grades row"/>
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The time this mark was created"/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The time this mark was modified"/>
Expand All @@ -185,9 +186,9 @@
<TABLE NAME="assign_allocated_marker" COMMENT="One or more teachers allocated to mark individual submissions">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="studentid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The id of the student this marker is allocated to"/>
<FIELD NAME="assignid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The id of the assignment this marker is allocated to"/>
<FIELD NAME="markerid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The teacher allocated to mark this user+assignment"/>
<FIELD NAME="student" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="User ID of student this marker is allocated to"/>
<FIELD NAME="assignment" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The id of the assignment this marker is allocated to"/>
<FIELD NAME="marker" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="User ID of teacher allocated to mark this student"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
Expand Down
36 changes: 36 additions & 0 deletions mod/assign/db/upgrade.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
15 changes: 8 additions & 7 deletions mod/assign/gradingtable.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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.
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)) ||
Expand Down
19 changes: 9 additions & 10 deletions mod/assign/locallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}
}
Expand Down
2 changes: 1 addition & 1 deletion mod/assign/version.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.

0 comments on commit 92a552c

Please sign in to comment.