diff --git a/app/controllers/crops_controller.rb b/app/controllers/crops_controller.rb index 4ad458503..ef9051ba5 100644 --- a/app/controllers/crops_controller.rb +++ b/app/controllers/crops_controller.rb @@ -4,37 +4,23 @@ class CropsController < ApplicationController before_action :authenticate_member!, except: [:index, :hierarchy, :search, :show] load_and_authorize_resource skip_authorize_resource only: [:hierarchy, :search] + respond_to :html, :json, :rss, :csv + responders :flash # GET /crops # GET /crops.json def index @sort = params[:sort] - @crops = if @sort == 'alpha' - Crop.includes(:scientific_names, plantings: :photos) - else - popular_crops - end - @paginated_crops = @crops.approved.paginate(page: params[:page]) - - @has_requested_pending = Crop.pending_approval.where(requester: current_member).count if current_member - - respond_to do |format| - format.html - format.json { render json: @crops } - format.rss do - @crops = Crop.recent.includes(:scientific_names, :creator) - render rss: @crops - end - format.csv do - @filename = "Growstuff-Crops-#{Time.zone.now.to_s(:number)}.csv" - @crops = Crop.includes(:scientific_names, :plantings, :seeds, :creator) - render csv: @crops - end - end + @crops = crops + @has_requested_pending = current_member.requested_crops.pending_approval.size if current_member + @filename = filename + respond_with(@crops) end def requested - @requested = Crop.pending_approval.where(requester: current_member).paginate(page: params[:page]) + @requested = Crop.pending_approval + .where(requester: current_member) + .paginate(page: params[:page]) end # GET /crops/wrangle @@ -52,29 +38,20 @@ class CropsController < ApplicationController @crops = @crops.paginate(page: params[:page]) @crop_wranglers = Role.crop_wranglers - respond_to do |format| - format.html - end end # GET /crops/hierarchy def hierarchy @crops = Crop.toplevel - respond_to do |format| - format.html - end end # GET /crops/search def search @term = params[:term] - @matches = Crop.search(@term) + @matches = Crop.approved.search(@term) @paginated_matches = @matches.paginate(page: params[:page]) - respond_to do |format| - format.html - format.json { render json: @matches } - end + respond_with(@matches) end # GET /crops/1 @@ -85,19 +62,7 @@ class CropsController < ApplicationController respond_to do |format| format.html # show.html.haml - format.json do - # TODO RABL or similar one day to avoid presentation logic here - owner_structure = { - owner: { - only: [:id, :login_name, :location, :latitude, :longitude] - } - } - render json: @crop.to_json(include: { - plantings: { - include: owner_structure - } - }) - end + format.json { render json: @crop.to_json(crop_json_fields) } end end @@ -108,10 +73,7 @@ class CropsController < ApplicationController @crop.alternate_names.build @crop.scientific_names.build - respond_to do |format| - format.html # new.html.haml - format.json { render json: @crop } - end + respond_with @crop end # GET /crops/1/edit @@ -127,34 +89,25 @@ class CropsController < ApplicationController if current_member.role? :crop_wrangler @crop.creator = current_member - success_msg = "Crop was successfully created." else @crop.requester = current_member @crop.approval_status = "pending" - success_msg = "Crop was successfully requested." end - respond_to do |format| - if @crop.save - params[:alt_name].each do |index, value| - create_name('alternate', value) + if @crop.save + params[:alt_name].each do |_i, value| + create_name('alternate', value) + end + params[:sci_name].each do |_i, value| + create_name('scientific', value) + end + unless current_member.role? :crop_wrangler + Role.crop_wranglers.each do |w| + Notifier.new_crop_request(w, @crop).deliver_now! end - params[:sci_name].each do |index, value| - create_name('scientific', value) - end - unless current_member.role? :crop_wrangler - Role.crop_wranglers.each do |w| - Notifier.new_crop_request(w, @crop).deliver_now! - end - end - - format.html { redirect_to @crop, notice: success_msg } - format.json { render json: @crop, status: :created, location: @crop } - else - format.html { render action: "new" } - format.json { render json: @crop.errors, status: :unprocessable_entity } end end + respond_with @crop end # PUT /crops/1 @@ -164,47 +117,33 @@ class CropsController < ApplicationController @crop.creator = current_member if previous_status == "pending" - respond_to do |format| - if @crop.update(crop_params) - recreate_names('alt_name', 'alternate') - recreate_names('sci_name', 'scientific') + if @crop.update(crop_params) + recreate_names('alt_name', 'alternate') + recreate_names('sci_name', 'scientific') - if previous_status == "pending" - requester = @crop.requester - new_status = @crop.approval_status - Notifier.crop_request_approved(requester, @crop).deliver_now! if new_status == "approved" - Notifier.crop_request_rejected(requester, @crop).deliver_now! if new_status == "rejected" - end - format.html { redirect_to @crop, notice: 'Crop was successfully updated.' } - format.json { head :no_content } - else - format.html { render action: "edit" } - format.json { render json: @crop.errors, status: :unprocessable_entity } + if previous_status == "pending" + requester = @crop.requester + new_status = @crop.approval_status + Notifier.crop_request_approved(requester, @crop).deliver_now! if new_status == "approved" + Notifier.crop_request_rejected(requester, @crop).deliver_now! if new_status == "rejected" end end + respond_with @crop end # DELETE /crops/1 # DELETE /crops/1.json def destroy @crop.destroy - - respond_to do |format| - format.html { redirect_to crops_url } - format.json { head :no_content } - end + respond_with @crop end private - def popular_crops - Crop.popular.includes(:scientific_names, plantings: :photos) - end - def recreate_names(param_name, name_type) return unless params[param_name].present? destroy_names(name_type) - params[param_name].each do |index, value| + params[param_name].each do |_i, value| create_name(name_type, value) end end @@ -229,4 +168,28 @@ class CropsController < ApplicationController :_destroy, :id]) end + + def filename + "Growstuff-Crops-#{Time.zone.now.to_s(:number)}.csv" + end + + def crop_json_fields + { + include: { + plantings: { + include: { + owner: { only: [:id, :login_name, :location, :latitude, :longitude] } + } + }, + scientific_names: { only: [:name] }, + alternate_names: { only: [:name] } + } + } + end + + def crops + q = Crop.approved.includes(:scientific_names, plantings: :photos) + q = q.popular unless @sort == 'alpha' + q.paginate(page: params[:page]) + end end diff --git a/app/models/member.rb b/app/models/member.rb index 2700c9361..2c2c20502 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -27,6 +27,7 @@ class Member < ActiveRecord::Base has_many :photos + has_many :requested_crops, class_name: Crop, foreign_key: 'requester_id' has_many :likes, dependent: :destroy default_scope { order("lower(login_name) asc") } diff --git a/app/views/crops/index.html.haml b/app/views/crops/index.html.haml index f0abebab9..e671f4628 100644 --- a/app/views/crops/index.html.haml +++ b/app/views/crops/index.html.haml @@ -23,10 +23,10 @@ = submit_tag "Show", class: 'btn btn-primary' .pagination - = will_paginate @paginated_crops + = will_paginate @crops .row - - @paginated_crops.each do |crop| + - @crops.each do |crop| .col-md-2.six-across = render partial: "thumbnail", locals: { crop: crop } @@ -35,7 +35,7 @@ = link_to 'New Crop', new_crop_path, class: 'btn btn-primary' .pagination - = will_paginate @paginated_crops + = will_paginate @crops %ul.list-inline diff --git a/spec/features/crops/creating_a_crop_spec.rb b/spec/features/crops/creating_a_crop_spec.rb index b97866fd8..2b1300485 100644 --- a/spec/features/crops/creating_a_crop_spec.rb +++ b/spec/features/crops/creating_a_crop_spec.rb @@ -27,7 +27,8 @@ feature "Crop - " do click_button "Save" end - expect(page).to have_content "Crop was successfully requested." + expect(page).to have_content 'crop was successfully created.' + expect(page).to have_content "This crop is currently pending approval." expect(page).to have_content "Jasminum sambac 2" expect(page).to have_content "Matsurika" end diff --git a/spec/features/crops/crop_wranglers_spec.rb b/spec/features/crops/crop_wranglers_spec.rb index e17c35266..eafc7039f 100644 --- a/spec/features/crops/crop_wranglers_spec.rb +++ b/spec/features/crops/crop_wranglers_spec.rb @@ -48,7 +48,7 @@ feature "crop wranglers", js: true do fill_in 'en_wikipedia_url', with: "http://en.wikipedia.org/wiki/Maize" fill_in 'sci_name[1]', with: "planticus maximus" click_on 'Save' - expect(page).to have_content 'Crop was successfully created' + expect(page).to have_content 'crop was successfully created.' expect(page).to have_content 'planticus maximus' end diff --git a/spec/features/crops/request_new_crop_spec.rb b/spec/features/crops/request_new_crop_spec.rb index 3d2f76e5f..9cccac4f8 100644 --- a/spec/features/crops/request_new_crop_spec.rb +++ b/spec/features/crops/request_new_crop_spec.rb @@ -14,7 +14,8 @@ feature "Requesting a new crop" do fill_in "Name", with: "Couch potato" fill_in "request_notes", with: "Couch potatoes are real for real." click_button "Save" - expect(page).to have_content "Crop was successfully requested." + expect(page).to have_content 'crop was successfully created.' + expect(page).to have_content "This crop is currently pending approval." end end @@ -32,7 +33,7 @@ feature "Requesting a new crop" do expect(page).to have_content "En wikipedia url is not a valid English Wikipedia URL" fill_in "en_wikipedia_url", with: "http://en.wikipedia.org/wiki/Aung_San_Suu_Kyi" click_button "Save" - expect(page).to have_content "Crop was successfully updated." + expect(page).to have_content "crop was successfully updated." end scenario "Rejecting a crop" do @@ -40,7 +41,7 @@ feature "Requesting a new crop" do select "rejected", from: "Approval status" select "not edible", from: "Reason for rejection" click_button "Save" - expect(page).to have_content "Crop was successfully updated." + expect(page).to have_content "crop was successfully updated." end end end diff --git a/spec/views/crops/index.html.haml_spec.rb b/spec/views/crops/index.html.haml_spec.rb index a11cbcb76..f8a33c738 100644 --- a/spec/views/crops/index.html.haml_spec.rb +++ b/spec/views/crops/index.html.haml_spec.rb @@ -21,10 +21,10 @@ describe "crops/index" do @tomato = FactoryGirl.create(:tomato) @maize = FactoryGirl.create(:maize) assign(:crops, [@tomato, @maize]) - paginated_crops = WillPaginate::Collection.create(page, per_page, total_entries) do |pager| + crops = WillPaginate::Collection.create(page, per_page, total_entries) do |pager| pager.replace([@tomato, @maize]) end - assign(:paginated_crops, paginated_crops) + assign(:crops, crops) end it "shows photos where available" do