From 1c0bd184d3b69b73794ee914d8d7d17d3b7c9a28 Mon Sep 17 00:00:00 2001
From: Tim Steiner <tsteiner2@unl.edu>
Date: Mon, 1 Aug 2011 20:56:15 +0000
Subject: [PATCH] [gh-188] Merging from testing into staging

git-svn-id: file:///tmp/wdn_thm_drupal/branches/drupal-7.x/staging@913 20a16fea-79d4-4915-8869-1ea9d5ebf173
---
 sites/all/modules/unl/includes/common.php   |  16 +++
 sites/all/modules/unl/unl.module            |   6 +
 sites/all/modules/unl/unl_site_creation.php | 149 ++++++++++++++------
 3 files changed, 127 insertions(+), 44 deletions(-)

diff --git a/sites/all/modules/unl/includes/common.php b/sites/all/modules/unl/includes/common.php
index 9bcc6fbe..dfca91b8 100644
--- a/sites/all/modules/unl/includes/common.php
+++ b/sites/all/modules/unl/includes/common.php
@@ -43,6 +43,22 @@ function unl_shared_variable_get($name, $default = NULL) {
   return unserialize($data[0]->value);
 }
 
+function unl_site_variable_get($db_prefix, $name, $default = NULL) {
+  $shared_prefix = unl_get_shared_db_prefix();
+  $data = db_query(
+    "SELECT * "
+    . "FROM {$db_prefix}_{$shared_prefix}variable "
+    . "WHERE name = :name",
+    array(':name' => $name)
+  )->fetchAll();
+
+  if (count($data) == 0) {
+    return $default;
+  }
+
+  return unserialize($data[0]->value);
+}
+
 /**
  * Given a URI, will return the name of the directory for that site in the sites directory.
  */
diff --git a/sites/all/modules/unl/unl.module b/sites/all/modules/unl/unl.module
index 1ee06bf4..02381dd3 100644
--- a/sites/all/modules/unl/unl.module
+++ b/sites/all/modules/unl/unl.module
@@ -373,6 +373,12 @@ function unl_menu() {
       'type'             => MENU_LOCAL_TASK,
       'file'             => 'unl_site_creation.php',
     );
+    
+    $items['admin/sites/unl/feed'] = array(
+      'page callback'   => 'unl_sites_feed',
+      'access callback' => TRUE,
+      'file'            => 'unl_site_creation.php',
+    );
   }
 
   return $items;
