Index: advpoll.module
===================================================================
--- advpoll.module	2009-05-12 11:45:04.000000000 -0400
+++ advpoll.module.withroles.php	2009-05-12 11:44:57.000000000 -0400
@@ -147,6 +147,15 @@ function advpoll_menu() {
     'type' => MENU_CALLBACK,
   );

+  // Allow roles to be removed.
+  $menu['node/%node/removerole'] = array(
+    'page callback' => 'advpoll_remove_role',
+    'page arguments' => array(1),
+    'access arguments' => array('administer polls'),
+    'weight' => 3,
+    'type' => MENU_CALLBACK,
+  );
+
   // Allow votes to be cleared.
   $menu['node/%node/votes/clear'] = array(
     'page callback' => 'advpoll_clear_votes_page',
@@ -878,7 +887,7 @@ function advpoll_electoral_list_page($no

   $header[] = array('data' => t('Voter'), 'field' => 'u.name');

-  $result = pager_query("SELECT u.uid, u.name FROM {advpoll_electoral_list} el LEFT JOIN {users} u ON el.uid = u.uid WHERE el.nid = %d". tablesort_sql($header), 20, 0, NULL, $node->nid);
+  $result = pager_query("SELECT u.uid, u.name FROM {advpoll_electoral_list} el LEFT JOIN {users} u ON el.uid = u.uid WHERE el.uid IS NOT NULL AND el.nid = %d". tablesort_sql($header), 20, 0, NULL, $node->nid);
   $table_rows = array();
   while ($voter = db_fetch_object($result)) {
     $row = array(
@@ -893,6 +902,27 @@ function advpoll_electoral_list_page($no
   }
   $output .= theme('table', $header, $table_rows);
   $output .= theme('pager', NULL, 20, 0);
+
+  $output .= '<p>'. t('This table lists all the eligible roles for this poll.') .'</p>';
+
+  unset($header);
+  $header[] = array('data' => t('Role'), 'field' => 'r.name');
+
+  $result = pager_query("SELECT r.rid, r.name FROM {advpoll_electoral_list} el LEFT JOIN {role} r ON el.rid = r.rid WHERE el.rid IS NOT NULL AND el.nid = %d". tablesort_sql($header), 20, 0, NULL, $node->nid);
+  $table_rows = array();
+  while ($voter_role = db_fetch_object($result)) {
+    $row = array(
+      theme('advpoll_role', $voter_role),
+    );
+
+    if (user_access('administer polls')) {
+      $row[] = l(t('remove'), 'node/'. $node->nid .'/removerole/'. $voter_role->rid);
+    }
+
+    $table_rows[] = $row;
+  }
+  $output .= theme('table', $header, $table_rows);
+  $output .= theme('pager', NULL, 20, 0);
   print theme('page', $output);
 }

@@ -904,6 +934,28 @@ function advpoll_electoral_list_form(&$f
     '#collapsible' => TRUE,
     '#weight' => 2,
   );
+
+  // List all roles with "vote on polls" permission, but don't include anonymous users.
+  $result = db_query("SELECT r.name, r.rid FROM {role} r LEFT JOIN {permission} p ON p.rid = r.rid WHERE p.perm LIKE '%vote on polls%' AND r.rid <> 1 ORDER BY r.name");
+  while ($role = db_fetch_object($result)) {
+    $role_options[$role->rid] = $role->name;
+  }
+
+  // get current roles
+  $current_roles = array();
+  $result = db_query("SELECT rid FROM {advpoll_electoral_list} WHERE rid IS NOT NULL AND nid = %d", $nid);
+  while ($role = db_fetch_object($result)) {
+    $current_roles[$role->rid] = $role->rid;
+  }
+
+  $form['electoral_list']['add_entire_role'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Roles'),
+    '#options' => $role_options,
+    '#description' => t('Add a role to the electoral list. Only roles that have the "vote on polls" permission are listed.'),
+    '#default_value' => $current_roles,
+  );
+
   $form['electoral_list']['add_user'] = array(
     '#type' => 'textfield',
     '#title' => t('Add user'),
@@ -916,19 +968,6 @@ function advpoll_electoral_list_form(&$f
     $form['electoral_list']['add_user']['#autocomplete_path'] = 'user/autocomplete';
   }

-  // List all roles with "vote on polls" permission, but don't include anonymous users.
-  $result = db_query("SELECT r.name, r.rid FROM {role} r LEFT JOIN {permission} p ON p.rid = r.rid WHERE p.perm LIKE '%vote on polls%' AND r.rid <> 1 ORDER BY r.name");
-  $role_options = array(0 => t('(Select a role)'));
-  while ($role = db_fetch_object($result)) {
-    $role_options[$role->rid] = $role->name;
-  }
-
-  $form['electoral_list']['add_role'] = array(
-    '#type' => 'select',
-    '#title' => t('Add users by role'),
-    '#description' => t('Only roles that have the "vote on polls" permission are listed.'),
-    '#options' => $role_options,
-  );
   $form['electoral_list']['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Add to electoral list'),
@@ -962,6 +1001,25 @@ function advpoll_remove_voter() {
 }

 /**
+ * Remove an individual role from the electoral list.
+ */
+function advpoll_remove_role() {
+  $nid = arg(1);
+  $rid = arg(3);
+  if ($rid && $node = node_load($nid)) {
+    $result = db_query('SELECT name FROM {role} WHERE rid = %d', $rid);
+    if ($role = db_fetch_object($result)) {
+      db_query('DELETE FROM {advpoll_electoral_list} WHERE nid = %d AND rid = %d', $nid, $rid);
+      drupal_set_message(t('"%role" role removed from the electoral list.', array('%role' => $role->name)));
+    }
+    else {
+      drupal_set_message(t('No role found with a rid of %rid.', array('%rid' => $uid)));
+    }
+  }
+  drupal_goto('node/'. $node->nid .'/electoral_list');
+}
+
+/**
  * Validate changes to the electoral list.
  */
 function advpoll_electoral_list_form_validate($form, &$form_state) {
@@ -969,10 +1027,23 @@ function advpoll_electoral_list_form_val
     if (user_access('administer polls')) {
       db_query('DELETE FROM {advpoll_electoral_list} WHERE nid = %d', $form_state['values']['nid']);
       drupal_set_message(t('Electoral list cleared.'));
+      drupal_goto('node/'. $form_state['values']['nid'] .'/electoral_list');
       return;
     }
   }

+  $add_entire_role = $form_state['values']['electoral_list']['add_entire_role'];
+  if ($add_entire_role) {
+  foreach ($add_entire_role as $role_id) {
+    if (!$role_id) continue;
+      $result = db_query("SELECT r.name, r.rid FROM {role} r LEFT JOIN {permission} p ON p.rid = r.rid WHERE p.perm LIKE '%vote on polls%' AND r.rid <> 1 AND r.rid = '%d' ", $role_id);
+      if (!db_fetch_object($result)) {
+        form_set_error('electoral_list][add_entire_role', t('Role does not exist.'));
+        return FALSE;
+      } // found role?
+  } // loop thru roles
+  } // got roles?
+
   $add_user = $form_state['values']['electoral_list']['add_user'];
   if ($add_user) {
     // Check that the user exists
@@ -994,10 +1065,36 @@ function advpoll_electoral_list_form_sub
     drupal_set_message(t('%user added to electoral list.', array('%user' => $add_user)));
   }

+  // ALTER TABLE `advpoll_electoral_list` ADD `rid` INT NULL ;
+  // ALTER TABLE `advpoll_electoral_list` DROP PRIMARY KEY ;
+  // ALTER TABLE `advpoll_electoral_list` CHANGE `uid` `uid` INT( 11 ) NULL ;
+  // ALTER TABLE `advpoll_electoral_list` ADD UNIQUE (`nid` ,`uid`);
+  // ALTER TABLE `advpoll_electoral_list` ADD UNIQUE (`nid` ,`rid`);
+
+  $add_entire_role = $form_state['values']['electoral_list']['add_entire_role'];
+  if ($add_entire_role) {
+    // clear the roles from the existing list first
+    $result = db_query("DELETE FROM {advpoll_electoral_list} WHERE nid= '%d' AND rid IS NOT NULL", $form_state['values']['nid']);
+    if (db_affected_rows($result)) {
+      $msg = t('Electoral roles list cleared');
+    }
+    foreach ($add_entire_role as $i => $role_id) {
+      if (!$role_id) unset($add_entire_role[$i]);
+    }
+    $role_list = implode(',', $add_entire_role);
+    if ($role_list) {
+    // insert the new list
+      if ($result = db_query("INSERT INTO {advpoll_electoral_list} (nid, rid) SELECT '%d', r.rid FROM {role} r LEFT JOIN {permission} p ON p.rid = r.rid WHERE p.perm LIKE '%vote on polls%' AND r.rid <> 1 AND r.rid IN (".$role_list.") ", $form_state['values']['nid'])) {
+          $msg = format_plural(db_affected_rows($result), 'Added 1 role to the electoral list.', 'Added @count roles to the electoral list.');
+        }
+    }
+    drupal_set_message($msg);
+  }
+
   $add_role = $form_state['values']['electoral_list']['add_role'];
   if ($add_role) {
-    // Get the current electoral list.
-    $result = db_query('SELECT uid FROM {advpoll_electoral_list} WHERE nid = %d', $form_state['values']['nid']);
+    // Get the users in the current electoral list.
+    $result = db_query('SELECT uid FROM {advpoll_electoral_list} WHERE uid IS NOT NULL AND nid = %d', $form_state['values']['nid']);
     $current_list = array(0);
     while ($user = db_fetch_object($result)) {
       $current_list[] = $user->uid;
@@ -1009,11 +1106,11 @@ function advpoll_electoral_list_form_sub
     if ($is_authenticated) {
       // Special case: any authenticated user can vote.
       // Add all current users to electoral list.
-      $result = db_query("INSERT INTO {advpoll_electoral_list} (nid, uid) SELECT '%d', u.uid FROM {users} u WHERE u.uid NOT IN('%s')", $form_state['values']['nid'], $user_in_string);
+      $result = db_query("INSERT INTO {advpoll_electoral_list} (nid, uid) SELECT '%d', u.uid FROM {users} u WHERE u.uid NOT IN(".$user_in_string.")", $form_state['values']['nid']);
     }
     else {
       // Insert new users into the electoral_list based on the role chosen.
-      $result = db_query("INSERT INTO {advpoll_electoral_list} (nid, uid) SELECT '%d', u.uid FROM {users} u LEFT JOIN {users_roles} ur ON u.uid = ur.uid WHERE ur.rid = %d AND u.uid NOT IN('%s')", $form_state['values']['nid'], $add_role, $user_in_string);
+      $result = db_query("INSERT INTO {advpoll_electoral_list} (nid, uid) SELECT '%d', u.uid FROM {users} u LEFT JOIN {users_roles} ur ON u.uid = ur.uid WHERE ur.rid = %d AND u.uid NOT IN(".$user_in_string.")", $form_state['values']['nid'], $add_role);
     }
     drupal_set_message(format_plural(db_affected_rows($result), 'Added 1 user to the electoral list.', 'Added @count users to the electoral list.'));
   }
@@ -1305,6 +1402,10 @@ function theme_advpoll_results($title, $
   return $output;
 }

+function theme_advpoll_role($role) {
+  return '<p class="poll-role_name">'. $role->name .'</p>';
+}
+
 function _advpoll_show_cancel_form($node) {
   $output = '';
   if ($node->voted && $node->cancel_vote && user_access('cancel own vote') && _advpoll_is_active($node)) {
@@ -1421,9 +1522,9 @@ function advpoll_eligible($node, $uid =
   if (!isset($uid)) {
     $uid = $user->uid;
   }
-
   if ($node->use_list) {
-    $eligible = db_result(db_query('SELECT COUNT(*) FROM {advpoll_electoral_list} WHERE nid = %d AND uid = %d', $node->nid, $uid));
+    if (!$uid) return 0;
+    $eligible = db_result(db_query("SELECT COUNT(*) FROM {advpoll_electoral_list} p LEFT JOIN {users_roles} ur ON ur.rid = p.rid WHERE p.nid = %d AND (p.uid = %d OR ur.uid = %d OR p.rid IN (SELECT r.rid FROM {role} r WHERE r.name = 'authenticated user'))", $node->nid, $uid, $uid));
   }
   else {
     $eligible = user_access('vote on polls');
@@ -1750,6 +1851,7 @@ function advpoll_theme() {
     'advpoll_results' => array('arguments' => array('title' => '', 'results' => '', 'votes' => '', 'links' => '', 'nid' => '', 'voted' => '', 'cancel_vote' => '')),
     'advpoll_bar' => array('arguments' => array('title' => '', 'percentage' => '', 'votes' => '', 'choice' => NULL)),
     'advpoll_voting_ranking_form' => array('template' => 'advpoll-display-ranking-form', 'file' => 'modes/ranking.inc', 'arguments' => array('form' => NULL)),
+    'advpoll_role' => array('arguments' => array('role' => NULL)),
   );
 }


Index: advpoll.install
===================================================================
--- advpoll.install     2009-05-12 11:55:21.000000000 -0400
+++ advpoll.withroles.install   2009-05-12 11:51:25.000000000 -0400
@@ -403,3 +403,15 @@ function advpoll_update_8() {
 function advpoll_update_6000() {
   return array();
 }
+
+/**
+ * Changes for new role eligiblity code
+ */
+function advpoll_update_6001() {
+  $ret = array();
+  $ret[] = update_sql('ALTER TABLE `advpoll_electoral_list` ADD `rid` INT NULL');
+  $ret[] = update_sql('ALTER TABLE `advpoll_electoral_list` DROP PRIMARY KEY');
+  $ret[] = update_sql('ALTER TABLE `advpoll_electoral_list` CHANGE `uid` `uid` INT( 11 ) NULL');
+  $ret[] = update_sql('ALTER TABLE `advpoll_electoral_list` ADD UNIQUE (`nid` ,`uid`)');
+  $ret[] = update_sql('ALTER TABLE `advpoll_electoral_list` ADD UNIQUE (`nid` ,`rid`)');
+  return $ret;
+}

