Files
growstuff/lib/tasks/growstuff.rake
T
Brenda Wallace 5313578d98 Add ReminderEvent tracking for planting and harvest reminders
- Update the growstuff rake tasks to log ReminderEvent when planting and harvest reminders are sent.
- Create a factory for ReminderEvent to facilitate testing.
- Implement model specs for ReminderEvent, including validations and weekly counts.
- Add request specs for Admin::ReminderStatsController to verify reminder statistics.
- Enhance unsubscribe specs to ensure ReminderEvent is logged correctly on unsubscriptions.
- Update task specs for growstuff to verify ReminderEvent counts for sent reminders.
2026-10-31 19:29:54 +13:00

93 lines
3.1 KiB
Ruby

# frozen_string_literal: true
namespace :growstuff do
desc "Add an admin user, by name"
# usage: rake growstuff:admin_user name=skud
task admin_user: :environment do
add_role_to_member! ENV.fetch('name', nil), 'Admin'
end
desc "Add a crop wrangler user, by name"
# usage: rake growstuff:cropwrangler_user name=skud
task cropwrangler_user: :environment do
add_role_to_member! ENV.fetch('name', nil), 'Crop Wrangler'
end
def add_role_to_member!(login_name, role_name)
unless login_name && role_name
raise "Usage: rake growstuff:[rolename] name=[username] " \
"\n (login name is case-sensitive)\n"
end
member = Member.find_by!(login_name:)
role = Role.find_by!(name: role_name)
member.roles << role
end
desc "Upload crops from a CSV file"
# usage: rake growstuff:import_crops file=filename.csv
task import_crops: :environment do
require 'csv'
(@file = ENV.fetch('file', nil)) || raise("Usage: rake growstuff:import_crops file=file.csv")
puts "Loading crops from #{@file}..."
CSV.foreach(@file) do |row|
CsvImporter.new.import_crop(row)
end
Rails.cache.delete('full_crop_hierarchy')
puts "Finished loading crops"
end
desc "Add the crop job templates in db/seeds/crop_job_templates, or in the files given"
# usage: rake growstuff:import_crop_job_templates [file=path.json]
task import_crop_job_templates: :environment do
files = ENV['file'] ? [ENV.fetch('file')] : Rails.root.glob('db/seeds/crop_job_templates/*.json')
stats = CropJobTemplateImporter.new.import_files(files)
puts stats.inspect
end
desc "Send planting reminder email"
# usage: rake growstuff:send_planting_reminder
task send_planting_reminder: :environment do
# Heroku scheduler only lets us run things daily, so this checks
# Send on Monday
if Time.zone.today.wday == 1 && Feature.enabled?(:enable_planting_reminders)
Member.confirmed.wants_reminders.find_each do |m|
next if m.plantings.active.empty?
NotifierMailer.planting_reminder(m).deliver_now
m.update_column(:planting_reminder_sent_at, Time.zone.now) # rubocop:disable Rails/SkipsModelValidations
ReminderEvent.sent!(m, :planting_reminder)
end
end
end
desc "Send harvest reminder email"
# usage: rake growstuff:send_harvest_reminders
task send_harvest_reminders: :environment do
# Heroku scheduler only lets us run things daily, so this checks
# Send on Wednesday
if Time.zone.today.wday == 3 && Feature.enabled?(:enable_harvest_reminders)
Member.confirmed.wants_harvest_reminders.find_each do |m|
if m.plantings.active.any?(&:harvest_in_next_week?)
NotifierMailer.harvest_reminder(m).deliver_now
ReminderEvent.sent!(m, :harvest_reminder)
end
end
end
end
desc "Mark seeds as finished when plant-before date expires"
# usage: rake growstuff:finish_expired_seeds
task finish_expired_seeds: :environment do
Seed.expired.find_each do |seed|
seed.update(finished: true, finished_at: Time.zone.now)
end
end
end