project_team.rb
2.43 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
class ProjectTeam
  attr_accessor :project
  def initialize(project)
    @project = project
  end
  # Shortcut to add users
  #
  # Use:
  #   @team << [@user, :master]
  #   @team << [@users, :master]
  #
  def << args
    users = args.first
    if users.respond_to?(:each)
      add_users(users, args.second)
    else
      add_user(users, args.second)
    end
  end
  def find(user_id)
    user = project.users.find_by(id: user_id)
    if group
      user ||= group.users.find_by(id: user_id)
    end
    user
  end
  def find_tm(user_id)
    tm = project.users_projects.find_by(user_id: user_id)
    # If user is not in project members
    # we should check for group membership
    if group && !tm
      tm = group.users_groups.find_by(user_id: user_id)
    end
    tm
  end
  def add_user(user, access)
    add_users_ids([user.id], access)
  end
  def add_users(users, access)
    add_users_ids(users.map(&:id), access)
  end
  def add_users_ids(user_ids, access)
    UsersProject.add_users_into_projects(
      [project.id],
      user_ids,
      access
    )
  end
  # Remove all users from project team
  def truncate
    UsersProject.truncate_team(project)
  end
  def users
    members
  end
  def members
    @members ||= fetch_members
  end
  def guests
    @guests ||= fetch_members(:guests)
  end
  def reporters
    @reporters ||= fetch_members(:reporters)
  end
  def developers
    @developers ||= fetch_members(:developers)
  end
  def masters
    @masters ||= fetch_members(:masters)
  end
  def import(source_project)
    target_project = project
    source_team = source_project.users_projects.to_a
    target_user_ids = target_project.users_projects.pluck(:user_id)
    source_team.reject! do |tm|
      # Skip if user already present in team
      target_user_ids.include?(tm.user_id)
    end
    source_team.map! do |tm|
      new_tm = tm.dup
      new_tm.id = nil
      new_tm.project_id = target_project.id
      new_tm
    end
    UsersProject.transaction do
      source_team.each do |tm|
        tm.save
      end
    end
    true
  rescue
    false
  end
  private
  def fetch_members(level = nil)
    project_members = project.users_projects
    group_members = group ? group.users_groups : []
    if level
      project_members = project_members.send(level)
      group_members = group_members.send(level) if group
    end
    (project_members + group_members).map(&:user).uniq
  end
  def group
    project.group
  end
end