]> projects.mako.cc - selectricity-live/blob - app/models/selectricity_service.rb
Add testcase for checking validity of vote results
[selectricity-live] / app / models / selectricity_service.rb
1 require 'action_controller/integration'
2
3 class SelectricityService < ActionWebService::Base
4   web_service_api SelectricityAPI
5   def cast_quickvote(election_name, voter_id, vote_list)
6     election = QuickVote.ident_to_quickvote election_name
7     if election
8       candidates=election.candidates.collect { |c| c.id }
9       vote_list[0].each do |vote|
10         raise ArgumentError.new "Invalid Candidate ID #{vote}" unless candidates.index(vote)
11       end
12       raise ArgumentError.new "You must rank all candidates" unless candidates.length <= vote_list[0].length
13       raise ArgumentError.new "Please rank each candidate only once" if vote_list[0].uniq!
14       voter = QuickVoter.new
15       voter.election = election
16       voter.ipaddress = "XMLRPC Request"
17       voter.session_id = "XMLRPC:#{voter_id}"
18       voter.vote=Vote.new
19       voter.vote.votes=vote_list[0]
20       voter.vote.time = Time.now
21       voter.save!
22       voter.vote.confirm!
23       voter.save!
24     else
25       raise ArgumentError.new "Cannot find election #{election_name}"
26     end
27   end
28   def quickvote_candidate_ids_to_names(shortname, id_list)
29     qv=QuickVote.ident_to_quickvote(shortname)
30     candidates={}
31     return [] unless qv
32     qv.results
33     qv.candidates.each {|c| candidates[c.id] = c}
34     results=[]
35     id_list.each { |id|
36       name=candidates[id]
37       if name
38         results << name
39       else
40         results << ""
41       end
42     }
43     results
44   end
45   def get_quickvote_results(shortname)
46     #TODO: Validate shortname
47     qv=QuickVote.ident_to_quickvote(shortname)
48     result=VoteResultStruct.new
49     result.errors=[]
50     unless qv
51       result.errors << "No quickvote with name #{shortname} found!"
52       return result
53     end
54     qv.results
55     result.plurality_winners=qv.plurality_result.winners
56     result.approval_winners=qv.approval_result.winners
57     result.condorcet_winners=qv.condorcet_result.winners
58     result.ssd_winners=qv.ssd_result.winners
59     result.borda_winners=qv.borda_result.winners
60     result
61   end
62   def get_quickvote_candidate_map(shortname)
63     qv=QuickVote.ident_to_quickvote(shortname)
64     result=CandidateMap.new
65     result.errors=[]
66     unless qv
67       result.errors << "No quickvote with name #{shortname} found!"
68       return result
69     end
70     candidates={}
71     qv.candidates.each {|c| candidates[c.id] = c.name}
72     result.candidate_ids=candidates.keys
73     result.candidate_names=candidates.values
74     result
75   end
76   def get_quickvote_votes(shortname)
77     qv=QuickVote.ident_to_quickvote(shortname)
78     votes=Array.new
79     unless qv
80       return result
81     end
82     qv.votes.each  do |vote|
83       votes << VoteInfo.new(:voter_id => vote.voter.id, :voter_ipaddress => vote.voter.ipaddress, :vote_time => vote.time.to_i, :vote => vote.votes)
84     end
85     return votes
86   end
87   def list_quickvotes()
88     all=Array.new
89     QuickVote.find_all.each do |election|
90       all << get_quickvote(election.name)
91     end
92     return all
93   end
94   def get_quickvote(shortname)
95     return ElectionStruct.new unless election=QuickVote.ident_to_quickvote(shortname)
96     return ElectionStruct.new (:id => election.id, :name => election.name, :description => election.description, :candidate_ids => election.candidates.collect {|c| c.id }, :candidate_names => election.candidates.collect {|c| c.name } )
97   end
98   def create_quickvote(election)
99     qv=QuickVote.new(:name => election.name, :description => election.description)
100     qv.candidatelist=election.candidate_names
101     if qv.save
102       return ""
103     else
104       return "Saving quickvote FAILED:"+qv.errors.inspect
105     end
106   end
107
108 end

Benjamin Mako Hill || Want to submit a patch?