| @@ -1,95 +1,184 @@ | |||||
| require 'rubygems' | |||||
| require 'sinatra' | require 'sinatra' | ||||
| require 'sinatra-helpers/haml/partials' | |||||
| require 'haml' | require 'haml' | ||||
| require 'lib/models' | |||||
| require './models' | |||||
| get '/' do | |||||
| if params[:postcode] | |||||
| @postcode = params[:postcode].strip.upcase | |||||
| unless result = Postcode.finder(@postcode) | |||||
| # Invalid postcode | |||||
| redirect '/error' | |||||
| end | |||||
| # Postcode valid but not in LB Sutton | |||||
| if result.district_code != "00BF" | |||||
| redirect '/aliens' | |||||
| class String | |||||
| def pluralize(num) | |||||
| if num == 1 | |||||
| return self | |||||
| end | end | ||||
| # Postcode in LB Sutton | |||||
| @ward = Ward.first( :ons_id => result.ward_code ) | |||||
| redirect "/wards/#{@ward.slug}/postcode/#{@postcode}" | |||||
| case self[-1] | |||||
| when 'y' | |||||
| self[0..-2] + 'ies' | |||||
| when 's' | |||||
| self + "es" | |||||
| else | |||||
| self + "s" | |||||
| end | |||||
| end | end | ||||
| @results = repository(:default).adapter.query(" | |||||
| SELECT p.name, | |||||
| sum(c.votes_2010) AS votes, | |||||
| p.colour | |||||
| FROM parties p, | |||||
| councilcandidates c | |||||
| WHERE p.id = c.party_id | |||||
| GROUP BY p.name, p.colour | |||||
| ORDER BY votes desc | |||||
| ;") | |||||
| end | |||||
| # select p.name, count(c.*) AS seats | |||||
| # FROM parties p, councilcandidates c | |||||
| # GROUP BY p.id | |||||
| helpers do | |||||
| # Format a number with commas for every ^3 | |||||
| def commify(num) | |||||
| num.to_s.reverse.gsub(/(\d\d\d)(?=\d)(?!\d*\.)/,'\1,').reverse | |||||
| end | |||||
| @total_votes = Councilcandidate.sum(:votes_2010) | |||||
| # From http://snippets.dzone.com/posts/show/593 | |||||
| def to_ordinal(num) | |||||
| num = num.to_i | |||||
| if (10...20) === num | |||||
| "#{num}th" | |||||
| else | |||||
| g = %w{ th st nd rd th th th th th th } | |||||
| a = num.to_s | |||||
| c = a[-1..-1].to_i | |||||
| a + g[c] | |||||
| end | |||||
| end | |||||
| def format_percent(num) | |||||
| sprintf("%.1f%%", num) | |||||
| end | |||||
| def short_date(d) | |||||
| d.strftime("%e %b %Y") | |||||
| end | |||||
| def long_date(d) | |||||
| d.strftime("%e %B %Y") | |||||
| end | |||||
| end | |||||
| get '/' do | |||||
| # if params[:postcode] | |||||
| # @postcode = params[:postcode].strip.upcase | |||||
| # | |||||
| # unless result = Postcode.finder(@postcode) | |||||
| # # Invalid postcode | |||||
| # redirect '/error' | |||||
| # end | |||||
| # | |||||
| # # Postcode valid but not in LB Sutton | |||||
| # if result.district_code != "00BF" | |||||
| # redirect '/aliens' | |||||
| # end | |||||
| # | |||||
| # # Postcode in LB Sutton | |||||
| # @ward = Ward.first( :ons_id => result.ward_code ) | |||||
| # redirect "/wards/#{@ward.slug}/postcode/#{@postcode}" | |||||
| # end | |||||
| haml :home | |||||
| @future_elections = Election.future | |||||
| @past_elections = Election.past | |||||
| haml :index | |||||
| end | end | ||||
| get '/wards/:slug/postcode/:postcode/?' do | |||||
| @ward = Ward.first(:slug => params[:slug]) | |||||
| @postcode = params[:postcode] | |||||
| haml :wards | |||||
| get '/bodies/:body/elections/:date' do | |||||
| @election = Election.first(:body => Body.first(:slug => params[:body]), :d => params[:date]) | |||||
| @total_seats = Candidacy.sum(:seats, :election => @election) | |||||
| @total_votes = Candidacy.sum(:votes, :election => @election) | |||||
| # There's got to be a better way to do this, either with SQL or Datamapper | |||||
| @total_districts = repository(:default).adapter.select(" | |||||
| SELECT district_id | |||||
| FROM candidacies | |||||
| WHERE election_id = #{@election.id} | |||||
| GROUP BY district_id | |||||
| ORDER BY district_id | |||||
| ").count | |||||
| @results_by_party = repository(:default).adapter.select(" | |||||
| SELECT | |||||
| p.colour, | |||||
| p.name, | |||||
| SUM(c.votes) AS votez, | |||||
| SUM(c.seats) AS seatz, | |||||
| COUNT(*) AS cands | |||||
| FROM candidacies c | |||||
| LEFT JOIN parties p ON p.id = c.party_id | |||||
| WHERE c.election_id = #{@election.id} | |||||
| GROUP BY c.party_id | |||||
| ORDER BY seatz DESC, votez DESC | |||||
| ") | |||||
| @results_by_district = repository(:default).adapter.select(" | |||||
| SELECT | |||||
| d.name, | |||||
| d.slug AS district_slug, | |||||
| SUM(c.seats) AS seats, | |||||
| SUM(c.votes) AS votez | |||||
| FROM districts d, candidacies c | |||||
| WHERE | |||||
| c.district_id = d.id | |||||
| AND c.election_id = #{@election.id} | |||||
| GROUP BY c.district_id | |||||
| ORDER BY d.name | |||||
| ") | |||||
| haml :electionsummary | |||||
| end | end | ||||
| get '/wards/:slug/?' do | |||||
| @ward = Ward.first(:slug => params[:slug]) | |||||
| haml :wards | |||||
| # get '/bodies/:body/elections/:date/parties/:party' do | |||||
| # Not written yet. Show how this party did at this election. | |||||
| # end | |||||
| get '/bodies/?' do | |||||
| @bodies = Body.all | |||||
| haml :bodies | |||||
| end | end | ||||
| get '/wards/?' do | |||||
| @wards = Ward.all | |||||
| haml :wardlist | |||||
| get '/bodies/:body/?' do | |||||
| @body = Body.first(:slug => params[:body]) | |||||
| haml :body | |||||
| end | end | ||||
| get '/results/uk-parliament/2010-05-06/:constituency' do | |||||
| if params[:constituency] == 'carshalton-and-wallington' | |||||
| const = 1 | |||||
| # get '/wards/:slug/postcode/:postcode/?' do | |||||
| # @ward = Ward.first(:slug => params[:slug]) | |||||
| # @postcode = params[:postcode] | |||||
| # haml :wards | |||||
| # end | |||||
| get '/candidates/:id/?' do | |||||
| if @candidate = Candidate.get(params[:id]) | |||||
| haml :candidate | |||||
| else | else | ||||
| const = 2 | |||||
| 404 | |||||
| end | end | ||||
| @constituency = Constituency.get(const) | |||||
| @candidates = Parliamentcandidate.all(:constituency_id => const, :order => [ :votes_2010.desc ]) | |||||
| @total_2010 = Parliamentcandidate.sum(:votes_2010, :constituency_id => const) | |||||
| haml :resultsukparliament | |||||
| end | end | ||||
| get '/results/sutton-council/2010-05-06/:slug' do | |||||
| @ward = Ward.first(:slug => params[:slug]) | |||||
| @candidates = Councilcandidate.all(:ward_id => @ward.id, :order => [ :votes_2010.desc ]) | |||||
| @total_2010 = Councilcandidate.sum(:votes_2010, :ward_id => @ward.id) | |||||
| haml :resultssuttoncouncil | |||||
| get '/candidates/?' do | |||||
| @candidates = Candidate.all(:order => [ :surname, :forenames ]) | |||||
| haml :candidates | |||||
| end | end | ||||
| get '/results/sutton-council/2010-05-06.csv' do | |||||
| @ward = Ward.first(:slug => params[:slug]) | |||||
| @candidates = Councilcandidate.all(:ward_id => @ward.id, :order => [ :votes_2010.desc ]) | |||||
| @total_2010 = Councilcandidate.sum(:votes_2010, :ward_id => @ward.id) | |||||
| haml :resultssuttoncouncil | |||||
| get '/bodies/:body/elections/:date/:districts_name/:district' do | |||||
| @district = District.first(:slug => params[:district]) | |||||
| @body = Body.first(:slug => params[:body]) | |||||
| @election = Election.first(:body => @body, :d => params[:date]) | |||||
| @candidacies = Candidacy.all(:district => @district, :election => @election, :order => [:votes.desc]) | |||||
| @total_votes = Candidacy.sum(:votes, :district => @district, :election => @election) | |||||
| @districts_in_this_election = @election.candidacies.districts | |||||
| haml :resultsdistrict | |||||
| end | end | ||||
| get '/bodies/:body/:districts_name/:district' do | |||||
| @district = District.first(:slug => params[:district]) | |||||
| @body = Body.first(:slug => params[:body]) | |||||
| haml :district | |||||
| end | |||||
| get '/how-the-council-election-works' do | get '/how-the-council-election-works' do | ||||
| haml :election | haml :election | ||||
| @@ -111,14 +200,10 @@ get '/about' do | |||||
| haml :about | haml :about | ||||
| end | end | ||||
| get '/aliens' do | |||||
| haml :aliens | |||||
| end | |||||
| get '/wardmap' do | |||||
| haml :wardmap | |||||
| end | |||||
| # get '/aliens' do | |||||
| # haml :aliens | |||||
| # end | |||||
| not_found do | not_found do | ||||
| haml :not_found | haml :not_found | ||||
| end | |||||
| end | |||||