diff --git a/app.rb b/app.rb index 844b978..a41988a 100644 --- a/app.rb +++ b/app.rb @@ -1,95 +1,184 @@ -require 'rubygems' require 'sinatra' -require 'sinatra-helpers/haml/partials' 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 - # 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 - - @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 -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 -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 -get '/wards/?' do - @wards = Ward.all - haml :wardlist +get '/bodies/:body/?' do + @body = Body.first(:slug => params[:body]) + haml :body 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 - const = 2 + 404 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 -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 -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 +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 haml :election @@ -111,14 +200,10 @@ get '/about' do haml :about end -get '/aliens' do - haml :aliens -end - -get '/wardmap' do - haml :wardmap -end +# get '/aliens' do +# haml :aliens +# end not_found do haml :not_found -end \ No newline at end of file +end