From f6b53a16236a26283205b51182d6b89ea561d6c8 Mon Sep 17 00:00:00 2001 From: PMKuipers Date: Mon, 11 Dec 2023 23:52:00 +0100 Subject: [PATCH] Fixed bugs in invitation system --- classes/coursecompetencyinfo.php | 69 ++++++++++++++++++++++++++++---- classes/courseinfo.php | 3 +- lib.php | 4 +- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/classes/coursecompetencyinfo.php b/classes/coursecompetencyinfo.php index ad1d442..3bbbfdf 100644 --- a/classes/coursecompetencyinfo.php +++ b/classes/coursecompetencyinfo.php @@ -28,6 +28,7 @@ require_once($CFG->libdir.'/gradelib.php'); require_once($CFG->dirroot.'/course/lib.php'); use core_competency\course_competency; +use core_competency\user_competency_course; use core_competency\competency; use core_competency\api as c_api; use core_competency\competency_rule_points; @@ -427,12 +428,14 @@ class coursecompetencyinfo { */ public function course_competencies() { $list = []; - // First retrieve all the competencies associates with this course. - $coursecompetencies = c_api::list_course_competencies($this->course->id); - // Next create the data model, and check user proficiency for each competency. - foreach($coursecompetencies as $ccinfo) { - $list[] = $ccinfo['competency']; + + $coursecompetencies = course_competency::list_course_competencies($this->course->id); + $competencies = course_competency::list_competencies($this->course->id); + + foreach ($coursecompetencies as $key => $coursecompetency) { + $list[] = $competencies[$coursecompetency->get('competencyid')]; } + return $list; } @@ -455,6 +458,56 @@ class coursecompetencyinfo { return $r; } + /** + * Get a user competency. (Copied from competency api and stripped out permission checks) + * + * @param int $userid The user ID. + * @param int $competencyid The competency ID. + * @return user_competency + */ + public static function get_user_competency($userid, $competencyid) { + c_api::require_enabled(); + $existing = user_competency::get_multiple($userid, array($competencyid)); + $uc = array_pop($existing); + + if (!$uc) { + $uc = user_competency::create_relation($userid, $competencyid); + $uc->create(); + } + + return $uc; + } + + /** + * Get a user competency in a course. (Copied from competency api and stripped out permission checks) + * + * @param int $courseid The id of the course to check. + * @param int $userid The id of the course to check. + * @param int $competencyid The id of the competency. + * @return user_competency_course + */ + public static function get_user_competency_in_course($courseid, $userid, $competencyid) { + c_api::require_enabled(); + // First we do a permissions check. + $context = \context_course::instance($courseid); + + // This will throw an exception if the competency does not belong to the course. + $competency = course_competency::get_competency($courseid, $competencyid); + + $params = array('courseid' => $courseid, 'userid' => $userid, 'competencyid' => $competencyid); + $exists = user_competency_course::get_record($params); + // Create missing. + if ($exists) { + $ucc = $exists; + } else { + $ucc = user_competency_course::create_relation($userid, $competency->get('id'), $courseid); + $ucc->create(); + } + + return $ucc; + } + + /** * Retrieve course proficiency and overall proficiency for a competency and user * @@ -469,7 +522,7 @@ class coursecompetencyinfo { $competencyid = $competency->get('id'); $r = new \stdClass(); - $uc = c_api::get_user_competency($userid, $competencyid); + $uc = self::get_user_competency($userid, $competencyid); $proficiency = $uc->get('proficiency'); $r->proficient = $proficiency; $r->grade = $scale->get_nearest_item($uc->get('grade')); @@ -477,7 +530,7 @@ class coursecompetencyinfo { $r->failed = $proficiency === false; try { // Only add course grade and proficiency if the competency is included in the course. - $ucc = c_api::get_user_competency_in_course($this->course->id,$userid,$competencyid); + $ucc = self::get_user_competency_in_course($this->course->id,$userid,$competencyid); $r->courseproficient = $ucc->get('proficiency'); $r->coursegrade = $scale->get_nearest_item($ucc->get('grade')); } catch (\Exception $x) {} @@ -495,7 +548,7 @@ class coursecompetencyinfo { */ public function retrievefeedback($competency, $userid) { $competencyid = $competency->get('id'); - $uc = c_api::get_user_competency($userid, $competencyid); + $uc = self::get_user_competency($userid, $competencyid); // Get evidences and sort by creation date (newest first) $evidence = evidence::get_records_for_usercompetency($uc->get('id'),\context_system::instance(),'timecreated', "DESC"); diff --git a/classes/courseinfo.php b/classes/courseinfo.php index 6313100..bce6eb2 100644 --- a/classes/courseinfo.php +++ b/classes/courseinfo.php @@ -556,7 +556,7 @@ class courseinfo { * @return array [value,type] of the field for this */ protected function extrafields_value($fieldname,$includeteachervisible=false) { - + global $PAGE; if ($fieldname == "description") { // Process embedded files. $value = \file_rewrite_pluginfile_urls( @@ -614,6 +614,7 @@ class courseinfo { } } else { // Everything else can just use the export value. + $PAGE->set_context(\context_system::instance()); $value = $data->export_value(); } diff --git a/lib.php b/lib.php index 768e8dd..69c9eb7 100644 --- a/lib.php +++ b/lib.php @@ -424,8 +424,8 @@ function local_treestudyplan_pluginfile( $plan = studyplan::find_by_id($itemid); $planctx = $plan->context(); - // Check if the current user has access to this studyplan - if ( webservicehelper::has_capabilities($studyplan_filecaps,$planctx) || $plan->has_linked_user($USER)) { + // Studyplan icons are not secret, so don't check for access.. + if ( true ) { // Extract the filename / filepath from the $args array $filename = array_pop($args); // The last item in the $args array. if (empty($args)) {