diff --git a/app/models/planting.rb b/app/models/planting.rb index 05c2a7024..c82b61fa3 100644 --- a/app/models/planting.rb +++ b/app/models/planting.rb @@ -53,10 +53,12 @@ class Planting < ActiveRecord::Base "#{owner.login_name}-#{garden}-#{crop}".downcase.gsub(' ', '-') end + # location = owner + garden, i.e. "Skud's backyard" def location return "#{garden.owner.login_name}'s #{garden}" end + # stringify as "beet in Skud's backyard" or similar def to_s self.crop_system_name + " in " + self.location end @@ -64,4 +66,23 @@ class Planting < ActiveRecord::Base def default_photo return photos.first end + + # return a list of interesting plantings, for the homepage etc. + # we can't do this via a scope (as far as we know) so sadly we have to + # do it this way. + def Planting.interesting(howmany=10) + interesting_plantings = Array.new + seen_owners = Hash.new(false) # keep track of which owners we've seen already + + Planting.all.each do |p| + break if interesting_plantings.count == howmany # got enough yet? + next unless p.photos.present? # skip those that don't have photos + next if seen_owners[p.owner] # skip if we already have one from this owner + + seen_owners[p.owner] = true # we've seen this owner + interesting_plantings.push(p) + end + + return interesting_plantings + end end diff --git a/app/views/home/_crops.html.haml b/app/views/home/_crops.html.haml index bd3690469..f3c0b8309 100644 --- a/app/views/home/_crops.html.haml +++ b/app/views/home/_crops.html.haml @@ -6,29 +6,12 @@ - next unless c.photos.present? - count += 1 .span3{:style => 'margin:0px; padding: 3px'} - = render :partial => 'crops/image_with_popover.html.haml', :locals => { :crop => c } + = render :partial => 'crops/image_with_popover', :locals => { :crop => c } - break if count == 12 .span6 %h2 Recently planted - - count = 0 - - Planting.all.each do |p| - - next unless p.photos.present? - - count += 1 - .row - .span2{:style => 'padding-bottom: 6px'} - = render :partial => 'plantings/image_with_popover.html.haml', :locals => { :planting => p } - .span10 - = link_to p.crop, p.crop - in - = succeed "'s" do - = link_to p.owner, p.owner - = link_to p.garden, p.garden - %br/ - %small - %i - = p.owner.location - - break if count == 4 + = render :partial => 'plantings/list', :locals => { :plantings => Planting.interesting(4) } .row-fluid .span12 diff --git a/app/views/plantings/_list.html.haml b/app/views/plantings/_list.html.haml index 139597f9c..bbf6323f9 100644 --- a/app/views/plantings/_list.html.haml +++ b/app/views/plantings/_list.html.haml @@ -1,2 +1,14 @@ - - +- plantings.each do |p| + .row + .span2{:style => 'padding-bottom: 6px'} + = render :partial => 'plantings/image_with_popover', :locals => { :planting => p } + .span10 + = link_to p.crop, p.crop + in + = succeed "'s" do + = link_to p.owner, p.owner + = link_to p.garden, p.garden + %br/ + %small + %i + = p.owner.location diff --git a/spec/models/planting_spec.rb b/spec/models/planting_spec.rb index bb5d87e0a..de2c24b65 100644 --- a/spec/models/planting_spec.rb +++ b/spec/models/planting_spec.rb @@ -148,4 +148,80 @@ describe Planting do end end + context 'interesting crops' do + it 'picks up interesting plantings' do + # plantings have members created implicitly for them + # each member is different, hence these are all interesting + @planting1 = FactoryGirl.create(:planting, :created_at => 5.days.ago) + @planting2 = FactoryGirl.create(:planting, :created_at => 4.days.ago) + @planting3 = FactoryGirl.create(:planting, :created_at => 3.days.ago) + @planting4 = FactoryGirl.create(:planting, :created_at => 2.days.ago) + + # plantings need photos to be interesting + @photo = FactoryGirl.create(:photo) + [@planting1, @planting2, @planting3, @planting4].each do |p| + p.photos << @photo + p.save + end + + Planting.interesting.should eq [ + @planting4, + @planting3, + @planting2, + @planting1 + ] + end + + it 'ignores plantings without photos' do + # first, an interesting planting + @planting = FactoryGirl.create(:planting) + @planting.photos << FactoryGirl.create(:photo) + @planting.save + + # this one doesn't have a photo + @boring_planting = FactoryGirl.create(:planting) + + Planting.interesting.should include @planting + Planting.interesting.should_not include @boring_planting + end + + it 'ignores plantings with the same owner' do + # this planting is older + @planting1 = FactoryGirl.create(:planting, :created_at => 1.day.ago) + @planting1.photos << FactoryGirl.create(:photo) + @planting1.save + + # 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 + ) + @planting2.photos << FactoryGirl.create(:photo) + @planting2.save + + # result: the newer one is interesting, the older one isn't + Planting.interesting.should include @planting2 + Planting.interesting.should_not include @planting1 + end + + it 'only gives you as many as you ask for' do + # plantings have members created implicitly for them + # each member is different, hence these are all interesting + @planting1 = FactoryGirl.create(:planting, :created_at => 5.days.ago) + @planting2 = FactoryGirl.create(:planting, :created_at => 4.days.ago) + @planting3 = FactoryGirl.create(:planting, :created_at => 3.days.ago) + @planting4 = FactoryGirl.create(:planting, :created_at => 2.days.ago) + + # plantings need photos to be interesting + @photo = FactoryGirl.create(:photo) + [@planting1, @planting2, @planting3, @planting4].each do |p| + p.photos << @photo + p.save + end + + Planting.interesting(2).length.should == 2 + end + + end + end