PHPDoc documentation
This commit is contained in:
parent
701f4d7363
commit
7de179e6e6
2 changed files with 123 additions and 25 deletions
|
@ -14,7 +14,7 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Moodle. If not, see <https://www.gnu.org/licenses/>.
|
// along with Moodle. If not, see <https://www.gnu.org/licenses/>.
|
||||||
/**
|
/**
|
||||||
*
|
* Scan course completion criteria for pending grading actions
|
||||||
* @package local_treestudyplan
|
* @package local_treestudyplan
|
||||||
* @copyright 2023 P.M. Kuipers
|
* @copyright 2023 P.M. Kuipers
|
||||||
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||||
|
@ -26,24 +26,56 @@ defined('MOODLE_INTERNAL') || die();
|
||||||
require_once($CFG->libdir.'/externallib.php');
|
require_once($CFG->libdir.'/externallib.php');
|
||||||
|
|
||||||
use \grade_item;
|
use \grade_item;
|
||||||
|
use \completion_criteria;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scan course completion criteria for pending grading actions
|
||||||
|
*/
|
||||||
class completionscanner {
|
class completionscanner {
|
||||||
|
/**
|
||||||
|
* Cache of supported mods
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
private static $modsupported = [];
|
private static $modsupported = [];
|
||||||
|
/**
|
||||||
|
* Cache of enrolled students in a particular course
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
private static $coursestudents = [];
|
private static $coursestudents = [];
|
||||||
|
/** The internally used grading scanner
|
||||||
|
* @var local\ungradedscanners\scanner_base
|
||||||
|
*/
|
||||||
private $scanner = null;
|
private $scanner = null;
|
||||||
private $course = null;
|
/**
|
||||||
|
* Course module
|
||||||
|
* @var \cm_info
|
||||||
|
*/
|
||||||
private $cm = null;
|
private $cm = null;
|
||||||
|
/** @var grade_item */
|
||||||
private $gi = null;
|
private $gi = null;
|
||||||
|
/**
|
||||||
|
* Cache of pending ungraded results per user
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
private $pendingcache = [];
|
private $pendingcache = [];
|
||||||
|
|
||||||
public static function supported($mod) {
|
/**
|
||||||
|
* Check if a certain activity type is supported for scanning pending results
|
||||||
|
* @param string $mod name of activity module
|
||||||
|
*/
|
||||||
|
public static function supported($mod) : bool {
|
||||||
if (!array_key_exists($mod, self::$modsupported)) {
|
if (!array_key_exists($mod, self::$modsupported)) {
|
||||||
self::$modsupported[$mod] = class_exists("\local_treestudyplan\\local\\ungradedscanners\\{$mod}_scanner");
|
self::$modsupported[$mod] = class_exists("\local_treestudyplan\\local\\ungradedscanners\\{$mod}_scanner");
|
||||||
}
|
}
|
||||||
return self::$modsupported[$mod];
|
return self::$modsupported[$mod];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function get_course_students($courseid) {
|
/**
|
||||||
|
* List all users enrolled in a course as student by userid
|
||||||
|
* @param int $courseid Course id of the course to check
|
||||||
|
* @return int[] Array if user ids
|
||||||
|
*/
|
||||||
|
public static function get_course_students($courseid) : array {
|
||||||
global $CFG;
|
global $CFG;
|
||||||
if (!array_key_exists($courseid, self::$coursestudents)) {
|
if (!array_key_exists($courseid, self::$coursestudents)) {
|
||||||
$students = [];
|
$students = [];
|
||||||
|
@ -57,7 +89,12 @@ class completionscanner {
|
||||||
return self::$coursestudents[$courseid];
|
return self::$coursestudents[$courseid];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __construct(\completion_criteria $crit, $course) {
|
/**
|
||||||
|
* Construct new scanner based on completion criteria and course
|
||||||
|
* @param completion_criteria $crit Criteria to check for
|
||||||
|
* @param stdClass $course Course DB record
|
||||||
|
*/
|
||||||
|
public function __construct(completion_criteria $crit, $course) {
|
||||||
$this->courseid = $course->id;
|
$this->courseid = $course->id;
|
||||||
$this->course = $course;
|
$this->course = $course;
|
||||||
$this->modinfo = get_fast_modinfo($course);
|
$this->modinfo = get_fast_modinfo($course);
|
||||||
|
@ -91,18 +128,26 @@ class completionscanner {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function pending($userid) {
|
/**
|
||||||
if (!array_key_exists($userid, $this->pending_cache)) {
|
* Check if the criteria this scanner scans has pending submissions for a specific user
|
||||||
|
* @param int $userid ID of the user to check for
|
||||||
|
*/
|
||||||
|
public function pending($userid) : bool {
|
||||||
|
if (!array_key_exists($userid, $this->pendingcache)) {
|
||||||
if ($this->scanner === null) {
|
if ($this->scanner === null) {
|
||||||
$this->pending_cache[$userid] = false;
|
$this->pendingcache[$userid] = false;
|
||||||
} else {
|
} else {
|
||||||
$this->pending_cache[$userid] = $this->scanner->has_ungraded_submission($userid);;
|
$this->pendingcache[$userid] = $this->scanner->has_ungraded_submission($userid);;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $this->pending_cache[$userid];
|
return $this->pendingcache[$userid];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function structure($value = VALUE_OPTIONAL) {
|
/**
|
||||||
|
* Webservice structure for basic info
|
||||||
|
* @param int $value Webservice requirement constant
|
||||||
|
*/
|
||||||
|
public static function structure($value = VALUE_OPTIONAL) : \external_description {
|
||||||
return new \external_single_structure([
|
return new \external_single_structure([
|
||||||
"ungraded" => new \external_value(PARAM_INT, 'number of ungraded submissions'),
|
"ungraded" => new \external_value(PARAM_INT, 'number of ungraded submissions'),
|
||||||
"completed" => new \external_value(PARAM_INT, 'number of completed students'),
|
"completed" => new \external_value(PARAM_INT, 'number of completed students'),
|
||||||
|
@ -112,7 +157,10 @@ class completionscanner {
|
||||||
], "details about gradable submissions", $value);
|
], "details about gradable submissions", $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function model() {
|
/**
|
||||||
|
* Webservice model for basic info
|
||||||
|
*/
|
||||||
|
public function model() : array {
|
||||||
|
|
||||||
// Get completion info.
|
// Get completion info.
|
||||||
$students = self::get_course_students($this->courseid);
|
$students = self::get_course_students($this->courseid);
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Moodle. If not, see <https://www.gnu.org/licenses/>.
|
// along with Moodle. If not, see <https://www.gnu.org/licenses/>.
|
||||||
/**
|
/**
|
||||||
*
|
* Scan gradables for a pending grading action
|
||||||
* @package local_treestudyplan
|
* @package local_treestudyplan
|
||||||
* @copyright 2023 P.M. Kuipers
|
* @copyright 2023 P.M. Kuipers
|
||||||
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||||
|
@ -27,21 +27,49 @@ require_once($CFG->libdir.'/externallib.php');
|
||||||
|
|
||||||
use \grade_item;
|
use \grade_item;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scan gradables for a pending grading action
|
||||||
|
*/
|
||||||
class gradingscanner {
|
class gradingscanner {
|
||||||
|
/**
|
||||||
|
* Cache of supported mods
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
private static $modsupported = [];
|
private static $modsupported = [];
|
||||||
|
/**
|
||||||
|
* Cache of enrolled students in a particular course
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
private static $coursestudents = [];
|
private static $coursestudents = [];
|
||||||
|
/** The internally used grading scanner
|
||||||
|
* @var local\ungradedscanners\scanner_base
|
||||||
|
*/
|
||||||
private $scanner = null;
|
private $scanner = null;
|
||||||
|
/** @var grade_item */
|
||||||
private $gi = null;
|
private $gi = null;
|
||||||
|
/**
|
||||||
|
* Cache of pending ungraded results per user
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
private $pendingcache = [];
|
private $pendingcache = [];
|
||||||
|
|
||||||
public static function supported($mod) {
|
/**
|
||||||
|
* Check if a certain activity type is supported for scanning pending results
|
||||||
|
* @param string $mod name of activity module
|
||||||
|
*/
|
||||||
|
public static function supported($mod) : bool {
|
||||||
if (!array_key_exists($mod, self::$modsupported)) {
|
if (!array_key_exists($mod, self::$modsupported)) {
|
||||||
self::$modsupported[$mod] = class_exists("\local_treestudyplan\\local\\ungradedscanners\\{$mod}_scanner");
|
self::$modsupported[$mod] = class_exists("\local_treestudyplan\\local\\ungradedscanners\\{$mod}_scanner");
|
||||||
}
|
}
|
||||||
return self::$modsupported[$mod];
|
return self::$modsupported[$mod];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function get_course_students($courseid) {
|
/**
|
||||||
|
* List all users enrolled in a course as student by userid
|
||||||
|
* @param int $courseid Course id of the course to check
|
||||||
|
* @return int[] Array if user ids
|
||||||
|
*/
|
||||||
|
public static function get_course_students($courseid) : array {
|
||||||
global $CFG;
|
global $CFG;
|
||||||
if (!array_key_exists($courseid, self::$coursestudents)) {
|
if (!array_key_exists($courseid, self::$coursestudents)) {
|
||||||
$students = [];
|
$students = [];
|
||||||
|
@ -55,6 +83,10 @@ class gradingscanner {
|
||||||
return self::$coursestudents[$courseid];
|
return self::$coursestudents[$courseid];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct new scanner based on grade item
|
||||||
|
* @param grade_item $gi Grade item
|
||||||
|
*/
|
||||||
public function __construct(grade_item $gi) {
|
public function __construct(grade_item $gi) {
|
||||||
$this->courseid = $gi->courseid;
|
$this->courseid = $gi->courseid;
|
||||||
$this->gi = $gi;
|
$this->gi = $gi;
|
||||||
|
@ -64,22 +96,33 @@ class gradingscanner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function is_available() {
|
/**
|
||||||
|
* Check if this scanner is usable (has an internal activity specific scanner)
|
||||||
|
*/
|
||||||
|
public function is_available() : bool {
|
||||||
return $this->scanner !== null;
|
return $this->scanner !== null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function pending($userid) {
|
/**
|
||||||
if (!array_key_exists($userid, $this->pending_cache)) {
|
* Check if the gradable item this scanner scans has pending submissions for a specific user
|
||||||
|
* @param int $userid ID of the user to check for
|
||||||
|
*/
|
||||||
|
public function pending($userid) : bool {
|
||||||
|
if (!array_key_exists($userid, $this->pendingcache)) {
|
||||||
if ($this->scanner === null) {
|
if ($this->scanner === null) {
|
||||||
$this->pending_cache[$userid] = false;
|
$this->pendingcache[$userid] = false;
|
||||||
} else {
|
} else {
|
||||||
$this->pending_cache[$userid] = $this->scanner->has_ungraded_submission($userid);;
|
$this->pendingcache[$userid] = $this->scanner->has_ungraded_submission($userid);;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $this->pending_cache[$userid];
|
return $this->pendingcache[$userid];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function structure($value =VALUE_OPTIONAL) {
|
/**
|
||||||
|
* Webservice structure for basic info
|
||||||
|
* @param int $value Webservice requirement constant
|
||||||
|
*/
|
||||||
|
public static function structure($value = VALUE_OPTIONAL) : \external_description {
|
||||||
return new \external_single_structure([
|
return new \external_single_structure([
|
||||||
"ungraded" => new \external_value(PARAM_INT, 'number of ungraded submissions'),
|
"ungraded" => new \external_value(PARAM_INT, 'number of ungraded submissions'),
|
||||||
"completed" => new \external_value(PARAM_INT, 'number of completed students'),
|
"completed" => new \external_value(PARAM_INT, 'number of completed students'),
|
||||||
|
@ -89,7 +132,10 @@ class gradingscanner {
|
||||||
], "details about gradable submissions", $value);
|
], "details about gradable submissions", $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function model() {
|
/**
|
||||||
|
* Webservice model for basic info
|
||||||
|
*/
|
||||||
|
public function model() : array {
|
||||||
// Upda.
|
// Upda.
|
||||||
$students = self::get_course_students($this->courseid);
|
$students = self::get_course_students($this->courseid);
|
||||||
$completed = 0;
|
$completed = 0;
|
||||||
|
@ -123,8 +169,12 @@ class gradingscanner {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a grade is considered passed according to the rules
|
||||||
|
* @param grade_grade $grade
|
||||||
|
*/
|
||||||
|
private function grade_passed($grade) : bool {
|
||||||
// Function copied from bistate aggregator to avoid reference mazes.
|
// Function copied from bistate aggregator to avoid reference mazes.
|
||||||
private function grade_passed($grade) {
|
|
||||||
global $DB;
|
global $DB;
|
||||||
$table = "local_treestudyplan_gradecfg";
|
$table = "local_treestudyplan_gradecfg";
|
||||||
// First determine if we have a grade_config for this scale or this maximum grade.
|
// First determine if we have a grade_config for this scale or this maximum grade.
|
||||||
|
|
Loading…
Reference in a new issue