| @@ -1,5 +1,6 @@ | |||
| require 'rubygems' | |||
| require 'sinatra' | |||
| require 'haml' | |||
| require 'pat' | |||
| require 'dm-core' | |||
| require 'dm-validations' | |||
| @@ -13,7 +14,8 @@ end | |||
| get '/wards/:id' do | |||
| @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 | |||
| end | |||
| @@ -22,8 +24,9 @@ get '/wards' do | |||
| result = Pat.get(@postcode) | |||
| @district_name = result['administrative']['district']['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 | |||
| end | |||
| @@ -5,51 +5,70 @@ require 'dm-validations' | |||
| require 'dm-timestamps' | |||
| require 'lib/models' | |||
| DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/db.sqlite3") | |||
| DataMapper.auto_upgrade! | |||
| # 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 | |||
| c = Councilcandidate.new( | |||
| c = Parliamentcandidate.new( | |||
| '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 | |||
| puts "ERROR: Failed to save candidate" | |||
| @@ -31,6 +31,7 @@ class Party | |||
| property :name, String, :required => true | |||
| has n, :councilcandidates | |||
| has n, :parliamentcandidates | |||
| end | |||
| class Councilcandidate | |||
| @@ -48,6 +49,21 @@ class Councilcandidate | |||
| belongs_to :ward | |||
| 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 | |||
| include DataMapper::Resource | |||
| @@ -55,6 +71,7 @@ class Constituency | |||
| property :name, String, :required => true | |||
| has n, :wards | |||
| has n, :parliamentcandidates | |||
| end | |||
| DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/db.sqlite3") | |||
| @@ -56,6 +56,7 @@ a:hover | |||
| h2 | |||
| { | |||
| margin-top: 50px; | |||
| line-height: 1.5em; | |||
| } | |||
| form | |||
| @@ -78,6 +79,7 @@ a.date | |||
| h1 | |||
| { | |||
| margin-top: 50px; | |||
| line-height: 1.5em; | |||
| } | |||
| .candidate_name | |||
| @@ -2,15 +2,20 @@ | |||
| %p | |||
| 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 | |||
| 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 | |||
| 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 | |||
| 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 | |||
| On 6 May you can vote to | |||
| @@ -1,3 +1,4 @@ | |||
| !!! XML | |||
| !!! | |||
| %html | |||
| %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 | |||
| member of parliament | |||
| @@ -19,7 +8,14 @@ | |||
| %strong | |||
| ONE | |||
| 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 | |||
| This list of candidates may be incomplete as people have until | |||
| @@ -29,8 +25,8 @@ | |||
| = @ward.constituency.name | |||
| MP. | |||
| %h2 | |||
| Your council candidates in | |||
| %h1 | |||
| Council candidates in | |||
| = @ward.name | |||
| Ward | |||
| @@ -44,7 +40,7 @@ | |||
| Find out more about | |||
| %a{ :href => '/how-the-council-election-works' } how the council election works. | |||
| - for candidate in @candidates | |||
| - for candidate in @council_candidates | |||
| %p | |||
| %span.candidate_name | |||
| = candidate.forenames | |||