*/
final class user_api {
+ /**
+ * Returns a subset of users (DO NOT COUNT)
+ * @global object $DB
+ * @param string $sort A SQL snippet for the sorting criteria to use
+ * @param string $recordsperpage how many records do pages have
+ * @param string $page which page to return (starts from 0)
+ * @param string $fields A comma separated list of fields to be returned from the chosen table.
+ * @param object $selectioncriteria:
+ * ->search string A simple string to search for
+ * ->confirmed bool A switch to allow/disallow unconfirmed users
+ * ->exceptions array(int) A list of IDs to ignore, eg 2,4,5,8,9,10
+ * ->firstinitial string ?
+ * ->lastinitial string ?
+ * @return array|false Array of {@link $USER} objects. False is returned if an error is encountered.
+ */
+ static function tmp_namedparams_get_users($sort='firstname ASC', $recordsperpage=999999, $page=0, $fields='*', $selectioncriteria=NULL) {
+ global $DB;
+
+ ///WS: convert array into an object
+ if (!empty($selectioncriteria) && is_array($selectioncriteria)) {
+ $selectioncriteria = (object) $selectioncriteria;
+ }
+ $LIKE = $DB->sql_ilike();
+ $fullname = $DB->sql_fullname();
-/**
- * Returns a subset of users (DO NOT COUNT)
- * @global object $DB
- * @param string $sort A SQL snippet for the sorting criteria to use
- * @param string $recordsperpage how many records do pages have
- * @param string $page which page to return (starts from 0)
- * @param string $fields A comma separated list of fields to be returned from the chosen table.
- * @param object $selectioncriteria:
- * ->search string A simple string to search for
- * ->confirmed bool A switch to allow/disallow unconfirmed users
- * ->exceptions array(int) A list of IDs to ignore, eg 2,4,5,8,9,10
- * ->firstinitial string ?
- * ->lastinitial string ?
- * @return array|false Array of {@link $USER} objects. False is returned if an error is encountered.
- */
-static function tmp_namedparams_get_users($sort='firstname ASC', $recordsperpage=999999, $page=0, $fields='*', $selectioncriteria=NULL) {
- global $DB;
-
- ///WS: convert array into an object
- if (!empty($selectioncriteria) && is_array($selectioncriteria)) {
- $selectioncriteria = (object) $selectioncriteria;
- }
+ $select = " username <> :guest AND deleted = 0";
+ $params = array('guest'=>'guest');
- $LIKE = $DB->sql_ilike();
- $fullname = $DB->sql_fullname();
+ if (!empty($selectioncriteria->search)){
+ $selectioncriteria->search = trim($selectioncriteria->search);
+ $select .= " AND ($fullname $LIKE :search1 OR email $LIKE :search2 OR username = :search3)";
+ $params['search1'] = "%".$selectioncriteria->search."%";
+ $params['search2'] = "%".$selectioncriteria->search."%";
+ $params['search3'] = $selectioncriteria->search;
+ }
- $select = " username <> :guest AND deleted = 0";
- $params = array('guest'=>'guest');
+ if (!empty($selectioncriteria->confirmed)) {
+ $select .= " AND confirmed = 1";
+ }
- if (!empty($selectioncriteria->search)){
- $selectioncriteria->search = trim($selectioncriteria->search);
- $select .= " AND ($fullname $LIKE :search1 OR email $LIKE :search2 OR username = :search3)";
- $params['search1'] = "%".$selectioncriteria->search."%";
- $params['search2'] = "%".$selectioncriteria->search."%";
- $params['search3'] = $selectioncriteria->search;
- }
+ if (!empty($selectioncriteria->exceptions)) {
+ list($selectioncriteria->exceptions, $eparams) = $DB->get_in_or_equal($selectioncriteria->exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
+ $params = $params + $eparams;
+ $except = " AND id ".$selectioncriteria->exceptions;
+ }
- if (!empty($selectioncriteria->confirmed)) {
- $select .= " AND confirmed = 1";
- }
+ if (!empty($selectioncriteria->firstinitial)) {
+ $select .= " AND firstname $LIKE :fni";
+ $params['fni'] = $selectioncriteria->firstinitial."%";
+ }
+ if (!empty($selectioncriteria->lastinitial)) {
+ $select .= " AND lastname $LIKE :lni";
+ $params['lni'] = $selectioncriteria->lastinitial."%";
+ }
- if (!empty($selectioncriteria->exceptions)) {
- list($selectioncriteria->exceptions, $eparams) = $DB->get_in_or_equal($selectioncriteria->exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
- $params = $params + $eparams;
- $except = " AND id ".$selectioncriteria->exceptions;
- }
+ if (!empty($selectioncriteria->extraselect)) {
+ $select .= " AND ".$selectioncriteria->extraselect;
+ if (empty($selectioncriteria->extraparams)){
+ $params = $params + (array)$selectioncriteria->extraparams;
+ }
+ }
- if (!empty($selectioncriteria->firstinitial)) {
- $select .= " AND firstname $LIKE :fni";
- $params['fni'] = $selectioncriteria->firstinitial."%";
- }
- if (!empty($selectioncriteria->lastinitial)) {
- $select .= " AND lastname $LIKE :lni";
- $params['lni'] = $selectioncriteria->lastinitial."%";
+ return $DB->get_records_select('user', $select, $params, $sort, $fields, $page, $recordsperpage);
}
- if (!empty($selectioncriteria->extraselect)) {
- $select .= " AND ".$selectioncriteria->extraselect;
- if (empty($selectioncriteria->extraparams)){
- $params = $params + (array)$selectioncriteria->extraparams;
+ /**
+ * Returns a subset of users
+ *
+ * @uses $CFG
+ * @param bool $get If false then only a count of the records is returned
+ * @param string $search A simple string to search for
+ * @param bool $confirmed A switch to allow/disallow unconfirmed users
+ * @param array(int) $exceptions A list of IDs to ignore, eg 2,4,5,8,9,10
+ * @param string $sort A SQL snippet for the sorting criteria to use
+ * @param string $firstinitial ?
+ * @param string $lastinitial ?
+ * @param string $page ?
+ * @param string $recordsperpage ?
+ * @param string $fields A comma separated list of fields to be returned from the chosen table.
+ * @return object|false|int {@link $USER} records unless get is false in which case the integer count of the records found is returned. False is returned if an error is encountered.
+ */
+ static function tmp_get_users($get=true, $search='', $confirmed=false, array $exceptions=null, $sort='firstname ASC',
+ $firstinitial='', $lastinitial='', $page='', $recordsperpage='', $fields='*', $extraselect='', array $extraparams=null) {
+ global $DB;
+
+ if ($get && !$recordsperpage) {
+ debugging('Call to get_users with $get = true no $recordsperpage limit. ' .
+ 'On large installations, this will probably cause an out of memory error. ' .
+ 'Please think again and change your code so that it does not try to ' .
+ 'load so much data into memory.', DEBUG_DEVELOPER);
}
- }
- return $DB->get_records_select('user', $select, $params, $sort, $fields, $page, $recordsperpage);
-}
+ $LIKE = $DB->sql_ilike();
+ $fullname = $DB->sql_fullname();
-/**
- * Returns a subset of users
- *
- * @uses $CFG
- * @param bool $get If false then only a count of the records is returned
- * @param string $search A simple string to search for
- * @param bool $confirmed A switch to allow/disallow unconfirmed users
- * @param array(int) $exceptions A list of IDs to ignore, eg 2,4,5,8,9,10
- * @param string $sort A SQL snippet for the sorting criteria to use
- * @param string $firstinitial ?
- * @param string $lastinitial ?
- * @param string $page ?
- * @param string $recordsperpage ?
- * @param string $fields A comma separated list of fields to be returned from the chosen table.
- * @return object|false|int {@link $USER} records unless get is false in which case the integer count of the records found is returned. False is returned if an error is encountered.
- */
-static function tmp_get_users($get=true, $search='', $confirmed=false, array $exceptions=null, $sort='firstname ASC',
- $firstinitial='', $lastinitial='', $page='', $recordsperpage='', $fields='*', $extraselect='', array $extraparams=null) {
- global $DB;
-
- if ($get && !$recordsperpage) {
- debugging('Call to get_users with $get = true no $recordsperpage limit. ' .
- 'On large installations, this will probably cause an out of memory error. ' .
- 'Please think again and change your code so that it does not try to ' .
- 'load so much data into memory.', DEBUG_DEVELOPER);
- }
+ $select = " username <> :guest AND deleted = 0";
+ $params = array('guest'=>'guest');
- $LIKE = $DB->sql_ilike();
- $fullname = $DB->sql_fullname();
+ if (!empty($search)){
+ $search = trim($search);
+ $select .= " AND ($fullname $LIKE :search1 OR email $LIKE :search2 OR username = :search3)";
+ $params['search1'] = "%$search%";
+ $params['search2'] = "%$search%";
+ $params['search3'] = "$search";
+ }
- $select = " username <> :guest AND deleted = 0";
- $params = array('guest'=>'guest');
+ if ($confirmed) {
+ $select .= " AND confirmed = 1";
+ }
- if (!empty($search)){
- $search = trim($search);
- $select .= " AND ($fullname $LIKE :search1 OR email $LIKE :search2 OR username = :search3)";
- $params['search1'] = "%$search%";
- $params['search2'] = "%$search%";
- $params['search3'] = "$search";
- }
+ if ($exceptions) {
+ list($exceptions, $eparams) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
+ $params = $params + $eparams;
+ $except = " AND id $exceptions";
+ }
- if ($confirmed) {
- $select .= " AND confirmed = 1";
- }
+ if ($firstinitial) {
+ $select .= " AND firstname $LIKE :fni";
+ $params['fni'] = "$firstinitial%";
+ }
+ if ($lastinitial) {
+ $select .= " AND lastname $LIKE :lni";
+ $params['lni'] = "$lastinitial%";
+ }
- if ($exceptions) {
- list($exceptions, $eparams) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
- $params = $params + $eparams;
- $except = " AND id $exceptions";
- }
+ if ($extraselect) {
+ $select .= " AND $extraselect";
+ $params = $params + (array)$extraparams;
+ }
- if ($firstinitial) {
- $select .= " AND firstname $LIKE :fni";
- $params['fni'] = "$firstinitial%";
- }
- if ($lastinitial) {
- $select .= " AND lastname $LIKE :lni";
- $params['lni'] = "$lastinitial%";
+ if ($get) {
+ return $DB->get_records_select('user', $select, $params, $sort, $fields, $page, $recordsperpage);
+ } else {
+ return $DB->count_records_select('user', $select, $params);
+ }
}
- if ($extraselect) {
- $select .= " AND $extraselect";
- $params = $params + (array)$extraparams;
- }
+ /**
+ * Creates an User with given information. Required fields are:
+ * -username
+ * -idnumber
+ * -firstname
+ * -lastname
+ * -email
+ *
+ * And there's some interesting fields:
+ * -password
+ * -auth
+ * -confirmed
+ * -timezone
+ * -country
+ * -emailstop
+ * -theme
+ * -lang
+ * -mailformat
+ *
+ * @param assoc array or object $user
+ *
+ * @return userid or thrown exceptions
+ */
+ static function tmp_create_user($user) {
+ global $CFG, $DB;
+ ///WS: convert user array into an user object
+ if (is_array($user)) {
+ $user = (object) $user;
+ }
- if ($get) {
- return $DB->get_records_select('user', $select, $params, $sort, $fields, $page, $recordsperpage);
- } else {
- return $DB->count_records_select('user', $select, $params);
- }
-}
+ ///check password and auth fields
+ if (!isset($user->password)) {
+ $user->password = '';
+ }
+ if (!isset($user->auth)) {
+ $user->auth = 'manual';
+ }
-/**
- * Creates an User with given information. Required fields are:
- * -username
- * -idnumber
- * -firstname
- * -lastname
- * -email
- *
- * And there's some interesting fields:
- * -password
- * -auth
- * -confirmed
- * -timezone
- * -country
- * -emailstop
- * -theme
- * -lang
- * -mailformat
- *
- * @param assoc array or object $user
- *
- * @return userid or thrown exceptions
- */
-static function tmp_create_user($user) {
- global $CFG, $DB;
- ///WS: convert user array into an user object
- if (is_array($user)) {
- $user = (object) $user;
- }
-
- ///check password and auth fields
- if (!isset($user->password)) {
- $user->password = '';
- }
- if (!isset($user->auth)) {
- $user->auth = 'manual';
+ $required = array('username','firstname','lastname','email');
+ foreach ($required as $req) {
+ if (!isset($user->{$req})) {
+ throw new moodle_exception('missingerequiredfield');
+ }
+ }
+
+ $record = create_user_record($user->username, $user->password, $user->auth);
+ if ($record) {
+ $user->id = $record->id;
+ if ($DB->update_record('user',$user)) {
+ return $record->id;
+ } else {
+ $DB->delete_record('user',array('id' => $record->id));
+ }
+ }
+ throw new moodle_exception('couldnotcreateuser');
}
- $required = array('username','firstname','lastname','email');
- foreach ($required as $req) {
- if (!isset($user->{$req})) {
- throw new moodle_exception('missingerequiredfield');
+ /**
+ * Marks user deleted in internal user database and notifies the auth plugin.
+ * Also unenrols user from all roles and does other cleanup.
+ * @param object $user Userobject before delete (without system magic quotes)
+ * @return boolean success
+ */
+ static function tmp_delete_user($user) {
+ global $CFG, $DB;
+ require_once($CFG->libdir.'/grouplib.php');
+ require_once($CFG->libdir.'/gradelib.php');
+
+ $DB->begin_sql();
+
+ // delete all grades - backup is kept in grade_grades_history table
+ if ($grades = grade_grade::fetch_all(array('userid'=>$user->id))) {
+ foreach ($grades as $grade) {
+ $grade->delete('userdelete');
+ }
}
- }
- $record = create_user_record($user->username, $user->password, $user->auth);
- if ($record) {
- $user->id = $record->id;
- if ($DB->update_record('user',$user)) {
- return $record->id;
- } else {
- $DB->delete_record('user',array('id' => $record->id));
+ // remove from all groups
+ $DB->delete_records('groups_members', array('userid'=>$user->id));
+
+ // unenrol from all roles in all contexts
+ role_unassign(0, $user->id); // this might be slow but it is really needed - modules might do some extra cleanup!
+
+ // now do a final accesslib cleanup - removes all role assingments in user context and context itself
+ delete_context(CONTEXT_USER, $user->id);
+
+ require_once($CFG->dirroot.'/tag/lib.php');
+ tag_set('user', $user->id, array());
+
+ // workaround for bulk deletes of users with the same email address
+ $delname = "$user->email.".time();
+ while ($DB->record_exists('user', array('username'=>$delname))) { // no need to use mnethostid here
+ $delname++;
}
- }
- throw new moodle_exception('couldnotcreateuser');
-}
-}
+ // mark internal user record as "deleted"
+ $updateuser = new object();
+ $updateuser->id = $user->id;
+ $updateuser->deleted = 1;
+ $updateuser->username = $delname; // Remember it just in case
+ $updateuser->email = ''; // Clear this field to free it up
+ $updateuser->idnumber = ''; // Clear this field to free it up
+ $updateuser->timemodified = time();
+ if ($DB->update_record('user', $updateuser)) {
+ $DB->commit_sql();
+ // notify auth plugin - do not block the delete even when plugin fails
+ $authplugin = get_auth_plugin($user->auth);
+ $authplugin->user_delete($user);
+ events_trigger('user_deleted', $user);
+ return true;
+ } else {
+ $DB->rollback_sql();
+ return false;
+ }
+ }
+
+ /**
+ * Update a user record from its id
+ * Warning: no checks are done on the data!!!
+ * @param object $user
+ */
+ static function tmp_update_user($user) {
+ global $DB;
+ if ($DB->update_record('user', $user)) {
+ $DB->commit_sql();
+ events_trigger('user_updated', $user);
+ return true;
+ } else {
+ $DB->rollback_sql();
+ return false;
+ }
+ }
+}
?>
/// Then 'paramorder'=> array('anyobjectname' => array('username' => ...));
///
///TODO: manage object->object parameter
- $this->descriptions['tmp_get_users'] = array( 'wsparams' => array('search'=> PARAM_ALPHA),
+ $this->descriptions['tmp_get_users'] = array( 'wsparams' => array('search'=> PARAM_ALPHANUM),
'return' => array('user', array('id' => PARAM_RAW, 'auth' => PARAM_RAW, 'confirmed' => PARAM_RAW, 'username' => PARAM_RAW, 'idnumber' => PARAM_RAW,
'firstname' => PARAM_RAW, 'lastname' => PARAM_RAW, 'email' => PARAM_RAW, 'emailstop' => PARAM_RAW,
'lang' => PARAM_RAW, 'theme' => PARAM_RAW, 'timezone' => PARAM_RAW, 'mailformat' => PARAM_RAW)));
'return' => array('user', array('id' => PARAM_RAW, 'auth' => PARAM_RAW, 'confirmed' => PARAM_RAW, 'username' => PARAM_RAW, 'idnumber' => PARAM_RAW,
'firstname' => PARAM_RAW, 'lastname' => PARAM_RAW, 'email' => PARAM_RAW, 'emailstop' => PARAM_RAW,
'lang' => PARAM_RAW, 'theme' => PARAM_RAW, 'timezone' => PARAM_RAW, 'mailformat' => PARAM_RAW)));
+
+ $this->descriptions['tmp_delete_user'] = array( 'wsparams' => array('username'=> PARAM_ALPHANUM, 'mnethostid'=> PARAM_NUMBER),
+ 'return' => array('result', PARAM_BOOL));
+
+ $this->descriptions['tmp_update_user'] = array( 'wsparams' => array('username'=> PARAM_ALPHANUM, 'mnethostid'=> PARAM_NUMBER, 'newusername' => PARAM_ALPHANUM, 'firstname' => PARAM_ALPHANUM),
+ 'return' => array('result', PARAM_BOOL));
}
/**
- *
- * @param <type> $search
- * @return <type>
+ * Retrieve all user
+ * @param string $search
+ * @return object user
*/
static function tmp_get_users($search) {
return user_api::tmp_get_users( true, $search, false, null, 'firstname ASC','', '', '', '',
}
/**
- *
- * @param <type> $username
- * @param <type> $firstname
- * @param <type> $lastname
- * @param <type> $email
- * @param <type> $password
- * @return <type>
+ * Create a user
+ * @param string $username
+ * @param string $firstname
+ * @param string $lastname
+ * @param string $email
+ * @param string $password
+ * @return integer id of new user
*/
static function tmp_create_user($username, $firstname, $lastname, $email, $password) {
$user = array();
$user['lastname'] = $lastname;
$user['email'] = $email;
$user['password'] = $password;
- return user_api::tmp_create_user($user);
-
+ return user_api::tmp_create_user($user);
+ }
+
+ /**
+ * Delete a user
+ * @global object $DB
+ * @param string $username
+ * @param integer $mnethostid
+ * @return boolean true if success
+ */
+ static function tmp_delete_user($username, $mnethostid) {
+ global $DB;
+ $user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$mnethostid));
+ return user_api::tmp_delete_user($user);
+ }
+
+ /**
+ * Update some user information
+ * @global object $DB
+ * @param string $username
+ * @param integer $mnethostid
+ * @param string $newusername
+ * @param string $firstname
+ * @return boolean true if success
+ */
+ static function tmp_update_user($username, $mnethostid, $newusername, $firstname) {
+ global $DB;
+ $user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$mnethostid));
+ $user->username = $newusername;
+ $user->firstname = $firstname;
+
+ return user_api::tmp_update_user($user);
}
}