File: 37_timelogs.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (101 lines) | stat: -rw-r--r-- 2,654 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# 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.create!(
        username: username,
        name: FFaker::Name.name,
        email: FFaker::Internet.email,
        confirmed_at: DateTime.now,
        password: password
      ) do |user|
        user.assign_personal_namespace(Organizations::Organization.default_organization)
      end
    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