+ super
+ end
+
+ def start_blockers
+ reasons = []
+ if self.candidates.length <= 1
+ reasons << "You must have at least two candidates."
+ end
+
+ if self.voters.length <= 1
+ reasons << "You must have at least two voters."
+ end
+
+ reasons
+ end
+
+ def activate!
+ self.active = 1
+ self.save!
+ end
+
+ def quickvote?
+ self.class == 'QuickVote'
+ end
+
+ def active?
+ active == 1
+ end
+
+ def done?
+ active == 2
+ end
+
+ def shortdesc
+ shortdesc = description.split(/\n/)[0]
+ end
+
+ def longdesc
+ longdesc = description.split(/\n/)[1..-1].join("")
+ longdesc.length > 0 ? longdesc : nil
+ end
+
+ #Calculate Election Results
+ def results
+ # initalize the tallies to empty arrays
+ preference_tally = Array.new
+ plurality_tally = Array.new
+ approval_tally = Array.new
+
+ self.voters.each do |voter|
+ # skip if the voter has not voted or has an unconfirmed vote
+ next unless voter.voted?
+
+ plurality_tally << voter.vote.rankings.sort[0].candidate.id
+ approval_tally << voter.vote.rankings.sort[0..1].collect \
+ { |ranking| ranking.candidate.id }
+ preference_tally << voter.vote.rankings.sort.collect \
+ { |ranking| ranking.candidate.id }
+ end
+
+ @plurality_result = PluralityVote.new(plurality_tally).result
+ @approval_result = ApprovalVote.new(approval_tally).result
+ @condorcet_result = PureCondorcetVote.new(preference_tally).result
+ @ssd_result = CloneproofSSDVote.new(preference_tally).result
+ @borda_result = BordaVote.new(preference_tally).result
+
+ { 'plurality' => @plurality_result,
+ 'approval' => @approval_result,
+ 'condorcet' => @condorcet_result,
+ 'ssd' => @ssd_result,
+ 'borda' => @borda_result }
+ end
+
+ def names_by_id
+ names = Hash.new
+
+ competitors = self.candidates.sort.collect {|candidate| candidate.id}
+ competitors.each do |candidate|
+ names[candidate] = Candidate.find(candidate).name
+ end
+
+ names