Skip to content

Commit

Permalink
webservice MDL-17135 add user selector for service to the administration
Browse files Browse the repository at this point in the history
  • Loading branch information
jerome committed Oct 14, 2009
1 parent 1c4eef5 commit 772db63
Show file tree
Hide file tree
Showing 3 changed files with 233 additions and 1 deletion.
75 changes: 74 additions & 1 deletion admin/external_service_users.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,86 @@
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once('external_forms.php');
require_once($CFG->dirroot.'/admin/webservice/lib.php');

$id = required_param('id', PARAM_INT);

$PAGE->set_url('admin/external_service_users.php', array('id'=>$id));

admin_externalpage_setup('externalserviceusers');
admin_externalpage_print_header();

echo('TODO: we need something like the role assign UI');
/// Get the user_selector we will need.
$potentialuserselector = new service_potential_user_selector('addselect', array('serviceid' => $id));
$alloweduserselector = new service_allowed_user_selector('removeselect', array('serviceid' => $id));

/// Process incoming user assignments to the service
if (optional_param('add', false, PARAM_BOOL) && confirm_sesskey()) {
$userstoassign = $potentialuserselector->get_selected_users();
if (!empty($userstoassign)) {

foreach ($userstoassign as $adduser) {
varlog($adduser);
global $DB;
$serviceuser = new object();
$serviceuser->externalserviceid = $id;
$serviceuser->userid = $adduser->id;
$serviceuser->timecreated = mktime();
$DB->insert_record('external_services_users', $serviceuser);
add_to_log(1, 'core', 'assign', 'admin/external_service_users.php?id='.$id, 'add', '', $adduser->id);
}

$potentialuserselector->invalidate_selected_users();
$alloweduserselector->invalidate_selected_users();
}
}

/// Process removing user assignments to the service
if (optional_param('remove', false, PARAM_BOOL) && confirm_sesskey()) {
$userstoremove = $alloweduserselector->get_selected_users();
if (!empty($userstoremove)) {

foreach ($userstoremove as $removeuser) {
varlog($removeuser);
global $DB;
$DB->delete_records('external_services_users', array('externalserviceid' => $id, 'userid' => $removeuser->id));
add_to_log(1, 'core', 'assign', 'admin/external_service_users.php?id='.$id, 'remove', '', $removeuser->id);
}

$potentialuserselector->invalidate_selected_users();
$alloweduserselector->invalidate_selected_users();
}
}


/// display the UI
?>
<form id="assignform" method="post" action="external_service_users.php?id=<?php echo $id ?>"><div>
<input type="hidden" name="sesskey" value="<?php echo sesskey() ?>" />

<table summary="" class="roleassigntable generaltable generalbox boxaligncenter" cellspacing="0">
<tr>
<td id="existingcell">
<p><label for="removeselect"><?php print_string('serviceusers', 'webservice'); ?></label></p>
<?php $alloweduserselector->display() ?>
</td>
<td id="buttonscell">
<div id="addcontrols">
<input name="add" id="add" type="submit" value="<?php echo $THEME->larrow.'&nbsp;'.get_string('add'); ?>" title="<?php print_string('add'); ?>" /><br />
</div>

<div id="removecontrols">
<input name="remove" id="remove" type="submit" value="<?php echo get_string('remove').'&nbsp;'.$THEME->rarrow; ?>" title="<?php print_string('remove'); ?>" />
</div>
</td>
<td id="potentialcell">
<p><label for="addselect"><?php print_string('potusers', 'webservice'); ?></label></p>
<?php $potentialuserselector->display() ?>
</td>
</tr>
</table>
</div></form>

<?php

