@@ -11,7 +11,7 @@ GEM | |||
specs: | |||
addressable (2.5.2) | |||
public_suffix (>= 2.0.2, < 4.0) | |||
bcrypt (3.1.11) | |||
bcrypt (3.1.12) | |||
bcrypt-ruby (3.1.5) | |||
bcrypt (>= 3.1.3) | |||
data_mapper (1.2.0) | |||
@@ -37,15 +37,15 @@ GEM | |||
dm-core (~> 1.2.0) | |||
dm-migrations (1.2.0) | |||
dm-core (~> 1.2.0) | |||
dm-postgres-adapter (1.2.0) | |||
dm-do-adapter (~> 1.2.0) | |||
do_postgres (~> 0.10.6) | |||
dm-serializer (1.2.2) | |||
dm-core (~> 1.2.0) | |||
fastercsv (~> 1.5) | |||
json (~> 1.6) | |||
json_pure (~> 1.6) | |||
multi_json (~> 1.0) | |||
dm-sqlite-adapter (1.2.0) | |||
dm-do-adapter (~> 1.2.0) | |||
do_sqlite3 (~> 0.10.6) | |||
dm-timestamps (1.2.0) | |||
dm-core (~> 1.2.0) | |||
dm-transactions (1.2.0) | |||
@@ -60,7 +60,7 @@ GEM | |||
uuidtools (~> 2.1) | |||
dm-validations (1.2.0) | |||
dm-core (~> 1.2.0) | |||
do_postgres (0.10.17) | |||
do_sqlite3 (0.10.17) | |||
data_objects (= 0.10.17) | |||
fastercsv (1.5.5) | |||
haml (5.0.4) | |||
@@ -69,8 +69,7 @@ GEM | |||
json (1.8.6) | |||
json_pure (1.8.6) | |||
multi_json (1.13.1) | |||
pg (1.0.0) | |||
public_suffix (3.0.2) | |||
public_suffix (3.0.3) | |||
stringex (1.5.1) | |||
temple (0.8.0) | |||
tilt (2.0.8) | |||
@@ -81,13 +80,11 @@ PLATFORMS | |||
DEPENDENCIES | |||
data_mapper | |||
dm-postgres-adapter | |||
haml | |||
dm-sqlite-adapter | |||
petrify! | |||
pg | |||
RUBY VERSION | |||
ruby 2.3.1p112 | |||
BUNDLED WITH | |||
1.16.1 | |||
1.16.6 |
@@ -2,6 +2,7 @@ | |||
require 'petrify' | |||
require_relative '../models' | |||
require_relative '../lib/helpers' | |||
require 'pp' | |||
def gen_info_pages | |||
Petrify.page('about', 'about') | |||
@@ -23,7 +24,7 @@ def gen_bodies_pages | |||
e.id, | |||
e.kind, | |||
e.d, | |||
SUM(p.ballot_papers_issued)::float / SUM(p.electorate) * 100 AS turnout_percent | |||
(SUM(p.ballot_papers_issued) * 1.0) / SUM(p.electorate) * 100 AS turnout_percent | |||
FROM elections e | |||
@@ -0,0 +1,32 @@ | |||
# require_relative '../models' | |||
require 'scraperwiki' | |||
require 'sequel' | |||
load '_config.rb' | |||
require 'pp' | |||
class Object | |||
def to_hash | |||
h = {} | |||
instance_variables.each do |var| | |||
h[var.to_s.delete('@')] = instance_variable_get(var) | |||
end | |||
# Remove DataMapper-specific keys, which start with an underscore | |||
h.keys.each do |k| | |||
h.delete(k) if k.match(/^_/) | |||
end | |||
h | |||
end | |||
end | |||
DB = Sequel.connect(ENV['DATABASE_URL']) | |||
DB[:polls].each { |o| ScraperWiki.save_sqlite([:district_id, :election_id], o.to_hash, 'polls') } | |||
DB[:candidates].each { |o| ScraperWiki.save_sqlite([:id], o.to_hash, 'candidates') } | |||
DB[:candidacies].each { |o| ScraperWiki.save_sqlite([:id], o.to_hash, 'candidacies') } | |||
DB[:deleted_candidates].each { |o| ScraperWiki.save_sqlite([:old_candidate_id], o.to_hash, 'deleted_candidates') } | |||
DB[:elections].each { |o| ScraperWiki.save_sqlite([:id], o.to_hash, 'elections') } | |||
DB[:districts].each { |o| ScraperWiki.save_sqlite([:id], o.to_hash, 'districts') } | |||
DB[:bodies].each { |o| ScraperWiki.save_sqlite([:id], o.to_hash, 'bodies') } | |||
DB[:parties].each { |o| ScraperWiki.save_sqlite([:id], o.to_hash, 'parties') } |
@@ -37,14 +37,19 @@ def format_percent(num) | |||
end | |||
def short_date(d) | |||
# FIXME wtf - because sometimes we're doing raw sql queries and sometimes it's coming through the DataMapper::Resource class | |||
d = Date.parse(d) unless d.class == Date | |||
d.strftime("%e %b %Y") | |||
end | |||
def long_date(d) | |||
# FIXME wtf - because sometimes we're doing raw sql queries and sometimes it's coming through the DataMapper::Resource class | |||
d = Date.parse(d) unless d.class == Date | |||
d.strftime("%e %B %Y") | |||
end | |||
# Exception for Labour/Co-operative candidacies | |||
def party_name(labcoop, party_name) | |||
labcoop ? "Labour and Co-operative Party" : party_name | |||
# puts labcoop.class # FIXME wtf - because sometimes we're doing raw sql queries and sometimes it's coming through the DataMapper::Resource class | |||
labcoop == 1 || labcoop == '1' ? "Labour and Co-operative Party" : party_name | |||
end |
@@ -62,73 +62,6 @@ class Poll | |||
belongs_to :district | |||
end | |||
class PollingStation | |||
include DataMapper::Resource | |||
property :id, String, :key => true, :length => 2 # e.g. "KA" | |||
property :name, String, :length => 255#, :required => true | |||
property :address, String, :length => 255#, :required => true | |||
property :postcode, String#, :required => true | |||
property :easting, Float, :required => true | |||
property :northing, Float, :required => true | |||
property :lat, Float, :required => true | |||
property :lng, Float, :required => true | |||
has n, :postcodes | |||
end | |||
class Postcode | |||
include DataMapper::Resource | |||
# Postcode natural key, uppercase with space, eg. "SM1 1EA" | |||
# Column names derived from Ordnance Survey CodePoint Open | |||
property :postcode, String, :key => true | |||
property :positional_quality_indicator, Integer | |||
property :eastings, Integer, :required => true | |||
property :northings, Integer, :required => true | |||
property :country_code, String, :required => true | |||
property :nhs_regional_ha_code, String, :required => true | |||
property :nhs_ha_code, String, :required => true | |||
property :admin_county_code, String # NULL within Greater London | |||
property :admin_district_code, String, :required => true # e.g. London Borough of Sutton | |||
property :admin_ward_code, String, :required => true # e.g. Sutton Central | |||
property :lat, Float, :required => true | |||
property :lng, Float, :required => true | |||
property :ward_id, Integer, :required => true # Sutton Council | |||
property :constituency_id, Integer, :required => false # UK Parliament | |||
property :polling_station_id, String, :length => 2 | |||
belongs_to :district, :child_key => [:ward_id] | |||
belongs_to :polling_station | |||
def self.finder(postcode) | |||
postcode = postcode.strip.upcase | |||
if o = self.get(postcode) | |||
return o | |||
end | |||
result = Pat.get(postcode) | |||
unless result.code == 404 | |||
# cache API result | |||
self.create( | |||
:postcode => postcode, | |||
:lat => result['geo']['lat'], | |||
:lng => result['geo']['lng'], | |||
:district_name => result['administrative']['district']['title'], | |||
:district_code => result['administrative']['district']['uri'].match(/.+\/(.+)$/)[1], | |||
:ward_name => result['administrative']['ward']['title'], | |||
:ward_code => result['administrative']['ward']['uri'].match(/.+\/(.+)$/)[1] | |||
) | |||
else | |||
# invalid postcode | |||
nil | |||
end | |||
end | |||
end | |||
class Candidate | |||
include DataMapper::Resource | |||
@@ -136,7 +69,7 @@ class Candidate | |||
property :forenames, String, :required => true | |||
property :surname, String, :required => true, :index => true | |||
has n, :candidacies | |||
has n, :candidacies#, 'Candidacy' | |||
def short_name | |||
@forenames.split(' ')[0] + ' ' + @surname | |||
@@ -171,7 +104,7 @@ class Candidacy | |||
property :postcode, String | |||
property :position, Integer # Position of this candidate in this district. (1..n) | |||
property :seats, Integer # Number of seats won by this candidacy (0 or 1) | |||
property :labcoop, Boolean, :default => false # Candidacy is for joint Labour/Co-op party | |||
property :labcoop, String, :default => '0' # Candidacy is for joint Labour/Co-op party | |||
belongs_to :election | |||
belongs_to :candidate | |||
@@ -179,19 +112,6 @@ class Candidacy | |||
belongs_to :district | |||
end | |||
class Campaign | |||
include DataMapper::Resource | |||
property :party_id, Integer, :key => true | |||
property :election_id, Integer, :key => true | |||
property :party_url, String, :length => 255 | |||
property :manifesto_html_url, String, :length => 255 | |||
property :manifesto_pdf_url, String, :length => 255 | |||
belongs_to :party | |||
belongs_to :election | |||
end | |||
class Election | |||
include DataMapper::Resource | |||
@@ -204,7 +124,6 @@ class Election | |||
has n, :candidacies | |||
has n, :polls | |||
belongs_to :body | |||
has n, :campaigns | |||
def self.past | |||
self.all(:d.lt => Time.now.to_s, :order => [ :d.desc ]) | |||
@@ -238,7 +157,6 @@ class District | |||
property :ons_district_code, String | |||
belongs_to :body | |||
has n, :postcodes, :child_key => [:ward_id] | |||
has n, :polls | |||
def self.slugify(name) | |||
@@ -267,8 +185,9 @@ class Party | |||
property :colour, String | |||
has n, :candidacies | |||
has n, :campaigns | |||
# has n, :campaigns | |||
end | |||
DataMapper.setup(:default, ENV['DATABASE_URL']) | |||
DataMapper.repository(:default).adapter.resource_naming_convention = DataMapper::NamingConventions::Resource::UnderscoredAndPluralized | |||
DataMapper.auto_upgrade! |
@@ -23,7 +23,7 @@ | |||
%td | |||
%a{ :href => "/bodies/#{ccy['body_slug']}/elections/#{ccy['d']}" } | |||
-# Postgres returns ccy['d'] as a Date and sqlite returns it as a String | |||
= long_date(ccy['d'].to_time) | |||
= long_date(ccy['d']) | |||
%td= party_name(ccy['labcoop'], ccy['party_name']) | |||
%td | |||
%a{ :href => "/bodies/#{ccy['body_slug']}" } | |||
@@ -11,7 +11,7 @@ | |||
- unless election_index == 0 | |||
- previous_election = elections_for_this_body[election_index - 1] | |||
%a{ :href => "/bodies/#{election.body.slug}/elections/#{previous_election.d}", :title => "#{previous_election.kind} #{short_date(previous_election.d)}" } | |||
%a{ :href => "/bodies/#{election.body.slug}/elections/#{previous_election.d.to_s}", :title => "#{previous_election.kind} #{short_date(previous_election.d.to_s)}" } | |||
« | |||
Previous | |||
= election.body.name | |||
@@ -20,7 +20,7 @@ | |||
- unless election_index == elections_for_this_body.size - 1 | |||
- next_election = elections_for_this_body[election_index + 1] | |||
%a{ :href => "/bodies/#{election.body.slug}/elections/#{next_election.d}", :title => "#{next_election.kind} #{short_date(next_election.d)}" } | |||
%a{ :href => "/bodies/#{election.body.slug}/elections/#{next_election.d.to_s}", :title => "#{next_election.kind} #{short_date(next_election.d)}" } | |||
Next | |||
= election.body.name | |||
election | |||
@@ -131,7 +131,7 @@ | |||
- election.polls.each do |p| | |||
%tr | |||
%td | |||
%a{ :href => "/bodies/#{election.body.slug}/elections/#{election.d}/#{election.body.districts_name}/#{p.district.slug}"} | |||
%a{ :href => "/bodies/#{election.body.slug}/elections/#{election.d.to_s}/#{election.body.districts_name}/#{p.district.slug}"} | |||
= p.district.name | |||
- p.successful_candidacies.each do |sc| | |||
%td{ :style => "background-color: #{sc.party.colour};" } | |||