OSDN Git Service

Merge pull request #2711 from fbehrens/patch-1
[wvm/gitlab.git] / app / models / user_team.rb
1 # == Schema Information
2 #
3 # Table name: user_teams
4 #
5 #  id         :integer          not null, primary key
6 #  name       :string(255)
7 #  path       :string(255)
8 #  owner_id   :integer
9 #  created_at :datetime         not null
10 #  updated_at :datetime         not null
11 #
12
13 class UserTeam < ActiveRecord::Base
14   attr_accessible :name, :owner_id, :path
15
16   belongs_to :owner, class_name: User
17
18   has_many :user_team_project_relationships, dependent: :destroy
19   has_many :user_team_user_relationships, dependent: :destroy
20
21   has_many :projects, through: :user_team_project_relationships
22   has_many :members,  through: :user_team_user_relationships, source: :user
23
24   validates :name, presence: true, uniqueness: true
25   validates :owner, presence: true
26   validates :path, uniqueness: true, presence: true, length: { within: 1..255 },
27             format: { with: Gitlab::Regex.path_regex,
28                       message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
29
30   scope :with_member, ->(user){ joins(:user_team_user_relationships).where(user_team_user_relationships: {user_id: user.id}) }
31   scope :with_project, ->(project){ joins(:user_team_project_relationships).where(user_team_project_relationships: {project_id: project})}
32   scope :without_project, ->(project){ where("user_teams.id NOT IN (:ids)", ids: (a = with_project(project); a.blank? ? 0 : a))}
33   scope :created_by, ->(user){ where(owner_id: user) }
34
35   class << self
36     def search query
37       where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
38     end
39
40     def global_id
41       'GLN'
42     end
43
44     def access_roles
45       UsersProject.access_roles
46     end
47   end
48
49   def to_param
50     path
51   end
52
53   def assign_to_projects(projects, access)
54     projects.each do |project|
55       assign_to_project(project, access)
56     end
57   end
58
59   def assign_to_project(project, access)
60     Gitlab::UserTeamManager.assign(self, project, access)
61   end
62
63   def resign_from_project(project)
64     Gitlab::UserTeamManager.resign(self, project)
65   end
66
67   def add_members(users, access, group_admin)
68     users.each do |user|
69       add_member(user, access, group_admin)
70     end
71   end
72
73   def add_member(user, access, group_admin)
74     Gitlab::UserTeamManager.add_member_into_team(self, user, access, group_admin)
75   end
76
77   def remove_member(user)
78     Gitlab::UserTeamManager.remove_member_from_team(self, user)
79   end
80
81   def update_membership(user, options)
82     Gitlab::UserTeamManager.update_team_user_membership(self, user, options)
83   end
84
85   def update_project_access(project, permission)
86     Gitlab::UserTeamManager.update_project_greates_access(self, project, permission)
87   end
88
89   def max_project_access(project)
90     user_team_project_relationships.find_by_project_id(project).greatest_access
91   end
92
93   def human_max_project_access(project)
94     self.class.access_roles.invert[max_project_access(project)]
95   end
96
97   def default_projects_access(member)
98     user_team_user_relationships.find_by_user_id(member).permission
99   end
100
101   def human_default_projects_access(member)
102     self.class.access_roles.invert[default_projects_access(member)]
103   end
104
105   def admin?(member)
106     user_team_user_relationships.with_user(member).first.group_admin?
107   end
108
109 end