]> git.mjollnir.org Git - moodle.git/commitdiff
webservice MDL-17135 add user selector for service to the administration
authorjerome <jerome>
Wed, 14 Oct 2009 09:47:48 +0000 (09:47 +0000)
committerjerome <jerome>
Wed, 14 Oct 2009 09:47:48 +0000 (09:47 +0000)
admin/external_service_users.php
admin/webservice/lib.php [new file with mode: 0644]
lang/en_utf8/webservice.php

index e3b7584c8f04b7ac858cf8d8415efe0d4c08483d..6a23fcb659abe327c78c44f22f4d81438e5c174a 100644 (file)
 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();
\ No newline at end of file
diff --git a/admin/webservice/lib.php b/admin/webservice/lib.php
new file mode 100644 (file)
index 0000000..741ec44
--- /dev/null
@@ -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;
+    }
+}
+
+?>
index a3114fa5099a01109bb93854d862486ab41e31f5..f0b9f3edffb2bc26b25b38729d32f588189174c2 100644 (file)
@@ -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';