debian-mirror-gitlab/db/fixtures/development/37_timelogs.rb
2023-06-20 00:43:36 +05:30

99 lines
2.5 KiB
Ruby

# frozen_string_literal: true
class Gitlab::Seeder::Timelogs
attr_reader :project, :issues, :merge_requests, :users
def initialize(project, users)
@project = project
@issues = project.issues
@merge_requests = project.merge_requests
@users = users
end
def seed!
ensure_users_are_reporters
print "\nGenerating time entries for issues and merge requests in '#{project.full_path}'\n"
seed_on_issuables(issues)
seed_on_issuables(merge_requests)
end
def self.find_or_create_reporters
password = SecureRandom.hex.slice(0, 16)
[
User.find_by_username("root"),
find_or_create_reporter_user("timelogs_reporter_user_1", password),
find_or_create_reporter_user("timelogs_reporter_user_2", password)
].compact
end
private
def ensure_users_are_reporters
team = ProjectTeam.new(project)
users.each do |user|
unless team.member?(user, Gitlab::Access::REPORTER)
print "\nAdding #{user.username} to #{project.full_path} reporters"
team.add_reporter(user)
end
end
end
def seed_on_issuables(issuables)
min_date = Time.now - 2.months
max_date = Time.now
issuables.each do |issuable|
rand(2..5).times do
timelog_author = users.sample
::Timelogs::CreateService.new(
issuable, rand(10..120) * 60, rand(min_date..max_date), FFaker::Lorem.sentence, timelog_author
).execute
print '.'
end
end
end
def self.find_or_create_reporter_user(username, password)
user = User.find_by_username(username)
if user.nil?
print "\nCreating user '#{username}' with password: '#{password}'"
user = User.create!(
username: username,
name: FFaker::Name.name,
email: FFaker::Internet.email,
confirmed_at: DateTime.now,
password: password
)
end
user
end
end
if ENV['SEED_TIMELOGS']
Gitlab::Seeder.quiet do
users = Gitlab::Seeder::Timelogs.find_or_create_reporters
# Seed timelogs for the first 5 projects
projects = Project.first(5)
# Always seed timelogs to the Flight project
flight_project = Project.find_by_full_path("flightjs/Flight")
projects |= [flight_project] unless flight_project.nil?
projects.each do |project|
Gitlab::Seeder::Timelogs.new(project, users).seed! unless project.nil?
end
rescue => e
warn "\nError seeding timelogs: #{e}"
end
else
puts "Skipped. Use the `SEED_TIMELOGS` environment variable to enable seeding timelogs data."
end