/** * parameter definition for output of get_groups_by_id method * * Returns description of method result value * @return external_multiple_structure */ public static function get_groups_by_id_returns() { $group_types = group_get_grouptypes(); $group_edit_roles = array_keys(group_get_editroles_options()); return new external_multiple_structure(new external_single_structure(array('id' => new external_value(PARAM_NUMBER, 'ID of the group'), 'name' => new external_value(PARAM_RAW, 'Group name'), 'shortname' => new external_value(PARAM_RAW, 'Group shortname for API only controlled groups'), 'description' => new external_value(PARAM_NOTAGS, 'Group description'), 'institution' => new external_value(PARAM_TEXT, 'Mahara institution - required for API controlled groups'), 'grouptype' => new external_value(PARAM_ALPHANUMEXT, 'Group type: ' . implode(',', $group_types)), 'category' => new external_value(PARAM_TEXT, 'Group category - the title of an existing group category'), 'editroles' => new external_value(PARAM_ALPHANUMEXT, 'Edit roles allowed: ' . implode(',', $group_edit_roles)), 'open' => new external_value(PARAM_INTEGER, 'Boolean 1/0 open - Users can join the group without approval from group administrators'), 'controlled' => new external_value(PARAM_INTEGER, 'Boolean 1/0 controlled - Group administrators can add users to the group without their consent, and members cannot choose to leave'), 'request' => new external_value(PARAM_INTEGER, 'Boolean 1/0 request - Users can send membership requests to group administrators'), 'submitpages' => new external_value(PARAM_INTEGER, 'Boolean 1/0 submitpages - Members can submit pages to the group'), 'public' => new external_value(PARAM_INTEGER, 'Boolean 1/0 public group'), 'viewnotify' => new external_value(PARAM_INTEGER, 'Boolean 1/0 for Shared page notifications'), 'usersautoadded' => new external_value(PARAM_INTEGER, 'Boolean 1/0 for auto-adding users'), 'members' => new external_multiple_structure(new external_single_structure(array('id' => new external_value(PARAM_NUMBER, 'member user Id'), 'username' => new external_value(PARAM_RAW, 'member username'), 'role' => new external_value(PARAM_ALPHANUMEXT, 'member role: admin, ')), 'Group membership'))))); }
$elements['groupparticipationreports'] = array('type' => 'switchbox', 'title' => get_string('groupparticipationreports', 'group'), 'description' => get_string('groupparticipationreportsdesc1', 'group'), 'defaultvalue' => $group_data->groupparticipationreports); $elements['editability'] = array('type' => 'html', 'value' => '<h4>' . get_string('editability', 'group') . '</h4>'); $currentdate = getdate(); $elements['editwindowstart'] = array('type' => 'date', 'class' => 'five-across hide-label', 'title' => get_string('windowstart', 'group'), 'defaultvalue' => $group_data->editwindowstart, 'description' => get_string('windowstartdesc', 'group'), 'minyear' => $currentdate['year'], 'maxyear' => $currentdate['year'] + 20, 'time' => true); $elements['editwindowend'] = array('type' => 'date', 'class' => 'five-across hide-label', 'title' => get_string('windowend', 'group'), 'defaultvalue' => $group_data->editwindowend, 'description' => get_string('windowenddesc', 'group'), 'minyear' => $currentdate['year'], 'maxyear' => $currentdate['year'] + 20, 'time' => true); $elements['general'] = array('type' => 'html', 'value' => '<h4>' . get_string('general') . '</h4>'); if (get_config('allowgroupcategories') && ($groupcategories = get_records_menu('group_category', '', '', 'displayorder', 'id,title'))) { $elements['category'] = array('type' => 'select', 'title' => get_string('groupcategory', 'group'), 'options' => array('0' => get_string('nocategoryselected', 'group')) + $groupcategories, 'defaultvalue' => $group_data->category); // If it's a new group & the category was passed as a parameter, hide it in the form. $groupcategoryparam = param_integer('category', 0); if (!$id && isset($groupcategories[$groupcategoryparam])) { $form['elements']['category'] = array('type' => 'hidden', 'value' => $groupcategoryparam); } } $elements['usersautoadded'] = array('type' => 'switchbox', 'title' => get_string('usersautoadded', 'group'), 'description' => get_string('usersautoaddeddescription1', 'group'), 'defaultvalue' => $group_data->usersautoadded, 'help' => true, 'ignore' => !$USER->get('admin')); $notifyroles = array(get_string('none', 'admin')) + group_get_editroles_options(true); $elements['viewnotify'] = array('type' => 'select', 'title' => get_string('viewnotify', 'group'), 'options' => $notifyroles, 'description' => get_string('viewnotifydescription2', 'group'), 'defaultvalue' => $group_data->viewnotify); $elements['feedbacknotify'] = array('type' => 'select', 'title' => get_string('feedbacknotify', 'group'), 'options' => $notifyroles, 'description' => get_string('feedbacknotifydescription1', 'group'), 'defaultvalue' => $group_data->feedbacknotify); if ($cancreatecontrolled) { $elements['sendnow'] = array('type' => 'switchbox', 'title' => get_string('allowsendnow', 'group'), 'description' => get_string('allowsendnowdescription1', 'group'), 'defaultvalue' => $group_data->sendnow); } else { $form['elements']['sendnow'] = array('type' => 'hidden', 'value' => $group_data->sendnow); } $form['elements']['settings']['elements'] = $elements; $editgroup = pieform($form); function editgroup_validate(Pieform $form, $values) { global $group_data; if ($group_data->name != $values['name']) { // This check has not always been case-insensitive; don't use get_record in case we get >1 row back. if ($ids = get_records_sql_array('SELECT id FROM {group} WHERE LOWER(TRIM(name)) = ?', array(strtolower(trim($values['name']))))) {
/** * Create a test group * @param array $record * @throws ErrorException if creating failed * @return int new group id */ public function create_group($record) { // Data validation $record['name'] = trim($record['name']); if ($ids = get_records_sql_array('SELECT id FROM {group} WHERE LOWER(TRIM(name)) = ?', array(strtolower($record['name'])))) { if (count($ids) > 1 || $ids[0]->id != $group_data->id) { throw new SystemException("Invalid group name '" . $record['name'] . "'. " . get_string('groupalreadyexists', 'group')); } } $record['owner'] = trim($record['owner']); $ids = get_records_sql_array('SELECT id FROM {usr} WHERE LOWER(TRIM(username)) = ?', array(strtolower($record['owner']))); if (!$ids || count($ids) > 1) { throw new SystemException("Invalid group owner '" . $record['owner'] . "'. The username does not exist or duplicated"); } $members = array($ids[0]->id => 'admin'); if (!empty($record['members'])) { foreach (explode(',', $record['members']) as $membername) { $ids = get_records_sql_array('SELECT id FROM {usr} WHERE LOWER(TRIM(username)) = ?', array(strtolower(trim($membername)))); if (!$ids || count($ids) > 1) { throw new SystemException("Invalid group member '" . $membername . "'. The username does not exist or duplicated"); } $members[$ids[0]->id] = 'member'; } } if (!empty($record['staff'])) { foreach (explode(',', $record['staff']) as $membername) { $ids = get_records_sql_array('SELECT id FROM {usr} WHERE LOWER(TRIM(username)) = ?', array(strtolower(trim($membername)))); if (!$ids || count($ids) > 1) { throw new SystemException("Invalid group staff '" . $membername . "'. The username does not exist or duplicated"); } $members[$ids[0]->id] = 'staff'; } } if (!empty($record['admins'])) { foreach (explode(',', $record['admins']) as $membername) { $ids = get_records_sql_array('SELECT id FROM {usr} WHERE LOWER(TRIM(username)) = ?', array(strtolower(trim($membername)))); if (!$ids || count($ids) > 1) { throw new SystemException("Invalid group admin '" . $membername . "'. The username does not exist or duplicated"); } $members[$ids[0]->id] = 'admin'; } } $availablegrouptypes = group_get_grouptypes(); if (!in_array($record['grouptype'], $availablegrouptypes)) { throw new SystemException("Invalid grouptype '" . $record['grouptype'] . "'. This grouptype does not exist.\n" . "The available grouptypes are " . join(', ', $availablegrouptypes)); } $availablegroupeditroles = array_keys(group_get_editroles_options()); if (!in_array($record['editroles'], $availablegroupeditroles)) { throw new SystemException("Invalid group editroles '" . $record['editroles'] . "'. This edit role does not exist.\n" . "The available group editroles are " . join(', ', $availablegroupeditroles)); } if (!empty($record['open'])) { if (!empty($record['controlled'])) { throw new SystemException('Invalid group membership setting. ' . get_string('membershipopencontrolled', 'group')); } if (!empty($record['request'])) { throw new SystemException('Invalid group membership setting. ' . get_string('membershipopenrequest', 'group')); } } if (!empty($record['invitefriends']) && !empty($record['suggestfriends'])) { throw new SystemException('Invalid friend invitation setting. ' . get_string('suggestinvitefriends', 'group')); } if (!empty($record['suggestfriends']) && empty($record['open']) && empty($record['request'])) { throw new SystemException('Invalid friend invitation setting. ' . get_string('suggestfriendsrequesterror', 'group')); } if (!empty($record['editwindowstart']) && !empty($record['editwindowend']) && $record['editwindowstart'] >= $record['editwindowend']) { throw new SystemException('Invalid group editability setting. ' . get_string('editwindowendbeforestart', 'group')); } $group_data = array('id' => null, 'name' => $record['name'], 'description' => isset($record['description']) ? $record['description'] : null, 'grouptype' => $record['grouptype'], 'open' => isset($record['open']) ? $record['open'] : 1, 'controlled' => isset($record['controlled']) ? $record['controlled'] : 0, 'request' => isset($record['request']) ? $record['request'] : 0, 'invitefriends' => isset($record['invitefriends']) ? $record['invitefriends'] : 0, 'suggestfriends' => isset($record['suggestfriends']) ? $record['suggestfriends'] : 0, 'category' => null, 'public' => 0, 'usersautoadded' => 0, 'viewnotify' => GROUP_ROLES_ALL, 'submittableto' => isset($record['submittableto']) ? $record['submittableto'] : 0, 'allowarchives' => isset($record['allowarchives']) ? $record['allowarchives'] : 0, 'editroles' => isset($record['editroles']) ? $record['editroles'] : 'all', 'hidden' => 0, 'hidemembers' => 0, 'hidemembersfrommembers' => 0, 'groupparticipationreports' => 0, 'urlid' => null, 'editwindowstart' => isset($record['editwindowstart']) ? $record['editwindowstart'] : null, 'editwindowend' => isset($record['editwindowend']) ? $record['editwindowend'] : null, 'sendnow' => 0, 'feedbacknotify' => GROUP_ROLES_ALL, 'members' => $members); // Create a new group db_begin(); $group_data['id'] = group_create($group_data); db_commit(); $this->groupcount++; return $group_data['id']; }
/** * 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; }
require_once get_config('libroot') . 'institution.php'; safe_require('artefact', 'internal'); raise_memory_limit("512M"); // Turn on autodetecting of line endings, so mac newlines (\r) will work ini_set('auto_detect_line_endings', 1); $FORMAT = array(); $ALLOWEDKEYS = array('shortname', 'displayname', 'description', 'open', 'controlled', 'request', 'roles', 'public', 'submitpages', 'allowarchives', 'editroles', 'hidden', 'hidemembers', 'hidemembersfrommembers', 'invitefriends', 'suggestfriends'); if ($USER->get('admin')) { $ALLOWEDKEYS[] = 'usersautoadded'; $ALLOWEDKEYS[] = 'quota'; } $MANDATORYFIELDS = array('shortname', 'displayname', 'roles'); $UPDATES = array(); // During validation, remember which group already exist $GROUPTYPES = group_get_grouptype_options(); $EDITROLES = group_get_editroles_options(); $form = array('name' => 'uploadcsv', 'elements' => array('institution' => get_institution_selector(), 'file' => array('type' => 'file', 'title' => get_string('csvfile', 'admin'), 'description' => get_string('groupcsvfiledescription', 'admin'), 'accept' => '.csv, text/csv, application/csv, text/comma-separated-values', 'rules' => array('required' => true)), 'updategroups' => array('type' => 'checkbox', 'title' => get_string('updategroups', 'admin'), 'description' => get_string('updategroupsdescription', 'admin'), 'defaultvalue' => false), 'submit' => array('type' => 'submit', 'value' => get_string('uploadgroupcsv', 'admin')))); /** * The CSV file is parsed here so validation errors can be returned to the * user. The data from a successful parsing is stored in the <var>$CVSDATA</var> * array so it can be accessed by the submit function * * @param Pieform $form The form to validate * @param array $values The values submitted */ function uploadcsv_validate(Pieform $form, $values) { global $CSVDATA, $ALLOWEDKEYS, $MANDATORYFIELDS, $GROUPTYPES, $FORMAT, $USER, $UPDATES, $EDITROLES; // Don't even start attempting to parse if there are previous errors if ($form->has_errors()) { return;