diff --git a/app/controllers/crops_controller.rb b/app/controllers/crops_controller.rb index 3bb020dda..6f8fa6917 100644 --- a/app/controllers/crops_controller.rb +++ b/app/controllers/crops_controller.rb @@ -7,7 +7,14 @@ class CropsController < ApplicationController # GET /crops # GET /crops.json def index - @crops = Crop.includes(:scientific_names, {:plantings => :photos}).paginate(:page => params[:page]) + @sort = params[:sort] + if @sort == 'alpha' + # alphabetical order + @crops = Crop.includes(:scientific_names, {:plantings => :photos}).paginate(:page => params[:page]) + else + # default to sorting by popularity + @crops = Crop.popular.includes(:scientific_names, {:plantings => :photos}).paginate(:page => params[:page]) + end respond_to do |format| format.html diff --git a/app/models/crop.rb b/app/models/crop.rb index ba2b8acaa..211a56146 100644 --- a/app/models/crop.rb +++ b/app/models/crop.rb @@ -17,6 +17,7 @@ class Crop < ActiveRecord::Base default_scope order("lower(name) asc") scope :recent, reorder("created_at desc") scope :toplevel, where(:parent_id => nil) + scope :popular, reorder("plantings_count desc, lower(name) asc") scope :randomized, reorder('random()') # ok on sqlite and psql, but not on mysql validates :en_wikipedia_url, diff --git a/app/views/crops/index.html.haml b/app/views/crops/index.html.haml index 2431bc9b6..a384efaf7 100644 --- a/app/views/crops/index.html.haml +++ b/app/views/crops/index.html.haml @@ -5,6 +5,11 @@ View any crop page to see which of our members have planted it and find information on how to grow it yourself. += form_tag(crops_path, :method => :get, :class => 'form-inline') do + = label_tag :sort, "Sort by:", :class => 'control-label' + = select_tag "sort", options_for_select({"Popularity" => 'popular', "Alphabetical" => 'alpha'}, @sort || 'popular') + = submit_tag "Show", :class => 'btn btn-primary' + %div.pagination = page_entries_info @crops, :model => "crops" = will_paginate @crops diff --git a/db/migrate/20140718075753_default_plantings_count_to_zero.rb b/db/migrate/20140718075753_default_plantings_count_to_zero.rb new file mode 100644 index 000000000..608821fbc --- /dev/null +++ b/db/migrate/20140718075753_default_plantings_count_to_zero.rb @@ -0,0 +1,9 @@ +class DefaultPlantingsCountToZero < ActiveRecord::Migration + def up + change_column :crops, :plantings_count, :integer, :default => 0 + end + + def down + change_column :crops, :plantings_count, :integer, :default => nil + end +end diff --git a/db/schema.rb b/db/schema.rb index 44ba8697c..489a9e6b6 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 => 20131031000655) do +ActiveRecord::Schema.define(:version => 20140718075753) do create_table "account_types", :force => true do |t| t.string "name", :null => false @@ -51,13 +51,13 @@ ActiveRecord::Schema.define(:version => 20131031000655) do end create_table "crops", :force => true do |t| - t.string "name", :null => false + t.string "name", :null => false t.string "en_wikipedia_url" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "slug" t.integer "parent_id" - t.integer "plantings_count" + t.integer "plantings_count", :default => 0 t.integer "creator_id" end @@ -242,11 +242,11 @@ ActiveRecord::Schema.define(:version => 20131031000655) do add_index "posts", ["slug"], :name => "index_updates_on_slug", :unique => true create_table "products", :force => true do |t| - t.string "name", :null => false - t.text "description", :limit => 255, :null => false - t.integer "min_price", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.string "name", :null => false + t.text "description", :null => false + t.integer "min_price", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.integer "account_type_id" t.integer "paid_months" t.integer "recommended_price" diff --git a/lib/tasks/growstuff.rake b/lib/tasks/growstuff.rake index 91814aff8..f4f7a0003 100644 --- a/lib/tasks/growstuff.rake +++ b/lib/tasks/growstuff.rake @@ -235,6 +235,17 @@ namespace :growstuff do PlantPart.find_or_create_by_name!(pp) end end - end + + desc "July 2014: set planting_count to 0 by default, not nil" + task :zero_plantings_count => :environment do + Crop.find_each do |c| + if c.plantings_count.nil? + c.plantings_count = 0 + c.save + end + end + end + + end # end oneoff section end diff --git a/script/deploy-tasks.sh b/script/deploy-tasks.sh index 08dd2b7ac..c471b566e 100755 --- a/script/deploy-tasks.sh +++ b/script/deploy-tasks.sh @@ -10,11 +10,5 @@ # echo "YYYY-MM-DD - do something or other" # rake growstuff:oneoff:something -echo "2013-10-24 - fix zeroed geolocations" -rake growstuff:depopulate_null_island - -echo "2013-10-24 - initialize garden locations" -rake growstuff:oneoff:initialize_garden_locations - -echo "2013-10-31 - import plant parts" -rake growstuff:oneoff:import_plant_parts +echo "2013-07-18 - zero crop plantings_count" +rake growstuff:oneoff:zero_plantings_count diff --git a/spec/models/crop_spec.rb b/spec/models/crop_spec.rb index c89328904..1741faf74 100644 --- a/spec/models/crop_spec.rb +++ b/spec/models/crop_spec.rb @@ -52,6 +52,23 @@ describe Crop do end end + context 'popularity' do + before (:each) do + @tomato = FactoryGirl.create(:tomato) + @maize = FactoryGirl.create(:maize) + @cucumber = FactoryGirl.create(:crop, :name => 'cucumber') + FactoryGirl.create_list(:planting, 10, :crop => @maize) + FactoryGirl.create_list(:planting, 3, :crop => @tomato) + end + + it "sorts by most plantings" do + Crop.popular.first.should eq @maize + FactoryGirl.create_list(:planting, 10, :crop => @tomato) + Crop.popular.first.should eq @tomato + end + + end + it 'finds a default scientific name' do @crop = FactoryGirl.create(:tomato) @crop.default_scientific_name.should eq nil diff --git a/spec/views/crops/_popover.html.haml_spec.rb b/spec/views/crops/_popover.html.haml_spec.rb index 4cbe7a677..ad07f8ada 100644 --- a/spec/views/crops/_popover.html.haml_spec.rb +++ b/spec/views/crops/_popover.html.haml_spec.rb @@ -5,6 +5,7 @@ describe "crops/_popover" do @tomato = FactoryGirl.create(:tomato) @sn = FactoryGirl.create(:solanum_lycopersicum, :crop => @tomato) @planting = FactoryGirl.create(:planting, :crop => @tomato) + @tomato.reload # to pick up latest plantings_count render :partial => 'crops/popover', :locals => { :crop => @tomato } end diff --git a/spec/views/crops/index.html.haml_spec.rb b/spec/views/crops/index.html.haml_spec.rb index cd43b7c1b..ca0ecc39b 100644 --- a/spec/views/crops/index.html.haml_spec.rb +++ b/spec/views/crops/index.html.haml_spec.rb @@ -14,6 +14,14 @@ describe "crops/index" do assign(:crops, crops) end + it "has a form for sorting by" do + render + assert_select "form" + assert_select "select#sort" + assert_select "option[value=alpha]" + assert_select "option[value=popular]" + end + it "renders a list of crops" do render assert_select "a", :text => @maize.name diff --git a/spec/views/crops/show.html.haml_spec.rb b/spec/views/crops/show.html.haml_spec.rb index 1e0aaa528..6e8250b27 100644 --- a/spec/views/crops/show.html.haml_spec.rb +++ b/spec/views/crops/show.html.haml_spec.rb @@ -19,7 +19,7 @@ describe "crops/show" do render end - it 'shows 4 photos across the top of the page' do + it 'shows 3 photos across the top of the page' do assert_select "div.thumbnail>a>img", :count => 3 end @@ -131,12 +131,13 @@ describe "crops/show" do :garden => @garden, :crop => @crop ) + @crop.reload # to pick up latest plantings_count end it "links to people who are growing this crop" do render - rendered.should contain /member\d+/ - rendered.should contain "Springfield Community Garden" + rendered.should contain @owner.login_name + rendered.should contain @garden.name end it "shows photos where available" do