# fill in the data with the optional data name
#Check to see if multiple datasets, if so, fill them all!
+ #Sort by biggest first piece of data.
if options[:data].is_a?(Hash)
- options[:data].each_pair do |name, array|
- @graph.data( name, array)
+ options[:data].sort {|a,b| b[1][0] <=> a[1][0]}.each do |dataset|
+ @graph.data(dataset[0], dataset[1])
end
#if each dataset nameless, will have only multiple arrays
elsif options[:data].size > 1 && options[:data].all? {|i| i.is_a?(Array)}
:y_axis_label => "Number of Votes")
send_data(*graph.output)
end
-
+
def borda_bar
@election = Election.find(params[:id])
@election.results unless @election.borda_result
send_data(*graph.output)
end
#Acording to Tufte, small, concomparitive, highly labeled data sets usually
- # belong in tables. The following is a bar graph...but would it be better
+ #belong in tables. The following is a bar graph...but would it be better
#as a table?
def choices_positions
-
@election = Election.find(params[:id])
- pref_tally = make_preference_tally(@election)
-
- fulldata, labels = get_positions_info(@election)
- legend = Hash.new
+ legend = Hash.new
+ alldata, labels = get_positions_info(@election)
+ @election.results unless @election.condorcet_result || @election.ssd_result
- @election.candidates.each_with_index do |candidate, index|
- legend[candidate.name] = fulldata[index]
+ names = Hash.new
+ candidates = @election.candidates.sort.collect {|candidate| candidate.id}
+ candidates.each do |candidate|
+ names[candidate]= (Candidate.find(candidate)).name
end
+ ranked_candidates = @election.condorcet_result.ranked_candidates.flatten
+ ranked_candidates.each_with_index \
+ {|candidate, index| legend[names[candidate]] = alldata[index]}
+
graph = GruffGraff.new( :graph_type => Gruff::Bar,
:data => legend,
:interval_labels => labels,
buckets2= Hash.new
rank_labels = Hash.new
- election.candidates.each do |candidate|
- buckets[candidate.id] = []
- buckets2[candidate.id] = []
- end
-
#attach the ranking to the candidate's array to which is belongs
+ #creating a key if necessary
election.votes.each do |vote|
vote.rankings.each do |ranking|
+
+ unless buckets.has_key?(ranking.candidate_id)
+ buckets[ranking.candidate_id] = []
+ end
buckets[ranking.candidate_id] << ranking.rank
+
end
end
#count how many times each candidate has been ranked at a certain level
buckets.each_pair do |id, array|
(1..election.candidates.size).each do |i|
+ buckets2[id] = [] unless buckets2.has_key?(id)
buckets2[id] << (array.find_all {|rank| rank == i}).size
end
end
def create
if params[:quickvote]
@quickvote = QuickVote.new(params[:quickvote])
-
# store the candidate grabbed through ajax and stored in flash
@quickvote.candidatelist = flash[:candlist]
@quickvote.description=CGI.escapeHTML(@quickvote.description)
def index
@election = QuickVote.ident_to_quickvote(params[:ident])
-
# if the person has specified an election, we show them the voting
# page. otherwise, we redirect back to main the page
if @election
-
# look to see that the voter has been created and has voted in
# this election, and has confirmed their vote
@voter = QuickVoter.find(:all, :conditions => ["session_id = ? and election_id = ?",
@voter = QuickVoter.new
@voter.election = @election
@voter.session_id = session.session_id
-
- # create new vote and make it the defaulted sorted list
+
+ # create new vote and make it the defaulted sorted list
@voter.vote = Vote.new
@voter.save
@voter.vote.set_defaults!
###############################################################
def results
- @election = QuickVote.ident_to_quickvote(params[:ident])
+ unless @election = QuickVote.ident_to_quickvote(params[:ident])
+ flash[:notice] = "Cannot find quickvote #{params[:ident]}."
+ redirect_to :controller => 'site'
+ return
+ end
@election.results
@candidates = {}
@election.candidates.each {|c| @candidates[c.id] = c}
<h1><strong><%= @election.name %>:</strong> Edit Overview</h1>
-<%= start_form_tag :action => 'update', :id => @election %>
+<% form_tag(:action => 'update', :id => @election) do %>
<%= render :partial => 'overview_form' %>
<%= submit_tag 'Done!' %>
-<%= end_form_tag %>
+<% end %>
<h1>Editing <%= @candidate.name %></h1>
<%= error_messages_for :candidate %>
-<%= form_tag( { :action => :update_candidate, :id => @candidate.id },
- :multipart => true ) %>
+<% form_tag( { :action => :update_candidate, :id => @candidate.id },
+ :multipart => true ) do %>
<%= render :partial => 'candidate_form' %>
<%= submit_tag "Save" %>
-<%= end_form_tag %>
+<% end %>
<p>Please enter new candidates below.</p>
-<%= form_tag( { :action => :add_candidate, :id => @election.id },
- :multipart => true ) %>
+<% form_tag( { :action => :add_candidate, :id => @election.id },
+ :multipart => true ) do %>
<%= render :partial => 'candidate_form' %>
<%= submit_tag "Add Candidate" %>
-<%= end_form_tag %>
+<% end %>
<%= button_to "Done!", :action => 'show', :id => @election %>
<%= render :partial => 'voter_list' %>
-<%= form_tag :action => 'edit_voters', :id => @election.id %>
+<% form_tag (:action => 'edit_voters', :id => @election.id) do %>
<%= render :partial => 'voters_form' %>
-<%= end_form_tag %>
+<% end %>
<%= button_to 'Done!', :action => 'show', :id => @election.id %>
<h2>Vote Overview</h2>
-<%= form_tag :action => 'create_election' %>
+<% form_tag (:action => 'create_election') do %>
<%= render :partial => 'overview_form' %>
<%= submit_tag "Done!" %>
-<%= end_form_tag %>
+<% end %>
<%= render :partial => 'voter_list' %>
-<%= form_tag :action => 'new_voters', :id => @election.id %>
+<% form_tag(:action => 'new_voters', :id => @election.id) do %>
<%= render :partial => 'voters_form' %>
-<%= end_form_tag %>
+<% end %>
<% %>
<!-- the list of candidates -->
-<% if @flash[:candlist] %>
+<% if flash[:candlist] %>
<ul>
- <% for cand in @flash[:candlist] %>
+ <% for cand in flash[:candlist] %>
<li><%= cand.capitalize %></li>
<% end %>
</ul>
<% end %>
-<%= form_remote_tag :update => 'candlist',
+<% form_remote_tag(:update => 'candlist',
:url => { :action => 'add_candidate' },
- :complete => "Field.focus('ajax_newcandidate')" %>
+ :complete => "Field.focus('ajax_newcandidate')") do %>
<p>
<%= text_field "ajax", "newcandidate", :size => 40 %>
<%= submit_tag "Add(+)" %>
</p>
-<%= end_form_tag %>
+<% end %>
<%= render :partial => 'candidate_list' %>
</div>
-<%= form_tag :action => 'create' %>
+<% form_tag(:action => 'create') do %>
<!--[form:election]-->
<p><label for="quickvote_name">One Word Description (for URL)<br />
<%= submit_tag "Create Quickvote" -%>
-<%= end_form_tag %>
+<% end %>
<h3>Please Login</h3>
<div class="form-padding">
- <%= start_form_tag :action => 'login' %>
+ <% form_tag(:action => 'login') do %>
<table>
<%= form_input :text_field, "Login ID", "login", :size => 30 %>
<%= form_input :password_field, "Password", "password", :size => 30 %>
<p><%= link_to 'Register for an account', :action => 'signup' %></p>
<p><%= link_to 'Forgot my password', :action => 'forgot_password' %></p>
</div>
- <%= end_form_tag %>
+ <% end %>
</div>
</div>
<em>(For example, 123 or 321 or 213, etc.)</em></p>
<% if @voter.election.quickvote? %>
- <%= form_tag quickaction_url( :ident => @voter.election.name, :action => 'confirm') %>
+ <% form_tag(quickaction_url( :ident => @voter.election.name, :action => 'confirm')) do %>
<% else %>
<%= form_tag :action => 'review', :id => @voter.password %>
<% end %>
<%= text_field :vote, :votestring -%>
<%= submit_tag "Vote!" %>
-<%= end_form_tag %>
+<% end %>
<p>Please enter your password/token to log in and vote:</p>
-<%= form_tag :action => 'index' %>
+<% form_tag(:action => 'index') do %>
<%= text_field :vote, :password %>
<%= submit_tag "Log In" %>
-<%= end_form_tag %>
+<% end %>
require File.dirname(__FILE__) + '/../test_helper'
require 'quickvote_controller'
+class ActionController::TestSession
+ def session_id
+ # Override this so we can set session ID
+ # pass in the 'test_session_id' session variable to override default
+ return "12345678" unless @attributes
+ if @attributes.has_key? 'test_session_id'
+ return @attributes['test_session_id']
+ end
+ end
+end
# Re-raise errors caught by the controller.
class QuickvoteController; def rescue_action(e) raise e end; end
end
# Replace this with your real tests.
- def test_truth
- assert true
+ def test_index
+ get :index
+ assert_response 302
+ end
+
+ def test_create_quickvote
+ post(:create, {'commit' =>"Create Quickvote", 'quickvote' =>{'name' =>"variable", 'description' =>"Favorite variable."}}, nil, {:candlist=>["foo", "bar", "foobar"]})
+ assert_template "quickvote/success"
+ get :index, { 'ident' => "variable"}
+ assert_response :success
+ end
+
+ def test_create_dupe_quickvote
+ test_create_quickvote
+ assert_raise(Test::Unit::AssertionFailedError) do
+ test_create_quickvote
+ end
+ end
+
+ def test_create_quickvote_badname
+ post(:create, {'commit' => "Create Quickvote", 'quickvote' => {'name' => "has a space", 'description' => "Foobar"}}, nil, {:candlist => ["foo", "bar", "foobar"]})
+ assert_template "quickvote/create"
+ end
+
+ def test_create_quickvote_dupe_candidate
+ post(:create, {'commit' => "Create Quickvote", 'quickvote' => {'name' => "has a space", 'description' => "Foobar"}}, nil, {:candlist => ["foo", "bar", "bar", "foobar"]})
+ assert_template "quickvote/create"
+ end
+
+ def test_create_quickvote_nil_candidate
+ post(:create, {'commit' => "Create Quickvote", 'quickvote' => {'name' => "has a space", 'description' => "Foobar"}}, nil, {:candlist => nil})
+ assert_template "quickvote/create"
+ post(:create, {'commit' => "Create Quickvote", 'quickvote' => {'name' => "has a space", 'description' => "Foobar"}}, nil, {:candlist => []})
+ assert_template "quickvote/create"
+ end
+
+ def test_get_quickvote_nonexistent
+ get :index, { 'ident' => "idontexist" }
+ assert_redirected_to :controller => 'site'
+ end
+
+ def test_get_result_empty_vote
+ test_create_quickvote
+ get :results, { 'ident' => 'variable' }
+ assert_response :success
+ end
+
+ def test_get_result_nonexistent
+ test_create_quickvote
+ get :results, { 'ident' => 'asdflaksdjf' }
+ assert_redirected_to :controller => 'site'
+ end
+
+ def test_get_result_with_a_vote
+ test_cast_quickvote
+ get :results, { 'ident' => 'variable' }
+ assert_response :success
+ end
+
+ def test_get_result_multi_votes
+ test_create_quickvote
+ votes = QuickVote.ident_to_quickvote('variable').candidates.collect { |c| c.id}
+ 5.times do |time|
+ get :index, { 'ident' => 'variable' }, { 'test_session_id' => (time+1)*50 }
+ assert_response :success
+ post :confirm, { 'ident' => 'variable', 'rankings-list' => votes.sort_by {rand} }, { 'test_session_id' => (time+1)*50 }
+ assert_template 'quickvote/thanks'
+ end
+ get :results, { 'ident' => 'variable' }
+ assert_response :success
+ end
+
+ def test_cast_quickvote
+ test_create_quickvote
+ votes = QuickVote.ident_to_quickvote('variable').candidates.collect { |c| c.id}
+ post :confirm, { 'ident' => 'variable', 'rankings-list' => votes.sort_by {rand} }
+ assert_template 'quickvote/thanks'
+ end
+
+ def test_cast_dupe_quickvote
+ test_create_quickvote
+ votes = QuickVote.ident_to_quickvote('variable').candidates.collect { |c| c.id}
+ get :index, { 'ident' => 'variable' }
+ assert_response :success
+
+ post :confirm, { 'ident' => 'variable', 'rankings-list' => votes.sort_by {rand} }
+ assert_template 'quickvote/thanks'
+
+ get :index, { 'ident' => 'variable' }
+ assert_response :success
+ post :confirm, { 'ident' => 'variable', 'rankings-list' => votes.sort_by {rand} }
+ assert_redirected_to :controller => 'quickvote', :ident => 'variable'
end
end
end
# Replace this with your real tests.
- def test_truth
- assert true
+ def test_index
+ get :index
+ assert_response :success
end
end