Exemple #1
0
 /**
  * Apply the competency rules from a user competency.
  *
  * The user competency passed should be one that was recently marked as complete.
  * A user competency is considered 'complete' when it's proficiency value is true.
  *
  * This method will check if the parent of this usercompetency's competency has any
  * rules and if so will see if they match. When matched it will take the required
  * step to add evidence and trigger completion, etc...
  *
  * @param  user_competency $usercompetency The user competency recently completed.
  * @param  competency|null $competency     The competency of the user competency, useful to avoid unnecessary read.
  * @return void
  */
 protected static function apply_competency_rules_from_usercompetency(user_competency $usercompetency, competency $competency = null)
 {
     // Perform some basic checks.
     if (!$usercompetency->get_proficiency()) {
         throw new coding_exception('The user competency passed is not completed.');
     }
     if ($competency === null) {
         $competency = $usercompetency->get_competency();
     }
     if ($competency->get_id() != $usercompetency->get_competencyid()) {
         throw new coding_exception('Mismatch between user competency and competency.');
     }
     // Fetch the parent.
     $parent = $competency->get_parent();
     if ($parent === null) {
         return;
     }
     // The parent should have a rule, and a meaningful outcome.
     $ruleoutcome = $parent->get_ruleoutcome();
     if ($ruleoutcome == competency::OUTCOME_NONE) {
         return;
     }
     $rule = $parent->get_rule_object();
     if ($rule === null) {
         return;
     }
     // Fetch or create the user competency for the parent.
     $userid = $usercompetency->get_userid();
     $parentuc = user_competency::get_record(array('userid' => $userid, 'competencyid' => $parent->get_id()));
     if (!$parentuc) {
         $parentuc = user_competency::create_relation($userid, $parent->get_id());
         $parentuc->create();
     }
     // Does the rule match?
     if (!$rule->matches($parentuc)) {
         return;
     }
     // Figuring out what to do.
     $recommend = false;
     if ($ruleoutcome == competency::OUTCOME_EVIDENCE) {
         $action = evidence::ACTION_LOG;
     } else {
         if ($ruleoutcome == competency::OUTCOME_RECOMMEND) {
             $action = evidence::ACTION_LOG;
             $recommend = true;
         } else {
             if ($ruleoutcome == competency::OUTCOME_COMPLETE) {
                 $action = evidence::ACTION_COMPLETE;
             } else {
                 throw new moodle_exception('Unexpected rule outcome: ' + $ruleoutcome);
             }
         }
     }
     // Finally add an evidence.
     static::add_evidence($userid, $parent, $parent->get_context()->id, $action, 'evidence_competencyrule', 'core_competency', null, $recommend);
 }
Exemple #2
0
 /**
  * Test evidence_created event by linking an invalid user competency to an evidence.
  *
  * @expectedException        coding_exception
  * @expectedExceptionMessage The user competency linked with this evidence is invalid.
  */
 public function test_evidence_created_with_invalid_user_competency()
 {
     $this->resetAfterTest(true);
     $dg = $this->getDataGenerator();
     $syscontext = context_system::instance();
     // Create students.
     $student = $dg->create_user();
     $student2 = $dg->create_user();
     // Create a competency for the course.
     $lpg = $dg->get_plugin_generator('core_competency');
     $framework = $lpg->create_framework();
     $comp = $lpg->create_competency(['competencyframeworkid' => $framework->get_id()]);
     // Create a different user competency.
     $otheruc = \core_competency\user_competency::create_relation($student2->id, $comp->get_id());
     $otheruc->create();
     // Add evidence.
     $recommend = false;
     $evidence = api::add_evidence($student->id, $comp, $syscontext, \core_competency\evidence::ACTION_OVERRIDE, 'commentincontext', 'core', null, $recommend, null, 1);
     // We expect this to fail and throw a coding exception.
     \core\event\competency_evidence_created::create_from_evidence($evidence, $otheruc, $recommend)->trigger();
 }