Пример #1
0
 /**
  * Get the user participating in the given assignment. An error with code 'usernotincourse'
  * is thrown is the user isn't a participant of the given assignment.
  *
  * @param int $assignid the assign instance id
  * @param int $userid the user id
  * @param bool $embeduser return user details (only applicable if not blind marking)
  * @return array of warnings and status result
  * @since Moodle 3.1
  * @throws moodle_exception
  */
 public static function get_participant($assignid, $userid, $embeduser)
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . "/mod/assign/locallib.php";
     require_once $CFG->dirroot . "/user/lib.php";
     $params = self::validate_parameters(self::get_participant_parameters(), array('assignid' => $assignid, 'userid' => $userid, 'embeduser' => $embeduser));
     list($assign, $course, $cm, $context) = self::validate_assign($params['assignid']);
     $assign->require_view_grades();
     $participant = $assign->get_participant($params['userid']);
     if (!$participant) {
         // No participant found so we can return early.
         throw new moodle_exception('usernotincourse');
     }
     $return = array('id' => $participant->id, 'fullname' => $participant->fullname, 'submitted' => $participant->submitted, 'requiregrading' => $participant->requiregrading, 'blindmarking' => $assign->is_blind_marking());
     if (!empty($participant->groupid)) {
         $return['groupid'] = $participant->groupid;
     }
     if (!empty($participant->groupname)) {
         $return['groupname'] = $participant->groupname;
     }
     // Skip the expensive lookup of user detail if we're blind marking or the caller
     // hasn't asked for user details to be embedded.
     if (!$assign->is_blind_marking() && $embeduser) {
         $return['user'] = user_get_user_details($participant, $course);
     }
     return $return;
 }
Пример #2
0
/**
 * Tries to obtain user details, either recurring directly to the user's system profile
 * or through one of the user's course enrollments (course profile).
 *
 * @param object $user The user.
 * @return array if unsuccessful or the allowed user details.
 */
