Beispiel #1
0
 /**
  * Returns immediate child contexts of course (most likely classes),
  * decendents beyond immediate children are not returned.
  *
  * @return \local_elisprogram\context\course|array A context instance or an empty array
  */
 public function get_child_contexts()
 {
     global $DB;
     $result = array();
     $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_class($this));
     $sql = "SELECT ctx.*\n                  FROM {context} ctx\n                 WHERE ctx.path LIKE ? AND (ctx.depth = ? OR ctx.contextlevel = ?)";
     $params = array($this->_path . '/%', $this->depth + 1, $contextlevel);
     $records = $DB->get_recordset_sql($sql, $params);
     foreach ($records as $record) {
         $result[$record->id] = \local_eliscore\context\base::create_instance_from_record($record);
     }
     unset($records);
     return $result;
 }
Beispiel #2
0
/**
 * Triggered when a role assignment takes place.
 * This function should use the PM configured values to send messages to appropriate users when a role assignment
 * takes place. Users will be ones configured for the context, which can include the user that is assigned and users
 * assigned to configured roles for that context. The message template used should be the one configured as well.
 *
 * @param object $eventdata the role assignment record
 * @return boolean success
 *
 */
function pm_notify_role_assign_handler($eventdata)
{
    global $CFG, $DB, $USER;
    pm_assign_instructor_from_mdl($eventdata);
    pm_assign_student_from_mdl($eventdata);
    /// Does the user receive a notification?
    $sendtouser = !empty(elis::$config->local_elisprogram->notify_classenrol_user) ? elis::$config->local_elisprogram->notify_classenrol_user : 0;
    $sendtorole = !empty(elis::$config->local_elisprogram->notify_classenrol_role) ? elis::$config->local_elisprogram->notify_classenrol_role : 0;
    $sendtosupervisor = !empty(elis::$config->local_elisprogram->notify_classenrol_supervisor) ? elis::$config->local_elisprogram->notify_classenrol_supervisor : 0;
    /// If nobody receives a notification, we're done.
    if (!$sendtouser && !$sendtorole && !$sendtosupervisor) {
        return true;
    }
    // First check if this is a standard Moodle context
    $context = context::instance_by_id($eventdata->contextid, IGNORE_MISSING);
    // If not, try checking to see if this is a custom ELIS context
    if (!$context) {
        $context = \local_eliscore\context\base::instance_by_id($eventdata->contextid, IGNORE_MISSING);
    }
    /// We get all context assigns, so check that this is a class. If not, we're done.
    //     if (!$context = context::instance_by_id($eventdata->contextid)) {
    if (!$context) {
        if (in_cron()) {
            mtrace(getstring('invalidcontext'));
        } else {
            print_error('invalidcontext');
        }
        return true;
    } else {
        if ($context->contextlevel == CONTEXT_SYSTEM) {
            // TBD: ^above was != CONTEXT_COURSE
            return true;
        }
    }
    /// Make sure this is a valid user.
    if (!($enroluser = $DB->get_record('user', array('id' => $eventdata->userid)))) {
        if (in_cron()) {
            mtrace(get_string('nomoodleuser', 'local_elisprogram'));
        } else {
            debugging(get_string('nomoodleuser', 'local_elisprogram'));
        }
        return true;
    }
    $course = null;
    /// Get the course record from the context id.
    if ($context->contextlevel == CONTEXT_COURSE && !($course = $DB->get_record('course', array('id' => $context->instanceid)))) {
        if (in_cron()) {
            mtrace(getstring('invalidcourse'));
        } else {
            print_error('invalidcourse');
        }
        return true;
    } else {
        if (empty($course) && $context->contextlevel != CONTEXT_ELIS_CLASS) {
            // TBD
            //error_log("/local/elisprogram/lib/notifications.php::pm_notify_role_assign_handler(); eventdata->contextid != CONTEXT_ELIS_CLASS");
            return true;
        }
        $name = !empty($course) ? $course->fullname : $DB->get_field(pmclass::TABLE, 'idnumber', array('id' => $context->instanceid));
        if (empty($name)) {
            return true;
        }
    }
    $message = new notification();
    /// Set up the text of the message
    $text = empty(elis::$config->local_elisprogram->notify_classenrol_message) ? get_string('notifyclassenrolmessagedef', 'local_elisprogram') : elis::$config->local_elisprogram->notify_classenrol_message;
    $search = array('%%userenrolname%%', '%%classname%%');
    $replace = array(elis_fullname($enroluser), $name);
    $text = str_replace($search, $replace, $text);
    if ($sendtouser) {
        $message->send_notification($text, $enroluser);
    }
    $users = array();
    if ($sendtorole) {
        // Get all users with the notify_classenrol capability.
        if ($roleusers = get_users_by_capability($context, 'local/elisprogram:notify_classenrol')) {
            $users = $users + $roleusers;
        }
        if ($roleusers = get_users_by_capability(context_system::instance(), 'local/elisprogram:notify_classenrol')) {
            $users = $users + $roleusers;
        }
    }
    if ($sendtosupervisor) {
        $pmuserid = pm_get_crlmuserid($eventdata->userid);
        // Get all users with the notify_classenrol capability.
        if ($supervisors = pm_get_users_by_capability('user', $pmuserid, 'local/elisprogram:notify_classenrol')) {
            $users = $users + $supervisors;
        }
    }
    foreach ($users as $user) {
        //error_log("/local/elisprogram/lib/notifications.php::pm_notify_role_assign_handler(eventdata); Sending notification to user[{$user->id}]: {$user->email}");
        $message->send_notification($text, $user, $enroluser);
    }
    /// If you don't return true, the message queue will clog and no more will be sent.
    return true;
}
Beispiel #3
0
 /**
  * Rebuild context paths and depths at ELIS User Set context level.
  *
  * @static
  * @param bool $force Set to false to include records whose path is null or depth is zero
  */
 protected static function build_paths($force)
 {
     global $DB;
     $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_called_class());
     if ($force or $DB->record_exists_select('context', "contextlevel = " . $contextlevel . " AND (depth = 0 OR path IS NULL)")) {
         if ($force) {
             $ctxemptyclause = $emptyclause = '';
         } else {
             $ctxemptyclause = "AND (ctx.path IS NULL OR ctx.depth = 0)";
             $emptyclause = "AND ({context}.path IS NULL OR {context}.depth = 0)";
         }
         $base = '/' . SYSCONTEXTID;
         // Normal top level user sets
         $sql = "UPDATE {context}\n                       SET depth = 2,\n                           path = " . $DB->sql_concat("'{$base}/'", 'id') . "\n                     WHERE contextlevel = " . $contextlevel . "\n                           AND EXISTS (SELECT 'x'\n                                         FROM {" . \userset::TABLE . "} eu\n                                        WHERE eu.id = {context}.instanceid AND eu.depth = 1)\n                           {$emptyclause}";
         $DB->execute($sql);
         // Deeper categories - one query per depthlevel
         $maxdepth = $DB->get_field_sql("SELECT MAX(depth) FROM {" . \userset::TABLE . "}");
         for ($n = 2; $n <= $maxdepth; $n++) {
             $sql = "INSERT INTO {context_temp} (id, path, depth)\n                        SELECT ctx.id, " . $DB->sql_concat('pctx.path', "'/'", 'ctx.id') . ", pctx.depth+1\n                          FROM {context} ctx\n                          JOIN {" . \userset::TABLE . "} eu ON (eu.id = ctx.instanceid AND ctx.contextlevel = " . $contextlevel . " AND eu.depth = {$n})\n                          JOIN {context} pctx ON (pctx.instanceid = eu.parent AND pctx.contextlevel = " . $contextlevel . ")\n                         WHERE pctx.path IS NOT NULL AND pctx.depth > 0\n                               {$ctxemptyclause}";
             $trans = $DB->start_delegated_transaction();
             $DB->delete_records('context_temp');
             $DB->execute($sql);
             \local_eliscore\context\base::merge_context_temp_table();
             $DB->delete_records('context_temp');
             $trans->allow_commit();
         }
     }
 }
