/** * 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'))))); }
/** * Returns a list of grouptype options to be used in the edit * group drop-down. */ function group_get_grouptype_options($currentgrouptype = null) { $groupoptions = array(); $grouptypes = group_get_grouptypes(); $enabled = array_map(create_function('$a', 'return $a->name;'), plugins_installed('grouptype')); if (is_null($currentgrouptype) || in_array($currentgrouptype, $enabled)) { $grouptypes = array_intersect($enabled, $grouptypes); } foreach ($grouptypes as $grouptype) { safe_require('grouptype', $grouptype); if (call_static_method('GroupType' . $grouptype, 'can_be_created_by_user')) { $roles = array(); foreach (call_static_method('GroupType' . $grouptype, 'get_roles') as $role) { $roles[] = get_string($role, 'grouptype.' . $grouptype); } $groupoptions[$grouptype] = get_string('name', 'grouptype.' . $grouptype) . ': ' . join(', ', $roles); } } return $groupoptions; }
function editaccess_submit(Pieform $form, $values) { global $SESSION, $institution, $collections, $views, $view; if ($values['accesslist']) { $dateformat = get_string('strftimedatetimeshort'); foreach ($values['accesslist'] as &$item) { if (!empty($item['startdate'])) { $item['startdate'] = ptimetotime(strptime($item['startdate'], $dateformat)); } if (!empty($item['stopdate'])) { $item['stopdate'] = ptimetotime(strptime($item['stopdate'], $dateformat)); } } } $viewconfig = array('startdate' => $values['startdate'], 'stopdate' => $values['stopdate'], 'template' => (int) $values['template'], 'retainview' => isset($values['retainview']) ? (int) $values['retainview'] : 0, 'allowcomments' => (int) $values['allowcomments'], 'approvecomments' => (int) ($values['allowcomments'] && $values['approvecomments']), 'accesslist' => $values['accesslist']); $toupdate = array(); if ($institution) { if (isset($values['copynewuser'])) { $viewconfig['copynewuser'] = (int) $values['copynewuser']; } if ($institution == 'mahara') { $createfor = array(); foreach (group_get_grouptypes() as $grouptype) { if ($values['copyfornewgroups_' . $grouptype]) { $createfor[] = $grouptype; } } $viewconfig['copynewgroups'] = $createfor; } } if (isset($values['collections'])) { foreach ($values['collections'] as $cid) { if (!isset($collections[$cid])) { throw new UserException(get_string('editaccessinvalidviewset', 'view')); } $toupdate = array_merge($toupdate, array_keys($collections[$cid]['views'])); } } if (isset($values['views'])) { foreach ($values['views'] as $viewid) { if (!isset($views[$viewid])) { throw new UserException(get_string('editaccessinvalidviewset', 'view')); } $toupdate[] = $viewid; } } else { if ($view->get('type') == 'profile') { // Force default Advanced options $felements = $form->get_property('elements'); if (!empty($felements['more']['elements'])) { foreach (array_keys($felements['more']['elements']) as $ename) { if (property_exists($view, $ename)) { $viewconfig[$ename] = $view->get($ename); } } } $toupdate[] = $view->get('id'); } } if (!empty($toupdate)) { View::update_view_access($viewconfig, $toupdate); if ($view->get('type') == 'profile') { // Ensure the user's institutions are still added to the access list $view->add_owner_institution_access(); if (get_config('loggedinprofileviewaccess')) { // Force logged-in user access $viewaccess = new stdClass(); $viewaccess->accesstype = 'loggedin'; $view->add_access($viewaccess); } } } $SESSION->add_ok_msg(get_string('updatedaccessfornumviews', 'view', count($toupdate))); if ($view->get('owner')) { redirect('/view/share.php'); } if ($view->get('group')) { redirect(get_config('wwwroot') . '/group/shareviews.php?group=' . $view->get('group')); } if ($view->get('institution')) { redirect(get_config('wwwroot') . '/view/institutionshare.php?institution=' . $view->get('institution')); } $view->post_edit_redirect(); }
/** * 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']; }
define('INTERNAL', 1); define('JSON', 1); require dirname(dirname(__FILE__)) . '/init.php'; require_once 'group.php'; $data['error'] = false; $data['message'] = null; $initialgroups = param_integer_list('initialgroups', array()); $resultgroups = param_integer_list('resultgroups', array()); $userid = param_integer('userid'); $addtype = param_variable('addtype'); // Prevent group membership changing done by ordinary members, Tutors can only // add members to group and cannot remove anyone. Group admins can do anything. // With regard to invitation, both admins and tutors can invite people. $allgroups = array_unique(array_merge($initialgroups, $resultgroups)); $groupdata = get_records_select_assoc('group', 'id IN (' . join(',', array_fill(0, count($allgroups), '?')) . ')', $allgroups); foreach (group_get_grouptypes() as $grouptype) { safe_require('grouptype', $grouptype); } foreach ($allgroups as $groupid) { if (!($loggedinrole = group_user_access($groupid))) { json_reply('local', get_string('accessdenied', 'error')); } if ($loggedinrole == 'admin') { continue; } if (!in_array($loggedinrole, call_static_method('GroupType' . $groupdata[$groupid]->grouptype, 'get_view_assessing_roles'))) { json_reply('local', get_string('accessdenied', 'error')); } if (group_user_access($groupid, $userid) && in_array($groupid, array_diff($initialgroups, $resultgroups))) { json_reply('local', get_string('cantremovememberfromgroup', 'group', hsc($groupdata[$groupid]->name))); }
function editaccess_submit(Pieform $form, $values) { global $SESSION, $view, $new, $institution, $collection; if (param_boolean('back')) { if (!$collection) { redirect('/view/edit.php?id=' . $view->get('id') . '&new=' . $new); } else { redirect('/collection/views.php?id=' . $collection->get('id') . '&new=' . $new); } } if ($values['accesslist']) { $dateformat = get_string('strftimedatetimeshort'); foreach ($values['accesslist'] as &$item) { if (!empty($item['startdate'])) { $item['startdate'] = ptimetotime(strptime($item['startdate'], $dateformat)); } if (!empty($item['stopdate'])) { $item['stopdate'] = ptimetotime(strptime($item['stopdate'], $dateformat)); } } } $view->set('startdate', $values['startdate']); $view->set('stopdate', $values['stopdate']); $istemplate = (int) $values['template']; $view->set('template', $istemplate); if (isset($values['copynewuser'])) { $view->set('copynewuser', (int) ($istemplate && $values['copynewuser'])); } if ($institution == 'mahara') { $createfor = array(); foreach (group_get_grouptypes() as $grouptype) { if ($istemplate && $values['copyfornewgroups_' . $grouptype]) { $createfor[] = $grouptype; } } $view->set('copynewgroups', $createfor); } $view->set('allowcomments', (int) $values['allowcomments']); if ($values['allowcomments']) { $view->set('approvecomments', (int) $values['approvecomments']); } db_begin(); $view->commit(); $view->set_access($values['accesslist']); if ($collection) { $collection->set_access($view->get('id')); } db_commit(); if ($values['new']) { $str = $collection ? get_string('collectioncreatedsuccessfully', 'collection') : get_string('viewcreatedsuccessfully', 'view'); } else { $str = $collection ? get_string('collectionaccesseditedsuccessfully', 'collection') : get_string('viewaccesseditedsuccessfully', 'view'); } $SESSION->add_ok_msg($str); if (!$collection) { $view->post_edit_redirect(); } else { $collection->post_edit_redirect(); } }
/** * Returns a list of grouptype & jointype options to be used in create * group/edit group drop-downs. * * If there is more than one group type with the same join type, * prefix the join types with the group type for display. */ function group_get_grouptype_options($currentgrouptype = null) { $groupoptions = array(); $jointypecount = array('open' => 0, 'invite' => 0, 'request' => 0, 'controlled' => 0); $grouptypes = group_get_grouptypes(); $enabled = array_map(create_function('$a', 'return $a->name;'), plugins_installed('grouptype')); if (is_null($currentgrouptype) || in_array($currentgrouptype, $enabled)) { $grouptypes = array_intersect($enabled, $grouptypes); } foreach ($grouptypes as $grouptype) { safe_require('grouptype', $grouptype); if (call_static_method('GroupType' . $grouptype, 'can_be_created_by_user')) { $grouptypename = get_string('name', 'grouptype.' . $grouptype); foreach (call_static_method('GroupType' . $grouptype, 'allowed_join_types') as $jointype) { $jointypecount[$jointype]++; $groupoptions['jointype']["{$grouptype}.{$jointype}"] = get_string('membershiptype.' . $jointype, 'group'); $groupoptions['grouptype']["{$grouptype}.{$jointype}"] = $grouptypename . ': ' . get_string('membershiptype.' . $jointype, 'group'); } } } $duplicates = array_reduce($jointypecount, create_function('$a, $b', 'return $a || $b > 1;')); if ($duplicates) { return $groupoptions['grouptype']; } return $groupoptions['jointype']; }
function editaccess_submit(Pieform $form, $values) { global $SESSION, $view, $new, $group, $institution; if (param_boolean('back')) { redirect('/view/blocks.php?id=' . $view->get('id') . '&new=' . $new); } $view->set_access($values['accesslist']); $view->set('startdate', $values['startdate']); $view->set('stopdate', $values['stopdate']); $istemplate = (int) $values['template']; $view->set('template', $istemplate); if (isset($values['copynewuser'])) { $view->set('copynewuser', (int) ($istemplate && $values['copynewuser'])); } if ($institution == 'mahara') { $createfor = array(); foreach (group_get_grouptypes() as $grouptype) { if ($istemplate && $values['copyfornewgroups_' . $grouptype]) { $createfor[] = $grouptype; } } $view->set('copynewgroups', $createfor); } $view->commit(); if ($values['new']) { $str = get_string('viewcreatedsuccessfully', 'view'); } else { $str = get_string('viewaccesseditedsuccessfully', 'view'); } $SESSION->add_ok_msg($str); if ($group) { redirect('/view/groupviews.php?group=' . $group); } if ($institution) { redirect('/view/institutionviews.php?institution=' . $institution); } redirect('/view/'); }