function user_get_user_details_courses($user)
{
    global $USER;
    $userdetails = null;
    //  Get the courses that the user is enrolled in (only active).
    $courses = enrol_get_users_courses($user->id, true);
    $systemprofile = false;
    if (can_view_user_details_cap($user) || $user->id == $USER->id || has_coursecontact_role($user->id)) {
        $systemprofile = true;
    }
    // Try using system profile.
    if ($systemprofile) {
        $userdetails = user_get_user_details($user, null);
    } else {
        // Try through course profile.
        foreach ($courses as $course) {
            if (can_view_user_details_cap($user, $course) || $user->id == $USER->id || has_coursecontact_role($user->id)) {
                $userdetails = user_get_user_details($user, $course);
            }
        }
    }
    return $userdetails;
}
Пример #3
0
 /**
  * Get course participants details
  *
  * @param int $courseid  course id
  * @param array $options options {
  *                                'name' => option name
  *                                'value' => option value
  *                               }
  * @return array An array of users
  */
 public static function get_enrolled_users($courseid, $options = array())
 {
     global $CFG, $USER, $DB;
     require_once $CFG->dirroot . "/user/lib.php";
     $params = self::validate_parameters(self::get_enrolled_users_parameters(), array('courseid' => $courseid, 'options' => $options));
     $withcapability = '';
     $groupid = 0;
     $onlyactive = false;
     $userfields = array();
     $limitfrom = 0;
     $limitnumber = 0;
     $sortby = 'us.id';
     $sortparams = array();
     $sortdirection = 'ASC';
     foreach ($options as $option) {
         switch ($option['name']) {
             case 'withcapability':
                 $withcapability = $option['value'];
                 break;
             case 'groupid':
                 $groupid = (int) $option['value'];
                 break;
             case 'onlyactive':
                 $onlyactive = !empty($option['value']);
                 break;
             case 'userfields':
                 $thefields = explode(',', $option['value']);
                 foreach ($thefields as $f) {
                     $userfields[] = clean_param($f, PARAM_ALPHANUMEXT);
                 }
                 break;
             case 'limitfrom':
                 $limitfrom = clean_param($option['value'], PARAM_INT);
                 break;
             case 'limitnumber':
                 $limitnumber = clean_param($option['value'], PARAM_INT);
                 break;
             case 'sortby':
                 $sortallowedvalues = array('id', 'firstname', 'lastname', 'siteorder');
                 if (!in_array($option['value'], $sortallowedvalues)) {
                     throw new invalid_parameter_exception('Invalid value for sortby parameter (value: ' . $option['value'] . '),' . 'allowed values are: ' . implode(',', $sortallowedvalues));
                 }
                 if ($option['value'] == 'siteorder') {
                     list($sortby, $sortparams) = users_order_by_sql('us');
                 } else {
                     $sortby = 'us.' . $option['value'];
                 }
                 break;
             case 'sortdirection':
                 $sortdirection = strtoupper($option['value']);
                 $directionallowedvalues = array('ASC', 'DESC');
                 if (!in_array($sortdirection, $directionallowedvalues)) {
                     throw new invalid_parameter_exception('Invalid value for sortdirection parameter
                     (value: ' . $sortdirection . '),' . 'allowed values are: ' . implode(',', $directionallowedvalues));
                 }
                 break;
         }
     }
     $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $coursecontext = context_course::instance($courseid, IGNORE_MISSING);
     if ($courseid == SITEID) {
         $context = context_system::instance();
     } else {
         $context = $coursecontext;
     }
     try {
         self::validate_context($context);
     } catch (Exception $e) {
         $exceptionparam = new stdClass();
         $exceptionparam->message = $e->getMessage();
         $exceptionparam->courseid = $params['courseid'];
         throw new moodle_exception('errorcoursecontextnotvalid', 'webservice', '', $exceptionparam);
     }
     if ($courseid == SITEID) {
         require_capability('moodle/site:viewparticipants', $context);
     } else {
         require_capability('moodle/course:viewparticipants', $context);
     }
     // to overwrite this parameter, you need role:review capability
     if ($withcapability) {
         require_capability('moodle/role:review', $coursecontext);
     }
     // need accessallgroups capability if you want to overwrite this option
     if (!empty($groupid) && !groups_is_member($groupid)) {
         require_capability('moodle/site:accessallgroups', $coursecontext);
     }
     // to overwrite this option, you need course:enrolereview permission
     if ($onlyactive) {
         require_capability('moodle/course:enrolreview', $coursecontext);
     }
     list($enrolledsql, $enrolledparams) = get_enrolled_sql($coursecontext, $withcapability, $groupid, $onlyactive);
     $ctxselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
     $ctxjoin = "LEFT JOIN {context} ctx ON (ctx.instanceid = u.id AND ctx.contextlevel = :contextlevel)";
     $enrolledparams['contextlevel'] = CONTEXT_USER;
     $groupjoin = '';
     if (empty($groupid) && groups_get_course_groupmode($course) == SEPARATEGROUPS && !has_capability('moodle/site:accessallgroups', $coursecontext)) {
         // Filter by groups the user can view.
         $usergroups = groups_get_user_groups($course->id);
         if (!empty($usergroups['0'])) {
             list($groupsql, $groupparams) = $DB->get_in_or_equal($usergroups['0'], SQL_PARAMS_NAMED);
             $groupjoin = "JOIN {groups_members} gm ON (u.id = gm.userid AND gm.groupid {$groupsql})";
             $enrolledparams = array_merge($enrolledparams, $groupparams);
         } else {
             // User doesn't belong to any group, so he can't see any user. Return an empty array.
             return array();
         }
     }
     $sql = "SELECT us.*\n                  FROM {user} us\n                  JOIN (\n                      SELECT DISTINCT u.id {$ctxselect}\n                        FROM {user} u {$ctxjoin} {$groupjoin}\n                       WHERE u.id IN ({$enrolledsql})\n                  ) q ON q.id = us.id\n                ORDER BY {$sortby} {$sortdirection}";
     $enrolledparams = array_merge($enrolledparams, $sortparams);
     $enrolledusers = $DB->get_recordset_sql($sql, $enrolledparams, $limitfrom, $limitnumber);
     $users = array();
     foreach ($enrolledusers as $user) {
         context_helper::preload_from_record($user);
         if ($userdetails = user_get_user_details($user, $course, $userfields)) {
             $users[] = $userdetails;
         }
     }
     $enrolledusers->close();
     return $users;
 }
Пример #4
0
 /**
  * Get course participant's details
  *
  * @param array $userlist  array of user ids and according course ids
  * @return array An array of arrays describing course participants
  * @since Moodle 2.2
  */
 public static function get_course_user_profiles($userlist)
 {
     global $CFG, $USER, $DB;
     require_once $CFG->dirroot . "/user/lib.php";
     $params = self::validate_parameters(self::get_course_user_profiles_parameters(), array('userlist' => $userlist));
     $userids = array();
     $courseids = array();
     foreach ($params['userlist'] as $value) {
         $userids[] = $value['userid'];
         $courseids[$value['userid']] = $value['courseid'];
     }
     // cache all courses
     $courses = array();
     list($cselect, $cjoin) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx');
     list($sqlcourseids, $params) = $DB->get_in_or_equal(array_unique($courseids));
     $coursesql = "SELECT c.* {$cselect}\n                        FROM {course} c {$cjoin}\n                       WHERE c.id {$sqlcourseids}";
     $rs = $DB->get_recordset_sql($coursesql, $params);
     foreach ($rs as $course) {
         // adding course contexts to cache
         context_instance_preload($course);
         // cache courses
         $courses[$course->id] = $course;
     }
     $rs->close();
     list($uselect, $ujoin) = context_instance_preload_sql('u.id', CONTEXT_USER, 'ctx');
     list($sqluserids, $params) = $DB->get_in_or_equal($userids);
     $usersql = "SELECT u.* {$uselect}\n                      FROM {user} u {$ujoin}\n                     WHERE u.id {$sqluserids}";
     $users = $DB->get_recordset_sql($usersql, $params);
     $result = array();
     foreach ($users as $user) {
         if (!empty($user->deleted)) {
             continue;
         }
         context_instance_preload($user);
         $course = $courses[$courseids[$user->id]];
         $context = context_course::instance($courseids[$user->id], IGNORE_MISSING);
         self::validate_context($context);
         if ($userarray = user_get_user_details($user, $course)) {
             $result[] = $userarray;
         }
     }
     $users->close();
     return $result;
 }
Пример #5
0
    /**
     * Get course participants details
     * @param int $courseid  course id
     * @param array $options options {
     *          'name' => option name
     *          'value' => option value
     * }
     * @return array An array of users
     */
    public static function get_users_by_courseid($courseid, $options) {
        global $CFG, $USER, $DB;
        require_once($CFG->dirroot . "/user/lib.php");

        $params = self::validate_parameters(
            self::get_users_by_courseid_parameters(),
            array(
                'courseid'=>$courseid,
                'options'=>$options
            )
        );
        $withcapability = '';
        $groupid        = 0;
        $onlyactive     = false;
        foreach ($options as $option) {
            switch ($option['name']) {
            case 'withcapability':
                $withcapability = $option['value'];
                break;
            case 'groupid':
                $groupid = (int)$option['value'];
                break;
            case 'onlyactive':
                $onlyactive = !empty($option['value']);
                break;
            }
        }

        // to overwrite this parameter, you need role:review capability
        if ($withcapability) {
            require_capability('moodle/role:review', $coursecontext);
        }
        // need accessallgroups capability if you want to overwrite this option
        if (!empty($groupid) && groups_is_member($groupid)) {
            require_capability('moodle/site:accessallgroups', $context);
        }
        // to overwrite this option, you need course:enrolereview permission
        if ($onlyactive) {
            require_capability('moodle/course:enrolreview', $coursecontext);
        }

        list($coursectxselect, $coursectxjoin) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx');
        $coursesql = "SELECT c.* $coursectxselect
                        FROM {course} c $coursectxjoin
                       WHERE c.id = $courseid";
        $course = $DB->get_record_sql($coursesql);
        context_instance_preload($course);
        $coursecontext = get_context_instance(CONTEXT_COURSE, $params['courseid']);
        if ($courseid == SITEID) {
            $context = get_system_context();
        } else {
            $context = $coursecontext;
        }
        try {
            self::validate_context($context);
        } catch (Exception $e) {
            $exceptionparam = new stdClass();
            $exceptionparam->message = $e->getMessage();
            $exceptionparam->courseid = $params['courseid'];
            throw new moodle_exception(get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
        }

        list($enrolledsql, $enrolledparams) = get_enrolled_sql($coursecontext, $withcapability, $groupid, $onlyactive);
        list($ctxselect, $ctxjoin) = context_instance_preload_sql('u.id', CONTEXT_USER, 'ctx');
        $records = $DB->get_records_sql($enrolledsql, $enrolledparams);
        $sqlparams['courseid'] = $courseid;
        $sql = "SELECT u.* $ctxselect
                  FROM {user} u $ctxjoin
                 WHERE u.id IN ($enrolledsql)
                 ORDER BY u.id ASC";
        $enrolledusers = $DB->get_recordset_sql($sql, $enrolledparams);
        $users = array();
        foreach ($enrolledusers as $user) {
            if (!empty($user->deleted)) {
                continue;
            }
            context_instance_preload($user);
            if ($userdetails = user_get_user_details($user, $course)) {
                $users[] = $userdetails;
            }
        }
        $enrolledusers->close();

        return $users;
    }
Пример #6
0
 /**
  * Get course participants details
  *
  * @param int $courseid  course id
  * @param array $options options {
  *                                'name' => option name
  *                                'value' => option value
  *                               }
  * @return array An array of users
  */
 public static function get_enrolled_users($courseid, $options = array())
 {
     global $CFG, $USER, $DB;
     require_once $CFG->dirroot . "/user/lib.php";
     $params = self::validate_parameters(self::get_enrolled_users_parameters(), array('courseid' => $courseid, 'options' => $options));
     $withcapability = '';
     $groupid = 0;
     $onlyactive = false;
     $userfields = array();
     $limitfrom = 0;
     $limitnumber = 0;
     foreach ($options as $option) {
         switch ($option['name']) {
             case 'withcapability':
                 $withcapability = $option['value'];
                 break;
             case 'groupid':
                 $groupid = (int) $option['value'];
                 break;
             case 'onlyactive':
                 $onlyactive = !empty($option['value']);
                 break;
             case 'userfields':
                 $thefields = explode(',', $option['value']);
                 foreach ($thefields as $f) {
                     $userfields[] = clean_param($f, PARAM_ALPHANUMEXT);
                 }
             case 'limitfrom':
                 $limitfrom = clean_param($option['value'], PARAM_INT);
                 break;
             case 'limitnumber':
                 $limitnumber = clean_param($option['value'], PARAM_INT);
                 break;
         }
     }
     $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     $coursecontext = context_course::instance($courseid, IGNORE_MISSING);
     if ($courseid == SITEID) {
         $context = get_system_context();
     } else {
         $context = $coursecontext;
     }
     try {
         self::validate_context($context);
     } catch (Exception $e) {
         $exceptionparam = new stdClass();
         $exceptionparam->message = $e->getMessage();
         $exceptionparam->courseid = $params['courseid'];
         throw new moodle_exception('errorcoursecontextnotvalid', 'webservice', '', $exceptionparam);
     }
     if ($courseid == SITEID) {
         require_capability('moodle/site:viewparticipants', $context);
     } else {
         require_capability('moodle/course:viewparticipants', $context);
     }
     // to overwrite this parameter, you need role:review capability
     if ($withcapability) {
         require_capability('moodle/role:review', $coursecontext);
     }
     // need accessallgroups capability if you want to overwrite this option
     if (!empty($groupid) && groups_is_member($groupid)) {
         require_capability('moodle/site:accessallgroups', $coursecontext);
     }
     // to overwrite this option, you need course:enrolereview permission
     if ($onlyactive) {
         require_capability('moodle/course:enrolreview', $coursecontext);
     }
     list($enrolledsql, $enrolledparams) = get_enrolled_sql($coursecontext, $withcapability, $groupid, $onlyactive);
     list($ctxselect, $ctxjoin) = context_instance_preload_sql('u.id', CONTEXT_USER, 'ctx');
     $sqlparams['courseid'] = $courseid;
     $sql = "SELECT u.* {$ctxselect}\n                  FROM {user} u {$ctxjoin}\n                 WHERE u.id IN ({$enrolledsql})\n                 ORDER BY u.id ASC";
     $enrolledusers = $DB->get_recordset_sql($sql, $enrolledparams, $limitfrom, $limitnumber);
     $users = array();
     foreach ($enrolledusers as $user) {
         context_instance_preload($user);
         if ($userdetails = user_get_user_details($user, $course, $userfields)) {
             $users[] = $userdetails;
         }
     }
     $enrolledusers->close();
     return $users;
 }
Пример #7
0
 /**
  * Get course participant's details
  *
  * @param array $userlist  array of user ids and according course ids
  * @return array An array of arrays describing course participants
  * @since Moodle 2.2
  */
 public static function get_course_user_profiles($userlist)
 {
     global $CFG, $USER, $DB;
     require_once $CFG->dirroot . "/user/lib.php";
     $params = self::validate_parameters(self::get_course_user_profiles_parameters(), array('userlist' => $userlist));
     $userids = array();
     $courseids = array();
     foreach ($params['userlist'] as $value) {
         $userids[] = $value['userid'];
         $courseids[$value['userid']] = $value['courseid'];
     }
     // Cache all courses.
     $courses = array();
     list($sqlcourseids, $params) = $DB->get_in_or_equal(array_unique($courseids), SQL_PARAMS_NAMED);
     $cselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
     $cjoin = "LEFT JOIN {context} ctx ON (ctx.instanceid = c.id AND ctx.contextlevel = :contextlevel)";
     $params['contextlevel'] = CONTEXT_COURSE;
     $coursesql = "SELECT c.* {$cselect}\n                        FROM {course} c {$cjoin}\n                       WHERE c.id {$sqlcourseids}";
     $rs = $DB->get_recordset_sql($coursesql, $params);
     foreach ($rs as $course) {
         // Adding course contexts to cache.
         context_helper::preload_from_record($course);
         // Cache courses.
         $courses[$course->id] = $course;
     }
     $rs->close();
     list($sqluserids, $params) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);
     $uselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
     $ujoin = "LEFT JOIN {context} ctx ON (ctx.instanceid = u.id AND ctx.contextlevel = :contextlevel)";
     $params['contextlevel'] = CONTEXT_USER;
     $usersql = "SELECT u.* {$uselect}\n                      FROM {user} u {$ujoin}\n                     WHERE u.id {$sqluserids}";
     $users = $DB->get_recordset_sql($usersql, $params);
     $result = array();
     foreach ($users as $user) {
         if (!empty($user->deleted)) {
             continue;
         }
         context_helper::preload_from_record($user);
         $course = $courses[$courseids[$user->id]];
         $context = context_course::instance($courseids[$user->id], IGNORE_MISSING);
         self::validate_context($context);
         if ($userarray = user_get_user_details($user, $course)) {
             $result[] = $userarray;
         }
     }
     $users->close();
     return $result;
 }
Пример #8
0
    /**
     * Get the user participating in the given assignment. An error with code 'usernotincourse'
     * is thrown is the user isn't a participant of the given assignment.
     *
     * @param int $assignid the assign instance id
     * @param int $userid the user id
     * @param bool $embeduser return user details (only applicable if not blind marking)
     * @return array of warnings and status result
     * @since Moodle 3.1
     * @throws moodle_exception
     */
    public static function get_participant($assignid, $userid, $embeduser) {
        global $DB, $CFG;
        require_once($CFG->dirroot . "/mod/assign/locallib.php");
        require_once($CFG->dirroot . "/user/lib.php");

        $params = self::validate_parameters(self::get_participant_parameters(), array(
            'assignid' => $assignid,
            'userid' => $userid,
            'embeduser' => $embeduser
        ));

        list($assign, $course, $cm, $context) = self::validate_assign($params['assignid']);
        $assign->require_view_grades();

        $participant = $assign->get_participant($params['userid']);

        // Update assign with override information.
        $assign->update_effective_access($params['userid']);

        if (!$participant) {
            // No participant found so we can return early.
            throw new moodle_exception('usernotincourse');
        }

        $return = array(
            'id' => $participant->id,
            'fullname' => $participant->fullname,
            'submitted' => $participant->submitted,
            'requiregrading' => $participant->requiregrading,
            'blindmarking' => $assign->is_blind_marking(),
            'allowsubmissionsfromdate' => $assign->get_instance()->allowsubmissionsfromdate,
            'duedate' => $assign->get_instance()->duedate,
            'cutoffdate' => $assign->get_instance()->cutoffdate,
            'duedatestr' => userdate($assign->get_instance()->duedate, get_string('strftimedatetime', 'langconfig')),
        );

        if (!empty($participant->groupid)) {
            $return['groupid'] = $participant->groupid;
        }
        if (!empty($participant->groupname)) {
            $return['groupname'] = $participant->groupname;
        }

        // Skip the expensive lookup of user detail if we're blind marking or the caller
        // hasn't asked for user details to be embedded.
        if (!$assign->is_blind_marking() && $embeduser) {
            $return['user'] = user_get_user_details($participant, $course);
        }

        return $return;
    }
Пример #9
0
 public function test_create_user()
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . '/user/lib.php';
     $this->resetAfterTest(true);
     $generator = $this->getDataGenerator();
     $count = $DB->count_records('user');
     $this->setCurrentTimeStart();
     $user = $generator->create_user();
     $this->assertEquals($count + 1, $DB->count_records('user'));
     $this->assertSame($user->username, clean_param($user->username, PARAM_USERNAME));
     $this->assertSame($user->email, clean_param($user->email, PARAM_EMAIL));
     $this->assertSame(AUTH_PASSWORD_NOT_CACHED, $user->password);
     $this->assertNotEmpty($user->firstnamephonetic);
     $this->assertNotEmpty($user->lastnamephonetic);
     $this->assertNotEmpty($user->alternatename);
     $this->assertNotEmpty($user->middlename);
     $this->assertSame('manual', $user->auth);
     $this->assertSame('en', $user->lang);
     $this->assertSame('1', $user->confirmed);
     $this->assertSame('0', $user->deleted);
     $this->assertTimeCurrent($user->timecreated);
     $this->assertSame($user->timecreated, $user->timemodified);
     $this->assertSame('0.0.0.0', $user->lastip);
     $record = array('auth' => 'email', 'firstname' => 'Žluťoučký', 'lastname' => 'Koníček', 'firstnamephonetic' => 'Zhlutyoucky', 'lastnamephonetic' => 'Koniiczek', 'middlename' => 'Hopper', 'alternatename' => 'horse', 'idnumber' => 'abc1', 'mnethostid' => (string) $CFG->mnet_localhost_id, 'username' => 'konic666', 'password' => 'password1', 'email' => '*****@*****.**', 'confirmed' => '1', 'lang' => 'cs', 'maildisplay' => '1', 'mailformat' => '0', 'maildigest' => '1', 'autosubscribe' => '0', 'trackforums' => '0', 'deleted' => '0', 'timecreated' => '666');
     $user = $generator->create_user($record);
     $this->assertEquals($count + 2, $DB->count_records('user'));
     foreach ($record as $k => $v) {
         if ($k === 'password') {
             $this->assertTrue(password_verify($v, $user->password));
         } else {
             $this->assertSame($v, $user->{$k});
         }
     }
     $record = array('firstname' => 'Some', 'lastname' => 'User', 'idnumber' => 'def', 'username' => 'user666', 'email' => '*****@*****.**', 'deleted' => '1');
     $user = $generator->create_user($record);
     $this->assertEquals($count + 3, $DB->count_records('user'));
     $this->assertSame('', $user->idnumber);
     $this->assertSame(md5($record['username']), $user->email);
     $this->assertFalse(context_user::instance($user->id, IGNORE_MISSING));
     // Test generating user with interests.
     $user = $generator->create_user(array('interests' => 'Cats, Dogs'));
     $userdetails = user_get_user_details($user);
     $this->assertSame('Cats, Dogs', $userdetails['interests']);
 }
