|
|
@@ -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 |
|
|
|
end |