Commit 439f399bece8c2b01dc064b6c02f28fb4149595e

Authored by Dmitriy Zaporozhets
1 parent 670aaaeb

Remove all team resources except models. Move models to deprecated directory

Showing 63 changed files with 193 additions and 2611 deletions   Show diff stats
app/controllers/admin/teams/application_controller.rb
... ... @@ -1,11 +0,0 @@
1   -# Provides a base class for Admin controllers to subclass
2   -#
3   -# Automatically sets the layout and ensures an administrator is logged in
4   -class Admin::Teams::ApplicationController < Admin::ApplicationController
5   -
6   - private
7   -
8   - def user_team
9   - @team = UserTeam.find_by_path(params[:team_id])
10   - end
11   -end
app/controllers/admin/teams/members_controller.rb
... ... @@ -1,40 +0,0 @@
1   -class Admin::Teams::MembersController < Admin::Teams::ApplicationController
2   - def new
3   - @users = User.potential_team_members(user_team)
4   - end
5   -
6   - def create
7   - unless params[:user_ids].blank?
8   - user_ids = params[:user_ids]
9   - access = params[:default_project_access]
10   - is_admin = params[:group_admin]
11   - user_team.add_members(user_ids, access, is_admin)
12   - end
13   -
14   - redirect_to admin_team_path(user_team), notice: 'Members were successfully added into Team of users.'
15   - end
16   -
17   - def edit
18   - team_member
19   - end
20   -
21   - def update
22   - options = {default_projects_access: params[:default_project_access], group_admin: params[:group_admin]}
23   - if user_team.update_membership(team_member, options)
24   - redirect_to admin_team_path(user_team), notice: "Membership for #{team_member.name} was successfully updated in Team of users."
25   - else
26   - render :edit
27   - end
28   - end
29   -
30   - def destroy
31   - user_team.remove_member(team_member)
32   - redirect_to admin_team_path(user_team), notice: "Member #{team_member.name} was successfully removed from Team of users."
33   - end
34   -
35   - protected
36   -
37   - def team_member
38   - @member ||= user_team.members.find_by_username(params[:id])
39   - end
40   -end
app/controllers/admin/teams/projects_controller.rb
... ... @@ -1,41 +0,0 @@
1   -class Admin::Teams::ProjectsController < Admin::Teams::ApplicationController
2   - def new
3   - @projects = Project.scoped
4   - @projects = @projects.without_team(user_team) if user_team.projects.any?
5   - #@projects.reject!(&:empty_repo?)
6   - end
7   -
8   - def create
9   - unless params[:project_ids].blank?
10   - project_ids = params[:project_ids]
11   - access = params[:greatest_project_access]
12   - user_team.assign_to_projects(project_ids, access)
13   - end
14   -
15   - redirect_to admin_team_path(user_team), notice: 'Team of users was successfully assgned to projects.'
16   - end
17   -
18   - def edit
19   - team_project
20   - end
21   -
22   - def update
23   - if user_team.update_project_access(team_project, params[:greatest_project_access])
24   - redirect_to admin_team_path(user_team), notice: 'Access was successfully updated.'
25   - else
26   - render :edit
27   - end
28   - end
29   -
30   - def destroy
31   - user_team.resign_from_project(team_project)
32   - redirect_to admin_team_path(user_team), notice: 'Team of users was successfully reassigned from project.'
33   - end
34   -
35   - protected
36   -
37   - def team_project
38   - @project ||= user_team.projects.find_with_namespace(params[:id])
39   - end
40   -
41   -end
app/controllers/admin/teams_controller.rb
... ... @@ -1,59 +0,0 @@
1   -class Admin::TeamsController < Admin::ApplicationController
2   - def index
3   - @teams = UserTeam.order('name ASC')
4   - @teams = @teams.search(params[:name]) if params[:name].present?
5   - @teams = @teams.page(params[:page]).per(20)
6   - end
7   -
8   - def show
9   - user_team
10   - end
11   -
12   - def new
13   - @team = UserTeam.new
14   - end
15   -
16   - def edit
17   - user_team
18   - end
19   -
20   - def create
21   - @team = UserTeam.new(params[:user_team])
22   - @team.path = @team.name.dup.parameterize if @team.name
23   - @team.owner = current_user
24   -
25   - if @team.save
26   - redirect_to admin_team_path(@team), notice: 'Team of users was successfully created.'
27   - else
28   - render action: "new"
29   - end
30   - end
31   -
32   - def update
33   - user_team_params = params[:user_team].dup
34   - owner_id = user_team_params.delete(:owner_id)
35   -
36   - if owner_id
37   - user_team.owner = User.find(owner_id)
38   - end
39   -
40   - if user_team.update_attributes(user_team_params)
41   - redirect_to admin_team_path(user_team), notice: 'Team of users was successfully updated.'
42   - else
43   - render action: "edit"
44   - end
45   - end
46   -
47   - def destroy
48   - user_team.destroy
49   -
50   - redirect_to admin_teams_path, notice: 'Team of users was successfully deleted.'
51   - end
52   -
53   - protected
54   -
55   - def user_team
56   - @team ||= UserTeam.find_by_path(params[:id])
57   - end
58   -
59   -end
app/controllers/dashboard_controller.rb
... ... @@ -7,7 +7,6 @@ class DashboardController &lt; ApplicationController
7 7 def show
8 8 @groups = current_user.authorized_groups.sort_by(&:human_name)
9 9 @has_authorized_projects = @projects.count > 0
10   - @teams = current_user.authorized_teams
11 10 @projects_count = @projects.count
12 11 @projects = @projects.limit(20)
13 12  
... ...
app/controllers/projects/teams_controller.rb
... ... @@ -1,34 +0,0 @@
1   -class Projects::TeamsController < Projects::ApplicationController
2   -
3   - before_filter :authorize_admin_team_member!
4   -
5   - def available
6   - @teams = current_user.is_admin? ? UserTeam.scoped : current_user.user_teams
7   - @teams = @teams.without_project(project)
8   - unless @teams.any?
9   - redirect_to project_team_index_path(project), notice: "No available teams for assigment."
10   - end
11   - end
12   -
13   - def assign
14   - unless params[:team_id].blank?
15   - team = UserTeam.find(params[:team_id])
16   - access = params[:greatest_project_access]
17   - team.assign_to_project(project, access)
18   - end
19   - redirect_to project_team_index_path(project)
20   - end
21   -
22   - def resign
23   - team = project.user_teams.find_by_path(params[:id])
24   - team.resign_from_project(project)
25   -
26   - redirect_to project_team_index_path(project)
27   - end
28   -
29   - protected
30   -
31   - def user_team
32   - @team ||= UserTeam.find_by_path(params[:id])
33   - end
34   -end
app/controllers/teams/application_controller.rb
... ... @@ -1,13 +0,0 @@
1   -class Teams::ApplicationController < ApplicationController
2   -
3   - layout 'user_team'
4   -
5   - before_filter :authorize_manage_user_team!
6   -
7   - protected
8   -
9   - def user_team
10   - @team ||= UserTeam.find_by_path(params[:team_id])
11   - end
12   -
13   -end
app/controllers/teams/members_controller.rb
... ... @@ -1,53 +0,0 @@
1   -class Teams::MembersController < Teams::ApplicationController
2   -
3   - skip_before_filter :authorize_manage_user_team!, only: [:index]
4   -
5   - def index
6   - @members = user_team.members
7   - end
8   -
9   - def new
10   - @users = User.potential_team_members(user_team)
11   - end
12   -
13   - def create
14   - unless params[:user_ids].blank?
15   - user_ids = params[:user_ids].split(',')
16   - access = params[:default_project_access]
17   - is_admin = params[:group_admin]
18   - user_team.add_members(user_ids, access, is_admin)
19   - end
20   -
21   - redirect_to team_members_path(user_team), notice: 'Members were successfully added into Team of users.'
22   - end
23   -
24   - def edit
25   - team_member
26   - end
27   -
28   - def update
29   - member_params = params[:team_member]
30   -
31   - options = {
32   - default_projects_access: member_params[:permission],
33   - group_admin: member_params[:group_admin]
34   - }
35   -
36   - if user_team.update_membership(team_member, options)
37   - redirect_to team_members_path(user_team), notice: "Membership for #{team_member.name} was successfully updated in Team of users."
38   - else
39   - render :edit
40   - end
41   - end
42   -
43   - def destroy
44   - user_team.remove_member(team_member)
45   - redirect_to team_path(user_team), notice: "Member #{team_member.name} was successfully removed from Team of users."
46   - end
47   -
48   - protected
49   -
50   - def team_member
51   - @member ||= user_team.members.find_by_username(params[:id])
52   - end
53   -end
app/controllers/teams/projects_controller.rb
... ... @@ -1,40 +0,0 @@
1   -class Teams::ProjectsController < Teams::ApplicationController
2   - def create
3   - redirect_to :back if params[:project_ids].blank?
4   -
5   - project_ids = params[:project_ids]
6   - access = params[:greatest_project_access]
7   -
8   - # Reject non-allowed projects
9   - allowed_project_ids = current_user.owned_projects.map(&:id)
10   - project_ids.select! { |id| allowed_project_ids.include?(id.to_i) }
11   -
12   - # Assign projects to team
13   - user_team.assign_to_projects(project_ids, access)
14   -
15   - redirect_to edit_team_path(user_team), notice: 'Team of users was successfully assigned to projects.'
16   - end
17   -
18   - def edit
19   - team_project
20   - end
21   -
22   - def update
23   - if user_team.update_project_access(team_project, params[:greatest_project_access])
24   - redirect_to edit_team_path(user_team), notice: 'Access was successfully updated.'
25   - else
26   - render :edit
27   - end
28   - end
29   -
30   - def destroy
31   - user_team.resign_from_project(team_project)
32   - redirect_to team_projects_path(user_team), notice: 'Team of users was successfully reassigned from project.'
33   - end
34   -
35   - private
36   -
37   - def team_project
38   - @project ||= user_team.projects.find_with_namespace(params[:id])
39   - end
40   -end
app/controllers/teams_controller.rb
... ... @@ -1,93 +0,0 @@
1   -class TeamsController < ApplicationController
2   - # Authorize
3   - before_filter :authorize_create_team!, only: [:new, :create]
4   - before_filter :authorize_manage_user_team!, only: [:edit, :update]
5   - before_filter :authorize_admin_user_team!, only: [:destroy]
6   -
7   - before_filter :user_team, except: [:new, :create]
8   -
9   - layout :determine_layout
10   -
11   - before_filter :set_title, only: [:new, :create]
12   -
13   - def show
14   - projects
15   - @events = Event.in_projects(user_team.project_ids).limit(20).offset(params[:offset] || 0)
16   - end
17   -
18   - def edit
19   - projects
20   - @avaliable_projects = current_user.owned_projects.without_team(user_team)
21   - end
22   -
23   - def update
24   - if user_team.update_attributes(params[:user_team])
25   - redirect_to team_path(user_team)
26   - else
27   - render action: :edit
28   - end
29   - end
30   -
31   - def destroy
32   - user_team.destroy
33   - redirect_to dashboard_path
34   - end
35   -
36   - def new
37   - @team = UserTeam.new
38   - end
39   -
40   - def create
41   - @team = UserTeam.new(params[:user_team])
42   - @team.owner = current_user unless params[:owner]
43   - @team.path = @team.name.dup.parameterize if @team.name
44   -
45   - if @team.save
46   - # Add current user as Master to the team
47   - @team.add_members([current_user.id], UsersProject::MASTER, true)
48   -
49   - redirect_to team_path(@team)
50   - else
51   - render action: :new
52   - end
53   - end
54   -
55   - # Get authored or assigned open merge requests
56   - def merge_requests
57   - projects
58   - @merge_requests = MergeRequest.of_user_team(user_team)
59   - @merge_requests = FilterContext.new(@merge_requests, params).execute
60   - @merge_requests = @merge_requests.recent.page(params[:page]).per(20)
61   - end
62   -
63   - # Get only assigned issues
64   - def issues
65   - projects
66   - @issues = Issue.of_user_team(user_team)
67   - @issues = FilterContext.new(@issues, params).execute
68   - @issues = @issues.recent.page(params[:page]).per(20)
69   - @issues = @issues.includes(:author, :project)
70   - end
71   -
72   - protected
73   -
74   - def projects
75   - @projects ||= user_team.projects.sorted_by_activity
76   - end
77   -
78   - def user_team
79   - @team ||= current_user.authorized_teams.find_by_path(params[:id])
80   - end
81   -
82   - def set_title
83   - @title = 'New Team'
84   - end
85   -
86   - def determine_layout
87   - if [:new, :create].include?(action_name.to_sym)
88   - 'navless'
89   - else
90   - 'user_team'
91   - end
92   - end
93   -end
app/helpers/application_helper.rb
... ... @@ -92,7 +92,6 @@ module ApplicationHelper
92 92 def search_autocomplete_source
93 93 projects = current_user.authorized_projects.map { |p| { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) } }
94 94 groups = current_user.authorized_groups.map { |group| { label: "group: #{simple_sanitize(group.name)}", url: group_path(group) } }
95   - teams = current_user.authorized_teams.map { |team| { label: "team: #{simple_sanitize(team.name)}", url: team_path(team) } }
96 95  
97 96 default_nav = [
98 97 { label: "My Profile", url: profile_path },
... ... @@ -128,7 +127,7 @@ module ApplicationHelper
128 127 ]
129 128 end
130 129  
131   - [groups, teams, projects, default_nav, project_nav, help_nav].flatten.to_json
  130 + [groups, projects, default_nav, project_nav, help_nav].flatten.to_json