Пример #10
0
    /**
     * Search contacts.
     *
     * @param string $searchtext query string.
     * @param bool $onlymycourses limit the search to the user's courses only.
     * @return external_description
     * @since 2.5
     */
    public static function search_contacts($searchtext, $onlymycourses = false) {
        global $CFG, $USER;
        require_once($CFG->libdir . '/enrollib.php');

        $params = array('searchtext' => $searchtext, 'onlymycourses' => $onlymycourses);
        $params = self::validate_parameters(self::search_contacts_parameters(), $params);

        // Extra validation, we do not allow empty queries.
        if ($params['searchtext'] === '') {
            throw new moodle_exception('querystringcannotbeempty');
        }

        $courseids = array();
        if ($params['onlymycourses']) {
            $mycourses = enrol_get_my_courses(array('id'));
            foreach ($mycourses as $mycourse) {
                $courseids[] = $mycourse->id;
            }
        } else {
            $courseids[] = SITEID;
        }

        // Retrieving the users matching the query.
        $users = message_search_users($courseids, $params['searchtext']);
        $results = array();
        foreach ($users as $user) {
            $results[$user->id] = $user;
        }

        // Reorganising information.
        foreach ($results as &$user) {
            $newuser = array(
                'id' => $user->id,
                'fullname' => fullname($user)
            );

            // Avoid undefined property notice as phone not specified.
            $user->phone1 = null;
            $user->phone2 = null;

            // Try to get the user picture, but sometimes this method can return null.
            $userdetails = user_get_user_details($user, null, array('profileimageurl', 'profileimageurlsmall'));
            if (!empty($userdetails)) {
                $newuser['profileimageurl'] = $userdetails['profileimageurl'];
                $newuser['profileimageurlsmall'] = $userdetails['profileimageurlsmall'];
            }

            $user = $newuser;
        }

        return $results;
    }
