mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-10-30 10:49:03 -04:00
- Renamed all instances of 'Activity' to 'Job' in views, controllers, and models. - Updated routes to reflect the change from activities to jobs. - Modified database schema to rename the activities table to jobs and adjusted related columns. - Updated locale files to change activity-related translations to jobs. - Adjusted tests to ensure they reference jobs instead of activities. - Removed the category field from jobs as they are now a plain list. - Updated seed data and sample data generation to create jobs instead of activities.
127 lines
4.3 KiB
Ruby
127 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'faker'
|
|
|
|
# Builds the sample data. Locations and photos are filled in directly so
|
|
# nothing here calls the geocoder or Flickr.
|
|
class SampleData
|
|
PLACES = [
|
|
['Wellington', -41.2866, 174.7756], ['Lower Hutt', -41.2092, 174.908], ['Porirua', -41.1339, 174.8409],
|
|
['Auckland', -36.8485, 174.7633], ['Christchurch', -43.5321, 172.6362], ['Dunedin', -45.8788, 170.5028],
|
|
['Hobart', -42.8821, 147.3272], ['Melbourne', -37.8136, 144.9631],
|
|
['London', 51.5074, -0.1278], ['Portland', 45.5152, -122.6784], ['Toronto', 43.6532, -79.3832]
|
|
].freeze
|
|
|
|
def initialize(members:)
|
|
@count = members
|
|
@crops = Crop.approved.to_a
|
|
@plant_parts = PlantPart.all.to_a
|
|
end
|
|
|
|
def load
|
|
abort "No approved crops: run rake db:seed first" if @crops.empty?
|
|
|
|
members = (1..@count).map { |number| member(number) }
|
|
members.each do |member|
|
|
fill_garden(member)
|
|
fill_posts(member)
|
|
end
|
|
follow_each_other(members)
|
|
puts "Sample data ready: #{@count} members"
|
|
end
|
|
|
|
private
|
|
|
|
def member(number)
|
|
login = "sample_#{number}"
|
|
existing = Member.find_by(login_name: login)
|
|
return existing if existing
|
|
|
|
name, latitude, longitude = PLACES[number % PLACES.size]
|
|
member = Member.new(login_name: login, email: "#{login}@example.com", password: "password#{number}", tos_agreement: true)
|
|
member.skip_confirmation!
|
|
member.save!
|
|
member.update_columns(location: name, latitude:, longitude:)
|
|
member.gardens.first.update_columns(location: name, latitude:, longitude:)
|
|
member
|
|
end
|
|
|
|
def fill_garden(member)
|
|
return if member.plantings.any?
|
|
|
|
garden = member.gardens.first
|
|
rand(6..16).times { planting(member, garden) }
|
|
rand(0..3).times { harvest(member) }
|
|
rand(1..4).times { seed(member) }
|
|
rand(0..2).times { job(member, garden) }
|
|
end
|
|
|
|
def fill_posts(member)
|
|
return if member.posts.any?
|
|
|
|
rand(0..2).times do
|
|
subject = "#{Faker::Lorem.sentence(word_count: 5).chomp('.')}?"
|
|
post = Post.create!(author: member, subject:, body: Faker::Lorem.paragraph(sentence_count: 3))
|
|
post.photos << photo(member, "post-#{post.id}")
|
|
rand(0..6).times { Comment.create!(commentable: post, author: Member.order('RANDOM()').first, body: Faker::Lorem.sentence) }
|
|
end
|
|
end
|
|
|
|
def planting(member, garden)
|
|
planting = Planting.create!(
|
|
owner: member, garden:, crop: @crops.sample,
|
|
planted_at: rand(0..400).days.ago, quantity: rand(1..12),
|
|
sunniness: Planting::SUNNINESS_VALUES.sample, planted_from: Planting::PLANTED_FROM_VALUES.sample
|
|
)
|
|
planting.photos << photo(member, "planting-#{planting.id}") if rand < 0.7
|
|
planting
|
|
end
|
|
|
|
def harvest(member)
|
|
planting = member.plantings.order(:planted_at).first
|
|
harvest = Harvest.create!(
|
|
crop: planting.crop, planting:, plant_part: @plant_parts.sample, owner: member,
|
|
harvested_at: rand(0..60).days.ago, quantity: rand(1..10), unit: 'individual',
|
|
weight_quantity: rand(1..8), weight_unit: 'kg', description: Faker::Food.dish
|
|
)
|
|
harvest.photos << photo(member, "harvest-#{harvest.id}")
|
|
end
|
|
|
|
def seed(member)
|
|
seed = Seed.create!(
|
|
owner: member, crop: @crops.sample, description: Faker::Food.description.truncate(120),
|
|
quantity: rand(10..300), tradable_to: %w(locally nationally internationally).sample,
|
|
organic: Seed::ORGANIC_VALUES.sample, gmo: Seed::GMO_VALUES.sample, heirloom: Seed::HEIRLOOM_VALUES.sample,
|
|
finished: false
|
|
)
|
|
seed.photos << photo(member, "seed-#{seed.id}")
|
|
end
|
|
|
|
def job(member, garden)
|
|
Job.create!(
|
|
owner: member, garden:, due_date: rand(-10..30).days.from_now.to_date,
|
|
name: "#{Faker::Verb.base.capitalize} the #{Faker::Food.vegetables.downcase}",
|
|
description: Faker::Lorem.sentence
|
|
)
|
|
end
|
|
|
|
def follow_each_other(members)
|
|
members.each do |member|
|
|
members.sample(rand(2..6)).each do |other|
|
|
next if other == member
|
|
|
|
Follow.find_or_create_by!(follower: member, followed: other)
|
|
end
|
|
end
|
|
end
|
|
|
|
def photo(member, tag)
|
|
Photo.create!(
|
|
owner: member, source: 'flickr', source_id: 1, title: Faker::Food.ingredient,
|
|
license_name: "CC-BY", license_url: "http://example.com/license.html",
|
|
thumbnail_url: "https://picsum.photos/seed/#{tag}/200", fullsize_url: "https://picsum.photos/seed/#{tag}/600",
|
|
link_url: Faker::Internet.url
|
|
)
|
|
end
|
|
end
|