From 772db6322b2e110449b49440fccf6ec004e5491d Mon Sep 17 00:00:00 2001 From: jerome Date: Wed, 14 Oct 2009 09:47:48 +0000 Subject: [PATCH] webservice MDL-17135 add user selector for service to the administration --- admin/external_service_users.php | 75 ++++++++++++++- admin/webservice/lib.php | 154 +++++++++++++++++++++++++++++++ lang/en_utf8/webservice.php | 5 + 3 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 admin/webservice/lib.php diff --git a/admin/external_service_users.php b/admin/external_service_users.php index e3b7584c8f..6a23fcb659 100644 --- a/admin/external_service_users.php +++ b/admin/external_service_users.php @@ -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 +?> +
+ + + + + + + + +
+

+ display() ?> +
+
+
+
+ +
+ +
+
+

+ display() ?> +
+
+ +footer(); \ No newline at end of file diff --git a/admin/webservice/lib.php b/admin/webservice/lib.php new file mode 100644 index 0000000000..741ec44f8a --- /dev/null +++ b/admin/webservice/lib.php @@ -0,0 +1,154 @@ +. + +/** + * 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; + } +} + +?> diff --git a/lang/en_utf8/webservice.php b/lang/en_utf8/webservice.php index a3114fa509..f0b9f3edff 100644 --- a/lang/en_utf8/webservice.php +++ b/lang/en_utf8/webservice.php @@ -13,6 +13,9 @@ $string['externalserviceusers'] = 'External service users'; $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\"?'; @@ -20,6 +23,8 @@ $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'; -- 2.39.5