X-Git-Url: https://projects.mako.cc/source/selectricity/blobdiff_plain/8dc61228b74613a5e585ef0a8cf7b4352e208717..15870a550ddd18192efc71c1355a238e7c7c53e8:/app/models/vote.rb?ds=inline diff --git a/app/models/vote.rb b/app/models/vote.rb index 33927cd..12dd64d 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -1,3 +1,10 @@ +# Selectricity: Voting Machinery for the Masses +# Copyright (C) 2007, 2008 Benjamin Mako Hill +# Copyright (C) 2007 Massachusetts Institute of Technology +# +# This program is free software. Please see the COPYING file for +# details. + class Vote < ActiveRecord::Base # relationships to other classes belongs_to :voter @@ -7,7 +14,7 @@ class Vote < ActiveRecord::Base # callbacks after_update :save_rankings before_destroy :destroy_rankings - + def to_s votes.join("") end @@ -21,7 +28,7 @@ class Vote < ActiveRecord::Base if rankings.empty? @votes = Array.new else - @votes = rankings.sort.collect { |ranking| ranking.candidate.id } + @votes = self.rankings.sort.collect { |ranking| ranking.candidate.id } end end @@ -33,6 +40,9 @@ class Vote < ActiveRecord::Base end def save_rankings + self.votes # i need to initalize this before destroying rankings + # or else the ranks themselves show up as nil + destroy_rankings self.votes.each_with_index do |candidate_id, index| ranking = Ranking.new @@ -52,13 +62,19 @@ class Vote < ActiveRecord::Base end def confirm! - self.confirmed = 1 - self.save - - unless self.voter.election.quickvote? - token.destroy and token.reload if token - self.token = Token.new + if self.voter.election.candidates.length == self.rankings.length + self.confirmed = 1 + self.time = Time.now self.save + + unless self.voter.election.quickvote? + token.destroy and token.reload if token + self.token = Token.new + self.save + end + return false + else + return true end end @@ -66,25 +82,24 @@ class Vote < ActiveRecord::Base confirmed == 1 end - def votestring=(string="") - candidate_ids = voter.election.candidates.sort.collect \ - { |candidate| candidate.id.to_i } - - rel_votes = string.split("").collect { |vote| vote.to_i } - - # covert relative orders to absolute candidate ids - self.votes = rel_votes.collect { |vote| candidate_ids[ vote - 1 ] } - end - def votestring - self.votes.join("") + # create a mapping of candidates ids and the relative order of the + # candidates as they appear when sorted alphabetically + cand_relnums = {} + self.voter.election.candidates.sort.each_with_index do |c, i| + cand_relnums[c.id] = i + 1 + end + + # assemble the votestring + self.votes.collect {|v| (cand_relnums[v] + 64).chr}.join("") end - # the following subroutine is used for quickvotes. it creates a vote - # with the candidates listed in order of preference based on - # alphabetical order. it is meant to be manipulated and then confirmed - def set_defaults! - self.votes = voter.election.candidates.sort.collect {|c| c.id } + # the following subroutine is used for quickvotes, but need for elections now + # too. It creates a vote with the candidates listed in order of preference + # based on alphabetical order. Meant to be manipulated and then confirmed + def set_defaults! + self.votes = self.voter.election.candidates.sort_by { rand }.collect {|c| c.id } self.save end + end