Index: nodevote.module =================================================================== --- nodevote.module (revision 66) +++ nodevote.module (working copy) @@ -11,6 +11,7 @@ define('NODEVOTE_TYPE', 'nodevo define('NODEVOTE_PERM_VIEW', 'view nodevote'); define('NODEVOTE_PERM_USE', 'use nodevote'); define('NODEVOTE_VOTE_OWN_NODE', 'nodevote_vote_own_node'); +define('NODEVOTE_VOTE_ANON', 'nodevote_vote_anon'); define('NODEVOTE_CHANGE_VOTE', 'nodevote_change_vote'); define('NODEVOTE_RESULT_VOTED', 'nodevote_result_voted'); define('NODEVOTE_RESULT_DISPLAY_PAGE', 'nodevote_result_display_page'); @@ -138,6 +139,13 @@ function nodevote_admin_settings() { '#return_value' => 1, '#default_value' => variable_get(NODEVOTE_VOTE_OWN_NODE, 0), ); + $form[$set][NODEVOTE_VOTE_ANON] = array( + '#type' => 'checkbox', + '#title' => t('Allow anonymous user to vote.'), + '#return_value' => 1, + '#default_value' => variable_get(NODEVOTE_VOTE_ANON, 0), + '#description' => t('Anonymous users will be able to vote on nodes one time per session.'), + ); $form[$set][NODEVOTE_DAILY_THRESHOLD] = array( '#type' => 'select', '#title' => t('Daily threshold'), @@ -280,9 +288,11 @@ function nodevote_page($node) { // check to see if the user has voted too many times today if(_nodevote_within_threshold($user->uid, variable_get(NODEVOTE_DAILY_THRESHOLD, 10))) { // log the vote - $result = db_query("INSERT INTO {nodevote} VALUES (%d, %d, %d, %d)", $user->uid, $node->nid, $vote, time()); + $result = db_query("INSERT INTO {nodevote} (uid, nid, vote, timestamp) VALUES (%d, %d, %d, %d)", $user->uid, $node->nid, $vote, time()); // do the userpoints dance nodevote_do_userpoints(); + // flag session for anon users + $_SESSION['nodevote']['anon'][$nid] = TRUE; } else { // if they've voted too many times today, show a message @@ -365,6 +375,11 @@ function nodevote_nodeapi(&$node, $op, $teaser, $p } function _nodevote_user_voted($uid, $nid) { + // Anonymous users should check session info + if ( $uid == 0 ) { + return ($_SESSION['nodevote']['anon'][$node->nid]); + } + if (db_result(db_query('SELECT count(nid) FROM {nodevote} WHERE uid = %d AND nid = %d', $uid, $nid))) { return TRUE; } @@ -444,8 +459,6 @@ function _nodevote_is_votable($node) { $ret = FALSE; - // Is user logged in? - if ($user->uid) { // Is node type votable? if (variable_get(NODEVOTE_TYPE . $node->type, 0)) { // Does the user has permission to vote? @@ -453,13 +466,13 @@ function _nodevote_is_votable($node) { // Is the node posted by someone else? if (($node->uid != $user->uid) || (variable_get(NODEVOTE_VOTE_OWN_NODE, 0))) { // Did the user already vote on this node? - if ((!_nodevote_user_voted($user->uid, $node->nid)) || (variable_get(NODEVOTE_CHANGE_VOTE, 0))){ + // For auth users, check if they can change the vote + if ((!_nodevote_user_voted($user->uid, $node->nid)) || ($user->uid && variable_get(NODEVOTE_CHANGE_VOTE, 0))){ $ret = TRUE; } } } } - } return $ret; } Index: nodevote.install =================================================================== --- nodevote.install (revision 66) +++ nodevote.install (working copy) @@ -14,6 +14,12 @@ function nodevote_schema() { $schema['nodevote'] = array( 'description' => t('Stores the users\' votes about a node'), 'fields' => array( + 'nvid' => array( + 'description' => t('Nodevote ID'), + 'type' => 'serial', + 'unsigned' => TRUE, + 'not null' => TRUE, + ), 'uid' => array( 'description' => t('User ID'), 'type' => 'int', @@ -40,7 +46,7 @@ function nodevote_schema() { 'not null' => TRUE, ), ), - 'primary key' => array('uid', 'nid'), + 'primary key' => array('nvid'), 'indexes' => array('node_nid' => array('nid'), 'user_id' => array('uid')), ); return $schema; @@ -58,6 +64,22 @@ function nodevote_update_2() { } /** + * Add new column, set it as primary key, drop old primary keys + */ +function nodevote_update_6001() { + $ret = array(); + db_drop_primary_key($ret, 'nodevote'); + $field = array( + 'description' => t('Nodevote ID'), + 'type' => 'serial', + 'unsigned' => TRUE, + 'not null' => TRUE, + ); + db_add_field($ret, 'nodevote', 'nvid', $field, array('primary key' => array('nvid'))); + return $ret; +} + +/** * Implementation of hook_uninstall(). */ function nodevote_uninstall() {