@@ -1,5 +1,6 @@ | |||||
require 'rubygems' | require 'rubygems' | ||||
require 'sinatra' | require 'sinatra' | ||||
require 'haml' | |||||
require 'pat' | require 'pat' | ||||
require 'dm-core' | require 'dm-core' | ||||
require 'dm-validations' | require 'dm-validations' | ||||
@@ -13,7 +14,8 @@ end | |||||
get '/wards/:id' do | get '/wards/:id' do | ||||
@ward = Ward.get(params[:id]) | @ward = Ward.get(params[:id]) | ||||
@candidates = Councilcandidate.all( :ward_id => @ward.id, :order => 'surname' ) | @council_candidates = Councilcandidate.all( :ward_id => @ward.id, :order => 'surname' ) | ||||
@parly_candidates = Parliamentcandidate.all( :constituency_id => @ward.constituency.id, :order => 'surname') | |||||
haml :wards | haml :wards | ||||
end | end | ||||
@@ -22,8 +24,9 @@ get '/wards' do | |||||
result = Pat.get(@postcode) | result = Pat.get(@postcode) | ||||
@district_name = result['administrative']['district']['title'] | @district_name = result['administrative']['district']['title'] | ||||
@ward_name = result['administrative']['ward']['title'] | @ward_name = result['administrative']['ward']['title'] | ||||
@ward = Ward.first( :name => @ward_name ) | @ward = Ward.first( { :name => @ward_name } ) | ||||
@candidates = Councilcandidate.all( :ward_id => @ward.id, :order => 'surname') | @council_candidates = Councilcandidate.all( :ward_id => @ward.id, :order => 'surname') | ||||
@parly_candidates = Parliamentcandidate.all( :constituency_id => @ward.constituency.id, :order => 'surname') | |||||
haml :wards | haml :wards | ||||
end | end | ||||
@@ -5,51 +5,70 @@ require 'dm-validations' | |||||
require 'dm-timestamps' | require 'dm-timestamps' | ||||
require 'lib/models' | require 'lib/models' | ||||
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/db.sqlite3") | |||||
DataMapper.auto_upgrade! | |||||
# Import wards | # Import wards | ||||
# | |||||
# CSV::Reader.parse(File.open('wards.csv', 'rb')) do |row| | |||||
# p row | |||||
# Ward.create( | |||||
# 'ons_id' => row[0], | |||||
# 'name' => row[1] | |||||
# ) | |||||
# end | |||||
# | |||||
# Define parties | |||||
CSV::Reader.parse(File.open('wards.csv', 'rb')) do |row| | # parties = [ | ||||
p row | # "British National Party", | ||||
Ward.create( | # "Christian Peoples Alliance", | ||||
'ons_id' => row[0], | # "Conservative Party", | ||||
'name' => row[1] | # "Green Party", | ||||
) | # "Labour Party", | ||||
end | # "Labour and Co-Operative Party", | ||||
# "Liberal Democrats", | |||||
# "United Kingdom Independence Party", | |||||
# "Libertarian Party" | |||||
# ] | |||||
# | |||||
# for party in parties | |||||
# puts party | |||||
# Party.create( :name => party ) | |||||
# end | |||||
# Define parties | # Import council candidates | ||||
parties = [ | # CSV::Reader.parse(File.open('../candidates-pretty.csv', 'rb')) do |row| | ||||
"British National Party", | # p row | ||||
"Christian Peoples Alliance", | # | ||||
"Conservative Party", | # c = Councilcandidate.new( | ||||
"Green Party", | # 'forenames' => row[1], | ||||
"Labour Party", | # 'surname' => row[2], | ||||
"Labour and Co-Operative Party", | # 'address' => row[4], | ||||
"Liberal Democrats", | # 'postcode' => row[5] | ||||
"United Kingdom Independence Party" | # ) | ||||
] | # | ||||
# c.ward = Ward.first( :name => row[0] ) | |||||
for party in parties | # c.party = Party.first( :name => row[3] ) | ||||
puts party | # | ||||
Party.create( :name => party ) | # unless c.save | ||||
end | # puts "ERROR: Failed to save candidate" | ||||
# c.errors.each do |e| | |||||
# puts e | |||||
# end | |||||
# end | |||||
# end | |||||
# Import candidates | # Import parliament candidates | ||||
CSV::Reader.parse(File.open('../candidates-pretty.csv', 'rb')) do |row| | CSV::Reader.parse(File.open('../parliament-candidates.csv', 'rb')) do |row| | ||||
p row | p row | ||||
c = Councilcandidate.new( | c = Parliamentcandidate.new( | ||||
'forenames' => row[1], | 'forenames' => row[1], | ||||
'surname' => row[2], | 'surname' => row[2] | ||||
'address' => row[4], | |||||
'postcode' => row[5] | |||||
) | ) | ||||
c.ward = Ward.first( :name => row[0] ) | c.constituency = Constituency.first( :name => row[3] ) | ||||
c.party = Party.first( :name => row[3] ) | c.party = Party.first( :name => row[0] ) | ||||
unless c.save | unless c.save | ||||
puts "ERROR: Failed to save candidate" | puts "ERROR: Failed to save candidate" | ||||
@@ -31,6 +31,7 @@ class Party | |||||
property :name, String, :required => true | property :name, String, :required => true | ||||
has n, :councilcandidates | has n, :councilcandidates | ||||
has n, :parliamentcandidates | |||||
end | end | ||||
class Councilcandidate | class Councilcandidate | ||||
@@ -48,6 +49,21 @@ class Councilcandidate | |||||
belongs_to :ward | belongs_to :ward | ||||
end | end | ||||
class Parliamentcandidate | |||||
include DataMapper::Resource | |||||
property :id, Serial | |||||
property :constituency_id, Integer, :required => true | |||||
property :party_id, Integer, :required => true | |||||
property :forenames, String, :required => true | |||||
property :surname, String, :required => true | |||||
property :address, String, :length => 200 | |||||
property :postcode, String | |||||
belongs_to :party | |||||
belongs_to :constituency | |||||
end | |||||
class Constituency | class Constituency | ||||
include DataMapper::Resource | include DataMapper::Resource | ||||
@@ -55,6 +71,7 @@ class Constituency | |||||
property :name, String, :required => true | property :name, String, :required => true | ||||
has n, :wards | has n, :wards | ||||
has n, :parliamentcandidates | |||||
end | end | ||||
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/db.sqlite3") | DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/db.sqlite3") |
@@ -56,6 +56,7 @@ a:hover | |||||
h2 | h2 | ||||
{ | { | ||||
margin-top: 50px; | margin-top: 50px; | ||||
line-height: 1.5em; | |||||
} | } | ||||
form | form | ||||
@@ -78,6 +79,7 @@ a.date | |||||
h1 | h1 | ||||
{ | { | ||||
margin-top: 50px; | margin-top: 50px; | ||||
line-height: 1.5em; | |||||
} | } | ||||
.candidate_name | .candidate_name | ||||
@@ -2,15 +2,20 @@ | |||||
%p | %p | ||||
This website was designed by | This website was designed by | ||||
%a{ :href => 'http://adrianshort.co.uk' } Adrian Short | %a{ :href => 'http://adrianshort.co.uk' }> Adrian Short | ||||
\. | |||||
You can contact me by email at | |||||
%a{ :href => "mailto:adrian.short@gmail.com" }< adrian.short@gmail.com | |||||
and | |||||
%a{ :href => "http://twitter.com/adrianshort" }<follow me on Twitter | |||||
\. | |||||
%p It is independent of Sutton Council, all political parties and candidates. | %p This site is independent of Sutton Council, all political parties and candidates. It exists only to provide information about the voting system and local candidates. | ||||
%p | %p | ||||
The code for this website is open source and managed on Github. It is hosted by Heroku. | The council candidates' data comes from Sutton Council who also provided information on council wards and parliamentary constituencies. | ||||
%p | %p | ||||
The candidates' data comes from Sutton Council who also provided information on council wards and parliamentary constituencies. | The code for this website is open source and managed on Github. It is hosted by Heroku. | ||||
%p | %p | ||||
The postcode lookup is done by UK Postcodes using open data from Ordnance Survey Code-Point Open enhanced by MySociety. I use the Ruby Pat gem to access the postcodes API. | The postcode lookup is done by UK Postcodes using open data from Ordnance Survey Code-Point Open enhanced by MySociety. I use the Ruby Pat gem to access the postcodes API. | ||||
@@ -1,4 +1,7 @@ | |||||
%h1 One day. Two elections in Sutton. | %h1 | ||||
Vote for your MP and councillors | |||||
%br | |||||
in Sutton | |||||
%p | %p | ||||
On 6 May you can vote to | On 6 May you can vote to | ||||
@@ -1,3 +1,4 @@ | |||||
!!! XML | |||||
!!! | !!! | ||||
%html | %html | ||||
%head | %head | ||||
@@ -1,16 +1,5 @@ | |||||
- if @postcode | %h1 | ||||
%h1 | Candidates for | ||||
= @postcode | |||||
is in | |||||
= @ward_name | |||||
Ward | |||||
-else | |||||
%h1 | |||||
= @ward.name | |||||
Ward | |||||
%h2 | |||||
Your candidates for | |||||
= @ward.constituency.name | = @ward.constituency.name | ||||
member of parliament | member of parliament | ||||
@@ -19,7 +8,14 @@ | |||||
%strong | %strong | ||||
ONE | ONE | ||||
of these people to become your next MP. | of these people to become your next MP. | ||||
- for candidate in @parly_candidates | |||||
%p | |||||
%span.candidate_name | |||||
= candidate.forenames | |||||
= candidate.surname | |||||
%br | |||||
= candidate.party.name | |||||
%p.highlight | %p.highlight | ||||
This list of candidates may be incomplete as people have until | This list of candidates may be incomplete as people have until | ||||
@@ -29,8 +25,8 @@ | |||||
= @ward.constituency.name | = @ward.constituency.name | ||||
MP. | MP. | ||||
%h2 | %h1 | ||||
Your council candidates in | Council candidates in | ||||
= @ward.name | = @ward.name | ||||
Ward | Ward | ||||
@@ -44,7 +40,7 @@ | |||||
Find out more about | Find out more about | ||||
%a{ :href => '/how-the-council-election-works' } how the council election works. | %a{ :href => '/how-the-council-election-works' } how the council election works. | ||||
- for candidate in @candidates | - for candidate in @council_candidates | ||||
%p | %p | ||||
%span.candidate_name | %span.candidate_name | ||||
= candidate.forenames | = candidate.forenames | ||||