Пример #11
0
 /**
  * Get user information
  * - This function is matching the permissions of /user/profil.php
  * - It is also matching some permissions from /user/editadvanced.php for the following fields:
  *   auth, confirmed, idnumber, lang, theme, timezone, mailformat
  *
  * @param array $userids  array of user ids
  * @return array An array of arrays describing users
  * @since Moodle 2.2
  */
 public static function get_users_by_id($userids)
 {
     global $CFG, $USER, $DB;
     require_once $CFG->dirroot . "/user/lib.php";
     //iteramos los parametros y reemplazamos por los ID
     if (is_array($userids)) {
         foreach ($userids as $indice => $dni) {
             $u = $DB->get_record('user', array('username' => $dni));
             if (is_object($u)) {
                 $userids[$indice] = $u->id;
             }
         }
     }
     $params = self::validate_parameters(self::get_users_by_id_parameters(), array('userids' => $userids));
     list($uselect, $ujoin) = context_instance_preload_sql('u.id', CONTEXT_USER, 'ctx');
     list($sqluserids, $params) = $DB->get_in_or_equal($userids);
     $usersql = "SELECT u.* {$uselect}\n                      FROM {user} u {$ujoin}\n                     WHERE u.id {$sqluserids}";
     $users = $DB->get_recordset_sql($usersql, $params);
     $result = array();
     $hasuserupdatecap = has_capability('moodle/user:update', get_system_context());
     foreach ($users as $user) {
         if (!empty($user->deleted)) {
             continue;
         }
         context_instance_preload($user);
         $usercontext = get_context_instance(CONTEXT_USER, $user->id);
         self::validate_context($usercontext);
         $currentuser = $user->id == $USER->id;
         if ($userarray = user_get_user_details($user)) {
             //fields matching permissions from /user/editadvanced.php
             if ($currentuser or $hasuserupdatecap) {
                 $userarray['auth'] = $user->auth;
                 $userarray['confirmed'] = $user->confirmed;
                 $userarray['idnumber'] = $user->idnumber;
                 $userarray['lang'] = $user->lang;
                 $userarray['theme'] = $user->theme;
                 $userarray['timezone'] = $user->timezone;
                 $userarray['mailformat'] = $user->mailformat;
             }
             $result[] = $userarray;
         }
     }
     $users->close();
     return $result;
 }
