diff --git a/classes/completionscanner.php b/classes/completionscanner.php index 364426d..cecf519 100644 --- a/classes/completionscanner.php +++ b/classes/completionscanner.php @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . /** - * + * Scan course completion criteria for pending grading actions * @package local_treestudyplan * @copyright 2023 P.M. Kuipers * @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'); use \grade_item; +use \completion_criteria; +/** + * Scan course completion criteria for pending grading actions + */ class completionscanner { + /** + * Cache of supported mods + * @var array + */ private static $modsupported = []; + /** + * Cache of enrolled students in a particular course + * @var array + */ private static $coursestudents = []; + /** The internally used grading scanner + * @var local\ungradedscanners\scanner_base + */ private $scanner = null; - private $course = null; + /** + * Course module + * @var \cm_info + */ private $cm = null; + /** @var grade_item */ private $gi = null; + /** + * Cache of pending ungraded results per user + * @var array + */ 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)) { self::$modsupported[$mod] = class_exists("\local_treestudyplan\\local\\ungradedscanners\\{$mod}_scanner"); } 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; if (!array_key_exists($courseid, self::$coursestudents)) { $students = []; @@ -57,7 +89,12 @@ class completionscanner { 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->course = $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) { - $this->pending_cache[$userid] = false; + $this->pendingcache[$userid] = false; } 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([ "ungraded" => new \external_value(PARAM_INT, 'number of ungraded submissions'), "completed" => new \external_value(PARAM_INT, 'number of completed students'), @@ -112,7 +157,10 @@ class completionscanner { ], "details about gradable submissions", $value); } - public function model() { + /** + * Webservice model for basic info + */ + public function model() : array { // Get completion info. $students = self::get_course_students($this->courseid); diff --git a/classes/gradingscanner.php b/classes/gradingscanner.php index 500d3ac..11c703e 100644 --- a/classes/gradingscanner.php +++ b/classes/gradingscanner.php @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . /** - * + * Scan gradables for a pending grading action * @package local_treestudyplan * @copyright 2023 P.M. Kuipers * @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; +/** + * Scan gradables for a pending grading action + */ class gradingscanner { + /** + * Cache of supported mods + * @var array + */ private static $modsupported = []; + /** + * Cache of enrolled students in a particular course + * @var array + */ private static $coursestudents = []; + /** The internally used grading scanner + * @var local\ungradedscanners\scanner_base + */ private $scanner = null; + /** @var grade_item */ private $gi = null; + /** + * Cache of pending ungraded results per user + * @var array + */ 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)) { self::$modsupported[$mod] = class_exists("\local_treestudyplan\\local\\ungradedscanners\\{$mod}_scanner"); } 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; if (!array_key_exists($courseid, self::$coursestudents)) { $students = []; @@ -55,6 +83,10 @@ class gradingscanner { return self::$coursestudents[$courseid]; } + /** + * Construct new scanner based on grade item + * @param grade_item $gi Grade item + */ public function __construct(grade_item $gi) { $this->courseid = $gi->courseid; $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; } - 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) { - $this->pending_cache[$userid] = false; + $this->pendingcache[$userid] = false; } 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([ "ungraded" => new \external_value(PARAM_INT, 'number of ungraded submissions'), "completed" => new \external_value(PARAM_INT, 'number of completed students'), @@ -89,7 +132,10 @@ class gradingscanner { ], "details about gradable submissions", $value); } - public function model() { + /** + * Webservice model for basic info + */ + public function model() : array { // Upda. $students = self::get_course_students($this->courseid); $completed = 0; @@ -123,8 +169,12 @@ class gradingscanner { } - // Function copied from bistate aggregator to avoid reference mazes. - private function grade_passed($grade) { + /** + * 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. global $DB; $table = "local_treestudyplan_gradecfg"; // First determine if we have a grade_config for this scale or this maximum grade.