/** * Set stuff that needs to be initialised once before a user record is created. */ public function create() { $this->set('ctime', time()); if (get_config('cleanurls') && is_null($this->urlid)) { $desiredurlid = generate_urlid($this->username, get_config('cleanurluserdefault'), 3, 30); $this->set('urlid', get_new_profile_urlid($desiredurlid)); } }
function regenerateurls_submit(Pieform $form, $values) { global $SESSION, $USER; require_once 'upgrade.php'; log_debug("Regenerating clean urls..."); db_begin(); // Checking duplicates one by one is too slow, so drop the index, // generate the urlids in big chunks, remove duplicates in one hit, // recreate the index. // Users: set urlid based on username. $table = new XMLDBTable('usr'); $index = new XMLDBIndex('urliduk'); $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid')); drop_index($table, $index); execute_sql('UPDATE {usr} SET urlid = NULL WHERE NOT urlid IS NULL'); $usrcount = count_records_select('usr', 'deleted = 0 AND id > 0'); $sql = 'SELECT id, username FROM {usr} WHERE id > ? AND deleted = 0 ORDER BY id'; $done = 0; $lastid = 0; $limit = 1000; while ($records = get_records_sql_array($sql, array($lastid), 0, $limit)) { $firstid = $lastid; $values = array(); foreach ($records as $r) { $r->urlid = generate_urlid($r->username, get_config('cleanurluserdefault'), 3, 30); array_push($values, $r->id, $r->urlid); $lastid = $r->id; } $updatesql = "UPDATE {usr} SET urlid = CASE id\n "; $updatesql .= join("\n ", array_fill(0, count($records), 'WHEN ? THEN ?')); $updatesql .= "\n ELSE NULL\n END WHERE id > ? AND id <= ? AND deleted = 0"; array_push($values, $firstid, $lastid); execute_sql($updatesql, $values); $done += count($records); log_debug("Generating user urls: {$done}/{$usrcount}"); } // Fix any duplicates created above $dupurls = get_records_sql_array(' SELECT id, urlid FROM {usr} WHERE urlid IN ( SELECT urlid FROM {usr} WHERE id > 0 AND deleted = 0 GROUP BY urlid HAVING COUNT(id) > 1 ) ORDER BY urlid, id', array()); $last = null; if ($dupurls) { log_debug('Fixing ' . count($dupurls) . ' duplicate user urls'); $ids = array(); $values = array(); for ($i = 0; $i < count($dupurls); $i++) { if ($dupurls[$i]->urlid != $last) { // The first user with this name can keep it, but get all the taken urlids that are similar // so we can check against them when appending digits below. $taken = get_column_sql("SELECT urlid FROM {usr} WHERE urlid LIKE ?", array(substr($dupurls[$i]->urlid, 0, 24) . '%')); } else { // Subsequent users need digits appended, while keeping the max length at 30 $suffix = 1; $try = substr($dupurls[$i]->urlid, 0, 28) . '-1'; while (in_array($try, $taken)) { $suffix++; $try = substr($dupurls[$i]->urlid, 0, 29 - strlen($suffix)) . '-' . $suffix; } $taken[] = $try; $ids[] = $dupurls[$i]->id; array_push($values, $dupurls[$i]->id, $try); } $last = $dupurls[$i]->urlid; } $updatesql = "UPDATE {usr} SET urlid = CASE id\n "; $updatesql .= join("\n ", array_fill(0, count($values) / 2, 'WHEN ? THEN ?')); $updatesql .= "\n ELSE urlid\n END\n WHERE id IN ("; $updatesql .= join(',', array_fill(0, count($ids), '?')); $updatesql .= ')'; $values = array_merge($values, $ids); execute_sql($updatesql, $values); } $table = new XMLDBTable('usr'); $index = new XMLDBIndex('urliduk'); $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid')); add_index($table, $index); // Groups: set urlid based on group name execute_sql('UPDATE {group} SET urlid = NULL'); $table = new XMLDBTable('group'); $index = new XMLDBIndex('urliduk'); $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid')); drop_index($table, $index); // Transliteration using iconv is bad if locale is set to C, so set it based on // the site language. $lang = $sitelang = get_config('lang'); set_locale_for_language($lang); $groupcount = count_records('group', 'deleted', 0); $sql = 'SELECT id, name FROM {group} WHERE deleted = 0 AND id > ? ORDER BY id'; $done = 0; $lastid = 0; $limit = 1000; while ($records = get_records_sql_array($sql, array($lastid), 0, $limit)) { $firstid = $lastid; $values = array(); foreach ($records as $r) { $r->urlid = generate_urlid($r->name, get_config('cleanurlgroupdefault'), 3, 30); array_push($values, $r->id, $r->urlid); $lastid = $r->id; } $updatesql = "UPDATE {group} SET urlid = CASE id\n "; $updatesql .= join("\n ", array_fill(0, count($records), 'WHEN ? THEN ?')); $updatesql .= "\n ELSE NULL\n END WHERE id > ? AND id <= ? AND deleted = 0"; array_push($values, $firstid, $lastid); execute_sql($updatesql, $values); $done += count($records); log_debug("Generating group urls: {$done}/{$groupcount}"); } // Fix duplicates... $dupurls = get_records_sql_array(' SELECT id, urlid FROM {group} WHERE urlid IN ( SELECT urlid FROM {group} WHERE id > 0 AND deleted = 0 GROUP BY urlid HAVING COUNT(id) > 1 ) ORDER BY urlid, id', array()); $last = null; if ($dupurls) { log_debug('Fixing ' . count($dupurls) . ' duplicate group urls'); $ids = array(); $values = array(); for ($i = 0; $i < count($dupurls); $i++) { if ($dupurls[$i]->urlid != $last) { // The first group with this name can keep it, get similar group urls $taken = get_column_sql("SELECT urlid FROM {group} WHERE urlid LIKE ?", array(substr($dupurls[$i]->urlid, 0, 24) . '%')); } else { // Append digits while keeping the max length at 30 $suffix = 1; $try = substr($dupurls[$i]->urlid, 0, 28) . '-1'; while (in_array($try, $taken)) { $suffix++; $try = substr($dupurls[$i]->urlid, 0, 29 - strlen($suffix)) . '-' . $suffix; } $taken[] = $try; $ids[] = $dupurls[$i]->id; array_push($values, $dupurls[$i]->id, $try); } $last = $dupurls[$i]->urlid; } $updatesql = "UPDATE {group} SET urlid = CASE id\n "; $updatesql .= join("\n ", array_fill(0, count($values) / 2, 'WHEN ? THEN ?')); $updatesql .= "\n ELSE urlid\n END\n WHERE id IN ("; $updatesql .= join(',', array_fill(0, count($ids), '?')); $updatesql .= ')'; $values = array_merge($values, $ids); execute_sql($updatesql, $values); } $table = new XMLDBTable('group'); $index = new XMLDBIndex('urliduk'); $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid')); add_index($table, $index); // Views: set urlid based on view title. Only portfolio views need urlids, and they // only need to be unique when they're owned by the same entity. // The iconv utf8 conversion gives better results if we set the locale based on the // user's language preference, so these are pulled from the db when appropriate. execute_sql('UPDATE {view} SET urlid = NULL'); $table = new XMLDBTable('view'); $index = new XMLDBIndex('urliduk'); $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid', 'owner', 'group', 'institution')); drop_index($table, $index); $viewcount = count_records('view', 'type', 'portfolio'); $sql = "\n SELECT v.id, v.title, ap.value AS lang\n FROM {view} v LEFT JOIN {usr_account_preference} ap ON ap.usr = v.owner AND ap.field = 'lang'\n WHERE v.id > ? AND v.type = 'portfolio'\n ORDER BY v.id"; $done = 0; $lastid = 0; $limit = 1000; while ($records = get_records_sql_array($sql, array($lastid), 0, $limit)) { $firstid = $lastid; $values = array(); foreach ($records as $r) { if (empty($r->lang) || $r->lang == 'default') { $r->lang = $sitelang; } if ($lang != $r->lang) { set_locale_for_language($r->lang); $lang = $r->lang; } $r->urlid = generate_urlid($r->title, get_config('cleanurlviewdefault'), 3, 100); array_push($values, $r->id, $r->urlid); $lastid = $r->id; } $updatesql = "UPDATE {view} SET urlid = CASE id\n "; $updatesql .= join("\n ", array_fill(0, count($records), 'WHEN ? THEN ?')); $updatesql .= "\n ELSE NULL\n END WHERE id > ? AND id <= ?"; array_push($values, $firstid, $lastid); execute_sql($updatesql, $values); $done += count($records); log_debug("Generating page urls: {$done}/{$viewcount}"); } // Reset locale set_locale_for_language($sitelang); // Fix duplicates with the same owner, group, or institution $dupurls = get_records_sql_array("\n SELECT\n v.id, dv.urlid, dv.owner, dv.group, dv.institution\n FROM\n {view} v,\n (SELECT d.urlid, d.owner, d.group, d.institution\n FROM {view} d\n WHERE d.type = 'portfolio'\n GROUP BY d.urlid, d.owner, d.group, d.institution\n HAVING COUNT(d.id) > 1) dv\n WHERE\n v.type = 'portfolio'\n AND v.urlid = dv.urlid\n AND (v.owner = dv.owner OR (v.owner IS NULL AND dv.owner IS NULL))\n AND (v.group = dv.group OR (v.group IS NULL AND dv.group IS NULL))\n AND (v.institution = dv.institution OR (v.institution IS NULL AND dv.institution IS NULL))\n ORDER BY\n dv.urlid, dv.owner, dv.group, dv.institution, v.id", array()); $last = array('urlid' => null, 'owner' => null, 'group' => null, 'institution' => null); if ($dupurls) { log_debug('Fixing ' . count($dupurls) . ' duplicate page urls'); $ids = array(); $values = array(); for ($i = 0; $i < count($dupurls); $i++) { $hasdupes = clone $dupurls[$i]; unset($hasdupes->id); if ($hasdupes != $last) { // The first view with this name can keep it // Get similar view names to check uniqueness when appending digits if (!is_null($hasdupes->owner)) { $ownersql = 'owner = ?'; $ownervalue = $hasdupes->owner; } else { if (!is_null($hasdupes->group)) { $ownersql = 'group = ?'; $ownervalue = $hasdupes->group; } else { if (!is_null($hasdupes->institution)) { $ownersql = 'institution = ?'; $ownervalue = $hasdupes->institution; } } } $taken = get_column_sql('SELECT urlid FROM {view} v WHERE urlid LIKE ? AND v.' . $ownersql, array(substr($dupurls[$i]->urlid, 0, 94), $ownervalue)); } else { // Subsequent views with this name need digits appended, keeping max length at 100 $suffix = 1; $try = substr($dupurls[$i]->urlid, 0, 98) . '-1'; while (in_array($try, $taken)) { $suffix++; $try = substr($dupurls[$i]->urlid, 0, 99 - strlen($suffix)) . '-' . $suffix; } $taken[] = $try; $ids[] = $dupurls[$i]->id; array_push($values, $dupurls[$i]->id, $try); } $last = $hasdupes; } $updatesql = "UPDATE {view} SET urlid = CASE id\n "; $updatesql .= join("\n ", array_fill(0, count($values) / 2, 'WHEN ? THEN ?')); $updatesql .= "\n ELSE urlid\n END\n WHERE id IN ("; $updatesql .= join(',', array_fill(0, count($ids), '?')); $updatesql .= ')'; $values = array_merge($values, $ids); execute_sql($updatesql, $values); } $table = new XMLDBTable('view'); $index = new XMLDBIndex('urliduk'); $index->setAttributes(XMLDB_INDEX_UNIQUE, array('urlid', 'owner', 'group', 'institution')); add_index($table, $index); // Reset in the session for this user - currently logged-in users may end up wiping theirs $USER->urlid = get_field('usr', 'urlid', 'id', $USER->get('id')); $USER->commit(); db_commit(); $SESSION->add_ok_msg(get_string('generateduserurls', 'admin', $usrcount)); $SESSION->add_ok_msg(get_string('generatedgroupurls', 'admin', $groupcount)); $SESSION->add_ok_msg(get_string('generatedviewurls', 'admin', $viewcount)); redirect('/admin/extensions/cleanurls.php'); }
/** * Creates a new View for the given user, based on the given information * about the view. * * Validation of the view data is performed, then the View is created. If * the View is to be owned by a group, that group is given access to it. * * @param array $viewdata Data about the view. You can pass in most fields * that appear in the view table. * * Note that you set who owns the View by setting * either the owner, group or institution field as * approriate. * * Currently, you cannot pass in access data. Use * $view->set_access() after retrieving the $view * object. * * @param int $userid The user who has issued the command to create the * View (note: this is different from the "owner" of the * View - a group or institution could be the "owner", * but it's a _user_ who requests a View is created for it) * @return View The created View * @throws SystemException if the View data is invalid - mostly this is due * to owner information being specified incorrectly. */ private static function _create(&$viewdata, $userid) { // If no owner information is provided, assume that the view is being // created by the user for themself if (!isset($viewdata['owner']) && !isset($viewdata['group']) && !isset($viewdata['institution'])) { $viewdata['owner'] = $userid; } if (isset($viewdata['owner'])) { if ($viewdata['owner'] != $userid) { $userobj = new User(); $userobj->find_by_id($userid); if (!$userobj->is_admin_for_user($viewdata['owner'])) { throw new SystemException("View::_create: User {$userid} is not allowed to create a view for owner {$viewdata['owner']}"); } } // Users can only have one view of each non-portfolio type if (isset($viewdata['type']) && $viewdata['type'] != 'portfolio' && get_record('view', 'owner', $viewdata['owner'], 'type', $viewdata['type'])) { $viewdata['type'] = 'portfolio'; } // Try to create the view with the owner's default theme if that theme is set by an // institution (i.e. if it's different from the site theme) // // This needs to be modified if users are ever allowed to change their own theme // preference. Currently it's okay because users' themes are forced on them by // the site or institution default, but if some users are allowed to change their // own theme pref, we should create those users' views without a theme. if (!get_config('userscanchooseviewthemes') && !isset($viewdata['theme']) && (!isset($viewdata['type']) || $viewdata['type'] != 'dashboard')) { global $USER; if ($viewdata['owner'] == $USER->get('id')) { $owner = $USER; } else { $owner = new User(); $owner->find_by_id($viewdata['owner']); } $ownerthemedata = $owner->get('institutiontheme'); $ownertheme = isset($ownerthemedata->basename) ? $ownerthemedata->basename : null; if ($ownertheme && $ownertheme != get_config('theme') && $ownertheme != 'custom') { $viewdata['theme'] = $ownertheme; } } } if (isset($viewdata['group'])) { require_once 'group.php'; if (!group_user_can_edit_views($viewdata['group'], $userid)) { throw new SystemException("View::_create: User {$userid} is not permitted to create a view for group {$viewdata['group']}"); } } if (isset($viewdata['institution'])) { $user = new User(); $user->find_by_id($userid); if (!$user->can_edit_institution($viewdata['institution'])) { throw new SystemException("View::_create: User {$userid} is not permitted to create a view for institution {$viewdata['institution']}"); } } // Create the view $defaultdata = array('numcolumns' => 2, 'numrows' => 1, 'columnsperrow' => self::default_columnsperrow(), 'template' => 0, 'type' => 'portfolio', 'title' => array_key_exists('title', $viewdata) ? $viewdata['title'] : self::new_title(get_string('Untitled', 'view'), (object) $viewdata), 'anonymise' => 0); $data = (object) array_merge($defaultdata, $viewdata); if ($data->type == 'portfolio' && (!isset($data->url) || is_null($data->url) || !strlen($data->url))) { $data->urlid = generate_urlid($data->title, get_config('cleanurlviewdefault'), 3, 100); $data->urlid = self::new_urlid($data->urlid, $data); } $view = new View(0, $data); $view->commit(); if (isset($viewdata['group']) && (empty($viewdata['type']) || !empty($viewdata['type']) && $viewdata['type'] != 'grouphomepage')) { require_once 'activity.php'; // Although group views are owned by the group, the view creator is treated as owner here. // So we need to ignore them from the activity_occured email. $beforeusers[$userid] = get_record('usr', 'id', $userid); // By default, group views should be visible to the group insert_record('view_access', (object) array('view' => $view->get('id'), 'group' => $viewdata['group'], 'ctime' => db_format_timestamp(time()))); // Notify group members $accessdata = new StdClass(); $accessdata->view = $view->get('id'); $accessdata->oldusers = $beforeusers; activity_occurred('viewaccess', $accessdata); } if (isset($viewdata['layout'])) { // e.g. importing via LEAP2A $layoutsrowscols = get_records_select_array('view_layout_rows_columns', 'viewlayout = ?', array($viewdata['layout'])); if ($layoutsrowscols) { delete_records('view_rows_columns', 'view', $view->get('id')); foreach ($layoutsrowscols as $layoutrow) { insert_record('view_rows_columns', (object) array('view' => $view->get('id'), 'row' => $layoutrow->row, 'columns' => self::$layoutcolumns[$layoutrow->columns]->columns)); } } } return new View($view->get('id')); // Reread to ensure defaults are set }
/** * Creates a group. * * All group creation should be done through this function, as the * implementation of group creation may change over time. * * @param array $data Data required to create the group. The following * key/value pairs can be specified: * * - name: The group name [required, must be unique] * - description: The group description [optional, defaults to empty string] * - grouptype: The grouptype for the new group. Must be an installed grouptype. * - open (jointype): anyone can join the group * - controlled (jointype): admin adds members; members cannot leave the group * - request: allows membership requests * - ctime: The unix timestamp of the time the group will be recorded as having * been created. Defaults to the current time. * - members: Array of users who should be in the group, structured like this: * array( * userid => role, * userid => role, * ... * ) * @return int The ID of the created group */ function group_create($data) { if (!is_array($data)) { throw new InvalidArgumentException("group_create: data must be an array, see the doc comment for this " . "function for details on its format"); } if (!isset($data['name'])) { throw new InvalidArgumentException("group_create: must specify a name for the group"); } if (get_records_sql_array('SELECT id FROM {group} WHERE LOWER(TRIM(name)) = ?', array(strtolower(trim($data['name']))))) { throw new UserException(get_string('groupalreadyexists', 'group') . ': ' . $data['name']); } if (!isset($data['grouptype']) || !in_array($data['grouptype'], group_get_grouptypes())) { throw new InvalidArgumentException("group_create: grouptype specified must be an installed grouptype"); } safe_require('grouptype', $data['grouptype']); if (!empty($data['open'])) { if (!empty($data['controlled'])) { throw new InvalidArgumentException("group_create: a group cannot have both open and controlled membership"); } if (!empty($data['request'])) { throw new InvalidArgumentException("group_create: open-membership groups don't accept membership requests"); } $jointype = 'open'; } else { if (!empty($data['controlled'])) { $jointype = 'controlled'; } else { $jointype = 'approve'; } } if (isset($data['jointype'])) { log_warn("group_create: ignoring supplied jointype"); } if (!isset($data['ctime'])) { $data['ctime'] = time(); } $data['ctime'] = db_format_timestamp($data['ctime']); $data['public'] = isset($data['public']) ? intval($data['public']) : 0; $data['hidden'] = isset($data['hidden']) ? intval($data['hidden']) : 0; $data['hidemembers'] = isset($data['hidemembers']) ? intval($data['hidemembers']) : 0; $data['hidemembersfrommembers'] = isset($data['hidemembersfrommembers']) ? intval($data['hidemembersfrommembers']) : 0; $data['groupparticipationreports'] = isset($data['groupparticipationreports']) ? intval($data['groupparticipationreports']) : 0; $data['usersautoadded'] = isset($data['usersautoadded']) ? intval($data['usersautoadded']) : 0; $data['quota'] = get_config_plugin('artefact', 'file', 'defaultgroupquota'); if (!empty($data['invitefriends']) && !empty($data['suggestfriends'])) { throw new InvalidArgumentException("group_create: a group cannot enable both invitefriends and suggestfriends"); } $data['invitefriends'] = isset($data['invitefriends']) ? intval($data['invitefriends']) : 0; $data['suggestfriends'] = isset($data['suggestfriends']) ? intval($data['suggestfriends']) : 0; if (isset($data['shortname']) && strlen($data['shortname'])) { // This is a group whose details and membership can be updated automatically, using a // webservice api or possibly csv upload. // On updates to this group, it will be identified using the institution and shortname // which must be unique. // The $USER object will be set to someone with at least institutional admin permission. global $USER; if (empty($data['institution'])) { throw new SystemException("group_create: a group with a shortname must have an institution; shortname: " . $data['shortname']); } if (!$USER->can_edit_institution($data['institution'])) { throw new AccessDeniedException("group_create: cannot create a group in this institution"); } if (!preg_match('/^[a-zA-Z0-9_.-]{2,255}$/', $data['shortname'])) { $message = get_string('invalidshortname', 'group') . ': ' . $data['shortname']; $message .= "\n" . get_string('shortnameformat', 'group'); throw new UserException($message); } if (record_exists('group', 'shortname', $data['shortname'], 'institution', $data['institution'])) { throw new UserException('group_create: group with shortname ' . $data['shortname'] . ' and institution ' . $data['institution'] . ' already exists'); } if (empty($data['members'])) { $data['members'] = array($USER->get('id') => 'admin'); } } else { if (!empty($data['institution'])) { throw new SystemException("group_create: group institution only available for api-controlled groups"); } $data['shortname'] = null; } if (get_config('cleanurls') && (!isset($data['urlid']) || strlen($data['urlid']) == 0)) { $data['urlid'] = generate_urlid($data['name'], get_config('cleanurlgroupdefault'), 3, 30); $data['urlid'] = group_get_new_homepage_urlid($data['urlid']); } if (!is_array($data['members']) || count($data['members']) == 0) { throw new InvalidArgumentException("group_create: at least one member must be specified for adding to the group"); } if (!isset($data['submittableto'])) { $data['submittableto'] = $data['grouptype'] != 'standard'; } if (!isset($data['editroles'])) { $data['editroles'] = $data['grouptype'] == 'standard' ? 'all' : 'notmember'; } else { if (!in_array($data['editroles'], array_keys(group_get_editroles_options()))) { throw new InvalidArgumentException("group_create: invalid option for page editroles setting"); } } if (!isset($data['editwindowstart'])) { $data['editwindowstart'] = null; } if (!isset($data['editwindowend'])) { $data['editwindowend'] = null; } if (!isset($data['sendnow'])) { $data['sendnow'] = null; } db_begin(); $id = insert_record('group', (object) array('name' => $data['name'], 'description' => isset($data['description']) ? $data['description'] : null, 'urlid' => isset($data['urlid']) ? $data['urlid'] : null, 'grouptype' => $data['grouptype'], 'category' => isset($data['category']) ? intval($data['category']) : null, 'jointype' => $jointype, 'ctime' => $data['ctime'], 'mtime' => $data['ctime'], 'public' => $data['public'], 'usersautoadded' => $data['usersautoadded'], 'quota' => $data['quota'], 'institution' => !empty($data['institution']) ? $data['institution'] : null, 'shortname' => $data['shortname'], 'request' => isset($data['request']) ? intval($data['request']) : 0, 'submittableto' => intval($data['submittableto']), 'allowarchives' => !empty($data['submittableto']) && !empty($data['allowarchives']) ? intval($data['allowarchives']) : 0, 'editroles' => $data['editroles'], 'hidden' => $data['hidden'], 'hidemembers' => $data['hidemembers'], 'hidemembersfrommembers' => $data['hidemembersfrommembers'], 'groupparticipationreports' => $data['groupparticipationreports'], 'invitefriends' => $data['invitefriends'], 'suggestfriends' => $data['suggestfriends'], 'editwindowstart' => $data['editwindowstart'], 'editwindowend' => $data['editwindowend'], 'sendnow' => isset($data['sendnow']) ? $data['sendnow'] : null, 'viewnotify' => isset($data['viewnotify']) ? $data['viewnotify'] : null, 'feedbacknotify' => isset($data['feedbacknotify']) ? $data['feedbacknotify'] : null), 'id', true); foreach ($data['members'] as $userid => $role) { insert_record('group_member', (object) array('group' => $id, 'member' => $userid, 'role' => $role, 'ctime' => $data['ctime'])); } // Copy views for the new group $templates = get_column('view_autocreate_grouptype', 'view', 'grouptype', $data['grouptype']); $templates = get_records_sql_array("\n SELECT v.id, v.title, v.description\n FROM {view} v\n INNER JOIN {view_autocreate_grouptype} vag ON vag.view = v.id\n LEFT JOIN {collection_view} cv ON v.id = cv.view\n WHERE vag.grouptype = 'standard'\n AND cv.view IS NULL", array()); if ($templates) { require_once get_config('libroot') . 'view.php'; foreach ($templates as $template) { list($view) = View::create_from_template(array('group' => $id, 'title' => $template->title, 'description' => $template->description), $template->id, null, false); $view->set_access(array(array('type' => 'group', 'id' => $id, 'startdate' => null, 'stopdate' => null, 'role' => null))); } } // Copy collections for the new group $templates = get_records_sql_array("\n SELECT DISTINCT c.id, c.name\n FROM {view} v\n INNER JOIN {view_autocreate_grouptype} vag ON vag.view = v.id\n INNER JOIN {collection_view} cv ON v.id = cv.view\n INNER JOIN {collection} c ON cv.collection = c.id\n WHERE vag.grouptype = ?", array($data['grouptype'])); if ($templates) { require_once 'collection.php'; foreach ($templates as $template) { Collection::create_from_template(array('group' => $id), $template->id, null, false, true); } } $data['id'] = $id; // install the homepage if ($t = get_record('view', 'type', 'grouphomepage', 'template', 1, 'owner', 0)) { require_once 'view.php'; $template = new View($t->id, (array) $t); list($homepage) = View::create_from_template(array('group' => $id, 'title' => $template->get('title'), 'description' => $template->get('description'), 'type' => 'grouphomepage'), $t->id, 0, false); } insert_record('view_access', (object) array('view' => $homepage->get('id'), 'accesstype' => $data['public'] ? 'public' : 'loggedin', 'ctime' => db_format_timestamp(time()))); handle_event('creategroup', $data); db_commit(); return $id; }
/** * Create user * * @param object $user stdclass or User object for the usr table * @param array $profile profile field/values to set * @param string|object $institution Institution the user should joined to (name or Institution object) * @param bool $remoteauth authinstance record for a remote authinstance * @param string $remotename username on the remote site * @param array $accountprefs user account preferences to set * @return integer id of the new user */ function create_user($user, $profile = array(), $institution = null, $remoteauth = null, $remotename = null, $accountprefs = array(), $quickhash = false) { db_begin(); if ($user instanceof User) { $user->create(); $user->quota_init(); $user->commit(); $user = $user->to_stdclass(); } else { $user->ctime = db_format_timestamp(time()); // Ensure this user has a profile urlid if (get_config('cleanurls') && (!isset($user->urlid) || is_null($user->urlid))) { $user->urlid = generate_urlid($user->username, get_config('cleanurluserdefault'), 3, 30); $user->urlid = get_new_profile_urlid($user->urlid); } if (empty($user->quota)) { $user->quota = get_config_plugin('artefact', 'file', 'defaultquota'); } if (get_config('defaultaccountlifetime')) { // we need to set the user expiry to the site default one $user->expiry = date('Y-m-d', mktime(0, 0, 0, date('m'), date('d'), date('Y')) + (int) get_config('defaultaccountlifetime')); } $user->id = insert_record('usr', $user, 'id', true); } if (isset($user->email) && $user->email != '') { set_profile_field($user->id, 'email', $user->email, TRUE); } if (isset($user->firstname) && $user->firstname != '') { set_profile_field($user->id, 'firstname', $user->firstname, TRUE); } if (isset($user->lastname) && $user->lastname != '') { set_profile_field($user->id, 'lastname', $user->lastname, TRUE); } foreach ($profile as $k => $v) { if (in_array($k, array('firstname', 'lastname', 'email'))) { continue; } set_profile_field($user->id, $k, $v, TRUE); } if (!empty($institution)) { if (is_string($institution)) { $institution = new Institution($institution); } if ($institution->name != 'mahara') { $institution->addUserAsMember($user); // uses $user->newuser if (empty($accountprefs['licensedefault'])) { $accountprefs['licensedefault'] = LICENSE_INSTITUTION_DEFAULT; } } } $authobj = get_record('auth_instance', 'id', $user->authinstance); $authinstance = AuthFactory::create($authobj->id); // For legacy compatibility purposes, we'll also put the remote auth on there if it has been // specifically requested. if ($authinstance->needs_remote_username() || !empty($remoteauth)) { if (isset($remotename) && strlen($remotename) > 0) { $un = $remotename; } else { $un = $user->username; } // remote username must not already exist if (record_exists('auth_remote_user', 'remoteusername', $un, 'authinstance', $user->authinstance)) { throw new InvalidArgumentException("user_create: remoteusername already exists: ({$un}, {$user->authinstance})"); } insert_record('auth_remote_user', (object) array('authinstance' => $user->authinstance, 'remoteusername' => $un, 'localusr' => $user->id)); } // Set account preferences if (!empty($accountprefs)) { $expectedprefs = expected_account_preferences(); foreach ($expectedprefs as $eprefkey => $epref) { if (isset($accountprefs[$eprefkey]) && $accountprefs[$eprefkey] != $epref) { set_account_preference($user->id, $eprefkey, $accountprefs[$eprefkey]); } } } // Copy site views and collections to the new user's profile $userobj = new User(); $userobj->find_by_id($user->id); $userobj->copy_site_views_collections_to_new_user(); reset_password($user, false, $quickhash); handle_event('createuser', $user); db_commit(); return $user->id; }
function editview_submit(Pieform $form, $values) { global $new, $view, $SESSION, $urlallowed; $view->set('title', $values['title']); if (trim($values['description']) !== '') { // Add or update embedded images in the view description require_once 'embeddedimage.php'; $view->set('description', EmbeddedImage::prepare_embedded_images($values['description'], 'description', $view->get('id'))); } else { // deleting description $view->set('description', ''); } $view->set('tags', $values['tags']); if (isset($values['locked'])) { $view->set('locked', (int) $values['locked']); } if (isset($values['ownerformat']) && $view->get('owner')) { $view->set('ownerformat', $values['ownerformat']); } if (isset($values['anonymise'])) { $view->set('anonymise', (int) $values['anonymise']); } if (isset($values['urlid'])) { $view->set('urlid', strlen($values['urlid']) == 0 ? null : $values['urlid']); } else { if ($new && $urlallowed) { // Generate one automatically based on the title $desired = generate_urlid($values['title'], get_config('cleanurlviewdefault'), 3, 100); $ownerinfo = (object) array('owner' => $view->get('owner'), 'group' => $view->get('group')); $view->set('urlid', View::new_urlid($desired, $ownerinfo)); } } $SESSION->add_ok_msg(get_string('viewsavedsuccessfully', 'view')); $view->commit(); redirect('/view/blocks.php?id=' . $view->get('id')); }