Пример #12
0
 /**
  * Returns the profile information for a contact for a user.
  *
  * @param int $userid The user id
  * @param int $otheruserid The id of the user whose profile we want to view.
  * @return \stdClass
  */
 public static function get_profile($userid, $otheruserid)
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . '/user/lib.php';
     if ($user = \core_user::get_user($otheruserid)) {
         // Create the data we are going to pass to the renderable.
         $userfields = user_get_user_details($user, null, array('city', 'country', 'email', 'profileimageurl', 'profileimageurlsmall', 'lastaccess'));
         if ($userfields) {
             $data = new \stdClass();
             $data->userid = $userfields['id'];
             $data->fullname = $userfields['fullname'];
             $data->city = isset($userfields['city']) ? $userfields['city'] : '';
             $data->country = isset($userfields['country']) ? $userfields['country'] : '';
             $data->email = isset($userfields['email']) ? $userfields['email'] : '';
             $data->profileimageurl = isset($userfields['profileimageurl']) ? $userfields['profileimageurl'] : '';
             if (isset($userfields['profileimageurlsmall'])) {
                 $data->profileimageurlsmall = $userfields['profileimageurlsmall'];
             } else {
                 $data->profileimageurlsmall = '';
             }
             if (isset($userfields['lastaccess'])) {
                 $data->isonline = helper::is_online($userfields['lastaccess']);
             } else {
                 $data->isonline = false;
             }
         } else {
             // Technically the access checks in user_get_user_details are correct,
             // but messaging has never obeyed them. In order to keep messaging working
             // we at least need to return a minimal user record.
             $data = new \stdClass();
             $data->userid = $otheruserid;
             $data->fullname = fullname($user);
             $data->city = '';
             $data->country = '';
             $data->email = '';
             $data->profileimageurl = '';
             $data->profileimageurlsmall = '';
             $data->isonline = false;
         }
         // Check if the contact has been blocked.
         $contact = $DB->get_record('message_contacts', array('userid' => $userid, 'contactid' => $otheruserid));
         if ($contact) {
             $data->isblocked = (bool) $contact->blocked;
             $data->iscontact = true;
         } else {
             $data->isblocked = false;
             $data->iscontact = false;
         }
         return $data;
     }
 }
