class ElectionController < ApplicationController require_dependency "raw_voter_list" require_dependency "voter" require_dependency "vote" require_dependency "candidate" layout 'main' #before_filter :login_required ## methods for displaying, creating, ## and manipulating election overview data #################################################################### def new redirect_to :action => 'general_information' end def general_information @sidebar_content = render_to_string :partial => 'progress', :locals => { :page => 'overview' } @election = Election.new render :action => 'general_information' end def create_election @election = Election.new(params[:election]) # default options @election.user = session[:user] @election.anonymous = 1 @election.startdate = Time.now if @election.save flash[:notice] = 'Election was successfully created.' redirect_to :action => 'edit_candidates', :id => @election.id else render :action => 'general_information' end end # add filter to verify that the person working on or looking at # something is the owner def edit @election = Election.find(params[:id]) end def show @election = Election.find(params[:id]) end def update @election = Election.find(params[:id]) if @election.update_attributes(params[:election]) flash[:notice] = 'Election was successfully updated.' redirect_to :action => 'show', :id => @election else render :action => 'edit' end end def start_election @election = Election.find(params[:id]) @election.voters.each do |voter| email = VoterNotify.deliver_votestart(voter) #render(:text => "
" + email.encoded + "") end @election.activate! redirect_to :action => 'show', :id => @election.id end def change_notices election = Election.find(params[:id]) if election.notices == 0 election.notices = 1 else election.notices = 0 end end # methods fod display, adding, deleting, and manipulating candidate # information for elections #################################################################### def edit_candidates @sidebar_content = render_to_string :partial => 'progress', :locals => { :page => 'candidates' } @election = Election.find( params[:id] ) end def add_candidate @election = Election.find(params[:id]) @candidate = Candidate.new(params[:candidate]) @election.candidates << @candidate if @candidate.save @candidate = Candidate.new redirect_to :action => 'edit_candidates', :id => @election.id else render :action => 'edit_candidates', :id => @election.id end end def delete_candidate candidate = Candidate.find( params[:id] ) candidate.destroy end def lessinfo_candidate @show_details = false @candidate = Candidate.find( params[:id] ) render :partial => 'candidate_line' end def moreinfo_candidate @show_details = true @candidate = Candidate.find( params[:id] ) render :partial => 'candidate_line' end def edit_candidate @candidate = Candidate.find( params[:id] ) @election = @candidate.election end def update_candidate @candidate = Candidate.find(params[:id]) @election = @candidate.election if @candidate.update_attributes(params[:candidate]) redirect_to :action => 'edit_candidates', :id => @candidate.election.id else render :action => 'edit_candidate' end end def candidate_picture candidate = Candidate.find( params[:id] ) send_data( candidate.picture.data, :filename => candidate.picture.filename, :type => candidate.picture.filetype, :disposition => 'inline' ) end ## methods for displaying, adding, deleting, and manipulating voters ## for a particular election #################################################################### def new_voters edit_voters end def edit_voters @election = Election.find( params[:id] ) if params.has_key?( :raw_voter_list ) process_incoming_voters( params[:raw_voter_list] ) end @raw_voter_list = RawVoterList.new end def delete_voter voter = Voter.find( params[:id] ) voter.destroy end ## methods for computing and printing results #################################################################### def results @election = Election.find( params[:id] ) votes = [] @election.voters.each do |voter| if voter.vote and voter.vote.confirmed? votes << voter.vote.rankings.sort.collect {|vote| vote.candidate_id} end end @voteobj = CloneproofSSDVote.new(votes) @resultobj = @voteobj.result @winners = @resultobj.winners @candidates_by_id = {} @election.candidates.each {|cand| @candidates_by_id[cand.id] = cand} end def detailed_results self.results @voter_list = [] @vote_list = [] @election.voters. each do |voter| if voter.vote and voter.vote.confirmed? @voter_list << voter.email @vote_list << voter.vote end end @vote_list.sort! @vote_list.sort! { |a,b| a.token <=> b.token } end ## private methods #################################################################### private def process_incoming_voters(raw_voter_list) incoming_voters = RawVoterList.new( raw_voter_list ) unless incoming_voters.entries.empty? incoming_voters.each do |new_voter| if incoming_voters.email == 0 new_voter.contacted = 1 elsif incoming_voters.email == 1 email_voter( new_voter ) new_voter.contacted = 1 else new_voter.contacted = 0 end # the new voter should be in good shape. save add to the election @election.voters << new_voter new_voter.save end end # reset the next time to have a the same default value for emailing @raw_voter_list = RawVoterList.new @raw_voter_list.email = incoming_voters.email end def email_voter(email=nil) if email end end end