* refactored the system so that it keeps pictures in a seperate table
[selectricity-live] / app / controllers / election_controller.rb
1 class ElectionController < ApplicationController
2   require_dependency "raw_voter_list"
3   require_dependency "voter"
4   require_dependency "vote"
5   require_dependency "candidate"
6   layout 'main'
7
8   #before_filter :login_required
9
10   ## methods for displaying, creating,
11   ## and manipulating election overview data
12   ####################################################################
13
14   def new
15     redirect_to :action => 'general_information'
16   end
17   
18   def general_information
19     @election = Election.new
20     render :action => 'general_information'
21   end
22   
23   def create_election
24     @election = Election.new(params[:election])
25     
26     # default options
27     @election.user = session[:user]
28     @election.anonymous = 1
29     @election.startdate = Time.now
30
31     if @election.save
32       flash[:notice] = 'Election was successfully created.'
33       redirect_to :action => 'edit_candidates', :id => @election.id
34     else
35       render :action => 'general_information'
36     end
37   end
38   
39   # add filter to verify that the person working on or looking at
40   # something is the owner
41   def edit
42     @election = Election.find(params[:id])
43   end
44
45   def show
46     @election = Election.find(params[:id])
47   end
48
49   def update
50     @election = Election.find(params[:id])
51     if @election.update_attributes(params[:election])
52       flash[:notice] = 'Election was successfully updated.'
53       redirect_to :action => 'show', :id => @election
54     else
55       render :action => 'edit'
56     end
57   end
58
59   def start_election
60     @election = Election.find(params[:id])
61     
62     @election.voters.each do |voter|
63       email = VoterNotify.deliver_votestart(voter)
64       #render(:text => "<pre>" + email.encoded + "</pre>")
65     end
66
67     @election.activate!
68     redirect_to :action => 'show', :id => @election.id
69   end
70
71   # methods fod display, adding, deleting, and manipulating candidate
72   # information for elections
73   ####################################################################
74   def edit_candidates
75     @election = Election.find( params[:id] )
76   end
77
78   def add_candidate
79     @election = Election.find(params[:id])
80     @candidate = Candidate.new(params[:candidate])
81     @election.candidates << @candidate
82
83     if @candidate.save
84       @candidate = Candidate.new
85       redirect_to :action => 'edit_candidates', :id => @election.id
86     else
87       render :action => 'edit_candidates', :id => @election.id
88     end
89   end
90   
91   def delete_candidate
92     candidate = Candidate.find( params[:id] )
93     candidate.destroy
94   end
95
96   def lessinfo_candidate
97     @show_details = false
98     @candidate = Candidate.find( params[:id] )
99     render :partial => 'candidate_line'
100   end
101
102   def moreinfo_candidate
103     @show_details = true
104     @candidate = Candidate.find( params[:id] )
105     render :partial => 'candidate_line'
106   end
107
108   def edit_candidate
109     @candidate = Candidate.find( params[:id] )
110     @election = @candidate.election
111   end
112
113   def update_candidate
114     @candidate = Candidate.find(params[:id])
115     @election = @candidate.election
116
117     if @candidate.update_attributes(params[:candidate])
118       redirect_to :action => 'edit_candidates', :id => @candidate.election.id
119     else
120       render :action => 'edit_candidate'
121     end
122   end
123
124   def candidate_picture
125     candidate = Candidate.find( params[:id] )
126     send_data( candidate.picture.data,
127                :filename => candidate.picture.filename,
128                :type => candidate.picture.filetype,
129                :disposition => 'inline' )
130   end
131
132   ## methods for displaying, adding, deleting, and manipulating voters
133   ## for a particular election
134   ####################################################################
135   def new_voters
136     edit_voters
137   end
138   
139   def edit_voters
140     @election = Election.find( params[:id] )
141     if params.has_key?( :raw_voter_list )
142       process_incoming_voters( params[:raw_voter_list] )
143     end
144
145     @raw_voter_list = RawVoterList.new
146   end
147   
148   def delete_voter
149     voter = Voter.find( params[:id] )
150     voter.destroy
151   end
152   
153   ## methods for computing and printing results
154   ####################################################################
155   def results
156     @election = Election.find( params[:id] )
157     votes = []
158
159     @election.voters.each do |voter|
160       if voter.vote and voter.vote.confirmed?
161         votes << voter.vote.rankings.sort.collect {|vote| vote.candidate_id}
162       end
163     end
164     
165     @voteobj = CloneproofSSDVote.new(votes)
166     @resultobj = @voteobj.result
167     @winners = @resultobj.winners
168     
169     @candidates_by_id = {}
170     @election.candidates.each {|cand| @candidates_by_id[cand.id] = cand}
171   end
172   
173   def detailed_results
174    
175     self.results
176
177     @voter_list = []
178     @vote_list = []
179     @election.voters. each do |voter|
180       if voter.vote and voter.vote.confirmed?
181         @voter_list << voter.email
182         @vote_list << voter.vote
183       end
184     end
185
186     @vote_list.sort!
187     @vote_list.sort! { |a,b| a.token <=> b.token }
188   end
189
190   ## private methods
191   ####################################################################
192   private
193
194     def process_incoming_voters(raw_voter_list)
195       incoming_voters = RawVoterList.new( raw_voter_list )
196
197       unless incoming_voters.entries.empty?
198         incoming_voters.each do |new_voter|
199
200           if incoming_voters.email == 0
201             new_voter.contacted = 1
202                 elsif incoming_voters.email == 1
203                   email_voter( new_voter )
204             new_voter.contacted = 1
205                 else
206                   new_voter.contacted = 0
207           end
208         
209           # the new voter should be in good shape. save add to the election
210           @election.voters << new_voter
211                 new_voter.save
212         end
213       end
214  
215       # reset the next time to have a the same default value for emailing
216       @raw_voter_list = RawVoterList.new
217       @raw_voter_list.email = incoming_voters.email
218     end
219
220     def email_voter(email=nil)
221       if email
222         
223       end
224     end
225
226 end

Benjamin Mako Hill || Want to submit a patch?