diff --git a/lib/models.rb b/models.rb similarity index 57% rename from lib/models.rb rename to models.rb index 2f236e1..d4025e6 100644 --- a/lib/models.rb +++ b/models.rb @@ -1,7 +1,4 @@ -require 'dm-core' -require 'dm-validations' -require 'dm-timestamps' -require 'dm-aggregates' +require 'data_mapper' require 'pat' class Postcode @@ -46,22 +43,95 @@ class Postcode end end -class Ward +class Candidate include DataMapper::Resource + + property :id, Serial + property :forenames, String, :required => true + property :surname, String, :required => true + property :sex, String - property :id, Serial - property :slug, String, :required => true - property :ons_id, String, :required => true - property :name, String, :required => true - property :constituency_id, Integer, :required => true - - has n, :councilcandidates, :order => ['surname'] - belongs_to :constituency + has n, :candidacies + + def short_name + @forenames.split(' ')[0] + ' ' + @surname + end + + def name + @forenames + ' ' + @surname + end +end + +class Candidacy + include DataMapper::Resource + + property :id, Serial + property :election_id, Integer, :required => true + property :candidate_id, Integer, :required => true + property :party_id, Integer + property :district_id, Integer, :required => true + property :votes, Integer + property :address, String, :length => 200 + property :postcode, String + property :position, Integer + property :elected, Boolean + property :seats, Integer + + belongs_to :election + belongs_to :candidate + belongs_to :party + belongs_to :district +end + +class Election + include DataMapper::Resource + + property :id, Serial + property :body_id, Integer, :required => true + property :d, Date, :required => true + property :reason, String, :length => 255 + property :kind, String, :length => 255 + + has n, :candidacies + belongs_to :body + + def self.past + self.all(:d.lt => Time.now.to_s, :order => [ :d.desc ]) + end + + def self.future + self.all(:d.gte => Time.now.to_s, :order => [ :d.desc ]) + end + +end + +class District + include DataMapper::Resource + + property :id, Serial + property :body_id, Integer, :required => true + property :name, String, :length => 255, :required => true + property :slug, String + property :seats, Integer + + belongs_to :body def self.slugify(name) name.gsub(/[^\w\s-]/, '').gsub(/\s+/, '-').downcase end +end + +class Body + include DataMapper::Resource + + property :id, Serial + property :name, String, :length => 255, :required => true + property :district_name, String, :length => 255, :required => true # singular + property :districts_name, String, :length => 255, :required => true # plural + property :slug, String, :length => 255 + has n, :elections + has n, :districts end class Party @@ -71,10 +141,32 @@ class Party property :name, String, :required => true property :colour, String + has n, :candidates, :order => ['surname'] + has n, :councilcandidates, :order => ['surname'] has n, :parliamentcandidates, :order => ['surname'] end +# These models are now redundant + +class Ward + include DataMapper::Resource + + property :id, Serial + property :slug, String, :required => true + property :ons_id, String, :required => true + property :name, String, :required => true + property :constituency_id, Integer, :required => true + + has n, :councilcandidates, :order => ['surname'] + belongs_to :constituency + + def self.slugify(name) + name.gsub(/[^\w\s-]/, '').gsub(/\s+/, '-').downcase + end + +end + class Councilcandidate include DataMapper::Resource @@ -120,5 +212,5 @@ class Constituency has n, :parliamentcandidates, :order => ['surname'] end -DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/suttonelections.db") +DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/db/suttonelections.db") DataMapper.auto_upgrade! \ No newline at end of file