X-Git-Url: https://projects.mako.cc/source/selectricity/blobdiff_plain/9abed97635edbac7fb1a687298fff5c5434cdff4..b3d85db71fcbea2c22666804174b68e83563d8f6:/app/models/vote.rb?ds=sidebyside diff --git a/app/models/vote.rb b/app/models/vote.rb index 2aa1c4b..8852fa5 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -1,38 +1,104 @@ class Vote < ActiveRecord::Base + # relationships to other classes belongs_to :voter has_many :rankings + has_one :token - def initialize + # callbacks + after_update :save_rankings + before_destroy :destroy_rankings + + def to_s + votes.join("") + end + + def each + self.votes.each {|vote| yield vote} + end + + def votes + unless @votes + if rankings.empty? + @votes = Array.new + else + @votes = rankings.sort.collect { |ranking| ranking.candidate.id } + end + end + + @votes + end + + def votes=(array) + @votes = array + end + + def save_rankings + destroy_rankings + self.votes.each_with_index do |candidate_id, index| + ranking = Ranking.new + ranking.rank = index + ranking.candidate = Candidate.find(candidate_id) + self.rankings << ranking + end + end + + def destroy + self.destroy_rankings super - @votes = [] + end + + def destroy_rankings + rankings.each { |ranking| ranking.destroy } + end + + def settime + self.time = Time.now + self.save + end + + def confirm! + self.confirmed = 1 + self.save + + unless self.voter.election.quickvote? + token.destroy and token.reload if token + self.token = Token.new + self.save + end + end + + def confirm? + 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 - candidate_ids = voter.election.candidates.sort - candidate_ids.collect! { |candidate| candidate.id.to_i } - - rel_votes.collect! { |vote| candidate_ids[ vote - 1 ] } - @votes = rel_votes + self.votes = rel_votes.collect { |vote| candidate_ids[ vote - 1 ] } end - def save - rankings.each { destroy } unless rankings.empty? - @votes.each_with_index do |candidate, index| - ranking = Ranking.new - ranking.rank = index + 1 - ranking.candidate = Candidate.find(candidate) - self.rankings << ranking + def votestring + # 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 - - super - end - def destroy - rankings.each { destroy } - super + # assemble the votestring + self.votes.collect {|v| cand_relnums[v]}.join("") end + # 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 = voter.election.candidates.sort.collect {|c| c.id } + self.save + end + end