PageRenderTime 58ms CodeModel.GetById 34ms RepoModel.GetById 0ms app.codeStats 0ms

/app/models/project_team.rb

https://gitlab.com/mehlah/gitlab-ce
Ruby | 207 lines | 145 code | 46 blank | 16 comment | 12 complexity | 7f0b7d4a9c8cb7369322e976743d1002 MD5 | raw file
  1. class ProjectTeam
  2. attr_accessor :project
  3. def initialize(project)
  4. @project = project
  5. end
  6. # Shortcut to add users
  7. #
  8. # Use:
  9. # @team << [@user, :master]
  10. # @team << [@users, :master]
  11. #
  12. def <<(args)
  13. users, access, current_user = *args
  14. if users.respond_to?(:each)
  15. add_users(users, access, current_user: current_user)
  16. else
  17. add_user(users, access, current_user: current_user)
  18. end
  19. end
  20. def add_guest(user, current_user: nil)
  21. self << [user, :guest, current_user]
  22. end
  23. def add_reporter(user, current_user: nil)
  24. self << [user, :reporter, current_user]
  25. end
  26. def add_developer(user, current_user: nil)
  27. self << [user, :developer, current_user]
  28. end
  29. def add_master(user, current_user: nil)
  30. self << [user, :master, current_user]
  31. end
  32. def find_member(user_id)
  33. member = project.members.find_by(user_id: user_id)
  34. # If user is not in project members
  35. # we should check for group membership
  36. if group && !member
  37. member = group.members.find_by(user_id: user_id)
  38. end
  39. member
  40. end
  41. def add_users(users, access_level, current_user: nil, expires_at: nil)
  42. ProjectMember.add_users(
  43. project,
  44. users,
  45. access_level,
  46. current_user: current_user,
  47. expires_at: expires_at
  48. )
  49. end
  50. def add_user(user, access_level, current_user: nil, expires_at: nil)
  51. ProjectMember.add_user(
  52. project,
  53. user,
  54. access_level,
  55. current_user: current_user,
  56. expires_at: expires_at
  57. )
  58. end
  59. # Remove all users from project team
  60. def truncate
  61. ProjectMember.truncate_team(project)
  62. end
  63. def members
  64. @members ||= fetch_members
  65. end
  66. alias_method :users, :members
  67. def guests
  68. @guests ||= fetch_members(Gitlab::Access::GUEST)
  69. end
  70. def reporters
  71. @reporters ||= fetch_members(Gitlab::Access::REPORTER)
  72. end
  73. def developers
  74. @developers ||= fetch_members(Gitlab::Access::DEVELOPER)
  75. end
  76. def masters
  77. @masters ||= fetch_members(Gitlab::Access::MASTER)
  78. end
  79. def import(source_project, current_user = nil)
  80. target_project = project
  81. source_members = source_project.project_members.to_a
  82. target_user_ids = target_project.project_members.pluck(:user_id)
  83. source_members.reject! do |member|
  84. # Skip if user already present in team
  85. !member.invite? && target_user_ids.include?(member.user_id)
  86. end
  87. source_members.map! do |member|
  88. new_member = member.dup
  89. new_member.id = nil
  90. new_member.source = target_project
  91. new_member.created_by = current_user
  92. new_member
  93. end
  94. ProjectMember.transaction do
  95. source_members.each do |member|
  96. member.save
  97. end
  98. end
  99. true
  100. rescue
  101. false
  102. end
  103. def guest?(user)
  104. max_member_access(user.id) == Gitlab::Access::GUEST
  105. end
  106. def reporter?(user)
  107. max_member_access(user.id) == Gitlab::Access::REPORTER
  108. end
  109. def developer?(user)
  110. max_member_access(user.id) == Gitlab::Access::DEVELOPER
  111. end
  112. def master?(user)
  113. max_member_access(user.id) == Gitlab::Access::MASTER
  114. end
  115. # Checks if `user` is authorized for this project, with at least the
  116. # `min_access_level` (if given).
  117. def member?(user, min_access_level = Gitlab::Access::GUEST)
  118. return false unless user
  119. max_member_access(user.id) >= min_access_level
  120. end
  121. def human_max_access(user_id)
  122. Gitlab::Access.human_access(max_member_access(user_id))
  123. end
  124. # Determine the maximum access level for a group of users in bulk.
  125. #
  126. # Returns a Hash mapping user ID -> maximum access level.
  127. def max_member_access_for_user_ids(user_ids)
  128. user_ids = user_ids.uniq
  129. key = "max_member_access:#{project.id}"
  130. access = {}
  131. if RequestStore.active?
  132. RequestStore.store[key] ||= {}
  133. access = RequestStore.store[key]
  134. end
  135. # Look up only the IDs we need
  136. user_ids = user_ids - access.keys
  137. return access if user_ids.empty?
  138. users_access = project.project_authorizations
  139. .where(user: user_ids)
  140. .group(:user_id)
  141. .maximum(:access_level)
  142. access.merge!(users_access)
  143. missing_user_ids = user_ids - users_access.keys
  144. missing_user_ids.each do |user_id|
  145. access[user_id] = Gitlab::Access::NO_ACCESS
  146. end
  147. access
  148. end
  149. def max_member_access(user_id)
  150. max_member_access_for_user_ids([user_id])[user_id] || Gitlab::Access::NO_ACCESS
  151. end
  152. private
  153. def fetch_members(level = nil)
  154. members = project.authorized_users
  155. members = members.where(project_authorizations: { access_level: level }) if level
  156. members
  157. end
  158. def group
  159. project.group
  160. end
  161. end