Import changes from the maemo preferential voting scripts
The changes come from the SVN repository at https://garage.maemo.org/svn/maemo2midgard/maemo-elections/vote, revision 1433. This commit only ports changes in the include/ subdirectory.
This commit is contained in:
		
							parent
							
								
									59930211ce
								
							
						
					
					
						commit
						31fd299c8c
					
				
					 5 changed files with 122 additions and 107 deletions
				
			
		|  | @ -13,6 +13,7 @@ $anon_tokens_table = "election_anon_tokens"; | ||||||
| $tmp_tokens_table = "election_tmp_tokens"; | $tmp_tokens_table = "election_tmp_tokens"; | ||||||
| $votes_table = "election_votes"; | $votes_table = "election_votes"; | ||||||
| $members_table = "foundationmembers"; | $members_table = "foundationmembers"; | ||||||
|  | $results_table = "election_results"; | ||||||
| 
 | 
 | ||||||
| if (is_readable ("include/localconfig.php")) { | if (is_readable ("include/localconfig.php")) { | ||||||
|   /* You can use such a file to have a local config for testing purpose. */ |   /* You can use such a file to have a local config for testing purpose. */ | ||||||
|  | @ -156,6 +157,7 @@ function elec_choices_get ($handle, $election_id) { | ||||||
| 
 | 
 | ||||||
|   $query = "SELECT * FROM " . $choices_table; |   $query = "SELECT * FROM " . $choices_table; | ||||||
|   $query .= " WHERE election_id = '".$escaped_election_id."'"; |   $query .= " WHERE election_id = '".$escaped_election_id."'"; | ||||||
|  |   $query .= " ORDER BY id"; | ||||||
| 
 | 
 | ||||||
|   $result = mysql_query ($query, $handle); |   $result = mysql_query ($query, $handle); | ||||||
| 
 | 
 | ||||||
|  | @ -172,14 +174,8 @@ function elec_choices_get ($handle, $election_id) { | ||||||
|   return $retval; |   return $retval; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function elec_verify_elections ($choices_nb, $choices) { | function elec_verify_elections ($choices) { | ||||||
|   if ($choices_nb === FALSE || $choices === FALSE) |   if ($choices === FALSE || count ($choices) <= 1) | ||||||
|     return FALSE; |  | ||||||
| 
 |  | ||||||
|   if ($choices_nb < 1) |  | ||||||
|     return FALSE; |  | ||||||
| 
 |  | ||||||
|   if (count ($choices) < $choices_nb || count ($choices) <= 1) |  | ||||||
|     return FALSE; |     return FALSE; | ||||||
| 
 | 
 | ||||||
|   return TRUE; |   return TRUE; | ||||||
|  | @ -204,6 +200,25 @@ function elec_get_election ($handle, $election_id) { | ||||||
|   return mysql_fetch_assoc ($result); |   return mysql_fetch_assoc ($result); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | function elec_get_results ($handle, $election_id) { | ||||||
|  |   global $results_table; | ||||||
|  | 
 | ||||||
|  |   if ($handle === FALSE) | ||||||
|  |     return FALSE; | ||||||
|  | 
 | ||||||
|  |   $escaped_election_id = mysql_real_escape_string ($election_id, $handle); | ||||||
|  | 
 | ||||||
|  |   $query = "SELECT * FROM " . $results_table; //FIXME: Don't use wildcards
 | ||||||
|  |   $query .= " WHERE election_id = '".$escaped_election_id."'"; | ||||||
|  | 
 | ||||||
|  |   $result = mysql_query ($query, $handle); | ||||||
|  | 
 | ||||||
|  |   if (!$result) | ||||||
|  |     return FALSE; | ||||||
|  | 
 | ||||||
|  |   return mysql_fetch_assoc ($result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| function elec_election_is_current ($election) { | function elec_election_is_current ($election) { | ||||||
|   $gmdate = gmdate ("Y-m-d H:i:s"); |   $gmdate = gmdate ("Y-m-d H:i:s"); | ||||||
|   return ($gmdate >= $election["voting_start"] && $gmdate <= $election["voting_end"]); |   return ($gmdate >= $election["voting_start"] && $gmdate <= $election["voting_end"]); | ||||||
|  | @ -223,24 +238,19 @@ function elec_election_get_type ($election) { | ||||||
| 
 | 
 | ||||||
| function elec_vote_get_votes_from_post ($choices) { | function elec_vote_get_votes_from_post ($choices) { | ||||||
|   $votes_array = array (); |   $votes_array = array (); | ||||||
| 
 |   $index=0; | ||||||
|   foreach ($choices as $choice) { |   foreach ($choices as $choice) { | ||||||
|     $name = "vote".$choice["id"]; |     $index++; | ||||||
|  |     $name = "pref".$index; | ||||||
|     if (isset ($_POST[$name]) && $_POST[$name] != "") { |     if (isset ($_POST[$name]) && $_POST[$name] != "") { | ||||||
|       array_push ($votes_array, $choice["id"]); |       array_push ($votes_array, substr($_POST[$name],4)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return $votes_array; |   return $votes_array; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function elec_verify_vote_is_valid ($choices_nb, $choices, $vote, $votes_array) { | function elec_verify_vote_is_valid ($choices, $vote, $votes_array) { | ||||||
|   if ($choices_nb == 1) |  | ||||||
|     return ""; |  | ||||||
| 
 |  | ||||||
|   if (count ($votes_array) > $choices_nb) { |  | ||||||
|     return "you chose ".count ($votes_array)." answers, while you can't choose more than ".$choices_nb." answers."; |  | ||||||
|   } |  | ||||||
|    |    | ||||||
|   return ""; |   return ""; | ||||||
| } | } | ||||||
|  | @ -274,18 +284,20 @@ function elec_insert_new_anon_token ($handle, $election_id, $anon_token) { | ||||||
|   return mysql_insert_id ($handle); |   return mysql_insert_id ($handle); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function elec_insert_new_vote ($handle, $anon_token_id, $vote) { | function elec_insert_new_vote ($handle, $anon_token_id, $vote, $preference) { | ||||||
|   global $votes_table; |   global $votes_table; | ||||||
| 
 | 
 | ||||||
|   if ($handle === FALSE) |   if ($handle === FALSE) | ||||||
|     return FALSE; |     return FALSE; | ||||||
| 
 |    | ||||||
|  |   error_log($vote, 0); | ||||||
|   $escaped_vote = mysql_real_escape_string ($vote, $handle); |   $escaped_vote = mysql_real_escape_string ($vote, $handle); | ||||||
|   $escaped_anon_token_id = mysql_real_escape_string ($anon_token_id, $handle); |   $escaped_anon_token_id = mysql_real_escape_string ($anon_token_id, $handle); | ||||||
| 
 | 
 | ||||||
|   $query = "INSERT INTO " . $votes_table . " (choice_id, anon_id)"; |   $query = "INSERT INTO " . $votes_table . " (choice_id, anon_id, preference)"; | ||||||
|   $query .= " VALUES ('".$escaped_vote."', '".$escaped_anon_token_id."')"; |   $query .= " VALUES ('".$escaped_vote."', '".$escaped_anon_token_id."', '".$preference."')"; | ||||||
| 
 | 
 | ||||||
|  |   error_log($query, 0); | ||||||
|   $result = mysql_query ($query, $handle); |   $result = mysql_query ($query, $handle); | ||||||
|   if (!$result) |   if (!$result) | ||||||
|     return FALSE; |     return FALSE; | ||||||
|  | @ -346,6 +358,7 @@ function elec_get_anon_tokens_for_election ($handle, $election_id) { | ||||||
|   return $retval; |   return $retval; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* Leaving this here as legacy code. Unused for preferential voting. */ | ||||||
| function elec_get_results_election ($handle, $election_id) { | function elec_get_results_election ($handle, $election_id) { | ||||||
|   global $anon_tokens_table; |   global $anon_tokens_table; | ||||||
|   global $votes_table; |   global $votes_table; | ||||||
|  | @ -413,14 +426,14 @@ function elec_get_votes_for_anon_token ($handle, $anon_token_id) { | ||||||
| 
 | 
 | ||||||
|   $escaped_anon_token_id = mysql_real_escape_string ($anon_token_id, $handle); |   $escaped_anon_token_id = mysql_real_escape_string ($anon_token_id, $handle); | ||||||
| 
 | 
 | ||||||
|   $query = "SELECT choice_id FROM " . $votes_table; |   $query = "SELECT choice_id,preference FROM " . $votes_table; | ||||||
|   $query .= " WHERE anon_id = '".$escaped_anon_token_id."'"; |   $query .= " WHERE anon_id = '".$escaped_anon_token_id."'"; | ||||||
|   /* -1 is not a valid value: it's the default value for referenda. |   /* -1 is not a valid value: it's the default value for referenda. | ||||||
|    * It's a blank vote. There was a bug that let this choice be saved in the |    * It's a blank vote. There was a bug that let this choice be saved in the | ||||||
|    * votes, but we don't need it there since we already have the anonymous |    * votes, but we don't need it there since we already have the anonymous | ||||||
|    * token as a proof of the blank vote. */ |    * token as a proof of the blank vote. */ | ||||||
|   $query .= " AND choice_id != '-1'"; |   $query .= " AND choice_id != '-1'"; | ||||||
|   $query .= " ORDER BY choice_id"; |   $query .= " ORDER BY preference"; | ||||||
| 
 | 
 | ||||||
|   $result = mysql_query ($query, $handle); |   $result = mysql_query ($query, $handle); | ||||||
| 
 | 
 | ||||||
|  | @ -429,7 +442,7 @@ function elec_get_votes_for_anon_token ($handle, $anon_token_id) { | ||||||
|   } else { |   } else { | ||||||
|     $result_array = array (); |     $result_array = array (); | ||||||
|     while ($buffer = mysql_fetch_assoc ($result)) { |     while ($buffer = mysql_fetch_assoc ($result)) { | ||||||
|       $result_array[] = $buffer["choice_id"]; |       $result_array[] = $buffer; | ||||||
|     } |     } | ||||||
|     $retval = $result_array; |     $retval = $result_array; | ||||||
|   } |   } | ||||||
|  |  | ||||||
							
								
								
									
										43
									
								
								foundation.gnome.org/vote/include/schema.sql
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								foundation.gnome.org/vote/include/schema.sql
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | ||||||
|  |  CREATE TABLE `elections` ( | ||||||
|  |    `id` int(11) NOT NULL auto_increment, | ||||||
|  |    `type` enum('elections','referendum') NOT NULL default 'elections', | ||||||
|  |    `name` varchar(150) NOT NULL default '', | ||||||
|  |    `voting_start` datetime default NULL, | ||||||
|  |    `voting_end` datetime default '0000-00-00 00:00:00', | ||||||
|  |    `choices_nb` int(11) NOT NULL default '0', | ||||||
|  |    `question` text NOT NULL, | ||||||
|  |    PRIMARY KEY  (`id`) | ||||||
|  |  CREATE TABLE `election_anon_tokens` ( | ||||||
|  |    `id` int(11) NOT NULL auto_increment, | ||||||
|  |    `anon_token` varchar(200) NOT NULL default '', | ||||||
|  |    `election_id` int(11) NOT NULL default '0', | ||||||
|  |    PRIMARY KEY  (`id`) | ||||||
|  |  ) ENGINE=InnoDB AUTO_INCREMENT=903 DEFAULT CHARSET=utf8 | ||||||
|  |  CREATE TABLE `election_choices` ( | ||||||
|  |    `id` int(11) NOT NULL auto_increment, | ||||||
|  |    `election_id` int(11) NOT NULL default '0', | ||||||
|  |    `choice` varchar(150) NOT NULL default '', | ||||||
|  |    PRIMARY KEY  (`id`) | ||||||
|  |  ) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8  | ||||||
|  |  CREATE TABLE `election_tmp_tokens` ( | ||||||
|  |    `election_id` int(11) NOT NULL default '0', | ||||||
|  |    `member_id` int(11) NOT NULL default '0', | ||||||
|  |    `tmp_token` varchar(200) NOT NULL default '' | ||||||
|  |  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ||||||
|  | 
 | ||||||
|  | /*  | ||||||
|  | from members database we prepare anon tokens | ||||||
|  |  then insert those anon tokens to database  | ||||||
|  |  of course before a new election record should be created since its id is needed for anon_tokens | ||||||
|  |  and election_choices are to be inserted | ||||||
|  |  rest is handled by itself iirc  | ||||||
|  | <bolsh> There's "election_votes" and "foundationmembers" too | ||||||
|  |  I'm not sure if there's a join done between foundationmembers and the other tables | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | CREATE TABLE `election_votes` ( | ||||||
|  |    `id` int(11) NOT NULL auto_increment, | ||||||
|  |    `choice_id` int(11) NOT NULL default '0', | ||||||
|  |    `anon_id` int(11) NOT NULL default '0', | ||||||
|  |    PRIMARY KEY  (`id`) | ||||||
|  | 
 | ||||||
|  | @ -2,46 +2,39 @@ | ||||||
| 
 | 
 | ||||||
| function step2_do () { | function step2_do () { | ||||||
|   global $election; |   global $election; | ||||||
|   global $choices_nb; |  | ||||||
|   global $choices; |   global $choices; | ||||||
|   global $vote; |   global $vote; | ||||||
|   global $votes_array; |   global $votes_array; | ||||||
| 
 | 
 | ||||||
|   $result = "<h2>Step 2/4 - Choose your vote</h2>\n"; |   $result = "<h2>Step 2/4 - Choose your vote</h2>\n"; | ||||||
| 
 | 
 | ||||||
|   $result .= "<p><strong>".$election["question"]."</strong></p>\n"; |   $result .= "<p>Choose your candidates in the order of your preference by "; | ||||||
|   $result .= "<p>Possible answers:</p>\n"; |   $result .= "clicking on them. Don't worry, if you click on someone by mistake "; | ||||||
|  |   $result .= "you can correct it later. Once you are happy with the order, "; | ||||||
|  |   $result .= "submit your vote. You will have the chance to review and confirm"; | ||||||
|  |   $result .= " your ballot on the next page.</p>"; | ||||||
| 
 | 
 | ||||||
|   $result .= "<div class=\"votedata\">\n"; |   $result .= "<p>You can vote for as few or as many candidates as you choose. "; | ||||||
|   if ($choices_nb == 1) { |   $result .= "Your vote will be counted for your first choice candidate as "; | ||||||
|     $result .= "<p>\n"; |   $result .= "long as he is still in the race, and when he is eliminated, your "; | ||||||
|     foreach ($choices as $choice) { |   $result .= "vote will transfer to the next preference candidate still in the "; | ||||||
|       $checked = ""; |   $result .= "race.</p>"; | ||||||
|       if ($choice["id"] == $vote) { |  | ||||||
|         $checked = " checked=\"checked\""; |  | ||||||
|       } |  | ||||||
| 
 | 
 | ||||||
|       $result .= "<input type=\"radio\" name=\"vote\" value=\"".$choice["id"]."\"".$checked."> ".$choice["choice"]."<br />\n"; |   $result .= "<p><noscript>Note: This page requires Javascript</noscript></p>"; | ||||||
|     } |  | ||||||
|     $result .= "</p>\n"; |  | ||||||
| 
 | 
 | ||||||
|   } else { |   $result .= "<p>Possible choices:</p>\n"; | ||||||
| 
 | 
 | ||||||
|     $result .= "<p>\n"; |   $result .= "<div class=\"canddata\">\n"; | ||||||
|     foreach ($choices as $choice) { |   $result .= "<h3>Candidates</h3>\n"; | ||||||
|       $checked = ""; |   $result .= "<ul id=\"candidates\">\n"; | ||||||
|       if (in_array ($choice["id"], $votes_array)) { |   $result .= "</ul>\n"; | ||||||
|         $checked = " checked=\"checked\""; |   $result .= "</div>"; | ||||||
|       } |   $result .= "<div class=\"prefdata\">"; | ||||||
|  |   $result .= "<h3>Preferences</h3>\n"; | ||||||
|  |   $result .= "<ol id=\"preferences\">\n"; | ||||||
|  |   $result .= "</ol>\n"; | ||||||
| 
 | 
 | ||||||
|       $result .= "<input type=\"checkbox\" name=\"vote".$choice["id"]."\"".$checked."> ".$choice["choice"]."<br />\n"; |  | ||||||
|     } |  | ||||||
|     $result .= "</p>\n"; |  | ||||||
| 
 |  | ||||||
|   } |  | ||||||
|   $result .= "</div>\n"; |   $result .= "</div>\n"; | ||||||
|   if ($choices_nb > 1) |  | ||||||
|     $result .= "<p><em>You can choose up to ".$choices_nb." answers.</em></p>\n"; |  | ||||||
| 
 | 
 | ||||||
|   return $result; |   return $result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,7 +2,6 @@ | ||||||
| 
 | 
 | ||||||
| function step3_do () { | function step3_do () { | ||||||
|   global $election; |   global $election; | ||||||
|   global $choices_nb; |  | ||||||
|   global $choices; |   global $choices; | ||||||
|   global $vote; |   global $vote; | ||||||
|   global $votes_array; |   global $votes_array; | ||||||
|  | @ -10,48 +9,28 @@ function step3_do () { | ||||||
|   $result = "<h2>Step 3/4 - Confirm your vote</h2>\n"; |   $result = "<h2>Step 3/4 - Confirm your vote</h2>\n"; | ||||||
| 
 | 
 | ||||||
|   $result .= "<p><strong>".$election["question"]."</strong></p>\n"; |   $result .= "<p><strong>".$election["question"]."</strong></p>\n"; | ||||||
|   if (($choices_nb == 1 && $vote >= 0) || |   if (count ($votes_array) >= 1) { | ||||||
|       ($choices_nb > 1 && count ($votes_array) >= 1)) { |  | ||||||
|     $result .= "<p>You choose to vote for:</p>\n"; |     $result .= "<p>You choose to vote for:</p>\n"; | ||||||
| 
 | 
 | ||||||
|     $result .= "<div class=\"votedata\">\n"; |     $result .= "<div class=\"votedata\">\n"; | ||||||
|     if ($choices_nb == 1) { |     $result .= "<ol>\n"; | ||||||
| 
 |     foreach ($votes_array as $vote) { | ||||||
|       $choice = null; |       $found = FALSE; | ||||||
|       foreach ($choices as $opt) { |       foreach ($choices as $choice) { | ||||||
|         if ($opt["id"] == $vote) { |         if ($choice["id"] == $vote) { | ||||||
|           $choice = $opt; |           $result .= "<li>".$choice["choice"]."</li>\n"; | ||||||
|  |           $found = TRUE; | ||||||
|           break; |           break; | ||||||
|         } |         } | ||||||
|       } |       }  | ||||||
|       if ($choice != null) | 
 | ||||||
|         $result .= "<p>".$choice["choice"]."</p>\n"; |       if (!$found) { | ||||||
|       else { |         $result .= "<li>Unknown vote: ".$vote."</li>\n"; | ||||||
|         $result .= "<p>Unknown vote: ".$vote."</p>\n"; |  | ||||||
|         $error .= "There was an unkown vote: ".$vote."<br />\n"; |         $error .= "There was an unkown vote: ".$vote."<br />\n"; | ||||||
|       } |       } | ||||||
| 
 |  | ||||||
|     } else { |  | ||||||
| 
 |  | ||||||
|       $result .= "<ul>\n"; |  | ||||||
|       foreach ($votes_array as $vote) { |  | ||||||
|         $found = FALSE; |  | ||||||
|         foreach ($choices as $choice) { |  | ||||||
|           if ($choice["id"] == $vote) { |  | ||||||
|             $result .= "<li>".$choice["choice"]."</li>\n"; |  | ||||||
|             $found = TRUE; |  | ||||||
|             break; |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (!$found) { |  | ||||||
|           $result .= "<li>Unknown vote: ".$vote."</li>\n"; |  | ||||||
|           $error .= "There was an unkown vote: ".$vote."<br />\n"; |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       $result .= "</ul>\n"; |  | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
|  |     $result .= "</ol>\n"; | ||||||
|  | 
 | ||||||
|     $result .= "</div>\n"; |     $result .= "</div>\n"; | ||||||
| 
 | 
 | ||||||
|   } else { |   } else { | ||||||
|  | @ -60,7 +39,8 @@ function step3_do () { | ||||||
|     $result .= "</div>\n"; |     $result .= "</div>\n"; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   $result .= "<p>To confirm this vote, please continue to the next step.</p>\n"; |   $result .= "<p>To confirm this vote, please continue to the next step. "; | ||||||
|  |   $result .= "To modify your choice, hit the \"Back\" button in your browser.</p>\n"; | ||||||
| 
 | 
 | ||||||
|   return $result; |   return $result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -37,7 +37,6 @@ function step4_do () { | ||||||
|   global $error; |   global $error; | ||||||
|   global $handle; |   global $handle; | ||||||
|   global $election_id; |   global $election_id; | ||||||
|   global $choices_nb; |  | ||||||
|   global $vote; |   global $vote; | ||||||
|   global $votes_array; |   global $votes_array; | ||||||
|   global $email; |   global $email; | ||||||
|  | @ -64,31 +63,18 @@ function step4_do () { | ||||||
|     return $result; |     return $result; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if ($choices_nb == 1) { |     $index=0; | ||||||
| 
 |  | ||||||
|     if ($vote != -1) { |  | ||||||
|       //FIXME verify that $vote is valid for this election/referendum
 |  | ||||||
|       $res = elec_insert_new_vote ($handle, $anon_token_id, $vote); |  | ||||||
| 
 |  | ||||||
|       if (!$res) { |  | ||||||
|         $error .= "Can not insert a vote: ".mysql_error ($handle)."<br />\n"; |  | ||||||
|         elec_sql_rollback ($handle); |  | ||||||
|         return $result; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|   } else { |  | ||||||
| 
 |  | ||||||
|     foreach ($votes_array as $vote) { |     foreach ($votes_array as $vote) { | ||||||
|       //FIXME verify that $vote is valid for this election/referendum
 |       //FIXME verify that $vote is valid for this election/referendum
 | ||||||
|       $res = elec_insert_new_vote ($handle, $anon_token_id, $vote); |       $index++; | ||||||
|  |       error_log($vote.", ".$index.", ".$anon_token_id, 0); | ||||||
|  |       $res = elec_insert_new_vote ($handle, $anon_token_id, $vote, $index); | ||||||
| 
 | 
 | ||||||
|       if (!$res) { |       if (!$res) { | ||||||
|         $error .= "Can not insert a vote: ".mysql_error ($handle)."<br />\n"; |         $error .= "Can not insert a vote: ".mysql_error ($handle)."<br />\n"; | ||||||
|         elec_sql_rollback ($handle); |         elec_sql_rollback ($handle); | ||||||
|         return $result; |         return $result; | ||||||
|       } |       } | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Tobias Mueller
						Tobias Mueller