echo $OUTPUT->footer();
154 changes: 154 additions & 0 deletions admin/webservice/lib.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Web services admin library
*
* @package webservice
* @copyright 2009 Moodle Pty Ltd (http://moodle.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

require_once($CFG->dirroot . '/user/selector/lib.php');

class service_allowed_user_selector extends user_selector_base {
const MAX_USERS_PER_PAGE = 100;

protected $serviceid;

public function __construct($name, $options) {
parent::__construct($name, $options);
if (!empty($options['serviceid'])) {
$this->serviceid = $options['serviceid'];
} else {
throw new moodle_exception('serviceidnotfound');
}
}

public function find_users($search) {
global $DB;

list($wherecondition, $params) = $this->search_sql($search, 'u'); //by default wherecondition retrieves
//all users except the deleted, not confirmed and guest
$params[] = $this->serviceid;

///the following SQL retrieve all users that are allowed to the serviceid
$fields = 'SELECT ' . $this->required_fields_sql('u');
$countfields = 'SELECT COUNT(1)';

$sql = " FROM {user} u, {external_services_users} esu
WHERE $wherecondition
AND esu.userid = u.id
AND esu.externalserviceid = ?";

$order = ' ORDER BY u.lastname ASC, u.firstname ASC';

if (!$this->is_validating()) {
$potentialmemberscount = $DB->count_records_sql($countfields . $sql, $params);
if ($potentialmemberscount > service_allowed_user_selector::MAX_USERS_PER_PAGE) {
return $this->too_many_results($search, $potentialmemberscount);
}
}

$availableusers = $DB->get_records_sql($fields . $sql . $order, $params);

if (empty($availableusers)) {
return array();
}

if ($search) {
$groupname = get_string('serviceusersmatching', 'webservice', $search);
} else {
$groupname = get_string('serviceusers', 'webservice');
}

return array($groupname => $availableusers);
}

protected function get_options() {
global $CFG;
$options = parent::get_options();
$options['file'] = '/admin/webservice/lib.php'; //need to be set, otherwise the /user/selector/search.php
//will fail to find this user_selector class
$options['serviceid'] = $this->serviceid;
return $options;
}
}

class service_potential_user_selector extends user_selector_base {
const MAX_USERS_PER_PAGE = 100;

protected $serviceid;

public function __construct($name, $options) {
parent::__construct($name, $options);
if (!empty($options['serviceid'])) {
$this->serviceid = $options['serviceid'];
}
else {
throw new moodle_exception('serviceidnotfound');
}
}

public function find_users($search) {
global $DB;

list($wherecondition, $params) = $this->search_sql($search, 'u'); //by default wherecondition retrieves
//all users except the deleted, not confirmed and guest
$params[] = $this->serviceid;
///the following SQL retrieve all users that are not allowed to the serviceid
$fields = 'SELECT ' . $this->required_fields_sql('u');
$countfields = 'SELECT COUNT(1)';

$sql = " FROM {user} u WHERE $wherecondition
AND NOT EXISTS (SELECT esu.userid FROM {external_services_users} esu
WHERE esu.externalserviceid = ?
AND esu.userid = u.id)";
$order = ' ORDER BY lastname ASC, firstname ASC';

if (!$this->is_validating()) {
$potentialmemberscount = $DB->count_records_sql($countfields . $sql, $params);
if ($potentialmemberscount > service_potential_user_selector::MAX_USERS_PER_PAGE) {
return $this->too_many_results($search, $potentialmemberscount);
}
}

$availableusers = $DB->get_records_sql($fields . $sql . $order, $params);

if (empty($availableusers)) {
return array();
}

if ($search) {
$groupname = get_string('potusersmatching', 'webservice', $search);
} else {
$groupname = get_string('potusers', 'webservice');
}

return array($groupname => $availableusers);
}

protected function get_options() {
global $CFG;
$options = parent::get_options();
$options['file'] = '/admin/webservice/lib.php'; //need to be set, otherwise the /user/selector/search.php
//will fail to find this user_selector class
$options['serviceid'] = $this->serviceid;
return $options;
}
}

?>
5 changes: 5 additions & 0 deletions lang/en_utf8/webservice.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,18 @@
$string['function'] = 'Function';
$string['functions'] = 'Functions';
$string['manageprotocols'] = 'Manage protocols';
$string['nouserrestriction'] = 'No restriction';
$string['potusers'] = 'Potential users';
$string['potusersmatching'] = 'Potential users matching';
$string['protocol'] = 'Protocol';
$string['removefunction'] = 'Remove';
$string['removefunctionconfirm'] = 'Do you really want to remove function \"$a->function\" from service \"$a->service\"?';
$string['requiredcapability'] = 'Required capability';
$string['restrictedusers'] = 'Restricted users';
$string['servicesbuiltin'] = 'Built-in services';
$string['servicescustom'] = 'Custom services';
$string['serviceusers'] = 'Allowed users';
$string['serviceusersmatching'] = 'Allowed users matching';
$string['test'] = 'Test';
$string['testclient'] = 'Test client';
$string['webservices'] = 'Web services';

0 comments on commit 772db63

Please sign in to comment.