From 2d624133410af5b207fe4a6ed63c132c5bb57d38 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 13 Jul 2025 06:32:10 +0000 Subject: [PATCH 1/3] Remove OpenFarm Service, as the project is dead and API endpoint gone --- app/models/concerns/open_farm_data.rb | 1 - app/services/openfarm_service.rb | 108 -------------------------- 2 files changed, 109 deletions(-) delete mode 100644 app/services/openfarm_service.rb diff --git a/app/models/concerns/open_farm_data.rb b/app/models/concerns/open_farm_data.rb index f051d43ce0..bd32eba34d 100644 --- a/app/models/concerns/open_farm_data.rb +++ b/app/models/concerns/open_farm_data.rb @@ -5,7 +5,6 @@ module OpenFarmData included do def update_openfarm_data! - OpenfarmService.new.update_crop(self) end def of_photo diff --git a/app/services/openfarm_service.rb b/app/services/openfarm_service.rb deleted file mode 100644 index 11b3d1e2df..0000000000 --- a/app/services/openfarm_service.rb +++ /dev/null @@ -1,108 +0,0 @@ -# frozen_string_literal: true - -BASE = 'https://openfarm.cc/api/v1/' -# BASE = 'http://127.0.0.1:3000/api/v1/' - -class OpenfarmService - def initialize - @cropbot = Member.find_by(login_name: 'cropbot') - end - - def import! - Crop.all.order(updated_at: :desc).each do |crop| - Rails.logger.debug { "#{crop.id}, #{crop.name}" } - update_crop(crop) if crop.valid? - end - end - - def update_crop(crop) - openfarm_record = fetch(crop.name) - if openfarm_record.present? && openfarm_record.is_a?(String) - Rails.logger.info(openfarm_record) - elsif openfarm_record.present? && openfarm_record.fetch('data', false) - crop.update! openfarm_data: openfarm_record.fetch('data', false) - save_companions(crop, openfarm_record) - save_photos(crop) - else - Rails.logger.debug "\tcrop not found on Open Farm" - crop.update!(openfarm_data: false) - end - end - - def save_companions(crop, openfarm_record) - companions = openfarm_record.fetch('data').fetch('relationships').fetch('companions').fetch('data') - crops = openfarm_record.fetch('included', []).select { |rec| rec["type"] == 'crops' } - CropCompanion.transaction do - companions.each do |com| - companion_crop_hash = crops.detect { |c| c.fetch('id') == com.fetch('id') } - companion_crop_name = companion_crop_hash.fetch('attributes').fetch('name').downcase - companion_crop = Crop.where('lower(name) = ?', companion_crop_name).first - companion_crop = Crop.create!(name: companion_crop_name, requester: @cropbot, approval_status: "pending") if companion_crop.nil? - crop.companions << companion_crop unless crop.companions.where(id: companion_crop.id).any? - end - end - end - - def save_photos(crop) - pictures = fetch_pictures(crop.name) - pictures.each do |picture| - data = picture.fetch('attributes') - Rails.logger.debug(data) - next unless data.fetch('image_url').start_with? 'http' - next if Photo.find_by(source_id: picture.fetch('id'), source: 'openfarm') - - photo = Photo.new( - source_id: picture.fetch('id'), - source: 'openfarm', - owner: @cropbot, - thumbnail_url: data.fetch('thumbnail_url'), - fullsize_url: data.fetch('image_url'), - title: 'Open Farm photo', - license_name: 'No rights reserved', - link_url: "https://openfarm.cc/en/crops/#{name_to_slug(crop.name)}" - ) - if photo.valid? - Photo.transaction do - photo.save - PhotoAssociation.find_or_create_by! photo:, photographable: crop - end - Rails.logger.debug { "\t saved photo #{photo.id} #{photo.source_id}" } - else - Rails.logger.warn "Photo not valid" - end - end - end - - def fetch(name) - conn.get("crops/#{name_to_slug(name)}.json").body - rescue NoMethodError - Rails.logger.debug "error fetching crop" - Rails.logger.debug "BODY: " - Rails.logger.debug body - end - - def name_to_slug(name) - CGI.escape(name.gsub(' ', '-').downcase) - end - - def fetch_all(page) - conn.get("crops.json?page=#{page}").body.fetch('data', {}) - end - - def fetch_pictures(name) - body = conn.get("crops/#{name_to_slug(name)}/pictures.json").body - body.fetch('data', false) - rescue StandardError - Rails.logger.debug "Error fetching photos" - Rails.logger.debug [] - end - - private - - def conn - Faraday.new BASE do |conn| - conn.response :json, content_type: /\bjson$/ - conn.adapter Faraday.default_adapter - end - end -end From 48ec11a96e549755058fa5d55f8e0b6b85a15a89 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 13 Jul 2025 06:32:35 +0000 Subject: [PATCH 2/3] Remove OpenFarm Service, as the project is dead and API endpoint gone --- lib/tasks/openfarm.rake | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/tasks/openfarm.rake b/lib/tasks/openfarm.rake index 92ca9cc399..30a018e6e8 100644 --- a/lib/tasks/openfarm.rake +++ b/lib/tasks/openfarm.rake @@ -6,6 +6,5 @@ namespace :openfarm do task import: :environment do Rails.logger = Logger.new(STDOUT) - OpenfarmService.new.import! end end From 6dc6422805ef3649bc0750804328e2b89345dfeb Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 13 Jul 2025 06:35:48 +0000 Subject: [PATCH 3/3] Remove other openfarm info --- .rubocop_todo.yml | 2 - app/controllers/crops_controller.rb | 7 -- app/models/ability.rb | 1 - app/models/concerns/open_farm_data.rb | 79 -------------------- app/models/crop.rb | 1 - app/services/gbif_service.rb | 3 - app/views/crops/_planting_advice.html.haml | 6 +- app/views/crops/_wrangle.html.haml | 4 - app/views/crops/show.html.haml | 7 -- lib/tasks/openfarm.rake | 10 --- spec/features/crops/crop_detail_page_spec.rb | 4 - spec/helpers/photos_helper_spec.rb | 1 - 12 files changed, 1 insertion(+), 124 deletions(-) delete mode 100644 app/models/concerns/open_farm_data.rb delete mode 100644 lib/tasks/openfarm.rake diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 3195873c11..401b72d402 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -513,7 +513,6 @@ Rails/RedundantActiveRecordAllMethod: - 'app/controllers/forums_controller.rb' - 'app/controllers/plant_parts_controller.rb' - 'app/controllers/scientific_names_controller.rb' - - 'app/services/openfarm_service.rb' - 'spec/features/percy/percy_spec.rb' - 'spec/models/harvest_spec.rb' @@ -630,7 +629,6 @@ Style/GlobalStdStream: Exclude: - 'config/environments/production.rb' - 'lib/tasks/gbif.rake' - - 'lib/tasks/openfarm.rake' # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). diff --git a/app/controllers/crops_controller.rb b/app/controllers/crops_controller.rb index a80234bfb6..73b1067eef 100644 --- a/app/controllers/crops_controller.rb +++ b/app/controllers/crops_controller.rb @@ -39,12 +39,6 @@ def wrangle respond_with @crops end - def openfarm - @crop = Crop.find(params[:crop_slug]) - @crop.update_openfarm_data! - respond_with @crop, location: @crop - end - def gbif @crop = Crop.find(params[:crop_slug]) @crop.update_gbif_data! @@ -137,7 +131,6 @@ def update if @crop.approval_status_changed?(from: "pending", to: "approved") notifier.deliver_now! - @crop.update_openfarm_data! @crop.update_gbif_data! end else diff --git a/app/models/ability.rb b/app/models/ability.rb index 7c32ea241b..d14d532670 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -78,7 +78,6 @@ def member_abilities(member) can :manage, Crop can :manage, ScientificName can :manage, AlternateName - can :openfarm, Crop can :gbif, Crop end diff --git a/app/models/concerns/open_farm_data.rb b/app/models/concerns/open_farm_data.rb deleted file mode 100644 index bd32eba34d..0000000000 --- a/app/models/concerns/open_farm_data.rb +++ /dev/null @@ -1,79 +0,0 @@ -# frozen_string_literal: true - -module OpenFarmData - extend ActiveSupport::Concern - - included do - def update_openfarm_data! - end - - def of_photo - fetch_attr('main_image_path') - end - - def height - fetch_attr('height') - end - - def spread - fetch_attr('spread') - end - - def svg_icon - icon = fetch_attr('svg_icon') - return icon if icon.present? - - parent.svg_icon if parent.present? - end - - def tags_array - fetch_attr('tags_array') - end - - def description - fetch_attr('description') - end - - def row_spacing - fetch_attr('row_spacing') - end - - def common_names - fetch_attr('common_names') - end - - def guides_count - fetch_attr('guides_count') - end - - def binomial_name - fetch_attr('binomial_name') - end - - def sowing_method - fetch_attr('sowing_method') - end - - def main_image_path - fetch_attr('main_image_path') - end - - def sun_requirements - fetch_attr('sun_requirements') - end - - def growing_degree_days - fetch_attr('growing_degree_days') - end - - def processing_pictures - fetch_attr('processing_pictures') - end - end - - def fetch_attr(key) - return if openfarm_data.blank? - - openfarm_data.fetch('attributes', {}).fetch(key, nil) - end -end diff --git a/app/models/crop.rb b/app/models/crop.rb index 1ab135dffd..7cd6693434 100644 --- a/app/models/crop.rb +++ b/app/models/crop.rb @@ -3,7 +3,6 @@ class Crop < ApplicationRecord extend FriendlyId include PhotoCapable - include OpenFarmData include GbifData include SearchCrops diff --git a/app/services/gbif_service.rb b/app/services/gbif_service.rb index 669c6bdd49..b5b228fe69 100644 --- a/app/services/gbif_service.rb +++ b/app/services/gbif_service.rb @@ -126,12 +126,9 @@ def update_crop(crop) gbif_record = fetch(gbif_usage_key) if gbif_record.present? - # crop.update! openfarm_data: gbif_record.fetch('data', false) - # save_companions(crop, gbif_record) save_photos(crop, gbif_usage_key) else Rails.logger.debug "\tcrop not found on GBIF" - # crop.update!(openfarm_data: false) end end diff --git a/app/views/crops/_planting_advice.html.haml b/app/views/crops/_planting_advice.html.haml index a554a7058e..139597f9cb 100644 --- a/app/views/crops/_planting_advice.html.haml +++ b/app/views/crops/_planting_advice.html.haml @@ -1,6 +1,2 @@ -- if crop.guides_count.present? && crop.guides_count.positive? - %p - There are - = link_to "https://openfarm.cc/en/crops/#{CGI.escape @crop.name.gsub(' ', '-').downcase}" do - #{crop.guides_count} growing guides on Open Farm + diff --git a/app/views/crops/_wrangle.html.haml b/app/views/crops/_wrangle.html.haml index f9ea9ede18..10ce04bdcb 100644 --- a/app/views/crops/_wrangle.html.haml +++ b/app/views/crops/_wrangle.html.haml @@ -10,10 +10,6 @@ = edit_icon = t('.edit') - = link_to crop_openfarm_path(crop), method: :post, class: 'dropdown-item' do - = icon 'far', 'update' - Fetch data from OpenFarm - = link_to crop_gbif_path(crop), method: :post, class: 'dropdown-item' do = icon 'far', 'update' Fetch data from GBIF diff --git a/app/views/crops/show.html.haml b/app/views/crops/show.html.haml index 9084bdbef0..202a9bb892 100644 --- a/app/views/crops/show.html.haml +++ b/app/views/crops/show.html.haml @@ -124,13 +124,6 @@ = icon 'fas', 'external-link-alt' Wikipedia (English) - %li.list-group-item - = link_to "https://openfarm.cc/en/crops/#{CGI.escape @crop.name.gsub(' ', '-')}", - class: 'card-link', - target: "_blank", - rel: "noopener noreferrer" do - = icon 'fas', 'external-link-alt' - OpenFarm - Growing guide %li.list-group-item = link_to "https://www.gardenate.com/plant/#{CGI.escape @crop.name}", target: "_blank", diff --git a/lib/tasks/openfarm.rake b/lib/tasks/openfarm.rake deleted file mode 100644 index 30a018e6e8..0000000000 --- a/lib/tasks/openfarm.rake +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -namespace :openfarm do - desc "Retrieve crop info from open farm" - # usage: rake growstuff:admin_user name=skud - - task import: :environment do - Rails.logger = Logger.new(STDOUT) - end -end diff --git a/spec/features/crops/crop_detail_page_spec.rb b/spec/features/crops/crop_detail_page_spec.rb index 96020dca79..71d5e662dc 100644 --- a/spec/features/crops/crop_detail_page_spec.rb +++ b/spec/features/crops/crop_detail_page_spec.rb @@ -76,10 +76,6 @@ expect(page).to have_link "Wikipedia (English)", href: crop.en_wikipedia_url end - it "has a link to OpenFarm" do - expect(page).to have_link "OpenFarm - Growing guide" - end - it "has a link to gardenate" do expect(page).to have_link "Gardenate - Planting reminders", href: "https://www.gardenate.com/plant/#{CGI.escape crop.name}" diff --git a/spec/helpers/photos_helper_spec.rb b/spec/helpers/photos_helper_spec.rb index 5c93d2fcf5..46c78a2195 100644 --- a/spec/helpers/photos_helper_spec.rb +++ b/spec/helpers/photos_helper_spec.rb @@ -4,7 +4,6 @@ describe PhotosHelper do let(:crop) { FactoryBot.create(:crop) } - let(:crop_photo_of) { FactoryBot.create(:photo, source: 'openfarm') } let(:crop_photo_flickr) { FactoryBot.create(:photo, source: 'flickr') } let(:garden) { FactoryBot.create(:garden) }