| @@ -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 ) | |||||
| @candidates = Councilcandidate.all( :ward_id => @ward.id, :order => 'surname') | |||||
| @ward = Ward.first( { :name => @ward_name } ) | |||||
| @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| | |||||
| p row | |||||
| Ward.create( | |||||
| 'ons_id' => row[0], | |||||
| 'name' => row[1] | |||||
| ) | |||||
| end | |||||
| # parties = [ | |||||
| # "British National Party", | |||||
| # "Christian Peoples Alliance", | |||||
| # "Conservative Party", | |||||
| # "Green Party", | |||||
| # "Labour Party", | |||||
| # "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 = [ | |||||
| "British National Party", | |||||
| "Christian Peoples Alliance", | |||||
| "Conservative Party", | |||||
| "Green Party", | |||||
| "Labour Party", | |||||
| "Labour and Co-Operative Party", | |||||
| "Liberal Democrats", | |||||
| "United Kingdom Independence Party" | |||||
| ] | |||||
| for party in parties | |||||
| puts party | |||||
| Party.create( :name => party ) | |||||
| end | |||||
| # CSV::Reader.parse(File.open('../candidates-pretty.csv', 'rb')) do |row| | |||||
| # p row | |||||
| # | |||||
| # c = Councilcandidate.new( | |||||
| # 'forenames' => row[1], | |||||
| # 'surname' => row[2], | |||||
| # 'address' => row[4], | |||||
| # 'postcode' => row[5] | |||||
| # ) | |||||
| # | |||||
| # c.ward = Ward.first( :name => row[0] ) | |||||
| # c.party = Party.first( :name => row[3] ) | |||||
| # | |||||
| # unless c.save | |||||
| # 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], | |||||
| 'address' => row[4], | |||||
| 'postcode' => row[5] | |||||
| 'surname' => row[2] | |||||
| ) | ) | ||||
| c.ward = Ward.first( :name => row[0] ) | |||||
| c.party = Party.first( :name => row[3] ) | |||||
| c.constituency = Constituency.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 | |||||
| = @postcode | |||||
| is in | |||||
| = @ward_name | |||||
| Ward | |||||
| -else | |||||
| %h1 | |||||
| = @ward.name | |||||
| Ward | |||||
| %h2 | |||||
| Your candidates for | |||||
| %h1 | |||||
| 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 | |||||
| Your council candidates in | |||||
| %h1 | |||||
| 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 | ||||