Пример #13
0
 /**
  * Returns the profile information for a contact for a user.
  *
  * @param int $userid The user id
  * @param int $otheruserid The id of the user whose profile we want to view.
  * @return \stdClass
  */
 public static function get_profile($userid, $otheruserid)
 {
     global $CFG, $DB, $PAGE;
     require_once $CFG->dirroot . '/user/lib.php';
     $user = \core_user::get_user($otheruserid, '*', MUST_EXIST);
     // Create the data we are going to pass to the renderable.
     $data = new \stdClass();
     $data->userid = $otheruserid;
     $data->fullname = fullname($user);
     $data->city = '';
     $data->country = '';
     $data->email = '';
     $data->isonline = null;
     // Get the user picture data - messaging has always shown these to the user.
     $userpicture = new \user_picture($user);
     $userpicture->size = 1;
     // Size f1.
     $data->profileimageurl = $userpicture->get_url($PAGE)->out(false);
     $userpicture->size = 0;
     // Size f2.
     $data->profileimageurlsmall = $userpicture->get_url($PAGE)->out(false);
     $userfields = user_get_user_details($user, null, array('city', 'country', 'email', 'lastaccess'));
     if ($userfields) {
         if (isset($userfields['city'])) {
             $data->city = $userfields['city'];
         }
         if (isset($userfields['country'])) {
             $data->country = $userfields['country'];
         }
         if (isset($userfields['email'])) {
             $data->email = $userfields['email'];
         }
         if (isset($userfields['lastaccess'])) {
             $data->isonline = helper::is_online($userfields['lastaccess']);
         }
     }
     // Check if the contact has been blocked.
     $contact = $DB->get_record('message_contacts', array('userid' => $userid, 'contactid' => $otheruserid));
     if ($contact) {
         $data->isblocked = (bool) $contact->blocked;
         $data->iscontact = true;
     } else {
         $data->isblocked = false;
         $data->iscontact = false;
     }
     return $data;
 }