Beispiel #4
0
 /**
  * Rebuild context paths and depths at ELIS track context level.
  *
  * @static
  * @param bool $force Set to false to include records whose path is null or depth is zero
  */
 protected static function build_paths($force)
 {
     global $DB;
     $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_called_class());
     if ($force or $DB->record_exists_select('context', "contextlevel = " . $contextlevel . " AND (depth = 0 OR path IS NULL)")) {
         $ctxemptyclause = $force ? '' : "AND (ctx.path IS NULL OR ctx.depth = 0)";
         $parentcontextlevel = \local_eliscore\context\helper::get_level_from_class_name('\\local_elisprogram\\context\\program');
         $sql = "INSERT INTO {context_temp} (id, path, depth)\n                    SELECT ctx.id, " . $DB->sql_concat('pctx.path', "'/'", 'ctx.id') . ", pctx.depth+1\n                      FROM {context} ctx\n                      JOIN {local_elisprogram_trk} trk ON (trk.id = ctx.instanceid AND ctx.contextlevel = " . $contextlevel . ")\n                      JOIN {context} pctx ON (pctx.instanceid = trk.curid AND pctx.contextlevel = " . $parentcontextlevel . ")\n                     WHERE pctx.path IS NOT NULL AND pctx.depth > 0\n                           {$ctxemptyclause}";
         $trans = $DB->start_delegated_transaction();
         $DB->delete_records('context_temp');
         $DB->execute($sql);
         \local_eliscore\context\base::merge_context_temp_table();
         $DB->delete_records('context_temp');
         $trans->allow_commit();
     }
 }
Beispiel #5
0
 /**
  * Returns ELIS User context instance.
  *
  * @static
  * @param int $instanceid The ELIS user id
  * @param int $strictness IGNORE_MISSING means compatible mode, false returned if record not found, debug message if more found;
  *                        IGNORE_MULTIPLE means return first, ignore multiple records found(not recommended);
  *                        MUST_EXIST means we will throw an exception if no record or multiple records found.
  * @return \local_elisprogram\context\user|bool Context instance or false if instance was not found.
  */
 public static function instance($instanceid, $strictness = MUST_EXIST)
 {
     global $DB;
     $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_called_class());
     if ($context = \local_eliscore\context\base::cache_get($contextlevel, $instanceid)) {
         return $context;
     }
     if (!($record = $DB->get_record('context', array('contextlevel' => $contextlevel, 'instanceid' => $instanceid)))) {
         if ($user = $DB->get_record(\user::TABLE, array('id' => $instanceid), 'id', $strictness)) {
             $record = \local_eliscore\context\base::insert_context_record($contextlevel, $user->id, '/' . SYSCONTEXTID, 0);
         }
     }
     if ($record) {
         $context = new \local_elisprogram\context\user($record);
         \local_eliscore\context\base::cache_add($context);
         return $context;
     }
     return false;
 }