diff --git a/app.rb b/app.rb index 0633af0..0790e6f 100644 --- a/app.rb +++ b/app.rb @@ -2,7 +2,7 @@ require 'rubygems' require 'sinatra' require 'sinatra-helpers/haml/partials' require 'haml' -require 'pat' +# require 'pat' require 'lib/models' get '/' do @@ -16,20 +16,19 @@ end get '/wards' do @postcode = params[:postcode].strip.upcase - result = Pat.get(@postcode) - - # Invalid postcode - if result.code == 404 + + unless result = Postcode.finder(@postcode) + # Invalid postcode redirect '/error' end # Postcode valid but not in LB Sutton - if result['administrative']['district']['title'] != "Sutton London Borough Council" + if result.district_code != "00BF" redirect '/aliens' end # Postcode in LB Sutton - @ward = Ward.first( :name => result['administrative']['ward']['title'] ) + @ward = Ward.first( :ons_id => result.ward_code ) haml :wards end @@ -56,4 +55,4 @@ end get '/aliens' do haml :aliens -end \ No newline at end of file +end diff --git a/lib/models.rb b/lib/models.rb index 73b276b..29a9126 100644 --- a/lib/models.rb +++ b/lib/models.rb @@ -1,19 +1,52 @@ require 'dm-core' require 'dm-validations' require 'dm-timestamps' +require 'pat' class Postcode include DataMapper::Resource - property :id, Serial - property :postcode, String, :required => true - property :created_at, DateTime, :required => true + # Postcode natural key, uppercase with space, eg. "SM1 1EA" + property :postcode, String, :key => true + property :created_at, DateTime + property :updated_at, DateTime property :lat, Float, :required => true property :lng, Float, :required => true property :district_name, String, :required => true property :district_code, String, :required => true property :ward_name, String, :required => true property :ward_code, String, :required => true + + def postcode=(postcode) + attribute_set(:postcode, postcode.strip.upcase) + end + + 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 + return 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 Ward diff --git a/public/style.css b/public/style.css index 426a672..fa800a3 100644 --- a/public/style.css +++ b/public/style.css @@ -25,11 +25,6 @@ input.postcode text-transform: uppercase; } -#header -{ - margin-bottom: 0px; -} - #main { margin: 30px 0; @@ -43,9 +38,9 @@ input.postcode margin: 40px 0 40px 0; } -a, a:visited +a { - background-color: #d9ec96; + background-color: #dce9b0; padding: 1px 4px; color: #111; text-decoration: none; @@ -65,20 +60,6 @@ a:hover color: #fff; } -a.date -{ - font-size: 610%; - font-weight: bold; - padding: 30px 30px; - background-color: red; - display: none; - position: absolute; - left: 0; - top: 1000; - -webkit-transform: rotate(-90deg); - -moz-transform: rotate(-90deg); -} - h1 { margin-top: 20px;