132 131 end
133 132  
134 133 def emoji_autocomplete_source
... ...
app/helpers/user_teams_helper.rb
... ... @@ -1,25 +0,0 @@
1   -module UserTeamsHelper
2   - def team_filter_path(entity, options={})
3   - exist_opts = {
4   - status: params[:status],
5   - project_id: params[:project_id],
6   - }
7   -
8   - options = exist_opts.merge(options)
9   -
10   - case entity
11   - when 'issue' then
12   - issues_team_path(@team, options)
13   - when 'merge_request'
14   - merge_requests_team_path(@team, options)
15   - end
16   - end
17   -
18   - def grouped_user_team_members(team)
19   - team.user_team_user_relationships.sort_by(&:permission).reverse.group_by(&:permission)
20   - end
21   -
22   - def remove_from_user_team_message(team, member)
23   - "You are going to remove #{member.name} from #{team.name}. Are you sure?"
24   - end
25   -end
app/models/ability.rb
... ... @@ -11,7 +11,6 @@ class Ability
11 11 when "PersonalSnippet" then personal_snippet_abilities(user, subject)
12 12 when "MergeRequest" then merge_request_abilities(user, subject)
13 13 when "Group", "Namespace" then group_abilities(user, subject)
14   - when "UserTeam" then user_team_abilities(user, subject)
15 14 else []
16 15 end.concat(global_abilities(user))
17 16 end
... ... @@ -19,7 +18,6 @@ class Ability
19 18 def global_abilities(user)
20 19 rules = []
21 20 rules << :create_group if user.can_create_group
22   - rules << :create_team if user.can_create_team
23 21 rules
24 22 end
25 23  
... ... @@ -146,21 +144,6 @@ class Ability
146 144 rules.flatten
147 145 end
148 146  
149   - def user_team_abilities user, team
150   - rules = []
151   -
152   - # Only group owner and administrators can manage team
153   - if user.admin? || team.owner == user || team.admin?(user)
154   - rules << [ :manage_user_team ]
155   - end
156   -
157   - if team.owner == user || user.admin?
158   - rules << [ :admin_user_team ]
159   - end
160   -
161   - rules.flatten
162   - end
163   -
164 147 [:issue, :note, :project_snippet, :personal_snippet, :merge_request].each do |name|
165 148 define_method "#{name}_abilities" do |user, subject|
166 149 if subject.author == user
... ...
app/models/deprecated/user_team.rb 0 → 100644
... ... @@ -0,0 +1,116 @@
  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 +# description :string(255) default(""), not null
  12 +#
  13 +
  14 +class UserTeam < ActiveRecord::Base
  15 + attr_accessible :name, :description, :owner_id, :path
  16 +
  17 + belongs_to :owner, class_name: User
  18 +
  19 + has_many :user_team_project_relationships, dependent: :destroy
  20 + has_many :user_team_user_relationships, dependent: :destroy
  21 +
  22 + has_many :projects, through: :user_team_project_relationships
  23 + has_many :members, through: :user_team_user_relationships, source: :user
  24 +
  25 + validates :owner, presence: true
  26 + validates :name, presence: true, uniqueness: true,
  27 + length: { within: 0..255 },
  28 + format: { with: Gitlab::Regex.name_regex,
  29 + message: "only letters, digits, spaces & '_' '-' '.' allowed." }
  30 + validates :description, length: { within: 0..255 }
  31 + validates :path, uniqueness: true, presence: true, length: { within: 1..255 },
  32 + format: { with: Gitlab::Regex.path_regex,
  33 + message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
  34 +
  35 + scope :with_member, ->(user){ joins(:user_team_user_relationships).where(user_team_user_relationships: {user_id: user.id}) }
  36 + scope :with_project, ->(project){ joins(:user_team_project_relationships).where(user_team_project_relationships: {project_id: project})}
  37 + scope :without_project, ->(project){ where("user_teams.id NOT IN (:ids)", ids: (a = with_project(project); a.blank? ? 0 : a))}
  38 + scope :created_by, ->(user){ where(owner_id: user) }
  39 +
  40 + class << self
  41 + def search query
  42 + where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
  43 + end
  44 +
  45 + def global_id
  46 + 'GLN'
  47 + end
  48 +
  49 + def access_roles
  50 + UsersProject.access_roles
  51 + end
  52 + end
  53 +
  54 + def to_param
  55 + path
  56 + end
  57 +
  58 + def assign_to_projects(projects, access)
  59 + projects.each do |project|
  60 + assign_to_project(project, access)
  61 + end
  62 + end
  63 +
  64 + def assign_to_project(project, access)
  65 + Gitlab::UserTeamManager.assign(self, project, access)
  66 + end
  67 +
  68 + def resign_from_project(project)
  69 + Gitlab::UserTeamManager.resign(self, project)
  70 + end
  71 +
  72 + def add_members(users, access, group_admin)
  73 + # reject existing users
  74 + users.reject! { |id| member_ids.include?(id.to_i) }
  75 +
  76 + users.each do |user|
  77 + add_member(user, access, group_admin)
  78 + end
  79 + end
  80 +
  81 + def add_member(user, access, group_admin)
  82 + Gitlab::UserTeamManager.add_member_into_team(self, user, access, group_admin)
  83 + end
  84 +
  85 + def remove_member(user)
  86 + Gitlab::UserTeamManager.remove_member_from_team(self, user)
  87 + end
  88 +
  89 + def update_membership(user, options)
  90 + Gitlab::UserTeamManager.update_team_user_membership(self, user, options)
  91 + end
  92 +
  93 + def update_project_access(project, permission)
  94 + Gitlab::UserTeamManager.update_project_greates_access(self, project, permission)
  95 + end
  96 +
  97 + def max_project_access(project)
  98 + user_team_project_relationships.find_by_project_id(project).greatest_access
  99 + end
  100 +
  101 + def human_max_project_access(project)
  102 + self.class.access_roles.invert[max_project_access(project)]
  103 + end
  104 +
  105 + def default_projects_access(member)
  106 + user_team_user_relationships.find_by_user_id(member).permission
  107 + end
  108 +
  109 + def human_default_projects_access(member)
  110 + self.class.access_roles.invert[default_projects_access(member)]
  111 + end
  112 +
  113 + def admin?(member)
  114 + user_team_user_relationships.with_user(member).first.try(:group_admin?)
  115 + end
  116 +end
... ...
app/models/deprecated/user_team_project_relationship.rb 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: user_team_project_relationships
  4 +#
  5 +# id :integer not null, primary key
  6 +# project_id :integer
  7 +# user_team_id :integer
  8 +# greatest_access :integer
  9 +# created_at :datetime not null
  10 +# updated_at :datetime not null
  11 +#
  12 +
  13 +class UserTeamProjectRelationship < ActiveRecord::Base
  14 + attr_accessible :greatest_access, :project_id, :user_team_id
  15 +
  16 + belongs_to :user_team
  17 + belongs_to :project
  18 +
  19 + validates :project, presence: true
  20 + validates :user_team, presence: true
  21 + validate :check_greatest_access
  22 +
  23 + scope :with_project, ->(project){ where(project_id: project.id) }
  24 +
  25 + def team_name
  26 + user_team.name
  27 + end
  28 +
  29 + def human_max_access
  30 + UserTeam.access_roles.key(greatest_access)
  31 + end
  32 +
  33 + private
  34 +
  35 + def check_greatest_access
  36 + errors.add(:base, :incorrect_access_code) unless correct_access?
  37 + end
  38 +
  39 + def correct_access?
  40 + return false if greatest_access.blank?
  41 + return true if UsersProject.access_roles.has_value?(greatest_access)
  42 + false
  43 + end
  44 +end
... ...
app/models/deprecated/user_team_user_relationship.rb 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: user_team_user_relationships
  4 +#
  5 +# id :integer not null, primary key
  6 +# user_id :integer
  7 +# user_team_id :integer
  8 +# group_admin :boolean
  9 +# permission :integer
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +#
  13 +
  14 +class UserTeamUserRelationship < ActiveRecord::Base
  15 + attr_accessible :group_admin, :permission, :user_id, :user_team_id
  16 +
  17 + belongs_to :user_team
  18 + belongs_to :user
  19 +
  20 + validates :user_team, presence: true
  21 + validates :user, presence: true
  22 +
  23 + scope :with_user, ->(user) { where(user_id: user.id) }
  24 +
  25 + def user_name
  26 + user.name
  27 + end
  28 +
  29 + def access_human
  30 + UsersProject.access_roles.invert[permission]
  31 + end
  32 +end
... ...
app/models/user.rb
... ... @@ -75,13 +75,6 @@ class User &lt; ActiveRecord::Base
75 75 has_many :users_groups, dependent: :destroy
76 76 has_many :groups, through: :users_groups
77 77  
78   - # Teams
79   - has_many :own_teams, dependent: :destroy, class_name: "UserTeam", foreign_key: :owner_id
80   - has_many :user_team_user_relationships, dependent: :destroy
81   - has_many :user_teams, through: :user_team_user_relationships
82   - has_many :user_team_project_relationships, through: :user_teams
83   - has_many :team_projects, through: :user_team_project_relationships
84   -
85 78 # Projects
86 79 has_many :snippets, dependent: :destroy, foreign_key: :author_id, class_name: "Snippet"
87 80 has_many :users_projects, dependent: :destroy
... ... @@ -235,10 +228,6 @@ class User &lt; ActiveRecord::Base
235 228 own_groups
236 229 end
237 230  
238   - def owned_teams
239   - own_teams
240   - end
241   -
242 231 # Groups user has access to
243 232 def authorized_groups
244 233 @group_ids ||= (groups.pluck(:id) + own_groups.pluck(:id) + authorized_projects.pluck(:namespace_id))
... ... @@ -252,15 +241,6 @@ class User &lt; ActiveRecord::Base
252 241 Project.where(id: @project_ids)
253 242 end
254 243  
255   - def authorized_teams
256   - if admin?
257   - UserTeam.scoped
258   - else
259   - @team_ids ||= (user_teams.pluck(:id) + own_teams.pluck(:id)).uniq
260   - UserTeam.where(id: @team_ids)
261   - end
262   - end
263   -
264 244 # Team membership in authorized projects
265 245 def tm_in_authorized_projects
266 246 UsersProject.where(project_id: authorized_projects.map(&:id), user_id: self.id)
... ...
app/models/user_team.rb
... ... @@ -1,116 +0,0 @@
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   -# description :string(255) default(""), not null
12   -#
13   -
14   -class UserTeam < ActiveRecord::Base
15   - attr_accessible :name, :description, :owner_id, :path
16   -
17   - belongs_to :owner, class_name: User
18   -
19   - has_many :user_team_project_relationships, dependent: :destroy
20   - has_many :user_team_user_relationships, dependent: :destroy
21   -
22   - has_many :projects, through: :user_team_project_relationships
23   - has_many :members, through: :user_team_user_relationships, source: :user
24   -
25   - validates :owner, presence: true
26   - validates :name, presence: true, uniqueness: true,
27   - length: { within: 0..255 },
28   - format: { with: Gitlab::Regex.name_regex,
29   - message: "only letters, digits, spaces & '_' '-' '.' allowed." }
30   - validates :description, length: { within: 0..255 }
31   - validates :path, uniqueness: true, presence: true, length: { within: 1..255 },
32   - format: { with: Gitlab::Regex.path_regex,
33   - message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
34   -
35   - scope :with_member, ->(user){ joins(:user_team_user_relationships).where(user_team_user_relationships: {user_id: user.id}) }
36   - scope :with_project, ->(project){ joins(:user_team_project_relationships).where(user_team_project_relationships: {project_id: project})}
37   - scope :without_project, ->(project){ where("user_teams.id NOT IN (:ids)", ids: (a = with_project(project); a.blank? ? 0 : a))}
38   - scope :created_by, ->(user){ where(owner_id: user) }
39   -
40   - class << self
41   - def search query
42   - where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
43   - end
44   -
45   - def global_id
46   - 'GLN'
47   - end
48   -
49   - def access_roles
50   - UsersProject.access_roles
51   - end
52   - end
53   -
54   - def to_param
55   - path
56   - end
57   -
58   - def assign_to_projects(projects, access)
59   - projects.each do |project|
60   - assign_to_project(project, access)
61   - end
62   - end
63   -
64   - def assign_to_project(project, access)
65   - Gitlab::UserTeamManager.assign(self, project, access)
66   - end
67   -
68   - def resign_from_project(project)
69   - Gitlab::UserTeamManager.resign(self, project)
70   - end
71   -
72   - def add_members(users, access, group_admin)
73   - # reject existing users
74   - users.reject! { |id| member_ids.include?(id.to_i) }
75   -
76   - users.each do |user|
77   - add_member(user, access, group_admin)
78   - end
79   - end
80   -
81   - def add_member(user, access, group_admin)
82   - Gitlab::UserTeamManager.add_member_into_team(self, user, access, group_admin)
83   - end
84   -
85   - def remove_member(user)
86   - Gitlab::UserTeamManager.remove_member_from_team(self, user)
87   - end
88   -
89   - def update_membership(user, options)
90   - Gitlab::UserTeamManager.update_team_user_membership(self, user, options)
91   - end
92   -
93   - def update_project_access(project, permission)
94   - Gitlab::UserTeamManager.update_project_greates_access(self, project, permission)
95   - end
96   -
97   - def max_project_access(project)
98   - user_team_project_relationships.find_by_project_id(project).greatest_access
99   - end
100   -
101   - def human_max_project_access(project)
102   - self.class.access_roles.invert[max_project_access(project)]
103   - end
104   -
105   - def default_projects_access(member)
106   - user_team_user_relationships.find_by_user_id(member).permission
107   - end
108   -
109   - def human_default_projects_access(member)
110   - self.class.access_roles.invert[default_projects_access(member)]
111   - end
112   -
113   - def admin?(member)
114   - user_team_user_relationships.with_user(member).first.try(:group_admin?)
115   - end
116   -end
app/models/user_team_project_relationship.rb
... ... @@ -1,44 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: user_team_project_relationships
4   -#
5   -# id :integer not null, primary key
6   -# project_id :integer
7   -# user_team_id :integer
8   -# greatest_access :integer
9   -# created_at :datetime not null
10   -# updated_at :datetime not null
11   -#
12   -
13   -class UserTeamProjectRelationship < ActiveRecord::Base
14   - attr_accessible :greatest_access, :project_id, :user_team_id
15   -
16   - belongs_to :user_team
17   - belongs_to :project
18   -
19   - validates :project, presence: true
20   - validates :user_team, presence: true
21   - validate :check_greatest_access
22   -
23   - scope :with_project, ->(project){ where(project_id: project.id) }
24   -
25   - def team_name
26   - user_team.name
27   - end
28   -
29   - def human_max_access
30   - UserTeam.access_roles.key(greatest_access)
31   - end
32   -
33   - private
34   -
35   - def check_greatest_access
36   - errors.add(:base, :incorrect_access_code) unless correct_access?
37   - end
38   -
39   - def correct_access?
40   - return false if greatest_access.blank?
41   - return true if UsersProject.access_roles.has_value?(greatest_access)
42   - false
43   - end
44   -end
app/models/user_team_user_relationship.rb
... ... @@ -1,32 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: user_team_user_relationships
4   -#
5   -# id :integer not null, primary key
6   -# user_id :integer
7   -# user_team_id :integer
8   -# group_admin :boolean
9   -# permission :integer
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -#
13   -
14   -class UserTeamUserRelationship < ActiveRecord::Base
15   - attr_accessible :group_admin, :permission, :user_id, :user_team_id
16   -
17   - belongs_to :user_team
18   - belongs_to :user
19   -
20   - validates :user_team, presence: true
21   - validates :user, presence: true
22   -
23   - scope :with_user, ->(user) { where(user_id: user.id) }
24   -
25   - def user_name
26   - user.name
27   - end
28   -
29   - def access_human
30   - UsersProject.access_roles.invert[permission]
31   - end
32   -end
app/views/admin/dashboard/index.html.haml
... ... @@ -50,10 +50,6 @@
50 50 %h4 Stats
51 51 %hr
52 52 %p
53   - Teams
54   - %span.light.pull-right
55   - = UserTeam.count
56   - %p
57 53 Forks
58 54 %span.light.pull-right
59 55 = ForkedProjectLink.count
... ...
app/views/admin/teams/edit.html.haml
... ... @@ -1,28 +0,0 @@
1   -%h3.page_title Edit Team
2   -%hr
3   -= form_for @team, url: admin_team_path(@team), method: :put do |f|
4   - - if @team.errors.any?
5   - .alert.alert-error
6   - %span= @team.errors.full_messages.first
7   - .clearfix.team_name_holder
8   - = f.label :name do
9   - Team name is
10   - .input
11   - = f.text_field :name, placeholder: "Example Team", class: "xxlarge"
12   -
13   - .clearfix.team-description-holder
14   - = f.label :description, "Details"
15   - .input
16   - = f.text_area :description, maxlength: 250, class: "xxlarge js-gfm-input", rows: 4
17   -
18   - .clearfix.team_name_holder
19   - = f.label :path do
20   - %span.cred Team path is
21   - .input
22   - = f.text_field :path, placeholder: "example-team", class: "xxlarge danger"
23   - %ul.cred
24   - %li It will change web url for access team and team projects.
25   -
26   - .form-actions
27   - = f.submit 'Edit team', class: "btn btn-remove"
28   - = link_to 'Cancel', admin_teams_path, class: "btn btn-cancel"
app/views/admin/teams/index.html.haml
... ... @@ -1,48 +0,0 @@
1   -%h3.page_title
2   - Teams (#{@teams.total_count})
3   - %small
4   - allow you to organize groups of people that have a common focus. Use teams to simplify the process of assigning roles to groups of people.
5   -
6   - = link_to 'New Team', new_admin_team_path, class: "btn btn-small pull-right"
7   -%br
8   -
9   -= form_tag admin_teams_path, method: :get, class: 'form-inline' do
10   - = text_field_tag :name, params[:name], class: "span6"
11   - = submit_tag "Search", class: "btn submit btn-primary"
12   -
13   -%hr
14   -
15   -%ul.bordered-list
16   - - @teams.each do |team|
17   - %li
18   - .clearfix
19   - .pull-right.prepend-top-10
20   - = link_to 'Edit', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn btn-small"
21   - = link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn btn-small btn-remove"
22   -
23   - %h4
24   - = link_to admin_team_path(team) do
25   - %i.icon-group
26   - = team.name
27   -
28   - .clearfix.light.append-bottom-10
29   - %span
30   - %b Owner:
31   - - if team.owner
32   - = link_to team.owner.name, admin_user_path(team.owner)
33   - - else
34   - (deleted)
35   - \|
36   - %span
37   - %b Users:
38   - %span.badge= team.members.count
39   - \|
40   - %span
41   - %b Projects:
42   - %span.badge= team.projects.count
43   -
44   - .clearfix
45   - %p
46   - = truncate team.description, length: 150
47   -
48   -= paginate @teams, theme: "gitlab"
app/views/admin/teams/members/_form.html.haml
... ... @@ -1,20 +0,0 @@
1   -= form_tag admin_team_member_path(@team, @member), method: :put do
2   - -if @member.errors.any?
3   - .alert.alert-error
4   - %ul
5   - - @member.errors.full_messages.each do |msg|
6   - %li= msg
7   -
8   - .clearfix
9   - %label Default access for Team projects:
10   - .input
11   - = select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3"
12   - .clearfix
13   - %label Team admin?
14   - .input
15   - = check_box_tag :group_admin, true, @team.admin?(@member)
16   -
17   - %br
18   - .actions
19   - = submit_tag 'Save', class: "btn btn-primary"
20   - = link_to 'Cancel', :back, class: "btn"
app/views/admin/teams/members/edit.html.haml
... ... @@ -1,16 +0,0 @@
1   -%h3
2   - Edit access #{@member.name} in #{@team.name} team
3   -
4   -%hr
5   -%table.zebra-striped
6   - %tr
7   - %td User:
8   - %td= @member.name
9   - %tr
10   - %td Team:
11   - %td= @team.name
12   - %tr
13   - %td Since:
14   - %td= member_since(@team, @member).stamp("Nov 11, 2010")
15   -
16   -= render 'form'
app/views/admin/teams/members/new.html.haml
... ... @@ -1,27 +0,0 @@
1   -%h3.page_title
2   - New members for
3   - = link_to @team.name, admin_team_path(@team)
4   - team
5   -%hr
6   -= form_tag admin_team_members_path(@team), id: "team_members", class: "bulk_import", method: :post do
7   - - if @team.errors.any?
8   - .alert.alert-error
9   - %span= @team.errors.full_messages.first
10   - .clearfix
11   - = label_tag :user_ids do
12   - Users to add
13   - .input
14   - = select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_username), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5'
15   - .clearfix.group-description-holder
16   - = label_tag :default_project_access do
17   - Default permission in projects
18   - .input
19   - = select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }
20   - .clearfix
21   - = label_tag :group_admin do
22   - Is team admin
23   - .input
24   - = check_box_tag :group_admin
25   - .clearfix.form-actions
26   - = submit_tag 'Add users into team', class: "btn btn-primary", id: :add_members_to_team
27   - = link_to 'Cancel', :back, class: "btn"
app/views/admin/teams/new.html.haml
... ... @@ -1,26 +0,0 @@
1   -%h3.page_title New Team
2   -%hr
3   -= form_for @team, url: admin_teams_path do |f|
4   - - if @team.errors.any?
5   - .alert.alert-error
6   - %span= @team.errors.full_messages.first
7   - .clearfix
8   - = f.label :name do
9   - Team name is
10   - .input
11   - = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
12   -
13   - .clearfix.team-description-holder
14   - = f.label :description, "Details"
15   - .input
16   - = f.text_area :description, maxlength: 250, class: "xxlarge js-gfm-input", rows: 4
17   -
18   - .form-actions
19   - = f.submit 'Create team', class: "btn btn-create"
20   -
21   - %hr
22   - .padded
23   - %ul
24   - %li All created teams are public (users can view who enter into team and which project are assigned for this team)
25   - %li People within a team see only projects they have access to
26   - %li You will be able to assign existing projects for team
app/views/admin/teams/projects/_form.html.haml
... ... @@ -1,16 +0,0 @@
1   -= form_tag admin_team_project_path(@team, @project), method: :put do
2   - -if @project.errors.any?
3   - .alert.alert-error
4   - %ul
5   - - @project.errors.full_messages.each do |msg|
6   - %li= msg
7   -
8   - .clearfix
9   - %label Max access for Team members:
10   - .input
11   - = select_tag :greatest_project_access, options_for_select(UserTeam.access_roles, @team.max_project_access(@project)), class: "project-access-select chosen span3"
12   -
13   - %br
14   - .actions
15   - = submit_tag 'Save', class: "btn btn-primary"
16   - = link_to 'Cancel', :back, class: "btn"
app/views/admin/teams/projects/edit.html.haml
... ... @@ -1,16 +0,0 @@
1   -%h3
2   - Edit max access in #{@project.name} for #{@team.name} team
3   -
4   -%hr
5   -%table.zebra-striped
6   - %tr
7   - %td Project:
8   - %td= @project.name
9   - %tr
10   - %td Team:
11   - %td= @team.name
12   - %tr
13   - %td Since:
14   - %td= assigned_since(@team, @project).stamp("Nov 11, 2010")
15   -
16   -= render 'form'
app/views/admin/teams/projects/new.html.haml
... ... @@ -1,18 +0,0 @@
1   -%h3.page_title
2   - Team: #{@team.name}
3   -%hr
4   -= form_tag admin_team_projects_path(@team), id: "assign_projects", class: "bulk_import", method: :post do
5   - %h6 Choose Projects you want to assign:
6   - .clearfix
7   - = label_tag :project_ids, "Projects"
8   - .input
9   - = select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
10   -
11   - %h6 Choose greatest user acces for your team in this projects:
12   - .clearfix
13   - = label_tag :greatest_project_access, "Greatest Access"
14   - .input
15   - = select_tag :greatest_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" }
16   -
17   - .form-actions
18   - = submit_tag 'Add team to projects', class: "btn btn-create", id: :assign_projects_to_team
app/views/admin/teams/show.html.haml
... ... @@ -1,96 +0,0 @@
1   -%h3.page_title
2   - Team: #{@team.name}
3   -
4   -
5   - = link_to edit_admin_team_path(@team), class: "btn btn-small pull-right" do
6   - %i.icon-edit
7   - Edit
8   -%hr
9   -
10   -
11   -.row
12   - .span6
13   - .ui-box
14   - %h5.title
15   - Team info:
16   - %ul.well-list
17   - %li
18   - %span.light Name:
19   - %strong= @team.name
20   - %li
21   - %span.light Path:
22   - %strong
23   - = @team.path
24   -
25   - %li
26   - %span.light Description:
27   - %strong
28   - = @team.description
29   -
30   - %li
31   - %span.light Owned by:
32   - %strong
33   - - if @team.owner
34   - = link_to @team.owner.name, admin_user_path(@team.owner)
35   - - else
36   - (deleted)
37   - .pull-right
38   - = link_to "#", class: "btn btn-small change-owner-link" do
39   - %i.icon-edit
40   - Change owner
41   - %li.change-owner-holder.hide.bgred
42   - .form-holder
43   - %strong.cred New Owner:
44   - = form_for @team, url: admin_team_path(@team) do |f|
45   - = users_select_tag(:"user_team[owner_id]")
46   - .prepend-top-10
47   - = f.submit 'Change Owner', class: "btn btn-remove"
48   - = link_to "Cancel", "#", class: "btn change-owner-cancel-link"
49   -
50   - %li
51   - %span.light Created at:
52   - %strong
53   - = @team.created_at.stamp("March 1, 1999")
54   -
55   - .span6
56   - .ui-box
57   - %h5.title
58   - Members (#{@team.members.count})
59   - .pull-right
60   - = link_to 'Add members', new_admin_team_member_path(@team), class: "btn btn-small", id: :add_members_to_team
61   - %ul.well-list#members_list
62   - - @team.members.each do |member|
63   - %li.member{ class: "user_#{member.id}"}
64   - = link_to [:admin, member] do
65   - %strong
66   - = member.name
67   - .pull-right
68   - %span.light
69   - = @team.human_default_projects_access(member)
70   - - if @team.admin?(member)
71   - %span.label.label-info Admin
72   - &nbsp;
73   - = link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn btn-small"
74   - &nbsp;
75   - = link_to 'Remove', admin_team_member_path(@team, member), confirm: 'Remove member from team. Are you sure?', method: :delete, class: "btn btn-remove btn-small", id: "remove_member_#{member.id}"
76   -
77   -
78   - .ui-box
79   - %h5.title
80   - Projects (#{@team.projects.count})
81   - .pull-right
82   - = link_to 'Add projects', new_admin_team_project_path(@team), class: "btn btn-small", id: :assign_projects_to_team
83   - %ul.well-list#projects_list
84   - - @team.projects.each do |project|
85   - %li.project
86   - = link_to [:admin, project] do
87   - %strong
88   - = project.name_with_namespace
89   -
90   - .pull-right
91   - %span.light
92   - = @team.human_max_project_access(project)
93   - &nbsp;
94   - = link_to 'Edit', edit_admin_team_project_path(@team, project), class: "btn btn-small"
95   - &nbsp;
96   - = link_to 'Relegate', admin_team_project_path(@team, project), confirm: 'Remove project from team. Are you sure?', method: :delete, class: "btn btn-remove small", id: "relegate_project_#{project.id}"
app/views/admin/users/show.html.haml
... ... @@ -93,13 +93,6 @@
93 93 %li
94 94 %strong= link_to group.name, admin_group_path(group)
95 95  
96   - - if @admin_user.owned_teams.present?
97   - .ui-box
98   - %h5.title Owned teams:
99   - %ul.well-list
100   - - @admin_user.owned_teams.each do |team|
101   - %li
102   - %strong= link_to team.name, admin_team_path(team)
103 96  
104 97  
105 98 .span6
... ...
app/views/dashboard/_sidebar.html.haml
... ... @@ -3,16 +3,12 @@
3 3 = link_to 'Projects', '#projects', 'data-toggle' => 'tab', id: 'sidebar-projects-tab'
4 4 %li
5 5 = link_to 'Groups', '#groups', 'data-toggle' => 'tab', id: 'sidebar-groups-tab'
6   - %li
7   - = link_to 'Teams', '#teams', 'data-toggle' => 'tab', id: 'sidebar-teams-tab'
8 6  
9 7 .tab-content
10 8 .tab-pane.active#projects
11 9 = render "projects", projects: @projects
12 10 .tab-pane#groups
13 11 = render "groups", groups: @groups
14   - .tab-pane#teams
15   - = render "teams", teams: @teams
16 12  
17 13 .prepend-top-20
18 14 %span.rss-icon
... ...
app/views/layouts/nav/_admin.html.haml
... ... @@ -4,8 +4,6 @@
4 4 %i.icon-home
5 5 = nav_link(controller: :projects) do
6 6 = link_to "Projects", admin_projects_path
7   - = nav_link(controller: :teams) do
8   - = link_to "Teams", admin_teams_path
9 7 = nav_link(controller: :groups) do
10 8 = link_to "Groups", admin_groups_path
11 9 = nav_link(controller: :users) do
... ...
app/views/projects/teams/available.html.haml
... ... @@ -1,22 +0,0 @@
1   -= render "projects/settings_nav"
2   -
3   -%h3.page_title
4   - = "Assign project to team of users"
5   -%hr
6   -%p.slead
7   - Read more about assign to team of users #{link_to "here", '#', class: 'vlink'}.
8   -= form_tag assign_project_teams_path(@project), method: 'post' do
9   - %p.slead Choose Team of users you want to assign:
10   - .padded
11   - = label_tag :team_id, "Team"
12   - .input= select_tag(:team_id, options_from_collection_for_select(@teams, :id, :name), prompt: "Select team", class: "chosen xxlarge", required: true)
13   - %p.slead Choose greatest user acces in team you want to assign:
14   - .padded
15   - = label_tag :team_ids, "Permission"
16   - .input= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen span3" }
17   -
18   -
19   - .actions
20   - = submit_tag 'Assign', class: "btn btn-create"
21   - = link_to "Cancel", project_team_index_path(@project), class: "btn btn-cancel"
22   -
app/views/teams/_filter.html.haml
... ... @@ -1,33 +0,0 @@
1   -= form_tag team_filter_path(entity), method: 'get' do
2   - %fieldset.dashboard-search-filter
3   - = search_field_tag "search", params[:search], { placeholder: 'Search', class: 'search-text-input' }
4   - = button_tag type: 'submit', class: 'btn' do
5   - %i.icon-search
6   -
7   - %fieldset
8   - %legend Status:
9   - %ul.nav.nav-pills.nav-stacked
10   - %li{class: ("active" if !params[:status])}
11   - = link_to team_filter_path(entity, status: nil) do
12   - Open
13   - %li{class: ("active" if params[:status] == 'closed')}
14   - = link_to team_filter_path(entity, status: 'closed') do
15   - Closed
16   - %li{class: ("active" if params[:status] == 'all')}
17   - = link_to team_filter_path(entity, status: 'all') do
18   - All
19   -
20   - %fieldset
21   - %legend Projects:
22   - %ul.nav.nav-pills.nav-stacked
23   - - @projects.each do |project|
24   - - unless entities_per_project(project, entity).zero?
25   - %li{class: ("active" if params[:project_id] == project.id.to_s)}
26   - = link_to team_filter_path(entity, project_id: project.id) do
27   - = project.name_with_namespace
28   - %small.pull-right= entities_per_project(project, entity)
29   -
30   - %fieldset
31   - %hr
32   - = link_to "Reset", team_filter_path(entity), class: 'btn pull-right'
33   -
app/views/teams/_projects.html.haml
... ... @@ -1,22 +0,0 @@
1   -.ui-box
2   - %h5.title
3   - Projects
4   - %small
5   - (#{projects.count})
6   - - if can? current_user, :manage_user_team, @team
7   - %span.pull-right
8   - = link_to edit_team_path(@team), class: "btn btn-tiny info" do
9   - %i.icon-plus
10   - Assign Project
11   - %ul.well-list
12   - - if projects.blank?
13   - %p.nothing_here_message This team has no projects yet
14   - - projects.each do |project|
15   - %li
16   - = link_to project_path(project), class: dom_class(project) do
17   - %strong.well-title= truncate(project.name_with_namespace, length: 40)
18   - %span.arrow
19   - &rarr;
20   - %span.last_activity
21   - %strong Last activity:
22   - %span= project_last_activity(project)
app/views/teams/edit.html.haml
... ... @@ -1,74 +0,0 @@
1   -.row
2   - .span3
3   - %ul.nav.nav-pills.nav-stacked
4   - %li.active
5   - = link_to 'Projects', '#tab-projects', 'data-toggle' => 'tab'
6   - %li
7   - = link_to 'Edit Team', '#tab-edit', 'data-toggle' => 'tab'
8   - - if can? current_user, :admin_user_team, @team
9   - %li
10   - = link_to 'Remove', '#tab-remove', 'data-toggle' => 'tab'
11   -
12   - .span9
13   - .tab-content
14   - .tab-pane.active#tab-projects
15   - .ui-box.projects-table
16   - %h5.title Projects
17   - %ul.well-list
18   - - @projects.each do |project|
19   - %li
20   - - if project.public
21   - %i.icon-share
22   - - else
23   - %i.icon-lock.cgreen
24   - = link_to project.name_with_namespace, project
25   - .pull-right
26   - = link_to 'Edit max access', edit_team_project_path(@team, project), class: "btn btn-small"
27   - = link_to 'Relegate', team_project_path(@team, project), confirm: 'Remove project from team and move to global namespace. Are you sure?', method: :delete, class: "btn btn-remove small"
28   - .form-holder
29   - = form_tag team_projects_path(@team), id: "assign_projects", class: "bulk_import", method: :post do
30   - %table.headless
31   - %tr
32   - %td= select_tag :project_ids, options_from_collection_for_select(@avaliable_projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span4'
33   - %td= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen" }
34   - %td= submit_tag 'Add Project', class: "btn btn-create", id: :assign_projects_to_team
35   -
36   -
37   - .tab-pane#tab-edit
38   - .ui-box
39   - %h5.title Edit Team
40   - %div.form-holder
41   - = form_for @team, url: team_path(@team) do |f|
42   - - if @team.errors.any?
43   - .alert.alert-error
44   - %span= @team.errors.full_messages.first
45   - .clearfix
46   - = f.label :name do
47   - Team name is
48   - .input
49   - = f.text_field :name, placeholder: "Ex. OpenSource", class: "xlarge left"
50   -
51   - .clearfix.team-description-holder
52   - = f.label :description, "Details"
53   - .input
54   - = f.text_area :description, maxlength: 250, class: "xlarge js-gfm-input", rows: 4
55   -
56   - .clearfix
57   - = f.label :path do
58   - Team path is
59   - .input
60   - = f.text_field :path, placeholder: "opensource", class: "xlarge left"
61   -
62   - .form-actions
63   - = f.submit 'Save team changes', class: "btn btn-primary"
64   -
65   - .tab-pane#tab-remove
66   - .ui-box.ui-box-danger
67   - %h5.title Remove team
68   - .ui-box-body
69   - %p
70   - Remove of team will cause removing members access to projects.
71   - %p
72   - %strong Removed team can not be restored!
73   -
74   - = link_to 'Remove team', team_path(@team), method: :delete, confirm: "You are sure?", class: "btn btn-remove btn-small"
app/views/teams/issues.html.haml
... ... @@ -1,23 +0,0 @@
1   -%h3.page_title
2   - Issues
3   - %small (in Team projects assigned to Team members)
4   - %small.pull-right #{@issues.total_count} issues
5   -
6   -%hr
7   -.row
8   - .span3
9   - = render 'filter', entity: 'issue'
10   - .span9
11   - - if @issues.any?
12   - - @issues.group_by(&:project).each do |group|
13   - %div.ui-box
14   - - @project = group[0]
15   - %h5.title
16   - = link_to_project @project
17   - %ul.well-list.issues-list
18   - - group[1].each do |issue|
19   - = render issue
20   - %hr
21   - = paginate @issues, theme: "gitlab"
22   - - else
23   - %p.nothing_here_message Nothing to show here
app/views/teams/members/_form.html.haml
... ... @@ -1,20 +0,0 @@
1   -= form_tag admin_team_member_path(@team, @member), method: :put do
2   - -if @member.errors.any?
3   - .alert.alert-error
4   - %ul
5   - - @member.errors.full_messages.each do |msg|
6   - %li= msg
7   -
8   - .clearfix
9   - %label Default access for Team projects:
10   - .input
11   - = select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3"
12   - .clearfix
13   - %label Team admin?
14   - .input
15   - = check_box_tag :group_admin, true, @team.admin?(@member)
16   -
17   - %br
18   - .actions
19   - = submit_tag 'Save', class: "btn btn-save"
20   - = link_to 'Cancel', :back, class: "btn"
app/views/teams/members/_member.html.haml
... ... @@ -1,31 +0,0 @@
1   -- user = member.user
2   -- allow_admin = can? current_user, :manage_user_team, @team
3   -%li{id: dom_id(member), class: "team_member_row user_#{user.id}"}
4   - .row
5   - .span3
6   - = link_to user_path(user.username), title: user.name, class: "dark" do
7   - = image_tag gravatar_icon(user.email, 40), class: "avatar s32"
8   - = link_to user_path(user.username), title: user.name, class: "dark" do
9   - %strong= truncate(user.name, lenght: 40)
10   - %br
11   - %small.cgray= user.username
12   -
13   - .span5.pull-right
14   - - if allow_admin
15   - .pull-left
16   - = form_for(member, as: :team_member, url: team_member_path(@team, user)) do |f|
17   - = label_tag :group_admin do
18   - = f.check_box :group_admin, class: 'trigger-submit'
19   - %span Admin access
20   - &nbsp;
21   - = f.select :permission, options_for_select(UsersProject.access_roles, @team.default_projects_access(user)), {}, class: "span2 trigger-submit"
22   - .pull-right
23   - - if current_user == user
24   - %span.label.label-success This is you!
25   - - if @team.owner == user
26   - %span.label.label-info Owner
27   - - elsif user.blocked?
28   - %span.label.label-error Blocked
29   - - elsif allow_admin
30   - = link_to team_member_path(@team, user), confirm: remove_from_user_team_message(@team, user), method: :delete, class: "btn-tiny btn btn-remove", title: "Remove from team" do
31   - %i.icon-minus.icon-white
app/views/teams/members/_team.html.haml
... ... @@ -1,10 +0,0 @@
1   -- grouped_user_team_members(team).each do |access, members|
2   - - access_key = Project.access_options.key(access)
3   - - next if params[:type].present? && params[:type] != access_key.tableize
4   - .ui-box
5   - %h5.title
6   - = access_key.pluralize
7   - %small= members.size
8   - %ul.well-list.team-members
9   - - members.sort_by(&:user_name).each do |member|
10   - = render 'teams/members/member', member: member
app/views/teams/members/edit.html.haml
... ... @@ -1,16 +0,0 @@
1   -%h3.page_title
2   - Edit access #{@member.name} in #{@team.name} team
3   -
4   -%hr
5   -%table.zebra-striped
6   - %tr
7   - %td User:
8   - %td= @member.name
9   - %tr
10   - %td Team:
11   - %td= @team.name
12   - %tr
13   - %td Since:
14   - %td= member_since(@team, @member).stamp("Nov 11, 2010")
15   -
16   -= render 'form'
app/views/teams/members/index.html.haml
... ... @@ -1,37 +0,0 @@
1   -%h3.page_title
2   - Team Members
3   - (#{@members.count})
4   - %small
5   - Read more about project permissions
6   - %strong= link_to "here", help_permissions_path, class: "vlink"
7   -
8   - - if can? current_user, :manage_user_team, @team
9   - %span.pull-right
10   - = link_to new_team_member_path(@team), class: "btn btn-primary small grouped", title: "New Team Member" do
11   - New Team Member
12   -%hr
13   -
14   -
15   -.row
16   - .span3
17   - %ul.nav.nav-pills.nav-stacked
18   - %li{class: ("active" if !params[:type])}
19   - = link_to team_members_path(@team, type: nil) do
20   - All
21   - %li{class: ("active" if params[:type] == 'masters')}
22   - = link_to team_members_path(@team, type: 'masters') do
23   - Masters
24   - %li{class: ("active" if params[:type] == 'developers')}
25   - = link_to team_members_path(@team, type: 'developers') do
26   - Developers
27   - %li{class: ("active" if params[:type] == 'reporters')}
28   - = link_to team_members_path(@team, type: 'reporters') do
29   - Reporters
30   - %li{class: ("active" if params[:type] == 'guests')}
31   - = link_to team_members_path(@team, type: 'guests') do
32   - Guests
33   -
34   - .span9
35   - .clearfix
36   - %div.team-table
37   - = render "teams/members/team", team: @team
app/views/teams/members/new.html.haml
... ... @@ -1,25 +0,0 @@
1   -%h3.page_title
2   - Team: #{@team.name}
3   -
4   -%hr
5   -
6   -= form_tag team_members_path(@team), id: "team_members", class: "bulk_import", method: :post do
7   - %h6 1. Choose people you want in the team
8   - .clearfix
9   - = label_tag :user_ids, "People"
10   - .input
11   - = users_select_tag(:user_ids, multiple: true)
12   -
13   - %h6 2. Set access level for them
14   - .clearfix
15   - = label_tag :project_access, "Project Access"
16   - .input= select_tag :default_project_access, options_for_select(Project.access_options), class: "project-access-select chosen"
17   -
18   - .clearfix
19   - = label_tag :group_admin do
20   - %span Team Admin?
21   - .input= check_box_tag :group_admin
22   -
23   - .actions
24   - = submit_tag 'Add users', class: "btn btn-create", id: :add_members_to_team
25   - = link_to "Cancel", team_members_path(@team), class: "btn btn-cancel"
app/views/teams/merge_requests.html.haml
... ... @@ -1,24 +0,0 @@
1   -%h3.page_title
2   - Merge Requests
3   - %small (authored by or assigned to Team members)
4   - %small.pull-right #{@merge_requests.total_count} merge requests
5   -
6   -%hr
7   -.row
8   - .span3
9   - = render 'filter', entity: 'merge_request'
10   - .span9
11   - - if @merge_requests.any?
12   - - @merge_requests.group_by(&:project).each do |group|
13   - .ui-box
14   - - @project = group[0]
15   - %h5.title
16   - = link_to_project @project
17   - %ul.well-list
18   - - group[1].each do |merge_request|
19   - = render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request})
20   - %hr
21   - = paginate @merge_requests, theme: "gitlab"
22   -
23   - - else
24   - %h3.nothing_here_message Nothing to show here
app/views/teams/new.html.haml
... ... @@ -1,37 +0,0 @@
1   -= form_for @team, url: teams_path do |f|
2   - - if @team.errors.any?
3   - .alert.alert-error
4   - %span= @team.errors.full_messages.first
5   - .clearfix
6   - = f.label :name do
7   - Team name is
8   - .input
9   - = f.text_field :name, placeholder: "Ex. Ruby Developers", class: "xxlarge left"
10   -
11   - .clearfix.team-description-holder
12   - = f.label :description, "Details"
13   - .input
14   - = f.text_area :description, maxlength: 250, class: "xxlarge js-gfm-input", rows: 4
15   -
16   -
17   - .clearfix
18   - .input
19   - %ul
20   - %li All created teams are public (users can view who enter into team and which project are assigned for this team)
21   - %li People within a team see only projects they have access to
22   - %li You will be able to assign existing projects for team
23   - .form-actions
24   - = f.submit 'Create team', class: "btn btn-create"
25   -
26   - - if current_user.can_create_group?
27   - .clearfix
28   - .input.light
29   - Need a group for several dependent projects?
30   - = link_to new_group_path, class: "btn btn-tiny" do
31   - Create a group
32   - - if current_user.can_create_project?
33   - .clearfix
34   - .input.light
35   - Want to create a project?
36   - = link_to new_project_path, class: "btn btn-tiny" do
37   - Create a project
app/views/teams/projects/_form.html.haml
... ... @@ -1,16 +0,0 @@
1   -= form_tag team_project_path(@team, @project), method: :put do
2   - -if @project.errors.any?
3   - .alert.alert-error
4   - %ul
5   - - @project.errors.full_messages.each do |msg|
6   - %li= msg
7   -
8   - .clearfix
9   - %label Max access for Team members:
10   - .input
11   - = select_tag :greatest_project_access, options_for_select(UserTeam.access_roles, @team.max_project_access(@project)), class: "project-access-select chosen span3"
12   -
13   - %br
14   - .actions
15   - = submit_tag 'Save', class: "btn btn-save"
16   - = link_to 'Cancel', :back, class: "btn btn-cancel"
app/views/teams/projects/edit.html.haml
... ... @@ -1,6 +0,0 @@
1   -%h3.page_title
2   - Edit max access in #{link_to @project.name_with_namespace, @project} for #{link_to(@team.name, team_path(@team))} team
3   -
4   -%hr
5   -
6   -= render 'form'
app/views/teams/show.atom.builder
... ... @@ -1,28 +0,0 @@
1   -xml.instruct!
2   -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
3   - xml.title "Team feed - #{@team.name}"
4   - xml.link :href => team_url(@team, :atom), :rel => "self", :type => "application/atom+xml"
5   - xml.link :href => team_url(@team), :rel => "alternate", :type => "text/html"
6   - xml.id projects_url
7   - xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any?
8   -
9   - @events.each do |event|
10   - if event.proper?
11   - xml.entry do
12   - event_link = event_feed_url(event)
13   - event_title = event_feed_title(event)
14   -
15   - xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}"
16   - xml.link :href => event_link
17   - xml.title truncate(event_title, :length => 80)
18   - xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
19   - xml.media :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(event.author_email)
20   - xml.author do |author|
21   - xml.name event.author_name
22   - xml.email event.author_email
23   - end
24   - xml.summary event_title
25   - end
26   - end
27   - end
28   -end
app/views/teams/show.html.haml
... ... @@ -1,25 +0,0 @@
1   -.dashboard
2   - .activities.span8
3   - = link_to dashboard_path, class: 'btn btn-tiny' do
4   - &larr; To dashboard
5   - &nbsp;
6   - %span.cgray Events and projects are filtered in scope of team
7   - %hr
8   - - if @events.any?
9   - .content_list
10   - - else
11   - %p.nothing_here_message Projects activity will be displayed here
12   - .loading.hide
13   - .side.span4
14   - - if @team.description.present?
15   - .description-block
16   - = @team.description
17   - = render "projects", projects: @projects
18   - .prepend-top-20
19   - = link_to team_path(@team, { format: :atom, private_token: current_user.private_token }), title: "Feed" do
20   - %strong
21   - %i.icon-rss
22   - News Feed
23   -
24   - %hr
25   - = render 'shared/promo'
app/views/teams/show.js.haml
... ... @@ -1,2 +0,0 @@
1   -:plain
2   - Pager.append(#{@events.count}, "#{escape_javascript(render(@events))}");
config/routes.rb
... ... @@ -155,20 +155,6 @@ Gitlab::Application.routes.draw do
155 155 resources :users_groups, only: [:create, :update, :destroy]
156 156 end
157 157  
158   - #
159   - # Teams Area
160   - #
161   - resources :teams, constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} do
162   - member do
163   - get :issues
164   - get :merge_requests
165   - end
166   - scope module: :teams do
167   - resources :members, only: [:index, :new, :create, :edit, :update, :destroy]
168   - resources :projects, only: [:index, :new, :create, :edit, :update, :destroy], constraints: { id: /[a-zA-Z.0-9_\-\/]+/ }
169   - end
170   - end
171   -
172 158 resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create]
173 159  
174 160 devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations }
... ... @@ -307,18 +293,6 @@ Gitlab::Application.routes.draw do
307 293 end
308 294 end
309 295  
310   - scope module: :projects do
311   - resources :teams, only: [] do
312   - collection do
313   - get :available
314   - post :assign
315   - end
316   - member do
317   - delete :resign
318   - end
319   - end
320   - end
321   -
322 296 resources :notes, only: [:index, :create, :destroy] do
323 297 collection do
324 298 post :preview
... ...
features/steps/userteams/userteams.rb
... ... @@ -1,241 +0,0 @@
1   -class Userteams < Spinach::FeatureSteps
2   - include SharedAuthentication
3   - include SharedPaths
4   - include SharedProject
5   - include Select2Helper
6   -
7   - When 'I do not have teams with me' do
8   - UserTeam.with_member(current_user).destroy_all
9   - end
10   -
11   - Then 'I should see dashboard page without teams info block' do
12   - page.has_no_css?(".teams-box").must_equal true
13   - end
14   -
15   - When 'I have teams with my membership' do
16   - team = create :user_team, owner: current_user
17   - team.add_member(current_user, UserTeam.access_roles["Master"], true)
18   - end
19   -
20   - Then 'I should see dashboard page with teams information block' do
21   - page.should have_css(".teams-box")
22   - end
23   -
24   - When 'exist user teams' do
25   - team = create :user_team
26   - team.add_member(current_user, UserTeam.access_roles["Master"], true)
27   - end
28   -
29   - And 'I click on "All teams" link' do
30   - click_link("All Teams")
31   - end
32   -
33   - Then 'I should see "All teams" page' do
34   - current_path.should == teams_path
35   - end
36   -
37   - And 'I should see exist teams in teams list' do
38   - team = UserTeam.last
39   - find_in_list(".teams_list tr", team).must_equal true
40   - end
41   -
42   - When 'I click to "New team" link' do
43   - click_link("New Team")
44   - end
45   -
46   - And 'I submit form with new team info' do
47   - fill_in 'name', with: 'gitlab'
48   -
49   - fill_in 'user_team_description', with: 'team description'
50   - click_button 'Create team'
51   - end
52   -
53   - And 'I should see newly created team' do
54   - page.should have_content "gitlab"
55   - page.should have_content "team description"
56   - end
57   -
58   - Then 'I should be redirected to new team page' do
59   - team = UserTeam.last
60   - current_path.should == team_path(team)
61   - end
62   -
63   - When 'I have teams with projects and members' do
64   - team = create :user_team, owner: current_user
65   - @project = create :project
66   - team.add_member(current_user, UserTeam.access_roles["Master"], true)
67   - team.assign_to_project(@project, UserTeam.access_roles["Master"])
68   - @event = create(:closed_issue_event, project: @project)
69   - end
70   -
71   - When 'I visit team page' do
72   - visit team_path(UserTeam.last)
73   - end
74   -
75   - Then 'I should see projects list' do
76   - within(".side .ui-box") do
77   - page.should have_content(@project.name)
78   - end
79   - end
80   -
81   - And 'project from team has issues assigned to me' do
82   - team = UserTeam.last
83   - team.projects.each do |project|
84   - project.issues << create(:issue, assignee: current_user)
85   - end
86   - end
87   -
88   - When 'I visit team issues page' do
89   - team = UserTeam.last
90   - visit issues_team_path(team)
91   - end
92   -
93   - Then 'I should see issues from this team assigned to me' do
94   - team = UserTeam.last
95   - team.projects.each do |project|
96   - project.issues.assigned_to(current_user).each do |issue|
97   - page.should have_content issue.title
98   - end
99   - end
100   - end
101   -
102   - Given 'I have team with projects and members' do
103   - team = create :user_team, owner: current_user
104   - project = create :project
105   - user = create :user
106   - team.add_member(current_user, UserTeam.access_roles["Master"], true)
107   - team.add_member(user, UserTeam.access_roles["Developer"], false)
108   - team.assign_to_project(project, UserTeam.access_roles["Master"])
109   - end
110   -
111   - Given 'project from team has issues assigned to teams members' do
112   - team = UserTeam.last
113   - team.projects.each do |project|
114   - team.members.each do |member|
115   - project.issues << create(:issue, assignee: member)
116   - end
117   - end
118   - end
119   -
120   - Then 'I should see issues from this team assigned to teams members' do
121   - team = UserTeam.last
122   - team.projects.each do |project|
123   - team.members.each do |member|
124   - project.issues.assigned_to(member).each do |issue|
125   - page.should have_content issue.title
126   - end
127   - end
128   - end
129   - end
130   -
131   - Given 'project from team has merge requests assigned to me' do
132   - team = UserTeam.last
133   - team.projects.each do |project|
134   - create(:merge_request, assignee: current_user, project: project)
135   - end
136   - end
137   -
138   - When 'I visit team merge requests page' do
139   - team = UserTeam.last
140   - visit merge_requests_team_path(team)
141   - end
142   -
143   - Then 'I should see merge requests from this team assigned to me' do
144   - team = UserTeam.last
145   - team.projects.each do |project|
146   - project.merge_requests.each do |merge_request|
147   - page.should have_content merge_request.title
148   - end
149   - end
150   - end
151   -
152   - Given 'project from team has merge requests assigned to team members' do
153   - team = UserTeam.last
154   - team.projects.each do |project|
155   - member = team.members.sample
156   - create(:merge_request, assignee: member, project: project)
157   - end
158   - end
159   -
160   - Given 'I have new user "John"' do
161   - create :user, name: "John"
162   - end
163   -
164   - When 'I visit team people page' do
165   - team = UserTeam.last
166   - visit team_members_path(team)
167   - end
168   -
169   - And 'I select user "John" from list with role "Reporter"' do
170   - user = User.find_by_name("John")
171   - select2(user.id, from: "#user_ids", multiple: true)
172   - within "#team_members" do
173   - select "Reporter", from: "default_project_access"
174   - end
175   - click_button "Add"
176   - end
177   -
178   - Then 'I should see user "John" in team list' do
179   - user = User.find_by_name("John")
180   - team_members_list = find(".team-table")
181   - team_members_list.should have_content user.name
182   - end
183   -
184   - And 'I have my own project without teams' do
185   - @project = create :project, namespace: current_user.namespace
186   - end
187   -
188   - And 'I visit my team page' do
189   - team = UserTeam.where(owner_id: current_user.id).last
190   - visit team_path(team)
191   - end
192   -
193   - When 'I click on link "Assign Project"' do
194   - click_link "Assign Project"
195   - end
196   -
197   - Then 'I should see form with my own project in available projects list' do
198   - projects_select = find("#project_ids")
199   - projects_select.should have_content(@project.name)
200   - end
201   -
202   - When 'I submit form with selected project and max access' do
203   - within "#assign_projects" do
204   - select @project.name_with_namespace, from: "project_ids"
205   - select "Reporter", from: "greatest_project_access"
206   - end
207   - click_button "Add"
208   - end
209   -
210   - Then 'I should see my own project in team projects list' do
211   - projects = find(".projects-table")
212   - projects.should have_content(@project.name)
213   - end
214   -
215   - When 'I click link "New Team Member"' do
216   - click_link "New Team Member"
217   - end
218   -
219   - protected
220   -
221   - def current_team
222   - @user_team ||= UserTeam.first
223   - end
224   -
225   - def project
226   - current_team.projects.first
227   - end
228   -
229   - def assigned_to_user key, user
230   - project.send(key).where(assignee_id: user)
231   - end
232   -
233   - def find_in_list(selector, item)
234   - members_list = all(selector)
235   - entered = false
236   - members_list.each do |member_item|
237   - entered = true if member_item.has_content?(item.name)
238   - end
239   - entered
240   - end
241   -end
features/teams/team.feature
... ... @@ -1,65 +0,0 @@
1   -Feature: UserTeams
2   - Background:
3   - Given I sign in as a user
4   - And I own project "Shop"
5   - And project "Shop" has push event
6   -
7   - Scenario: I should see teams info block
8   - When I have teams with my membership
9   - And I visit dashboard page
10   - Then I should see dashboard page with teams information block
11   -
12   - Scenario: I should can create new team
13   - When I have teams with my membership
14   - And I visit dashboard page
15   - When I click to "New team" link
16   - And I submit form with new team info
17   - Then I should be redirected to new team page
18   - Then I should see newly created team
19   -
20   - Scenario: I should see team dashboard list
21   - When I have teams with projects and members
22   - When I visit team page
23   - Then I should see projects list
24   -
25   - Scenario: I should see team issues list
26   - Given I have team with projects and members
27   - And project from team has issues assigned to me
28   - When I visit team issues page
29   - Then I should see issues from this team assigned to me
30   -
31   - Scenario: I should see teams members issues list
32   - Given I have team with projects and members
33   - Given project from team has issues assigned to teams members
34   - When I visit team issues page
35   - Then I should see issues from this team assigned to teams members
36   -
37   - Scenario: I should see team merge requests list
38   - Given I have team with projects and members
39   - Given project from team has merge requests assigned to me
40   - When I visit team merge requests page
41   - Then I should see merge requests from this team assigned to me
42   -
43   - Scenario: I should see teams members merge requests list
44   - Given I have team with projects and members
45   - Given project from team has merge requests assigned to team members
46   - When I visit team merge requests page
47   - Then I should see merge requests from this team assigned to me
48   -
49   - @javascript
50   - Scenario: I should add user to projects in Team
51   - Given I have team with projects and members
52   - Given I have new user "John"
53   - When I visit team people page
54   - When I click link "New Team Member"
55   - And I select user "John" from list with role "Reporter"
56   - Then I should see user "John" in team list
57   -
58   - Scenario: I should assign my team to my own project
59   - Given I have team with projects and members
60   - And I have my own project without teams
61   - And I visit my team page
62   - When I click on link "Assign Project"
63   - Then I should see form with my own project in available projects list
64   - When I submit form with selected project and max access
65   - Then I should see my own project in team projects list
lib/api/api.rb
... ... @@ -35,7 +35,6 @@ module API
35 35 mount Notes
36 36 mount Internal
37 37 mount SystemHooks
38   - mount UserTeams
39 38 mount ProjectSnippets
40 39 mount DeployKeys
41 40 mount ProjectHooks
... ...
lib/api/entities.rb
... ... @@ -99,10 +99,6 @@ module API
99 99 expose :id, :title, :key, :created_at
100 100 end
101 101  
102   - class UserTeam < Grape::Entity
103   - expose :id, :name, :path, :owner_id
104   - end
105   -
106 102 class MergeRequest < Grape::Entity
107 103 expose :id, :target_branch, :source_branch, :project_id, :title, :state
108 104 expose :author, :assignee, using: Entities::UserBasic
... ...
lib/api/user_teams.rb
... ... @@ -1,276 +0,0 @@
1   -module API
2   - # user_teams API
3   - class UserTeams < Grape::API
4   - before { authenticate! }
5   -
6   - resource :user_teams do
7   - helpers do
8   - def handle_team_member_errors(errors)
9   - if errors[:permission].any?
10   - render_api_error!(errors[:permission], 422)
11   - end
12   - not_found!
13   - end
14   -
15   - def validate_access_level?(level)
16   - [UsersProject::GUEST, UsersProject::REPORTER, UsersProject::DEVELOPER, UsersProject::MASTER].include? level.to_i
17   - end
18   - end
19   -
20   -
21   - # Get a user_teams list
22   - #
23   - # Example Request:
24   - # GET /user_teams
25   - get do
26   - if current_user.admin
27   - @user_teams = paginate UserTeam
28   - else
29   - @user_teams = paginate current_user.user_teams
30   - end
31   - present @user_teams, with: Entities::UserTeam
32   - end
33   -
34   -
35   - # Create user_team. Available only for admin
36   - #
37   - # Parameters:
38   - # name (required) - The name of the user_team
39   - # path (required) - The path of the user_team
40   - # Example Request:
41   - # POST /user_teams
42   - post do
43   - authenticated_as_admin!
44   - required_attributes! [:name, :path]
45   -
46   - attrs = attributes_for_keys [:name, :path]
47   - @user_team = UserTeam.new(attrs)
48   - @user_team.owner = current_user
49   -
50   - if @user_team.save
51   - present @user_team, with: Entities::UserTeam
52   - else
53   - not_found!
54   - end
55   - end
56   -
57   -
58   - # Get a single user_team
59   - #
60   - # Parameters:
61   - # id (required) - The ID of a user_team
62   - # Example Request:
63   - # GET /user_teams/:id
64   - get ":id" do
65   - @user_team = UserTeam.find(params[:id])
66   - if current_user.admin or current_user.user_teams.include? @user_team
67   - present @user_team, with: Entities::UserTeam
68   - else
69   - not_found!
70   - end
71   - end
72   -
73   -
74   - # Get user_team members
75   - #
76   - # Parameters:
77   - # id (required) - The ID of a user_team
78   - # Example Request:
79   - # GET /user_teams/:id/members
80   - get ":id/members" do
81   - @user_team = UserTeam.find(params[:id])
82   - if current_user.admin or current_user.user_teams.include? @user_team
83   - @members = paginate @user_team.members
84   - present @members, with: Entities::TeamMember, user_team: @user_team
85   - else
86   - not_found!
87   - end
88   - end
89   -
90   -
91   - # Add a new user_team member
92   - #
93   - # Parameters:
94   - # id (required) - The ID of a user_team
95   - # user_id (required) - The ID of a user
96   - # access_level (required) - Project access level
97   - # Example Request:
98   - # POST /user_teams/:id/members
99   - post ":id/members" do
100   - authenticated_as_admin!
101   - required_attributes! [:user_id, :access_level]
102   -
103   - if not validate_access_level?(params[:access_level])
104   - render_api_error!("Wrong access level", 422)
105   - end
106   -
107   - @user_team = UserTeam.find(params[:id])
108   - if @user_team
109   - team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id])
110   - # Not existing member
111   - if team_member.nil?
112   - @user_team.add_member(params[:user_id], params[:access_level], false)
113   - team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id])
114   -
115   - if team_member.nil?
116   - render_api_error!("Error creating membership", 500)
117   - else
118   - @member = team_member.user
119   - present @member, with: Entities::TeamMember, user_team: @user_team
120   - end
121   - else
122   - render_api_error!("Already exists", 409)
123   - end
124   - else
125   - not_found!
126   - end
127   - end
128   -
129   -
130   - # Get a single team member from user_team
131   - #
132   - # Parameters:
133   - # id (required) - The ID of a user_team
134   - # user_id (required) - The ID of a team member
135   - # Example Request:
136   - # GET /user_teams/:id/members/:user_id
137   - get ":id/members/:user_id" do
138   - @user_team = UserTeam.find(params[:id])
139   - if current_user.admin or current_user.user_teams.include? @user_team
140   - team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id])
141   - unless team_member.nil?
142   - present team_member.user, with: Entities::TeamMember, user_team: @user_team
143   - else
144   - not_found!
145   - end
146   - else
147   - not_found!
148   - end
149   - end
150   -
151   - # Remove a team member from user_team
152   - #
153   - # Parameters:
154   - # id (required) - The ID of a user_team
155   - # user_id (required) - The ID of a team member
156   - # Example Request:
157   - # DELETE /user_teams/:id/members/:user_id
158   - delete ":id/members/:user_id" do
159   - authenticated_as_admin!
160   -
161   - @user_team = UserTeam.find(params[:id])
162   - if @user_team
163   - team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id])
164   - unless team_member.nil?
165   - team_member.destroy
166   - else
167   - not_found!
168   - end
169   - else
170   - not_found!
171   - end
172   - end
173   -
174   -
175   - # Get to user_team assigned projects
176   - #
177   - # Parameters:
178   - # id (required) - The ID of a user_team
179   - # Example Request:
180   - # GET /user_teams/:id/projects
181   - get ":id/projects" do
182   - @user_team = UserTeam.find(params[:id])
183   - if current_user.admin or current_user.user_teams.include? @user_team
184   - @projects = paginate @user_team.projects
185   - present @projects, with: Entities::TeamProject, user_team: @user_team
186   - else
187   - not_found!
188   - end
189   - end
190   -
191   -
192   - # Add a new user_team project
193   - #
194   - # Parameters:
195   - # id (required) - The ID of a user_team
196   - # project_id (required) - The ID of a project
197   - # greatest_access_level (required) - Project access level
198   - # Example Request:
199   - # POST /user_teams/:id/projects
200   - post ":id/projects" do
201   - authenticated_as_admin!
202   - required_attributes! [:project_id, :greatest_access_level]
203   -
204   - if not validate_access_level?(params[:greatest_access_level])
205   - render_api_error!("Wrong greatest_access_level", 422)
206   - end
207   -
208   - @user_team = UserTeam.find(params[:id])
209   - if @user_team
210   - team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id])
211   -
212   - # No existing project
213   - if team_project.nil?
214   - @user_team.assign_to_projects([params[:project_id]], params[:greatest_access_level])
215   - team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id])
216   - if team_project.nil?
217   - render_api_error!("Error creating project assignment", 500)
218   - else
219   - @project = team_project.project
220   - present @project, with: Entities::TeamProject, user_team: @user_team
221   - end
222   - else
223   - render_api_error!("Already exists", 409)
224   - end
225   - else
226   - not_found!
227   - end
228   - end
229   -
230   - # Show a single team project from user_team
231   - #
232   - # Parameters:
233   - # id (required) - The ID of a user_team
234   - # project_id (required) - The ID of a project assigned to the team
235   - # Example Request:
236   - # GET /user_teams/:id/projects/:project_id
237   - get ":id/projects/:project_id" do
238   - @user_team = UserTeam.find(params[:id])
239   - if current_user.admin or current_user.user_teams.include? @user_team
240   - team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id])
241   - unless team_project.nil?
242   - present team_project.project, with: Entities::TeamProject, user_team: @user_team
243   - else
244   - not_found!
245   - end
246   - else
247   - not_found!
248   - end
249   - end
250   -
251   - # Remove a team project from user_team
252   - #
253   - # Parameters:
254   - # id (required) - The ID of a user_team
255   - # project_id (required) - The ID of a project assigned to the team
256   - # Example Request:
257   - # DELETE /user_teams/:id/projects/:project_id
258   - delete ":id/projects/:project_id" do
259   - authenticated_as_admin!
260   -
261   - @user_team = UserTeam.find(params[:id])
262   - if @user_team
263   - team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id])
264   - unless team_project.nil?
265   - team_project.destroy
266   - else
267   - not_found!
268   - end
269   - else
270   - not_found!
271   - end
272   - end
273   -
274   - end
275   - end
276   -end
lib/gitlab/user_team_manager.rb
... ... @@ -1,146 +0,0 @@
1   -# UserTeamManager class
2   -#
3   -# Used for manage User teams with project repositories
4   -module Gitlab
5   - class UserTeamManager
6   - class << self
7   - def assign(team, project, access)
8   - project = Project.find(project) unless project.is_a? Project
9   - searched_project = team.user_team_project_relationships.find_by_project_id(project.id)
10   -
11   - unless searched_project.present?
12   - team.user_team_project_relationships.create(project_id: project.id, greatest_access: access)
13   - update_team_users_access_in_project(team, project, :added)
14   - end
15   - end
16   -
17   - def resign(team, project)
18   - project = Project.find(project) unless project.is_a? Project
19   -
20   - team.user_team_project_relationships.with_project(project).destroy_all
21   -
22   - update_team_users_access_in_project(team, project, :updated)
23   - end
24   -
25   - def update_team_user_membership(team, member, options)
26   - updates = {}
27   -
28   - if options[:default_projects_access].present?
29   - default_projects_access = options[:default_projects_access].to_s
30   -
31   - if default_projects_access != team.default_projects_access(member).to_s
32   - updates[:permission] = default_projects_access
33   - end
34   - end
35   -
36   - if options[:group_admin].present?
37   - group_admin = options[:group_admin].to_s == "1" ? true : false
38   -
39   - if group_admin != team.admin?(member)
40   - updates[:group_admin] = group_admin
41   - end
42   - end
43   -
44   - return true if updates.blank?
45   -
46   - user_team_relationship = team.user_team_user_relationships.find_by_user_id(member)
47   - return false unless user_team_relationship.update_attributes(updates)
48   -
49   - rebuild_project_permissions_to_member(team, member) if updates[:permission]
50   -
51   - true
52   - end
53   -
54   - def update_project_greates_access(team, project, permission)
55   - project_relation = team.user_team_project_relationships.find_by_project_id(project)
56   - if permission != team.max_project_access(project)
57   - if project_relation.update_attributes(greatest_access: permission)
58   - update_team_users_access_in_project(team, project, :updated)
59   - true
60   - else
61   - false
62   - end
63   - else
64   - true
65   - end
66   - end
67   -
68   - def rebuild_project_permissions_to_member(team, member)
69   - team.projects.each do |project|
70   - update_team_user_access_in_project(team, member, project, :updated)
71   - end
72   - end
73   -
74   - def update_team_users_access_in_project(team, project, action)
75   - members = team.members
76   - members.each do |member|
77   - update_team_user_access_in_project(team, member, project, action)
78   - end
79   - end
80   -
81   - def update_team_user_access_in_project(team, user, project, action)
82   - granted_access = max_teams_member_permission_in_project(user, project, action)
83   - project_team_user = UsersProject.find_by_user_id_and_project_id(user.id, project.id)
84   -
85   - if granted_access.zero?
86   - project_team_user.destroy if project_team_user.present?
87   - return
88   - end
89   -
90   - if project_team_user.present?
91   - project_team_user.update_attributes(project_access: granted_access)
92   - else
93   - project.team << [user, granted_access]
94   - end
95   - end
96   -
97   - def max_teams_member_permission_in_project(user, project, action = nil, teams = nil)
98   - result_access = 0
99   -
100   - teams ||= project.user_teams.with_member(user)
101   -
102   - if action && (action == :added)
103   - result_access = project.users_projects.with_user(user).first.project_access if project.users_projects.with_user(user).any?
104   - end
105   -
106   - if teams.any?
107   - teams.each do |team|
108   - granted_access = max_team_member_permission_in_project(team, user, project)
109   - result_access = [granted_access, result_access].max
110   - end
111   - end
112   - result_access
113   - end
114   -
115   - def max_team_member_permission_in_project(team, user, project)
116   - member_access = team.default_projects_access(user)
117   - team_access = team.user_team_project_relationships.find_by_project_id(project.id).greatest_access
118   -
119   - [team_access, member_access].min
120   - end
121   -
122   - def add_member_into_team(team, user, access, admin)
123   - user = User.find(user) unless user.is_a? User
124   -
125   - team.user_team_user_relationships.create(user_id: user.id, permission: access, group_admin: admin)
126   - team.projects.each do |project|
127   - update_team_user_access_in_project(team, user, project, :added)
128   - end
129   - end
130   -
131   - def remove_member_from_team(team, user)
132   - user = User.find(user) unless user.is_a? User
133   -
134   - team.user_team_user_relationships.with_user(user).destroy_all
135   - other_teams = []
136   - team.projects.each do |project|
137   - other_teams << project.user_teams.with_member(user)
138   - end
139   - other_teams.uniq
140   - unless other_teams.any?
141   - UsersProject.in_projects(team.projects).with_user(user).destroy_all
142   - end
143   - end
144   - end
145   - end
146   -end
spec/models/user_team_project_relationship_spec.rb
... ... @@ -1,17 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: user_team_project_relationships
4   -#
5   -# id :integer not null, primary key
6   -# project_id :integer
7   -# user_team_id :integer
8   -# greatest_access :integer
9   -# created_at :datetime not null
10   -# updated_at :datetime not null
11   -#
12   -
13   -require 'spec_helper'
14   -
15   -describe UserTeamProjectRelationship do
16   - pending "add some examples to (or delete) #{__FILE__}"
17   -end
spec/models/user_team_spec.rb
... ... @@ -1,37 +0,0 @@
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   -# description :string(255) default(""), not null
12   -#
13   -
14   -require 'spec_helper'
15   -
16   -describe UserTeam do
17   - let(:team) { FactoryGirl.create :user_team }
18   -
19   - context ".add_member" do
20   - let(:user) { FactoryGirl.create :user }
21   -
22   - it "should work" do
23   - team.add_member(user, UsersProject::DEVELOPER, false)
24   - team.members.should include(user)
25   - end
26   - end
27   -
28   - context ".remove_member" do
29   - let(:user) { FactoryGirl.create :user }
30   - before { team.add_member(user, UsersProject::DEVELOPER, false) }
31   -
32   - it "should work" do
33   - team.remove_member(user)
34   - team.members.should_not include(user)
35   - end
36   - end
37   -end
spec/models/user_team_user_relationship_spec.rb
... ... @@ -1,18 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: user_team_user_relationships
4   -#
5   -# id :integer not null, primary key
6   -# user_id :integer
7   -# user_team_id :integer
8   -# group_admin :boolean
9   -# permission :integer
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -#
13   -
14   -require 'spec_helper'
15   -
16   -describe UserTeamUserRelationship do
17   - pending "add some examples to (or delete) #{__FILE__}"
18   -end
spec/requests/api/user_teams_spec.rb
... ... @@ -1,360 +0,0 @@
1   -require 'spec_helper'
2   -
3   -describe API::API do
4   - include ApiHelpers
5   -
6   - # Create test objects
7   - let(:user1) { create(:user) }
8   - let(:user2) { create(:user) }
9   - let(:admin) { create(:admin) }
10   - let!(:group1) { create(:group, owner: user1) }
11   - let!(:group2) { create(:group, owner: user2) }
12   - let(:user_team1) { create(:user_team, owner: user1) }
13   - let(:user_team2) { create(:user_team, owner: user2) }
14   - let!(:project1) { create(:project, creator_id: admin.id) }
15   - let!(:project2) { create(:project, creator_id: admin.id) }
16   -
17   -
18   - before {
19   - # Add members to teams
20   - user_team1.add_member(user1, UsersProject::MASTER, false)
21   - user_team2.add_member(user2, UsersProject::MASTER, false)
22   -
23   - # Add projects to teams
24   - user_team1.assign_to_projects([project1.id], UsersProject::MASTER)
25   - user_team2.assign_to_projects([project2.id], UsersProject::MASTER)
26   -
27   - }
28   -
29   - describe "GET /user_teams" do
30   - context "when unauthenticated" do
31   - it "should return authentication error" do
32   - get api("/user_teams")
33   - response.status.should == 401
34   - end
35   - end
36   -
37   - context "when authenticated as user" do
38   - it "normal user: should return an array of user_teams of user1" do
39   - get api("/user_teams", user1)
40   - response.status.should == 200
41   - json_response.should be_an Array
42   - json_response.length.should == 1
43   - json_response.first['name'].should == user_team1.name
44   - end
45   - end
46   -
47   - context "when authenticated as admin" do
48   - it "admin: should return an array of all user_teams" do
49   - get api("/user_teams", admin)
50   - response.status.should == 200
51   - json_response.should be_an Array
52   - json_response.length.should == 2
53   - end
54   - end
55   - end
56   -
57   - describe "GET /user_teams/:id" do
58   - context "when authenticated as user" do
59   - it "should return one of user1's user_teams" do
60   - get api("/user_teams/#{user_team1.id}", user1)
61   - response.status.should == 200
62   - json_response['name'] == user_team1.name
63   - end
64   -
65   - it "should not return a non existing team" do
66   - get api("/user_teams/1328", user1)
67   - response.status.should == 404
68   - end
69   -
70   - it "should not return a user_team not attached to user1" do
71   - get api("/user_teams/#{user_team2.id}", user1)
72   - response.status.should == 404
73   - end
74   - end
75   -
76   - context "when authenticated as admin" do
77   - it "should return any existing user_team" do
78   - get api("/user_teams/#{user_team2.id}", admin)
79   - response.status.should == 200
80   - json_response['name'].should == user_team2.name
81   - end
82   -
83   - it "should not return a non existing user_team" do
84   - get api("/user_teams/1328", admin)
85   - response.status.should == 404
86   - end
87   - end
88   - end
89   -
90   - describe "POST /user_teams" do
91   - context "when authenticated as user" do
92   - it "should not create user_team" do
93   - count_before=UserTeam.count
94   - post api("/user_teams", user1), attributes_for(:user_team)
95   - response.status.should == 403
96   - UserTeam.count.should == count_before
97   - end
98   - end
99   -
100   - context "when authenticated as admin" do
101   - it "should create user_team" do
102   - count_before=UserTeam.count
103   - post api("/user_teams", admin), attributes_for(:user_team)
104   - response.status.should == 201
105   - UserTeam.count.should == count_before + 1
106   - end
107   -
108   - it "should not create user_team, duplicate" do
109   - post api("/user_teams", admin), {:name => "Duplicate Test", :path => user_team2.path}
110   - response.status.should == 404
111   - end
112   -
113   - it "should return 400 bad request error if name not given" do
114   - post api("/user_teams", admin), {:path => user_team2.path}
115   - response.status.should == 400
116   - end
117   -
118   - it "should return 400 bad request error if path not given" do
119   - post api("/user_teams", admin), {:name => 'test'}
120   - response.status.should == 400
121   - end
122   - end
123   - end
124   -
125   - # Members
126   -
127   - describe "GET /user_teams/:id/members" do
128   - context "when authenticated as user" do
129   - it "should return user1 as member of user1's user_teams" do
130   - get api("/user_teams/#{user_team1.id}/members", user1)
131   - response.status.should == 200
132   - json_response.first['name'].should == user1.name
133   - json_response.first['access_level'].should == UsersProject::MASTER
134   - end
135   - end
136   -
137   - context "when authenticated as admin" do
138   - it "should return member of any existing user_team" do
139   - get api("/user_teams/#{user_team2.id}/members", admin)
140   - response.status.should == 200
141   - json_response.first['name'].should == user2.name
142   - json_response.first['access_level'].should == UsersProject::MASTER
143   - end
144   - end
145   - end
146   -
147   - describe "POST /user_teams/:id/members" do
148   - context "when authenticated as user" do
149   - it "should not add user2 as member of user_team1" do
150   - post api("/user_teams/#{user_team1.id}/members", user1), user_id: user2.id, access_level: UsersProject::MASTER
151   - response.status.should == 403
152   - end
153   - end
154   -
155   - context "when authenticated as admin" do
156   - it "should return ok and add new member" do
157   - count_before=user_team1.user_team_user_relationships.count
158   - post api("/user_teams/#{user_team1.id}/members", admin), user_id: user2.id, access_level: UsersProject::MASTER
159   - response.status.should == 201
160   - json_response['name'].should == user2.name
161   - json_response['access_level'].should == UsersProject::MASTER
162   - user_team1.user_team_user_relationships.count.should == count_before + 1
163   - end
164   - it "should return ok if member already exists" do
165   - post api("/user_teams/#{user_team2.id}/members", admin), user_id: user2.id, access_level: UsersProject::MASTER
166   - response.status.should == 409
167   - end
168   - it "should return a 400 error when user id is not given" do
169   - post api("/user_teams/#{user_team2.id}/members", admin), access_level: UsersProject::MASTER
170   - response.status.should == 400
171   - end
172   - it "should return a 400 error when access level is not given" do
173   - post api("/user_teams/#{user_team2.id}/members", admin), user_id: user2.id
174   - response.status.should == 400
175   - end
176   -
177   - it "should return a 422 error when access level is not known" do
178   - post api("/user_teams/#{user_team2.id}/members", admin), user_id: user1.id, access_level: 1234
179   - response.status.should == 422
180   - end
181   -
182   - end
183   - end
184   -
185   - # Get single member
186   - describe "GET /user_teams/:id/members/:user_id" do
187   - context "when authenticated as member" do
188   - it "should show user1's membership of user_team1" do
189   - get api("/user_teams/#{user_team1.id}/members/#{user1.id}", user1)
190   - response.status.should == 200
191   - json_response['name'].should == user1.name
192   - json_response['access_level'].should == UsersProject::MASTER
193   - end
194   - it "should show that user2 is not member of user_team1" do
195   - get api("/user_teams/#{user_team1.id}/members/#{user2.id}", user1)
196   - response.status.should == 404
197   - end
198   - end
199   -
200   - context "when authenticated as non-member" do
201   - it "should not show user1's membership of user_team1" do
202   - get api("/user_teams/#{user_team1.id}/members/#{user1.id}", user2)
203   - response.status.should == 404
204   - end
205   - end
206   -
207   - context "when authenticated as admin" do
208   - it "should show user1's membership of user_team1" do
209   - get api("/user_teams/#{user_team1.id}/members/#{user1.id}", admin)
210   - response.status.should == 200
211   - json_response['name'].should == user1.name
212   - json_response['access_level'].should == UsersProject::MASTER
213   - end
214   - it "should return a 404 error when user id is not known" do
215   - get api("/user_teams/#{user_team2.id}/members/1328", admin)
216   - response.status.should == 404
217   - end
218   - end
219   - end
220   -
221   - describe "DELETE /user_teams/:id/members/:user_id" do
222   - context "when authenticated as user" do
223   - it "should not delete user1's membership of user_team1" do
224   - delete api("/user_teams/#{user_team1.id}/members/#{user1.id}", user1)
225   - response.status.should == 403
226   - end
227   - end
228   -
229   - context "when authenticated as admin" do
230   - it "should delete user1's membership of user_team1" do
231   - count_before=user_team1.user_team_user_relationships.count
232   - delete api("/user_teams/#{user_team1.id}/members/#{user1.id}", admin)
233   - response.status.should == 200
234   - user_team1.user_team_user_relationships.count.should == count_before - 1
235   - end
236   - it "should return a 404 error when user id is not known" do
237   - delete api("/user_teams/#{user_team2.id}/members/1328", admin)
238   - response.status.should == 404
239   - end
240   - end
241   - end
242   -
243   - # Projects
244   -
245   - describe "GET /user_teams/:id/projects" do
246   - context "when authenticated as user" do
247   - it "should return project1 as assigned to user_team1 as member user1" do
248   - get api("/user_teams/#{user_team1.id}/projects", user1)
249   - response.status.should == 200
250   - json_response.first['name'].should == project1.name
251   - json_response.length.should == user_team1.user_team_project_relationships.count
252   - end
253   - end
254   -
255   - context "when authenticated as admin" do
256   - it "should return project2 as assigned to user_team2 as non-member, but admin" do
257   - get api("/user_teams/#{user_team2.id}/projects", admin)
258   - response.status.should == 200
259   - json_response.first['name'].should == project2.name
260   - json_response.first['greatest_access_level'].should == UsersProject::MASTER
261   - end
262   - end
263   - end
264   -
265   - describe "POST /user_teams/:id/projects" do
266   - context "when authenticated as admin" do
267   - it "should return ok and add new project" do
268   - count_before=user_team1.user_team_project_relationships.count
269   - post api("/user_teams/#{user_team1.id}/projects", admin),
270   - project_id: project2.id,
271   - greatest_access_level: UsersProject::MASTER
272   - response.status.should == 201
273   - json_response['name'].should == project2.name
274   - json_response['greatest_access_level'].should == UsersProject::MASTER
275   - user_team1.user_team_project_relationships.count.should == count_before + 1
276   - end
277   - it "should return ok if project already exists" do
278   - post api("/user_teams/#{user_team2.id}/projects", admin),
279   - project_id: project2.id,
280   - greatest_access_level: UsersProject::MASTER
281   - response.status.should == 409
282   - end
283   - it "should return a 400 error when project id is not given" do
284   - post api("/user_teams/#{user_team2.id}/projects", admin), greatest_access_level: UsersProject::MASTER
285   - response.status.should == 400
286   - end
287   - it "should return a 400 error when access level is not given" do
288   - post api("/user_teams/#{user_team2.id}/projects", admin), project_id: project2.id
289   - response.status.should == 400
290   - end
291   -
292   - it "should return a 422 error when access level is not known" do
293   - post api("/user_teams/#{user_team2.id}/projects", admin),
294   - project_id: project2.id,
295   - greatest_access_level: 1234
296   - response.status.should == 422
297   - end
298   -
299   - end
300   - end
301   -
302   -
303   - describe "GET /user_teams/:id/projects/:project_id" do
304   - context "when authenticated as member" do
305   - it "should show project1's assignment to user_team1" do
306   - get api("/user_teams/#{user_team1.id}/projects/#{project1.id}", user1)
307   - response.status.should == 200
308   - json_response['name'].should == project1.name
309   - json_response['greatest_access_level'].should == UsersProject::MASTER
310   - end
311   - it "should show project2's is not assigned to user_team1" do
312   - get api("/user_teams/#{user_team1.id}/projects/#{project2.id}", user1)
313   - response.status.should == 404
314   - end
315   - end
316   -
317   - context "when authenticated as non-member" do
318   - it "should not show project1's assignment to user_team1" do
319   - get api("/user_teams/#{user_team1.id}/projects/#{project1.id}", user2)
320   - response.status.should == 404
321   - end
322   - end
323   -
324   - context "when authenticated as admin" do
325   - it "should show project1's assignment to user_team1" do
326   - get api("/user_teams/#{user_team1.id}/projects/#{project1.id}", admin)
327   - response.status.should == 200
328   - json_response['name'].should == project1.name
329   - json_response['greatest_access_level'].should == UsersProject::MASTER
330   - end
331   - it "should return a 404 error when project id is not known" do
332   - get api("/user_teams/#{user_team2.id}/projects/1328", admin)
333   - response.status.should == 404
334   - end
335   - end
336   - end
337   -
338   - describe "DELETE /user_teams/:id/projects/:project_id" do
339   - context "when authenticated as user" do
340   - it "should not delete project1's assignment to user_team2" do
341   - delete api("/user_teams/#{user_team2.id}/projects/#{project1.id}", user1)
342   - response.status.should == 403
343   - end
344   - end
345   -
346   - context "when authenticated as admin" do
347   - it "should delete project1's assignment to user_team1" do
348   - count_before=user_team1.user_team_project_relationships.count
349   - delete api("/user_teams/#{user_team1.id}/projects/#{project1.id}", admin)
350   - response.status.should == 200
351   - user_team1.user_team_project_relationships.count.should == count_before - 1
352   - end
353   - it "should return a 404 error when project id is not known" do
354   - delete api("/user_teams/#{user_team2.id}/projects/1328", admin)
355   - response.status.should == 404
356   - end
357   - end
358   - end
359   -
360   -end