From 5901217a8893619fbdb02d540c08390f92eae368 Mon Sep 17 00:00:00 2001 From: Date: Wed, 30 Jan 2008 22:05:21 -0500 Subject: [PATCH] first (mostly) working version of full elections. Lots of work, the vast majority of it superficial, to get full election support ready. The creation is still a little rough and results are not online yet but everything else is good to go. --- app/controllers/election_controller.rb | 44 +++-------------- app/controllers/voter_controller.rb | 36 ++++++++++++-- app/models/election.rb | 4 +- app/views/election/_candidate_form.rhtml | 10 ++-- app/views/election/_candidate_line.rhtml | 28 +++++------ app/views/election/_candidate_line_edit.rhtml | 49 +++++++++---------- app/views/election/_candidate_list.rhtml | 17 ++++++- app/views/election/_overview_form.rhtml | 6 ++- app/views/election/_voters_form.rhtml | 3 +- app/views/election/edit_candidate.rhtml | 9 ---- app/views/election/edit_candidates.rhtml | 41 ++++++++++++---- app/views/election/edit_voters.rhtml | 16 ++++-- app/views/election/general_information.rhtml | 5 +- app/views/election/list.rhtml | 35 ------------- app/views/election/remind_voter.rhtml | 1 - app/views/election/show.rhtml | 25 +++++++--- app/views/front/_basic_login.rhtml | 2 +- app/views/front/_user_summary.rhtml | 2 + app/views/front/index.rhtml | 13 +++-- app/views/quickvote/create.rhtml | 4 ++ app/views/quickvote/index.rhtml | 4 +- app/views/voter/_sortable_vote.rhtml | 9 ++++ app/views/voter/forgot_password.rhtml | 12 ----- app/views/voter/full_vote.rhtml | 43 +++++++++++++--- app/views/voter/index.rhtml | 7 ++- app/views/voter/reminder.rhtml | 16 ++++++ app/views/voter/reminder_sent.rhtml | 6 +++ app/views/voter/review.rhtml | 42 +++++++++------- app/views/voter/thanks.rhtml | 8 ++- app/views/voter_notify/reminder.rhtml | 10 ++-- app/views/voter_notify/votestart.rhtml | 4 +- config/environment.rb | 2 +- config/routes.rb | 7 +++ public/stylesheets/main.css | 45 +++++++++++------ public/stylesheets/quickvote.css | 15 ++++++ public/stylesheets/voter.css | 14 ++++++ 36 files changed, 369 insertions(+), 225 deletions(-) delete mode 100644 app/views/election/edit_candidate.rhtml delete mode 100644 app/views/election/list.rhtml delete mode 100644 app/views/election/remind_voter.rhtml delete mode 100644 app/views/voter/forgot_password.rhtml create mode 100644 app/views/voter/reminder.rhtml create mode 100644 app/views/voter/reminder_sent.rhtml diff --git a/app/controllers/election_controller.rb b/app/controllers/election_controller.rb index 89a2c22..acf47cc 100644 --- a/app/controllers/election_controller.rb +++ b/app/controllers/election_controller.rb @@ -43,6 +43,9 @@ class ElectionController < ApplicationController end def show + @sidebar_content = render_to_string :partial => 'progress', + :locals => { :page => 'review' } + @election = Election.find(params[:id]) end @@ -94,34 +97,6 @@ class ElectionController < ApplicationController candidate.destroy end - def lessinfo_candidate - @show_details = false - @current_candidate = Candidate.find( params[:id] ) - render :partial => 'candidate_line' - end - - def moreinfo_candidate - @show_details = true - @current_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, @@ -134,10 +109,13 @@ class ElectionController < ApplicationController ## for a particular election #################################################################### def new_voters - edit_voters + redirect_to :action => 'edit_voters', :id => params[:id] end def edit_voters + @sidebar_content = render_to_string :partial => 'progress', + :locals => { :page => 'voters' } + @election = Election.find( params[:id] ) if params.has_key?( :raw_voter_list ) process_incoming_voters( params[:raw_voter_list] ) @@ -150,14 +128,6 @@ class ElectionController < ApplicationController voter.destroy end - def remind_voter - voter_array= FullVoter.find(:all, :conditions => ["email = ?", params[:email]]) - voter_array.delete_if {|voter| voter.election.active == 0} - unless voter_array.empty? - VoterNotify.deliver_reminder(voter_array) - end - end - ## methods for computing and printing results #################################################################### def results diff --git a/app/controllers/voter_controller.rb b/app/controllers/voter_controller.rb index fb1bec7..461be29 100644 --- a/app/controllers/voter_controller.rb +++ b/app/controllers/voter_controller.rb @@ -5,12 +5,30 @@ class VoterController < ApplicationController require_dependency "election" def index - password = params[:id] - password = params[:vote][:password] if params[:vote] - if @voter = FullVoter.find(:all, :conditions => [ "password = ?", password ] )[0] + if params[:urlpassword] + password = params[:urlpassword] + else + password = nil + end + + if @voter = FullVoter.find(:all, :conditions => + [ "password = ?", password ] )[0] @voter.vote = Vote.new if @voter.vote.nil? @voter.vote.set_defaults! if @voter.vote.rankings.empty? + + @election = @voter.election + @sidebar_content = render_to_string(:partial => 'sortable_vote') render :action => 'full_vote' + elsif params[:urlpassword] + redirect_to :action => 'index' + end + end + + def login + if params[:vote] and params[:vote][:password] + redirect_to votepassword_url( :action => 'index', :urlpassword => params[:vote][:password]) + else + redirect_to :action => 'index' end end @@ -33,6 +51,18 @@ class VoterController < ApplicationController end end + def reminder + if params[:email] + voter_array= FullVoter.find(:all, :conditions => ["email = ?", params[:email]]) + voter_array.delete_if {|voter| voter.election.active == 0} + unless voter_array.empty? + VoterNotify.deliver_reminder(voter_array) + end + render :action => 'reminder_sent' + end + end + + private def authenticate password = params[:id] diff --git a/app/models/election.rb b/app/models/election.rb index cd809ab..99d64f9 100644 --- a/app/models/election.rb +++ b/app/models/election.rb @@ -91,14 +91,14 @@ class Election < ActiveRecord::Base #Calculate results if not in memcache def results # Assignment is intentional - if defined? Cache and c = Cache.get("election_results:#{id}:#{self.votes.length}") + if Cache and c = Cache.get("election_results:#{id}:#{self.votes.length}") @plurality_result = c['plurality'] @approval_result = c['approval'] @condorcet_result = c['condorcet'] @ssd_result = c['ssd'] @borda_result = c['borda'] return c - elsif defined? Cache + elsif Cache # memcache is available, but missed. results = self.results! Cache.set("election_results:#{id}:#{self.votes.length}", results) diff --git a/app/views/election/_candidate_form.rhtml b/app/views/election/_candidate_form.rhtml index ed14dff..fcbf072 100644 --- a/app/views/election/_candidate_form.rhtml +++ b/app/views/election/_candidate_form.rhtml @@ -1,11 +1,11 @@ -<% %> - -

