mirrored from git://git.moodle.org/moodle.git
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDL-68241 mod_h5pactivity: add grading attempts options
- Loading branch information
1 parent
206e179
commit e28b406
Showing
20 changed files
with
1,754 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,214 @@ | ||
<?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; | ||
} | ||
} |
Oops, something went wrong.