Пример #14
0
    /**
     * Test user_get_user_details
     */
    public function test_user_get_user_details() {
        global $DB;

        $this->resetAfterTest();

        // Create user and modify user profile.
        $teacher = $this->getDataGenerator()->create_user();
        $student = $this->getDataGenerator()->create_user();
        $studentfullname = fullname($student);

        $course1 = $this->getDataGenerator()->create_course();
        $coursecontext = context_course::instance($course1->id);
        $teacherrole = $DB->get_record('role', array('shortname' => 'teacher'));
        $studentrole = $DB->get_record('role', array('shortname' => 'student'));
        $this->getDataGenerator()->enrol_user($teacher->id, $course1->id);
        $this->getDataGenerator()->enrol_user($student->id, $course1->id);
        role_assign($teacherrole->id, $teacher->id, $coursecontext->id);
        role_assign($studentrole->id, $student->id, $coursecontext->id);

        accesslib_clear_all_caches_for_unit_testing();

        // Get student details as a user with super system capabilities.
        $result = user_get_user_details($student, $course1);
        $this->assertEquals($student->id, $result['id']);
        $this->assertEquals($studentfullname, $result['fullname']);
        $this->assertEquals($course1->id, $result['enrolledcourses'][0]['id']);

        $this->setUser($teacher);
        // Get student details as a user who can only see this user in a course.
        $result = user_get_user_details($student, $course1);
        $this->assertEquals($student->id, $result['id']);
        $this->assertEquals($studentfullname, $result['fullname']);
        $this->assertEquals($course1->id, $result['enrolledcourses'][0]['id']);

        // Get student details with required fields.
        $result = user_get_user_details($student, $course1, array('id', 'fullname'));
        $this->assertCount(2, $result);
        $this->assertEquals($student->id, $result['id']);
        $this->assertEquals($studentfullname, $result['fullname']);

        // Get exception for invalid required fields.
        $this->expectException('moodle_exception');
        $result = user_get_user_details($student, $course1, array('wrongrequiredfield'));
    }
Пример #15
0
 /**
  * Helper function for checking if we should show the user's online status.
  *
  * @param \stdClass $user
  * @return boolean
  */
 public static function show_online_status($user)
 {
     global $CFG;
     require_once $CFG->dirroot . '/user/lib.php';
     if ($lastaccess = user_get_user_details($user, null, array('lastaccess'))) {
         if (isset($lastaccess['lastaccess'])) {
             return true;
         }
     }
     return false;
 }