diff --git a/app/controllers/plantings_controller.rb b/app/controllers/plantings_controller.rb index 740edb5b3..a5b781bab 100644 --- a/app/controllers/plantings_controller.rb +++ b/app/controllers/plantings_controller.rb @@ -58,6 +58,7 @@ class PlantingsController < ApplicationController # POST /plantings # POST /plantings.json def create + params[:planting][:owner_id] = current_member.id params[:planted_at] = parse_date(params[:planted_at]) @planting = Planting.new(params[:planting]) diff --git a/app/models/crop.rb b/app/models/crop.rb index 46eadf535..9717eb1da 100644 --- a/app/models/crop.rb +++ b/app/models/crop.rb @@ -39,10 +39,6 @@ class Crop < ActiveRecord::Base end end - def plantings_count - return plantings.count - end - # crop.default_photo # currently returns the first available photo, but exists so that # later we can choose a default photo based on different criteria, diff --git a/app/models/member.rb b/app/models/member.rb index 7541a3a0e..0f7081cda 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -7,7 +7,7 @@ class Member < ActiveRecord::Base has_many :forums, :foreign_key => 'owner_id' has_many :gardens, :foreign_key => 'owner_id' - has_many :plantings, :through => :gardens + has_many :plantings, :foreign_key => 'owner_id' has_many :seeds, :foreign_key => 'owner_id' diff --git a/app/models/planting.rb b/app/models/planting.rb index cf9e9aea3..61188f184 100644 --- a/app/models/planting.rb +++ b/app/models/planting.rb @@ -3,11 +3,11 @@ class Planting < ActiveRecord::Base friendly_id :planting_slug, use: :slugged attr_accessible :crop_id, :description, :garden_id, :planted_at, - :quantity, :sunniness, :planted_from + :quantity, :sunniness, :planted_from, :owner_id belongs_to :garden + belongs_to :owner, :class_name => 'Member', :counter_cache => true belongs_to :crop, :counter_cache => true - has_one :owner, :through => :garden has_and_belongs_to_many :photos before_destroy {|planting| planting.photos.clear} @@ -53,7 +53,7 @@ class Planting < ActiveRecord::Base "#{owner.login_name}-#{garden}-#{crop}".downcase.gsub(' ', '-') end - # location = owner + garden, i.e. "Skud's backyard" + # location = garden owner + garden name, i.e. "Skud's backyard" def location return "#{garden.owner.login_name}'s #{garden}" end diff --git a/app/views/crops/_index_card.html.haml b/app/views/crops/_index_card.html.haml index c63f6ea05..640a3bcda 100644 --- a/app/views/crops/_index_card.html.haml +++ b/app/views/crops/_index_card.html.haml @@ -12,7 +12,7 @@ %p %b Planted - = pluralize(crop.plantings_count, "time") + = pluralize(crop.plantings.size, "time") by #{Growstuff::Application.config.site_name} members - if can? :create, Planting diff --git a/app/views/crops/_popover.html.haml b/app/views/crops/_popover.html.haml index c692f3d51..0c40b6ec7 100644 --- a/app/views/crops/_popover.html.haml +++ b/app/views/crops/_popover.html.haml @@ -5,4 +5,4 @@ = crop.scientific_names.first.scientific_name %br/ Planted - = pluralize(crop.plantings_count, "time") + = pluralize(crop.plantings.size, "time") diff --git a/app/views/crops/_thumbnail.html.haml b/app/views/crops/_thumbnail.html.haml index 1337b8f0d..aaaead82c 100644 --- a/app/views/crops/_thumbnail.html.haml +++ b/app/views/crops/_thumbnail.html.haml @@ -11,4 +11,4 @@ %br/ %small Planted - = pluralize(crop.plantings_count, "time") + = pluralize(crop.plantings.size, "time") diff --git a/app/views/crops/show.html.haml b/app/views/crops/show.html.haml index 713445005..952d6c5e4 100644 --- a/app/views/crops/show.html.haml +++ b/app/views/crops/show.html.haml @@ -9,9 +9,9 @@ = render :partial => 'planting_advice', :locals => { :crop => @crop } %p - - if @crop.plantings_count > 0 + - if @crop.plantings.size > 0 Planted - = pluralize(@crop.plantings_count, "time") + = pluralize(@crop.plantings.size, "time") by #{Growstuff::Application.config.site_name} members - else Nobody is growing this yet. You could be the first! @@ -25,7 +25,7 @@ - if can? :create, Seed = link_to 'Add seeds to stash', new_seed_path(:params => { :crop_id => @crop.id }), :class => 'btn btn-primary' - - if @crop.plantings_count > 0 + - if @crop.plantings.size > 0 - @crop.plantings.each do |p| = render :partial => "plantings/thumbnail", :locals => { :planting => p, :title => 'owner' } diff --git a/app/views/members/_popover.html.haml b/app/views/members/_popover.html.haml index 2772046cd..24122c560 100644 --- a/app/views/members/_popover.html.haml +++ b/app/views/members/_popover.html.haml @@ -8,8 +8,8 @@ = distance_of_time_in_words(member.created_at, Time.zone.now) ago. %p - = pluralize(member.gardens.count, "garden") + = pluralize(member.gardens.size, "garden") %br/ - = pluralize(member.plantings.count, "planting") + = pluralize(member.plantings.size, "planting") %br/ - = pluralize(member.seeds.count, "seed") + = pluralize(member.seeds.size, "seed") diff --git a/app/views/plantings/_list.html.haml b/app/views/plantings/_list.html.haml index 6c9812222..5374c815a 100644 --- a/app/views/plantings/_list.html.haml +++ b/app/views/plantings/_list.html.haml @@ -7,7 +7,7 @@ = link_to p.crop, p.crop in = succeed "'s" do - = link_to p.owner, p.owner + = link_to p.garden.owner, p.garden.owner = link_to p.garden, p.garden %br/ %small diff --git a/db/migrate/20130826012139_add_owner_to_planting.rb b/db/migrate/20130826012139_add_owner_to_planting.rb new file mode 100644 index 000000000..0f32568b2 --- /dev/null +++ b/db/migrate/20130826012139_add_owner_to_planting.rb @@ -0,0 +1,5 @@ +class AddOwnerToPlanting < ActiveRecord::Migration + def change + add_column :plantings, :owner_id, :integer + end +end diff --git a/db/migrate/20130826023159_add_plantings_count_to_member.rb b/db/migrate/20130826023159_add_plantings_count_to_member.rb new file mode 100644 index 000000000..06819f61c --- /dev/null +++ b/db/migrate/20130826023159_add_plantings_count_to_member.rb @@ -0,0 +1,5 @@ +class AddPlantingsCountToMember < ActiveRecord::Migration + def change + add_column :members, :plantings_count, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 2237703ee..179f7e82b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130821073736) do +ActiveRecord::Schema.define(:version => 20130826023159) do create_table "account_types", :force => true do |t| t.string "name", :null => false @@ -116,6 +116,7 @@ ActiveRecord::Schema.define(:version => 20130821073736) do t.float "longitude" t.boolean "send_notification_email", :default => true t.text "bio" + t.integer "plantings_count" end add_index "members", ["confirmation_token"], :name => "index_users_on_confirmation_token", :unique => true @@ -192,6 +193,7 @@ ActiveRecord::Schema.define(:version => 20130821073736) do t.string "slug" t.string "sunniness" t.string "planted_from" + t.integer "owner_id" end add_index "plantings", ["slug"], :name => "index_plantings_on_slug", :unique => true diff --git a/lib/tasks/growstuff.rake b/lib/tasks/growstuff.rake index 8b9a1bada..f1e63c5cb 100644 --- a/lib/tasks/growstuff.rake +++ b/lib/tasks/growstuff.rake @@ -138,14 +138,35 @@ namespace :growstuff do cropbot.account.account_type = AccountType.find_by_name("Staff") # set this just because it's nice cropbot.account.save Crop.find_each do |crop| - crop.creator = cropbot - crop.save + unless crop.creator + crop.creator = cropbot + crop.save + end end ScientificName.find_each do |sn| - sn.creator = cropbot - sn.save + unless sn.creator + sn.creator = cropbot + sn.save + end end end + + desc "August 2013: set planting owner" + task :set_planting_owner => :environment do + Planting.find_each do |p| + p.owner = p.garden.owner + p.save + end + end + + desc "August 2013: initialize member planting counter" + task :initialize_member_planting_count => :environment do + Member.find_each do |m| + Member.reset_counters m.id, :plantings + end + end + end + end diff --git a/lib/tasks/testing.rake b/lib/tasks/testing.rake index cb58df2c9..1f7f000ef 100644 --- a/lib/tasks/testing.rake +++ b/lib/tasks/testing.rake @@ -2,7 +2,7 @@ require 'rake' begin require 'rspec/core/rake_task' task(:spec).clear - RSpec::Core::RakeTask.new(:spec) do |t| + RSpec::Core::RakeTask.new(:spec => 'db:test:prepare') do |t| t.verbose = false end rescue LoadError diff --git a/script/deploy-tasks.sh b/script/deploy-tasks.sh index c7b85de08..510eac6fb 100755 --- a/script/deploy-tasks.sh +++ b/script/deploy-tasks.sh @@ -6,8 +6,12 @@ # when it was added. This will help us know which ones have been run # and can safely be commented out or removed. -echo "2013-08-18 - reset crop planting counts" -rake growstuff:oneoff:reset_crop_plantings_count +# Default format is: +# echo "YYYY-MM-DD - do something or other" +# rake growstuff:oneoff:something -echo "2013-08-21 - set default crop creator" -rake growstuff:oneoff:set_default_crop_creator +echo "2013-08-26 - set planting owner" +rake growstuff:oneoff:set_planting_owner + +echo "2013-08-26 - initialize member planting count" +rake growstuff:oneoff:initialize_member_planting_count diff --git a/spec/controllers/photos_controller_spec.rb b/spec/controllers/photos_controller_spec.rb index 9618c5b45..a73981e4c 100644 --- a/spec/controllers/photos_controller_spec.rb +++ b/spec/controllers/photos_controller_spec.rb @@ -4,7 +4,6 @@ describe PhotosController do login_member - def valid_attributes member = FactoryGirl.create(:member) { @@ -67,7 +66,7 @@ describe PhotosController do member = FactoryGirl.create(:member) controller.stub(:current_member) { member } garden = FactoryGirl.create(:garden, :owner => member) - planting = FactoryGirl.create(:planting, :garden => garden) + planting = FactoryGirl.create(:planting, :garden => garden, :owner => member) photo = FactoryGirl.create(:photo, :owner => member) post :create, {:photo => { :flickr_photo_id => photo.flickr_photo_id }, :planting_id => planting.id } @@ -78,7 +77,7 @@ describe PhotosController do member = FactoryGirl.create(:member) controller.stub(:current_member) { member } garden = FactoryGirl.create(:garden, :owner => member) - planting = FactoryGirl.create(:planting, :garden => garden) + planting = FactoryGirl.create(:planting, :garden => garden, :owner => member) photo = FactoryGirl.create(:photo, :owner => member) post :create, {:photo => { :flickr_photo_id => photo.flickr_photo_id }, :planting_id => planting.id } @@ -104,7 +103,7 @@ describe PhotosController do member = FactoryGirl.create(:member) controller.stub(:current_member) { member } garden = FactoryGirl.create(:garden, :owner => member) - planting = FactoryGirl.create(:planting, :garden => garden) + planting = FactoryGirl.create(:planting, :garden => garden, :owner => member) photo = FactoryGirl.create(:photo, :owner => member) post :create, {:photo => { :flickr_photo_id => photo.flickr_photo_id }, :planting_id => planting.id } diff --git a/spec/controllers/plantings_controller_spec.rb b/spec/controllers/plantings_controller_spec.rb index 2bc3367ec..7e6a75d22 100644 --- a/spec/controllers/plantings_controller_spec.rb +++ b/spec/controllers/plantings_controller_spec.rb @@ -49,6 +49,11 @@ describe PlantingsController do assigns(:planting).planted_at.should == Date.today end + it "sets the owner automatically" do + post :create, { :planting => valid_attributes } + assigns(:planting).owner.should eq subject.current_member + end + end end diff --git a/spec/factories/planting.rb b/spec/factories/planting.rb index 58f67f653..6bfe8554c 100644 --- a/spec/factories/planting.rb +++ b/spec/factories/planting.rb @@ -1,6 +1,7 @@ FactoryGirl.define do factory :planting do garden + owner crop planted_at Date.today quantity 33 diff --git a/spec/models/crop_spec.rb b/spec/models/crop_spec.rb index 55386a7b4..f7f606736 100644 --- a/spec/models/crop_spec.rb +++ b/spec/models/crop_spec.rb @@ -61,9 +61,10 @@ describe Crop do it 'counts plantings' do @crop = FactoryGirl.create(:tomato) - @crop.plantings_count.should eq 0 - FactoryGirl.create(:planting, :crop => @crop) - @crop.plantings_count.should eq 1 + @crop.plantings.size.should eq 0 + @planting = FactoryGirl.create(:planting, :crop => @crop) + @crop.reload + @crop.plantings.size.should eq 1 end it 'validates en_wikipedia_url' do diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb index a25dd3e24..51d10a5b2 100644 --- a/spec/models/member_spec.rb +++ b/spec/models/member_spec.rb @@ -32,7 +32,7 @@ describe 'member' do it 'should have a default garden' do @member.save - @member.gardens.count.should == 1 + @member.gardens.size.should == 1 end it 'should have a accounts entry' do @@ -68,12 +68,10 @@ describe 'member' do @member.gardens.first.name.should eq "Garden" end - it 'has many plantings through gardens' do + it 'has many plantings' do @member.save - @planting = FactoryGirl.create(:planting, - :garden => @member.gardens.first - ) - @member.plantings.count.should eq 1 + @planting = FactoryGirl.create(:planting, :owner => @member) + @member.plantings.size.should eq 1 end it "has many comments" do @@ -275,7 +273,7 @@ describe 'member' do @member4 = FactoryGirl.create(:unconfirmed_member) [@member1, @member2, @member3, @member4].each do |m| - FactoryGirl.create(:planting, :garden => m.gardens.first) + FactoryGirl.create(:planting, :owner => m) end @member1.updated_at = 3.days.ago diff --git a/spec/models/planting_spec.rb b/spec/models/planting_spec.rb index d730414aa..dfc7bbe39 100644 --- a/spec/models/planting_spec.rb +++ b/spec/models/planting_spec.rb @@ -4,19 +4,24 @@ describe Planting do before(:each) do @crop = FactoryGirl.create(:tomato) - @member = FactoryGirl.create(:member) - @garden = FactoryGirl.create(:garden, :owner => @member) + @garden_owner = FactoryGirl.create(:member) + @garden = FactoryGirl.create(:garden, :owner => @garden_owner) @planting = FactoryGirl.create(:planting, :crop => @crop, :garden => @garden) end - it "generates an owner" do + it 'has an owner' do @planting.owner.should be_an_instance_of Member - @planting.owner.login_name.should match /^member\d+$/ + end + + it "owner isn't necessarily the garden owner" do + # a new owner should be created automatically by FactoryGirl + # note that formerly, the planting belonged to an owner through the garden + @planting.owner.should_not eq @garden_owner end it "generates a location" do - @planting.location.should match /^member\d+'s Springfield Community Garden$/ + @planting.location.should eq "#{@garden_owner.login_name}'s #{@garden.name}" end it "sorts plantings in descending order of creation" do @@ -194,7 +199,7 @@ describe Planting do # this one is newer, and has the same owner, through the garden @planting2 = FactoryGirl.create(:planting, :created_at => 1.minute.ago, - :garden_id => @planting1.garden.id + :owner_id => @planting1.owner.id ) @planting2.photos << FactoryGirl.create(:photo) @planting2.save diff --git a/spec/views/home/_members.html.haml_spec.rb b/spec/views/home/_members.html.haml_spec.rb index 84570662f..f6498c243 100644 --- a/spec/views/home/_members.html.haml_spec.rb +++ b/spec/views/home/_members.html.haml_spec.rb @@ -6,7 +6,7 @@ describe 'home/_members.html.haml', :type => "view" do @member.updated_at = 2.days.ago assign(:members, [@member]) - @planting = FactoryGirl.create(:planting, :garden => @member.gardens.first) + @planting = FactoryGirl.create(:planting, :owner => @member) render end diff --git a/spec/views/home/index_spec.rb b/spec/views/home/index_spec.rb index 478f5815b..f94892b9c 100644 --- a/spec/views/home/index_spec.rb +++ b/spec/views/home/index_spec.rb @@ -9,7 +9,7 @@ describe 'home/index.html.haml', :type => "view" do @post = FactoryGirl.create(:post, :author => @member) assign(:posts, [@post]) - @planting = FactoryGirl.create(:planting, :garden => @member.gardens.first) + @planting = FactoryGirl.create(:planting, :owner => @member) assign(:plantings, [@planting]) @crop = FactoryGirl.create(:crop) diff --git a/spec/views/plantings/index.html.haml_spec.rb b/spec/views/plantings/index.html.haml_spec.rb index b660fe2a1..a3df530bd 100644 --- a/spec/views/plantings/index.html.haml_spec.rb +++ b/spec/views/plantings/index.html.haml_spec.rb @@ -14,7 +14,8 @@ describe "plantings/index" do pager.replace([ FactoryGirl.create(:planting, :garden => @garden, - :crop => @tomato + :crop => @tomato, + :owner => @member ), FactoryGirl.create(:planting, :garden => @garden,