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 .= '
'. t('This table lists all the eligible roles for this poll.') .'
'; + + 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 ''. $role->name .'
'; +} + 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; +}