New candidate name:
+


<%= text_field :candidate, :name, :size => 60 %>

-

Candidate description/platform (optional):
+

(optional)
<%= text_area :candidate, :description, :cols => 60, :rows => 5 %>

-

Candidate picture (optional and < 100x100 pixels):
+ +

(optional and < 100x100 pixels)
<%= file_field :candidate, :picture %>

+
diff --git a/app/views/election/_candidate_line.rhtml b/app/views/election/_candidate_line.rhtml index e5bcf07..6b5b553 100644 --- a/app/views/election/_candidate_line.rhtml +++ b/app/views/election/_candidate_line.rhtml @@ -1,19 +1,17 @@
  • <%=h @current_candidate.name -%> - <% if @show_details %> - (<%= link_to_remote "Hide Details", - :update => "cand#{@current_candidate.id}", - :url => { :action => :lessinfo_candidate, - :id => @current_candidate.id } %>) -
    -
    - <%=h (@current_candidate.description) %> -
    - <% else %> - (<%= link_to_remote "Show Details", - :update => "cand#{@current_candidate.id}", - :url => { :action => :moreinfo_candidate, - :id => @current_candidate.id } %>) - <% end %> + + (<%= link_to "Show Details", "#", + :onclick => "show_candidate_info(#{@current_candidate.id}); return false;" %>) + +
  • diff --git a/app/views/election/_candidate_line_edit.rhtml b/app/views/election/_candidate_line_edit.rhtml index 61a9f63..0fd5b67 100644 --- a/app/views/election/_candidate_line_edit.rhtml +++ b/app/views/election/_candidate_line_edit.rhtml @@ -1,29 +1,28 @@ -<% -%> -
    -

    <%=h @current_candidate.name %> - (<%= link_to_remote "Delete", +

    +
    <%=h @current_candidate.name %>
    +
    + <%= link_to_remote "Delete", :complete => "Element.remove('cand#{@current_candidate.id}')", :url => { :action => :delete_candidate, - :id => @current_candidate.id } %> | - <%= link_to "Edit", :action => 'edit_candidate', :id => - @current_candidate.id %>)
    -
    - - <% if @current_candidate.description.length > 0 %> - - <% else %> - - <% end %> -
    - <% if @current_candidate.picture? %> - - <% end %> - - Description:
    - <%= h(@current_candidate.description) %> -
    -
    + :id => @current_candidate.id } %> +
    +
    + +
    +
    + <% if @current_candidate.picture? %> + + <% end %> +
    +
    + <% if @current_candidate.description.length > 0 %> + <%= h(@current_candidate.description) %> + <% else %> + + <% end %> +
    +
    +

    diff --git a/app/views/election/_candidate_list.rhtml b/app/views/election/_candidate_list.rhtml index 881c0a5..2691f5b 100644 --- a/app/views/election/_candidate_list.rhtml +++ b/app/views/election/_candidate_list.rhtml @@ -1,7 +1,20 @@ -<% %> + + diff --git a/app/views/election/_overview_form.rhtml b/app/views/election/_overview_form.rhtml index 7d575e9..8efa1b3 100644 --- a/app/views/election/_overview_form.rhtml +++ b/app/views/election/_overview_form.rhtml @@ -15,9 +15,13 @@ <%= datetime_select :election, :startdate %>

    --> -

    Election End Date
    +


    All elections end at 23:59.
    <%= date_select :election, :enddate %>

    +


    +<% type_hash = {}; ELECTION_TYPES.each {|k,v| type_hash[v] = k} %> +<%= select_tag 'election[election_method]', options_for_select(type_hash, @election.election_method) %>

    + diff --git a/app/views/election/_voters_form.rhtml b/app/views/election/_voters_form.rhtml index 87df4ce..8130ade 100644 --- a/app/views/election/_voters_form.rhtml +++ b/app/views/election/_voters_form.rhtml @@ -11,4 +11,5 @@ address per line).

    --> <%= hidden_field :raw_voter_list, :email, :value => 2 %>

    -<%= submit_tag "Add Voters" %> + +

    <%= submit_tag "Add Voters" %>

    diff --git a/app/views/election/edit_candidate.rhtml b/app/views/election/edit_candidate.rhtml deleted file mode 100644 index 7e1dd65..0000000 --- a/app/views/election/edit_candidate.rhtml +++ /dev/null @@ -1,9 +0,0 @@ -

    Editing <%=h @candidate.name %>

    - -<%= error_messages_for :candidate %> -<% form_tag( { :action => :update_candidate, :id => @candidate.id }, - :multipart => true ) do %> -<%= render :partial => 'candidate_form' %> -<%= submit_tag "Save" %> -<% end %> - diff --git a/app/views/election/edit_candidates.rhtml b/app/views/election/edit_candidates.rhtml index dcd601a..7e1f315 100644 --- a/app/views/election/edit_candidates.rhtml +++ b/app/views/election/edit_candidates.rhtml @@ -1,10 +1,31 @@ -

    Edit/Add Candidates

    +
    + Edit Candidates + +
    + +
    + +
    + Enter New Candidate + +
    <%= error_messages_for :candidate %> -<% unless @election.candidates.empty? %> -

    The following are valid options or candidates in this election:

    +<% form_tag( { :action => :add_candidate, :id => @election.id }, + :multipart => true ) do %> +<%= render :partial => 'candidate_form' %> +

    <%= submit_tag "Add Candidate" %>

    +<% end %> + +
    + Current Candidates + +
    + + +<% unless @election.candidates.empty? %> <% @election.candidates.each do |candidate| %> <% @current_candidate = candidate %> <%= render :partial => 'candidate_line_edit' %> @@ -14,12 +35,12 @@

    There are no candidates registered for this election.

    <% end %> -

    Please enter new candidates below.

    +
    + Continue + +
    -<% form_tag( { :action => :add_candidate, :id => @election.id }, - :multipart => true ) do %> -<%= render :partial => 'candidate_form' %> -<%= submit_tag "Add Candidate" %> -<% end %> +

    When you are done entering candidates, please click the button below +to proceed to the next step.

    -<%= button_to "Done!", :action => 'new_voters', :id => @election %> +<%= button_to "Proceed to Next Step", :action => 'new_voters', :id => @election %> diff --git a/app/views/election/edit_voters.rhtml b/app/views/election/edit_voters.rhtml index 1e98fba..8819b95 100644 --- a/app/views/election/edit_voters.rhtml +++ b/app/views/election/edit_voters.rhtml @@ -1,5 +1,7 @@ -<% @edit = true %> -

    Edit Voter List

    +
    + Edit Voter List + +
    <%= render :partial => 'voter_list' %> @@ -7,4 +9,12 @@ <%= render :partial => 'voters_form' %> <% end %> -<%= button_to 'Done!', :action => 'show', :id => @election.id %> +
    + Continue + +
    + +

    When you are done entering voters, please click the button below +to proceed to the next step.

    + +<%= button_to 'Proceed to Next Step!', :action => 'show', :id => @election.id %> diff --git a/app/views/election/general_information.rhtml b/app/views/election/general_information.rhtml index be09953..dd1271c 100644 --- a/app/views/election/general_information.rhtml +++ b/app/views/election/general_information.rhtml @@ -1,4 +1,7 @@ -

    Vote Overview

    +
    + Election Overview + +
    <% form_tag (:action => 'create_election') do %> <%= render :partial => 'overview_form' %> diff --git a/app/views/election/list.rhtml b/app/views/election/list.rhtml deleted file mode 100644 index 321bf46..0000000 --- a/app/views/election/list.rhtml +++ /dev/null @@ -1,35 +0,0 @@ -<% %> -

    Listing elections

    - - - -<% for election in @elections %> - - - - - -<% end %> -

    <%=h link_to election.name, :action => 'show', :id => election %>

    -

    Description:

    -
    <%=h election.description %>
    - -

    Election Information:

    -
      -
    • <%= election.voters.length %> registered voters
    • -
    • <%= "Not " unless election.anonymous == 1 %>Anonymous
    • -
    • Starts <%= election.startdate %>
    • -
    • Ends <%= election.enddate %>
    • -
    -
    -

    Candidates:

    - <% @election = election %><%= render :partial => 'candidate_list', :id => election.id %> -
    - <%= link_to 'Destroy', { :action => 'destroy', :id => election }, :confirm => 'Are you sure?' %>
    - -<%= link_to 'Previous page', { :page => @election_pages.current.previous } if @election_pages.current.previous %> -<%= link_to 'Next page', { :page => @election_pages.current.next } if @election_pages.current.next %> - -
    - -<%= link_to 'New election', :action => 'new' %> diff --git a/app/views/election/remind_voter.rhtml b/app/views/election/remind_voter.rhtml deleted file mode 100644 index 40d7a20..0000000 --- a/app/views/election/remind_voter.rhtml +++ /dev/null @@ -1 +0,0 @@ -The message has been sent, please check your inbox soon. \ No newline at end of file diff --git a/app/views/election/show.rhtml b/app/views/election/show.rhtml index 2a23168..3e63628 100644 --- a/app/views/election/show.rhtml +++ b/app/views/election/show.rhtml @@ -1,4 +1,7 @@ -

    Vote Information

    +
    + Election Overview + +
    <% if @election.active? %>
    Vote is in currently in progress. Return to @@ -8,8 +11,6 @@ :action => 'results', :id => @election.id %>.
    <% end %> -

    Overview

    -

    Summary

    @@ -32,8 +33,11 @@

    <%= link_to "Edit overview.", :action => 'edit', :id => @election.id %>

    <% end %> -

    Candidates

    -<% %> +
    + Candidates + +
    + <% unless @election.candidates.empty? %> <%= render :partial => 'candidate_list' %> <% unless @election.active %> @@ -44,7 +48,10 @@ <% end %> -

    Voters

    +
    + Voters + +
    <% unless @election.voters.empty? %> <%= render :partial => 'voter_list' %> @@ -54,7 +61,11 @@ <% end %> <% unless @election.active? %> -

    Start Election

    + +
    + Start Election + +
    <% if @election.start_blockers.length > 0 %>

    Your vote cannot be started for the following reasons:

    diff --git a/app/views/front/_basic_login.rhtml b/app/views/front/_basic_login.rhtml index 16ddc8d..bd03a9d 100644 --- a/app/views/front/_basic_login.rhtml +++ b/app/views/front/_basic_login.rhtml @@ -8,5 +8,5 @@

    <%= submit_tag 'Log in' %>

    <% end %> -

    <%= link_to 'Lost or forgot your password?', :controller => 'account', :action => 'forgot_password' %>

    + diff --git a/app/views/front/_user_summary.rhtml b/app/views/front/_user_summary.rhtml index 3b541c8..ce65bba 100644 --- a/app/views/front/_user_summary.rhtml +++ b/app/views/front/_user_summary.rhtml @@ -9,3 +9,5 @@ <% end %> +

    <%= link_to "Create a new election", :controller => 'election', :action => 'new' %>.

    + diff --git a/app/views/front/index.rhtml b/app/views/front/index.rhtml index 54e4688..afdf35d 100644 --- a/app/views/front/index.rhtml +++ b/app/views/front/index.rhtml @@ -5,12 +5,12 @@

    If you have received an email with a token inviting you to vote in an ongoing election, you can log in to vote using your token below.

    - <% form_tag(:controller => 'voter', :action => 'index') do %> + <% form_tag(:controller => 'voter', :action => 'login') do %>

    <%= text_field :vote, :password %>

    <%= submit_tag "Log In" %>

    <% end %> -

    <%= link_to 'Lost or forgot your token?', :controller => 'voter', :action => 'forgot_password' %>

    +

    <%= link_to 'Lost or forgot your token?', :controller => 'voter', :action => 'reminder' %>

    SMS Interface

    For information on accessing Selectricity over email or via SMS/text messages from your mobile phone, email <%= link_to "vote\@selectricity.org", "mailto:vote@selectricity.org" %> with "help" in the body or read the <%= link_to "Selectricity Anywhere documentation", :controller => 'about', :action => 'anywhere' %>.

    @@ -29,9 +29,14 @@ existing vote. You can log in below.

    <%= render :partial => 'basic_login' %> + +

    Full elections creation is not yet public. Contact us for access.

    + + <% end %> -

    Full elections creation is not yet public. <%= link_to("Contact us", - "mailto:team@selectricity.org") %> for access.

    +
    diff --git a/app/views/quickvote/create.rhtml b/app/views/quickvote/create.rhtml index c05424e..eecb4fb 100644 --- a/app/views/quickvote/create.rhtml +++ b/app/views/quickvote/create.rhtml @@ -35,6 +35,10 @@

    +

    <%= quickform.select('election_method', %w(ssd condorcet plurality approval borda) ) %>

    diff --git a/app/views/quickvote/index.rhtml b/app/views/quickvote/index.rhtml index d1018cf..ccc7ec6 100644 --- a/app/views/quickvote/index.rhtml +++ b/app/views/quickvote/index.rhtml @@ -1,6 +1,6 @@
    - Quickvote - <%=h @voter.election.description.capitalize %> + Quickvote + <%=h @voter.election.description.capitalize %>
    diff --git a/app/views/voter/_sortable_vote.rhtml b/app/views/voter/_sortable_vote.rhtml index 512a4ee..2452476 100644 --- a/app/views/voter/_sortable_vote.rhtml +++ b/app/views/voter/_sortable_vote.rhtml @@ -1,3 +1,8 @@ +

    Your Vote

    + +

    Please vote by dragging items in the list below into your preferred +order.

    +
      <% for ranking in @voter.vote.rankings %> @@ -12,3 +17,7 @@ <%= sortable_element 'rankings-list', :url => { :action => "sort_candidates", :id => @voter.vote.id }, :complete => visual_effect(:highlight, 'rankings-list') %> + +
      +<%= button_to "Confirm Vote", :action => 'review', :id => @voter.password %> +
      diff --git a/app/views/voter/forgot_password.rhtml b/app/views/voter/forgot_password.rhtml deleted file mode 100644 index 43d1d03..0000000 --- a/app/views/voter/forgot_password.rhtml +++ /dev/null @@ -1,12 +0,0 @@ -

      Deleted your email? Lost your password?

      -

      Not to worry, enter the email at which you were supposed to receive your -password, and we'll hook you up with a set of magic numbers that shall grant -access to the chambers within. Hoo-rah!

      - -<% form_tag :controller => 'election', :action => 'remind_voter' do %> - -

      Email - <%= text_field_tag :email %>

      - - <%= submit_tag "Submit" %> -<% end -%> diff --git a/app/views/voter/full_vote.rhtml b/app/views/voter/full_vote.rhtml index cfc20e3..5534090 100644 --- a/app/views/voter/full_vote.rhtml +++ b/app/views/voter/full_vote.rhtml @@ -1,10 +1,41 @@ -<% %> +
      + Vote Recorded + +
      -

      Election: <%= @voter.election.name %>

      -

      Voter: <%= @voter.email %>

      Description:

      -
      <%= @voter.election.description %>
      +

      <%= @voter.election.description %>

      -<%= render :partial => 'sortable_vote' %> +
      + Current Voter + +
      -<%= button_to "Submit Vote", :action => 'review', :id => @voter.password %> +

      <%= @voter.email %>

      + +
      + Instructions + +
      + +

      Drag and drop the items on list in the right column +until they are in order from most preferred at the top to least +preferred at the bottom. When you are done, press confirm to record your +vote.

      + +
      + Candidate List + +
      + +<% @voter.election.candidates.each do |candidate| %> + <% @current_candidate = candidate %> + +
      +

      <%=h @current_candidate.name -%>

      +
      + <%=h (@current_candidate.description) %> +
      +
      + <% end %> + diff --git a/app/views/voter/index.rhtml b/app/views/voter/index.rhtml index 5c2ea27..e92081d 100644 --- a/app/views/voter/index.rhtml +++ b/app/views/voter/index.rhtml @@ -1,8 +1,11 @@ -<% %> +
      + Voter Login + +

      Please enter your password/token to log in and vote:

      -<% form_tag(:action => 'index') do %> +<% form_tag(:action => 'login') do %> <%= text_field :vote, :password %> <%= submit_tag "Log In" %> <% end %> diff --git a/app/views/voter/reminder.rhtml b/app/views/voter/reminder.rhtml new file mode 100644 index 0000000..ad757e4 --- /dev/null +++ b/app/views/voter/reminder.rhtml @@ -0,0 +1,16 @@ +
      + Password Reminder + +
      + +

      Enter the email at which you were supposed to receive your password, +and we'll send you a new password over email for every election that you +are currently registered.

      + +<% form_tag :action => 'reminder' do %> + +

      Email + <%= text_field_tag :email %>

      + + <%= submit_tag "Submit" %> +<% end -%> diff --git a/app/views/voter/reminder_sent.rhtml b/app/views/voter/reminder_sent.rhtml new file mode 100644 index 0000000..4bb88e8 --- /dev/null +++ b/app/views/voter/reminder_sent.rhtml @@ -0,0 +1,6 @@ +
      + Reminder Sent + +
      + +

      The message has been sent, please check your inbox.

      diff --git a/app/views/voter/review.rhtml b/app/views/voter/review.rhtml index b8b9089..d9ecf19 100644 --- a/app/views/voter/review.rhtml +++ b/app/views/voter/review.rhtml @@ -1,7 +1,11 @@ -<% %> +
      + Review + <%= @voter.election.name %> +
      -<% %> -

      Please review your vote carefully before confirming it.

      +

      Your vote will not be recorded until you confirm it on this +page. Please review your vote carefully before clicking +confirm.

      You have ranked the candidates in the following order (from most preferred to least preferred:

      @@ -12,21 +16,23 @@ preferred to least preferred:

      <% end %>
    - - - - - +
    + Confirm/Discard + +
    - - - - +

    Please select from one of the following pages.

    - - - - +
    +

    <%= button_to 'Confirm This Vote', :action => 'confirm', :id => @voter.password %>

    + +

    If you choose, you will be able to go back
    and change it up until + the end of hte voting period.

    -
    <%= button_to 'Confirm', :action => 'confirm', :id => @voter.password %>Confirm this vote now. You will be able to go back and - change it.
    <%= button_to 'Change', :action => 'index', :id => @voter.password %>Go back to the voting page and vote again.
    <%= button_to 'Discard', :action => 'discard' %>Discard this tentative vote and log out.
    +

    <%= button_to 'Discard This Vote', votepassword_url( + :action => 'index', :urlpassword => @voter.password) %>

    + +

    You will be returned to the voting page to vote
    again, if you choose.

    + + +
    diff --git a/app/views/voter/thanks.rhtml b/app/views/voter/thanks.rhtml index ab8992c..b19cb04 100644 --- a/app/views/voter/thanks.rhtml +++ b/app/views/voter/thanks.rhtml @@ -1,6 +1,10 @@ -<% %> +
    + Vote Recorded + +
    -

    Your vote has been recorded.

    +

    Your vote has been recorded for the <%= @voter.election.name +%>.

    Your unique token for this vote is: <%= @voter.vote.token %>

    diff --git a/app/views/voter_notify/reminder.rhtml b/app/views/voter_notify/reminder.rhtml index 1373bc2..0a90746 100644 --- a/app/views/voter_notify/reminder.rhtml +++ b/app/views/voter_notify/reminder.rhtml @@ -1,16 +1,18 @@ Voter! -Either you or an election administrator has requested you receive a reminder for an election you've been registered in. +Either you or an election administrator has requested you receive a +reminder for an election you've been registered in. + +Here are the election(s) for which you are currently registered and your +tokens to enter each election: -Here are the election(s) for which you are currently registered and your tokens to enter each election: <% @voter_array.each do |voter| -%> <%= voter.election.name %>: <%= voter.password %> <% end -%> - If you feel there is a technical error, please contact: - help@selectricity.org + team@selectricity.org (Selectricity Tech Support) Thanks and happy voting! diff --git a/app/views/voter_notify/votestart.rhtml b/app/views/voter_notify/votestart.rhtml index f9dbfc6..e2c480f 100644 --- a/app/views/voter_notify/votestart.rhtml +++ b/app/views/voter_notify/votestart.rhtml @@ -11,7 +11,7 @@ need to use the following token to log in to Selectricity: <%= @voter.password %> Alternatively, you can just click this URL: - http://selectricity.org<%= url_for :controller => 'voter' %> + <%= votepassword_url( :host => 'selectricity.org', :urlpassword => @voter.password) %> If you have any questions or if you feel you have received this message in error, you should contact: @@ -21,7 +21,7 @@ in error, you should contact: Alternatively, if you feel there is a technical error, please contact: - help@selectricity.org + team@selectricity.org (Selectricity Tech Support) Thanks and happy voting! diff --git a/config/environment.rb b/config/environment.rb index 3e5f1c6..32d313b 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -59,7 +59,7 @@ end # Include your application configuration below -MAIL_CONFIG = { :from => 'Selectricity '} +MAIL_CONFIG = { :from => 'Selectricity '} require 'uniq_token' require 'randarray' diff --git a/config/routes.rb b/config/routes.rb index f763da9..e2f458d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -15,6 +15,13 @@ ActionController::Routing::Routes.draw do |map| map.connect '/sitealizer/:action', :controller => 'sitealizer' + map.connect 'voter/:action', + :controller => 'voter', + :requirements => { :action => /(review|confirm|authenticate|index|login|reminder)/ } + + map.votepassword 'voter/:urlpassword', + :controller => 'voter', + :action => 'index' map.connect 'quickvote/:action/:id', :controller => 'quickvote', diff --git a/public/stylesheets/main.css b/public/stylesheets/main.css index 50863c1..97c6848 100644 --- a/public/stylesheets/main.css +++ b/public/stylesheets/main.css @@ -246,20 +246,6 @@ blockquote { background-color: #f0f0f0; } -li.moveable { - background-color: #E5FFCC; - border:1px solid #4D801A; - cursor: move; - padding: 4px; - margin: 4px; -} - -#sortable_list { - font-size: 24pt; - display: float; - float: left; -} - .result_table { text-align: center; margin-bottom: 1em; @@ -464,3 +450,34 @@ div.photo img { margin: 0; padding: 0; } + +/* main election candidate stylesheet information */ + +.candidate_box { +} +.candidate_box_name { + float: left; + font-size: 1.3em; + font-weight: bold; +} +.candidate_box_menu { + text-align: right; + float: right; + font-size: 0.8em; + font-weight: bold; +} +.candidate_box_info { + margin: 0.5em 0 0.5em 3em; +} +/*.candidate_box_picture { + width: 100px; + float: left; + margin: 0 0.8em 0.5em 0; +}*/ +.candidate_box_picture img { + width: 100px; + border: 1px solid black; +} +.candidate_box_description { + display: inline; +} diff --git a/public/stylesheets/quickvote.css b/public/stylesheets/quickvote.css index b18da44..5b7c8b4 100644 --- a/public/stylesheets/quickvote.css +++ b/public/stylesheets/quickvote.css @@ -9,3 +9,18 @@ a { #title-header .subheader { color: #74ce00; } + +#sortable_list { + font-size: 24pt; + display: float; + float: left; +} + +li.moveable { + background-color: #E5FFCC; + border:1px solid #4D801A; + cursor: move; + padding: 4px; + margin: 4px; +} + diff --git a/public/stylesheets/voter.css b/public/stylesheets/voter.css index 98b94dc..5a38cae 100644 --- a/public/stylesheets/voter.css +++ b/public/stylesheets/voter.css @@ -10,3 +10,17 @@ a { color: #005cd9; background-color: #e5e5e5; } + +#sortable_list { + display: float; + float: left; +} + +li.moveable { + background-color: #c0d9fb; + border:1px solid #005cd9; + cursor: move; + padding: 4px; + margin: 4px; +} + -- 2.30.2