215 lines
7.4 KiB
PHP
215 lines
7.4 KiB
PHP
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* H5P activity grader class.
|
|
*
|
|
* @package mod_h5pactivity
|
|
* @since Moodle 3.9
|
|
* @copyright 2020 Ferran Recio <ferran@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
namespace mod_h5pactivity\local;
|
|
|
|
use context_module;
|
|
use cm_info;
|
|
use moodle_recordset;
|
|
use stdClass;
|
|
|
|
/**
|
|
* Class for handling H5P activity grading.
|
|
*
|
|
* @package mod_h5pactivity
|
|
* @since Moodle 3.9
|
|
* @copyright 2020 Ferran Recio <ferran@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class grader {
|
|
|
|
/** @var stdClass course_module record. */
|
|
private $instance;
|
|
|
|
/** @var string idnumber course_modules idnumber. */
|
|
private $idnumber;
|
|
|
|
/**
|
|
* Class contructor.
|
|
*
|
|
* @param stdClass $instance H5Pactivity instance object
|
|
* @param string $idnumber course_modules idnumber
|
|
*/
|
|
public function __construct(stdClass $instance, string $idnumber = '') {
|
|
$this->instance = $instance;
|
|
$this->idnumber = $idnumber;
|
|
}
|
|
|
|
/**
|
|
* Delete grade item for given mod_h5pactivity instance.
|
|
*
|
|
* @return int Returns GRADE_UPDATE_OK, GRADE_UPDATE_FAILED, GRADE_UPDATE_MULTIPLE or GRADE_UPDATE_ITEM_LOCKED
|
|
*/
|
|
public function grade_item_delete(): ?int {
|
|
global $CFG;
|
|
require_once($CFG->libdir.'/gradelib.php');
|
|
|
|
return grade_update('mod/h5pactivity', $this->instance->course, 'mod', 'h5pactivity',
|
|
$this->instance->id, 0, null, ['deleted' => 1]);
|
|
}
|
|
|
|
/**
|
|
* Creates or updates grade item for the given mod_h5pactivity instance.
|
|
*
|
|
* @param mixed $grades optional array/object of grade(s); 'reset' means reset grades in gradebook
|
|
* @return int 0 if ok, error code otherwise
|
|
*/
|
|
public function grade_item_update($grades = null): int {
|
|
global $CFG;
|
|
require_once($CFG->libdir.'/gradelib.php');
|
|
|
|
$item = [];
|
|
$item['itemname'] = clean_param($this->instance->name, PARAM_NOTAGS);
|
|
$item['gradetype'] = GRADE_TYPE_VALUE;
|
|
if (!empty($this->idnumber)) {
|
|
$item['idnumber'] = $this->idnumber;
|
|
}
|
|
|
|
if ($this->instance->grade > 0) {
|
|
$item['gradetype'] = GRADE_TYPE_VALUE;
|
|
$item['grademax'] = $this->instance->grade;
|
|
$item['grademin'] = 0;
|
|
} else if ($this->instance->grade < 0) {
|
|
$item['gradetype'] = GRADE_TYPE_SCALE;
|
|
$item['scaleid'] = -$this->instance->grade;
|
|
} else {
|
|
$item['gradetype'] = GRADE_TYPE_NONE;
|
|
}
|
|
|
|
if ($grades === 'reset') {
|
|
$item['reset'] = true;
|
|
$grades = null;
|
|
}
|
|
|
|
return grade_update('mod/h5pactivity', $this->instance->course, 'mod',
|
|
'h5pactivity', $this->instance->id, 0, $grades, $item);
|
|
}
|
|
|
|
/**
|
|
* Update grades in the gradebook.
|
|
*
|
|
* @param int $userid Update grade of specific user only, 0 means all participants.
|
|
*/
|
|
public function update_grades(int $userid = 0): void {
|
|
// Scaled and none grading doesn't have grade calculation.
|
|
if ($this->instance->grade <= 0) {
|
|
$this->grade_item_update();
|
|
return;
|
|
}
|
|
// Populate array of grade objects indexed by userid.
|
|
$grades = $this->get_user_grades_for_gradebook($userid);
|
|
|
|
if (!empty($grades)) {
|
|
$this->grade_item_update($grades);
|
|
} else {
|
|
$this->grade_item_update();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get an updated list of user grades and feedback for the gradebook.
|
|
*
|
|
* @param int $userid int or 0 for all users
|
|
* @return array of grade data formated for the gradebook api
|
|
* The data required by the gradebook api is userid,
|
|
* rawgrade,
|
|
* feedback,
|
|
* feedbackformat,
|
|
* usermodified,
|
|
* dategraded,
|
|
* datesubmitted
|
|
*/
|
|
private function get_user_grades_for_gradebook(int $userid = 0): array {
|
|
$grades = [];
|
|
|
|
// In case of using manual grading this update must delete previous automatic gradings.
|
|
if ($this->instance->grademethod == manager::GRADEMANUAL || !$this->instance->enabletracking) {
|
|
return $this->get_user_grades_for_deletion($userid);
|
|
}
|
|
|
|
$manager = manager::create_from_instance($this->instance);
|
|
|
|
$scores = $manager->get_users_scaled_score($userid);
|
|
if (!$scores) {
|
|
return $grades;
|
|
}
|
|
|
|
// Maxgrade depends on the type of grade used:
|
|
// - grade > 0: regular quantitative grading.
|
|
// - grade = 0: no grading.
|
|
// - grade < 0: scale used.
|
|
$maxgrade = floatval($this->instance->grade);
|
|
|
|
// Convert scaled scores into gradebok compatible objects.
|
|
foreach ($scores as $userid => $score) {
|
|
$grades[$userid] = [
|
|
'userid' => $userid,
|
|
'rawgrade' => $maxgrade * $score->scaled,
|
|
'dategraded' => $score->timemodified,
|
|
'datesubmitted' => $score->timemodified,
|
|
];
|
|
}
|
|
|
|
return $grades;
|
|
}
|
|
|
|
/**
|
|
* Get an deletion list of user grades and feedback for the gradebook.
|
|
*
|
|
* This method is used to delete all autmatic gradings when grading method is set to manual.
|
|
*
|
|
* @param int $userid int or 0 for all users
|
|
* @return array of grade data formated for the gradebook api
|
|
* The data required by the gradebook api is userid,
|
|
* rawgrade (null to delete),
|
|
* dategraded,
|
|
* datesubmitted
|
|
*/
|
|
private function get_user_grades_for_deletion(int $userid = 0): array {
|
|
$grades = [];
|
|
|
|
if ($userid) {
|
|
$grades[$userid] = [
|
|
'userid' => $userid,
|
|
'rawgrade' => null,
|
|
'dategraded' => time(),
|
|
'datesubmitted' => time(),
|
|
];
|
|
} else {
|
|
$manager = manager::create_from_instance($this->instance);
|
|
$users = get_enrolled_users($manager->get_context(), 'mod/h5pactivity:submit');
|
|
foreach ($users as $user) {
|
|
$grades[$user->id] = [
|
|
'userid' => $user->id,
|
|
'rawgrade' => null,
|
|
'dategraded' => time(),
|
|
'datesubmitted' => time(),
|
|
];
|
|
}
|
|
}
|
|
return $grades;
|
|
}
|
|
}
|