diff --git a/sites/all/modules/unl/unl_site_creation.php b/sites/all/modules/unl/unl_site_creation.php
index eeb32323..ef93eb32 100644
--- a/sites/all/modules/unl/unl_site_creation.php
+++ b/sites/all/modules/unl/unl_site_creation.php
@@ -695,51 +695,12 @@ function unl_user_audit($form, &$form_state) {
   // Otherwise, since we have a username, we can query the sub-sites and return a list of roles for each.
   $username = $form_state['values']['username'];
   
-  $sites = db_select('unl_sites', 's')
-    ->fields('s', array('site_id', 'db_prefix', 'installed', 'site_path', 'uri'))
-    ->execute()
-    ->fetchAll();
-  
   $audit_map = array();
-  foreach ($sites as $site) {
-    $shared_prefix = unl_get_shared_db_prefix();
-    $prefix = $site->db_prefix;
-    
-    try {
-      $site_settings = unl_get_site_settings($site->uri);
-      $site_db_config = $site_settings['databases']['default']['default'];
-      $roles_are_shared = is_array($site_db_config['prefix']) && array_key_exists('role', $site_db_config['prefix']);
-      
-      /*
-      // If the site uses shared roles, ignore it if the user wants us to.
-      if ($roles_are_shared && $form_state['values']['ignore_shared_roles']) {
-        continue;
-      }
-      */
-      
-      $role_names = db_query(
-        "SELECT r.name "
-        . "FROM {$prefix}_{$shared_prefix}users AS u "
-        . "JOIN {$prefix}_{$shared_prefix}users_roles AS m "
-        . "  ON u.uid = m.uid "
-        . 'JOIN ' . ($roles_are_shared ? '' : $prefix . '_') . $shared_prefix . 'role AS r '
-        . "  ON m.rid = r.rid "
-        . "WHERE u.name = :name",
-        array(':name' => $username)
-      )->fetchCol();
-      
-      if (count($role_names) == 0) {
-        continue;
-      }
-      
-      $audit_map[] = array(
-        'data' => l($site->uri, $site->uri),
-        'children' => $role_names,
-      );
-    } catch (Exception $e) {
-      // Either the site has no settings.php or the db_prefix is wrong.
-      drupal_set_message('Error querying database for site ' . $site->uri, 'warning');
-    } 
+  foreach (unl_get_site_user_map('username', $username) as $site_id => $site) {
+    $audit_map[] = array(
+      'data' => l($site['uri'], $site['uri']),
+      'children' => $site['roles'],
+    );
   }
   
   $form['results'] = array(
@@ -782,3 +743,103 @@ function theme_unl_table($variables) {
 
   return theme('table', $form);
 }
+
+/**
+ * Callback for URI admin/sites/unl/feed
+ */
+function unl_sites_feed() {
+  $data = unl_get_site_user_map('role', 'Site Admin', TRUE);
+  
+  header('Content-type: application/json');
+  echo json_encode($data);
+}
+
+/**
+ * Returns an array of lists of either roles a user belongs to or users belonging to a role.
+ * Each key is the URI of a site and the value is the list.
+ * If $list_empty_sites is set to TRUE, all sites will be listed, even if they have empty lists.
+ * 
+ * @param string $search_by (Either 'username' or 'role')
+ * @param mixed $username_or_role
+ * @param bool $list_empty_sites
+ * @throws Exception
+ */
+function unl_get_site_user_map($search_by, $username_or_role, $list_empty_sites = FALSE) {
+  if (!in_array($search_by, array('username', 'role'))) {
+    throw new Exception('Invalid argument for $search_by');
+  }
+  
+  $sites = db_select('unl_sites', 's')
+    ->fields('s', array('site_id', 'db_prefix', 'installed', 'site_path', 'uri'))
+    ->execute()
+    ->fetchAll();
+  
+  $audit_map = array();
+  foreach ($sites as $site) {
+    $shared_prefix = unl_get_shared_db_prefix();
+    $prefix = $site->db_prefix;
+    
+    try {
+      $site_settings = unl_get_site_settings($site->uri);
+      $site_db_config = $site_settings['databases']['default']['default'];
+      $roles_are_shared = is_array($site_db_config['prefix']) && array_key_exists('role', $site_db_config['prefix']);
+      
+      /*
+      // If the site uses shared roles, ignore it if the user wants us to.
+      if ($roles_are_shared && $form_state['values']['ignore_shared_roles']) {
+        continue;
+      }
+      */
+      
+      $bound_params = array();
+      $where = array();
+      
+      if ($search_by == 'username') {
+        $return_label = 'roles';
+        $select = 'r.name';
+        $where[] = 'u.name = :name';
+        $bound_params[':name'] = $username_or_role;
+      }
+      else {
+        $return_label = 'users';
+        $select = 'u.name';
+        $where[] = 'r.name = :role';
+        $bound_params[':role'] = $username_or_role;
+      }
+      
+      $query = "SELECT {$select} "
+             . "FROM {$prefix}_{$shared_prefix}users AS u "
+             . "JOIN {$prefix}_{$shared_prefix}users_roles AS m "
+             . "  ON u.uid = m.uid "
+             . 'JOIN ' . ($roles_are_shared ? '' : $prefix . '_') . $shared_prefix . 'role AS r '
+             . "  ON m.rid = r.rid ";
+      
+      if (count($where) > 0) {
+        $query .= 'WHERE ' . implode(' AND ', $where) . ' ';
+      }
+      
+      $role_names = db_query($query, $bound_params)->fetchCol();
+      
+      if (count($role_names) == 0 && !$list_empty_sites) {
+        continue;
+      }
+      
+      $primary_base_url = unl_site_variable_get($prefix, 'unl_primary_base_url');
+      if ($primary_base_url) {
+        $uri = $primary_base_url;
+      }
+      else {
+        $uri = $site->uri;
+      }
+      $audit_map[$site->site_id] = array(
+        'uri' => $uri,
+        $return_label => $role_names,
+      );
+    } catch (Exception $e) {
+      // Either the site has no settings.php or the db_prefix is wrong.
+      drupal_set_message('Error querying database for site ' . $site->uri, 'warning');
+    }
+  }
+  
+  return $audit_map;
+}
-- 
GitLab