Remove all team resources except models. Move models to deprecated directory
This commit is contained in:
		
							parent
							
								
									670aaaeb9d
								
							
						
					
					
						commit
						439f399bec
					
				|  | @ -1,11 +0,0 @@ | ||||||
| # Provides a base class for Admin controllers to subclass |  | ||||||
| # |  | ||||||
| # Automatically sets the layout and ensures an administrator is logged in |  | ||||||
| class Admin::Teams::ApplicationController < Admin::ApplicationController |  | ||||||
| 
 |  | ||||||
|   private |  | ||||||
| 
 |  | ||||||
|   def user_team |  | ||||||
|     @team = UserTeam.find_by_path(params[:team_id]) |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,40 +0,0 @@ | ||||||
| class Admin::Teams::MembersController < Admin::Teams::ApplicationController |  | ||||||
|   def new |  | ||||||
|     @users = User.potential_team_members(user_team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def create |  | ||||||
|     unless params[:user_ids].blank? |  | ||||||
|       user_ids = params[:user_ids] |  | ||||||
|       access = params[:default_project_access] |  | ||||||
|       is_admin = params[:group_admin] |  | ||||||
|       user_team.add_members(user_ids, access, is_admin) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     redirect_to admin_team_path(user_team), notice: 'Members were successfully added into Team of users.' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def edit |  | ||||||
|     team_member |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def update |  | ||||||
|     options = {default_projects_access: params[:default_project_access], group_admin: params[:group_admin]} |  | ||||||
|     if user_team.update_membership(team_member, options) |  | ||||||
|       redirect_to admin_team_path(user_team), notice: "Membership for #{team_member.name} was successfully updated in Team of users." |  | ||||||
|     else |  | ||||||
|       render :edit |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def destroy |  | ||||||
|     user_team.remove_member(team_member) |  | ||||||
|     redirect_to admin_team_path(user_team), notice: "Member #{team_member.name} was successfully removed from Team of users." |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def team_member |  | ||||||
|     @member ||= user_team.members.find_by_username(params[:id]) |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,41 +0,0 @@ | ||||||
| class Admin::Teams::ProjectsController < Admin::Teams::ApplicationController |  | ||||||
|   def new |  | ||||||
|     @projects = Project.scoped |  | ||||||
|     @projects = @projects.without_team(user_team) if user_team.projects.any? |  | ||||||
|     #@projects.reject!(&:empty_repo?) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def create |  | ||||||
|     unless params[:project_ids].blank? |  | ||||||
|       project_ids = params[:project_ids] |  | ||||||
|       access = params[:greatest_project_access] |  | ||||||
|       user_team.assign_to_projects(project_ids, access) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     redirect_to admin_team_path(user_team), notice: 'Team of users was successfully assgned to projects.' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def edit |  | ||||||
|     team_project |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def update |  | ||||||
|     if user_team.update_project_access(team_project, params[:greatest_project_access]) |  | ||||||
|       redirect_to admin_team_path(user_team), notice: 'Access was successfully updated.' |  | ||||||
|     else |  | ||||||
|       render :edit |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def destroy |  | ||||||
|     user_team.resign_from_project(team_project) |  | ||||||
|     redirect_to admin_team_path(user_team), notice: 'Team of users was successfully reassigned from project.' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def team_project |  | ||||||
|     @project ||= user_team.projects.find_with_namespace(params[:id]) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
| end |  | ||||||
|  | @ -1,59 +0,0 @@ | ||||||
| class Admin::TeamsController < Admin::ApplicationController |  | ||||||
|   def index |  | ||||||
|     @teams = UserTeam.order('name ASC') |  | ||||||
|     @teams = @teams.search(params[:name]) if params[:name].present? |  | ||||||
|     @teams = @teams.page(params[:page]).per(20) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def show |  | ||||||
|     user_team |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def new |  | ||||||
|     @team = UserTeam.new |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def edit |  | ||||||
|     user_team |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def create |  | ||||||
|     @team = UserTeam.new(params[:user_team]) |  | ||||||
|     @team.path = @team.name.dup.parameterize if @team.name |  | ||||||
|     @team.owner = current_user |  | ||||||
| 
 |  | ||||||
|     if @team.save |  | ||||||
|       redirect_to admin_team_path(@team), notice: 'Team of users was successfully created.' |  | ||||||
|     else |  | ||||||
|       render action: "new" |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def update |  | ||||||
|     user_team_params = params[:user_team].dup |  | ||||||
|     owner_id = user_team_params.delete(:owner_id) |  | ||||||
| 
 |  | ||||||
|     if owner_id |  | ||||||
|       user_team.owner = User.find(owner_id) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     if user_team.update_attributes(user_team_params) |  | ||||||
|       redirect_to admin_team_path(user_team), notice: 'Team of users was successfully updated.' |  | ||||||
|     else |  | ||||||
|       render action: "edit" |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def destroy |  | ||||||
|     user_team.destroy |  | ||||||
| 
 |  | ||||||
|     redirect_to admin_teams_path, notice: 'Team of users was successfully deleted.' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def user_team |  | ||||||
|     @team ||= UserTeam.find_by_path(params[:id]) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
| end |  | ||||||
|  | @ -7,7 +7,6 @@ class DashboardController < ApplicationController | ||||||
|   def show |   def show | ||||||
|     @groups = current_user.authorized_groups.sort_by(&:human_name) |     @groups = current_user.authorized_groups.sort_by(&:human_name) | ||||||
|     @has_authorized_projects = @projects.count > 0 |     @has_authorized_projects = @projects.count > 0 | ||||||
|     @teams = current_user.authorized_teams |  | ||||||
|     @projects_count = @projects.count |     @projects_count = @projects.count | ||||||
|     @projects = @projects.limit(20) |     @projects = @projects.limit(20) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,34 +0,0 @@ | ||||||
| class Projects::TeamsController < Projects::ApplicationController |  | ||||||
| 
 |  | ||||||
|   before_filter :authorize_admin_team_member! |  | ||||||
| 
 |  | ||||||
|   def available |  | ||||||
|     @teams = current_user.is_admin? ? UserTeam.scoped : current_user.user_teams |  | ||||||
|     @teams = @teams.without_project(project) |  | ||||||
|     unless @teams.any? |  | ||||||
|       redirect_to project_team_index_path(project), notice: "No available teams for assigment." |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def assign |  | ||||||
|     unless params[:team_id].blank? |  | ||||||
|       team = UserTeam.find(params[:team_id]) |  | ||||||
|       access = params[:greatest_project_access] |  | ||||||
|       team.assign_to_project(project, access) |  | ||||||
|     end |  | ||||||
|     redirect_to project_team_index_path(project) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def resign |  | ||||||
|     team = project.user_teams.find_by_path(params[:id]) |  | ||||||
|     team.resign_from_project(project) |  | ||||||
| 
 |  | ||||||
|     redirect_to project_team_index_path(project) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def user_team |  | ||||||
|     @team ||= UserTeam.find_by_path(params[:id]) |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,13 +0,0 @@ | ||||||
| class Teams::ApplicationController < ApplicationController |  | ||||||
| 
 |  | ||||||
|   layout 'user_team' |  | ||||||
| 
 |  | ||||||
|   before_filter :authorize_manage_user_team! |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def user_team |  | ||||||
|     @team ||= UserTeam.find_by_path(params[:team_id]) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
| end |  | ||||||
|  | @ -1,53 +0,0 @@ | ||||||
| class Teams::MembersController < Teams::ApplicationController |  | ||||||
| 
 |  | ||||||
|   skip_before_filter :authorize_manage_user_team!, only: [:index] |  | ||||||
| 
 |  | ||||||
|   def index |  | ||||||
|     @members = user_team.members |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def new |  | ||||||
|     @users = User.potential_team_members(user_team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def create |  | ||||||
|     unless params[:user_ids].blank? |  | ||||||
|       user_ids = params[:user_ids].split(',') |  | ||||||
|       access = params[:default_project_access] |  | ||||||
|       is_admin = params[:group_admin] |  | ||||||
|       user_team.add_members(user_ids, access, is_admin) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     redirect_to team_members_path(user_team), notice: 'Members were successfully added into Team of users.' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def edit |  | ||||||
|     team_member |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def update |  | ||||||
|     member_params = params[:team_member] |  | ||||||
| 
 |  | ||||||
|     options = { |  | ||||||
|       default_projects_access: member_params[:permission], |  | ||||||
|       group_admin: member_params[:group_admin] |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if user_team.update_membership(team_member, options) |  | ||||||
|       redirect_to team_members_path(user_team), notice: "Membership for #{team_member.name} was successfully updated in Team of users." |  | ||||||
|     else |  | ||||||
|       render :edit |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def destroy |  | ||||||
|     user_team.remove_member(team_member) |  | ||||||
|     redirect_to team_path(user_team), notice: "Member #{team_member.name} was successfully removed from Team of users." |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def team_member |  | ||||||
|     @member ||= user_team.members.find_by_username(params[:id]) |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,40 +0,0 @@ | ||||||
| class Teams::ProjectsController < Teams::ApplicationController |  | ||||||
|   def create |  | ||||||
|     redirect_to :back if params[:project_ids].blank? |  | ||||||
| 
 |  | ||||||
|     project_ids = params[:project_ids] |  | ||||||
|     access = params[:greatest_project_access] |  | ||||||
| 
 |  | ||||||
|     # Reject non-allowed projects |  | ||||||
|     allowed_project_ids = current_user.owned_projects.map(&:id) |  | ||||||
|     project_ids.select! { |id| allowed_project_ids.include?(id.to_i) } |  | ||||||
| 
 |  | ||||||
|     # Assign projects to team |  | ||||||
|     user_team.assign_to_projects(project_ids, access) |  | ||||||
| 
 |  | ||||||
|     redirect_to edit_team_path(user_team), notice: 'Team of users was successfully assigned to projects.' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def edit |  | ||||||
|     team_project |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def update |  | ||||||
|     if user_team.update_project_access(team_project, params[:greatest_project_access]) |  | ||||||
|       redirect_to edit_team_path(user_team), notice: 'Access was successfully updated.' |  | ||||||
|     else |  | ||||||
|       render :edit |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def destroy |  | ||||||
|     user_team.resign_from_project(team_project) |  | ||||||
|     redirect_to team_projects_path(user_team), notice: 'Team of users was successfully reassigned from project.' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   private |  | ||||||
| 
 |  | ||||||
|   def team_project |  | ||||||
|     @project ||= user_team.projects.find_with_namespace(params[:id]) |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,93 +0,0 @@ | ||||||
| class TeamsController < ApplicationController |  | ||||||
|   # Authorize |  | ||||||
|   before_filter :authorize_create_team!, only: [:new, :create] |  | ||||||
|   before_filter :authorize_manage_user_team!, only: [:edit, :update] |  | ||||||
|   before_filter :authorize_admin_user_team!, only: [:destroy] |  | ||||||
| 
 |  | ||||||
|   before_filter :user_team, except: [:new, :create] |  | ||||||
| 
 |  | ||||||
|   layout :determine_layout |  | ||||||
| 
 |  | ||||||
|   before_filter :set_title, only: [:new, :create] |  | ||||||
| 
 |  | ||||||
|   def show |  | ||||||
|     projects |  | ||||||
|     @events = Event.in_projects(user_team.project_ids).limit(20).offset(params[:offset] || 0) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def edit |  | ||||||
|     projects |  | ||||||
|     @avaliable_projects = current_user.owned_projects.without_team(user_team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def update |  | ||||||
|     if user_team.update_attributes(params[:user_team]) |  | ||||||
|       redirect_to team_path(user_team) |  | ||||||
|     else |  | ||||||
|       render action: :edit |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def destroy |  | ||||||
|     user_team.destroy |  | ||||||
|     redirect_to dashboard_path |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def new |  | ||||||
|     @team = UserTeam.new |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def create |  | ||||||
|     @team = UserTeam.new(params[:user_team]) |  | ||||||
|     @team.owner = current_user unless params[:owner] |  | ||||||
|     @team.path = @team.name.dup.parameterize if @team.name |  | ||||||
| 
 |  | ||||||
|     if @team.save |  | ||||||
|       # Add current user as Master to the team |  | ||||||
|       @team.add_members([current_user.id], UsersProject::MASTER, true) |  | ||||||
| 
 |  | ||||||
|       redirect_to team_path(@team) |  | ||||||
|     else |  | ||||||
|       render action: :new |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   # Get authored or assigned open merge requests |  | ||||||
|   def merge_requests |  | ||||||
|     projects |  | ||||||
|     @merge_requests = MergeRequest.of_user_team(user_team) |  | ||||||
|     @merge_requests = FilterContext.new(@merge_requests, params).execute |  | ||||||
|     @merge_requests = @merge_requests.recent.page(params[:page]).per(20) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   # Get only assigned issues |  | ||||||
|   def issues |  | ||||||
|     projects |  | ||||||
|     @issues = Issue.of_user_team(user_team) |  | ||||||
|     @issues = FilterContext.new(@issues, params).execute |  | ||||||
|     @issues = @issues.recent.page(params[:page]).per(20) |  | ||||||
|     @issues = @issues.includes(:author, :project) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def projects |  | ||||||
|     @projects ||= user_team.projects.sorted_by_activity |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def user_team |  | ||||||
|     @team ||= current_user.authorized_teams.find_by_path(params[:id]) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def set_title |  | ||||||
|     @title = 'New Team' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def determine_layout |  | ||||||
|     if [:new, :create].include?(action_name.to_sym) |  | ||||||
|       'navless' |  | ||||||
|     else |  | ||||||
|       'user_team' |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -92,7 +92,6 @@ module ApplicationHelper | ||||||
|   def search_autocomplete_source |   def search_autocomplete_source | ||||||
|     projects = current_user.authorized_projects.map { |p| { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) } } |     projects = current_user.authorized_projects.map { |p| { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) } } | ||||||
|     groups = current_user.authorized_groups.map { |group| { label: "group: #{simple_sanitize(group.name)}", url: group_path(group) } } |     groups = current_user.authorized_groups.map { |group| { label: "group: #{simple_sanitize(group.name)}", url: group_path(group) } } | ||||||
|     teams = current_user.authorized_teams.map { |team| { label: "team: #{simple_sanitize(team.name)}", url: team_path(team) } } |  | ||||||
| 
 | 
 | ||||||
|     default_nav = [ |     default_nav = [ | ||||||
|       { label: "My Profile", url: profile_path }, |       { label: "My Profile", url: profile_path }, | ||||||
|  | @ -128,7 +127,7 @@ module ApplicationHelper | ||||||
|       ] |       ] | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     [groups, teams, projects, default_nav, project_nav, help_nav].flatten.to_json |     [groups, projects, default_nav, project_nav, help_nav].flatten.to_json | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def emoji_autocomplete_source |   def emoji_autocomplete_source | ||||||
|  |  | ||||||
|  | @ -1,25 +0,0 @@ | ||||||
| module UserTeamsHelper |  | ||||||
|   def team_filter_path(entity, options={}) |  | ||||||
|     exist_opts = { |  | ||||||
|       status: params[:status], |  | ||||||
|       project_id: params[:project_id], |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     options = exist_opts.merge(options) |  | ||||||
| 
 |  | ||||||
|     case entity |  | ||||||
|     when 'issue' then |  | ||||||
|       issues_team_path(@team, options) |  | ||||||
|     when 'merge_request' |  | ||||||
|       merge_requests_team_path(@team, options) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def grouped_user_team_members(team) |  | ||||||
|     team.user_team_user_relationships.sort_by(&:permission).reverse.group_by(&:permission) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def remove_from_user_team_message(team, member) |  | ||||||
|     "You are going to remove #{member.name} from #{team.name}. Are you sure?" |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -11,7 +11,6 @@ class Ability | ||||||
|       when "PersonalSnippet" then personal_snippet_abilities(user, subject) |       when "PersonalSnippet" then personal_snippet_abilities(user, subject) | ||||||
|       when "MergeRequest" then merge_request_abilities(user, subject) |       when "MergeRequest" then merge_request_abilities(user, subject) | ||||||
|       when "Group", "Namespace" then group_abilities(user, subject) |       when "Group", "Namespace" then group_abilities(user, subject) | ||||||
|       when "UserTeam" then user_team_abilities(user, subject) |  | ||||||
|       else [] |       else [] | ||||||
|       end.concat(global_abilities(user)) |       end.concat(global_abilities(user)) | ||||||
|     end |     end | ||||||
|  | @ -19,7 +18,6 @@ class Ability | ||||||
|     def global_abilities(user) |     def global_abilities(user) | ||||||
|       rules = [] |       rules = [] | ||||||
|       rules << :create_group if user.can_create_group |       rules << :create_group if user.can_create_group | ||||||
|       rules << :create_team if user.can_create_team |  | ||||||
|       rules |       rules | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -146,21 +144,6 @@ class Ability | ||||||
|       rules.flatten |       rules.flatten | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def user_team_abilities user, team |  | ||||||
|       rules = [] |  | ||||||
| 
 |  | ||||||
|       # Only group owner and administrators can manage team |  | ||||||
|       if user.admin? || team.owner == user || team.admin?(user) |  | ||||||
|         rules << [ :manage_user_team ] |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       if team.owner == user || user.admin? |  | ||||||
|         rules << [ :admin_user_team ] |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       rules.flatten |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     [:issue, :note, :project_snippet, :personal_snippet, :merge_request].each do |name| |     [:issue, :note, :project_snippet, :personal_snippet, :merge_request].each do |name| | ||||||
|       define_method "#{name}_abilities" do |user, subject| |       define_method "#{name}_abilities" do |user, subject| | ||||||
|         if subject.author == user |         if subject.author == user | ||||||
|  |  | ||||||
|  | @ -75,13 +75,6 @@ class User < ActiveRecord::Base | ||||||
|   has_many :users_groups, dependent: :destroy |   has_many :users_groups, dependent: :destroy | ||||||
|   has_many :groups, through: :users_groups |   has_many :groups, through: :users_groups | ||||||
| 
 | 
 | ||||||
|   # Teams |  | ||||||
|   has_many :own_teams,                       dependent: :destroy, class_name: "UserTeam", foreign_key: :owner_id |  | ||||||
|   has_many :user_team_user_relationships,    dependent: :destroy |  | ||||||
|   has_many :user_teams,                      through: :user_team_user_relationships |  | ||||||
|   has_many :user_team_project_relationships, through: :user_teams |  | ||||||
|   has_many :team_projects,                   through: :user_team_project_relationships |  | ||||||
| 
 |  | ||||||
|   # Projects |   # Projects | ||||||
|   has_many :snippets,                 dependent: :destroy, foreign_key: :author_id, class_name: "Snippet" |   has_many :snippets,                 dependent: :destroy, foreign_key: :author_id, class_name: "Snippet" | ||||||
|   has_many :users_projects,           dependent: :destroy |   has_many :users_projects,           dependent: :destroy | ||||||
|  | @ -235,10 +228,6 @@ class User < ActiveRecord::Base | ||||||
|     own_groups |     own_groups | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def owned_teams |  | ||||||
|     own_teams |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   # Groups user has access to |   # Groups user has access to | ||||||
|   def authorized_groups |   def authorized_groups | ||||||
|     @group_ids ||= (groups.pluck(:id) + own_groups.pluck(:id) + authorized_projects.pluck(:namespace_id)) |     @group_ids ||= (groups.pluck(:id) + own_groups.pluck(:id) + authorized_projects.pluck(:namespace_id)) | ||||||
|  | @ -252,15 +241,6 @@ class User < ActiveRecord::Base | ||||||
|     Project.where(id: @project_ids) |     Project.where(id: @project_ids) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def authorized_teams |  | ||||||
|     if admin? |  | ||||||
|       UserTeam.scoped |  | ||||||
|     else |  | ||||||
|       @team_ids ||= (user_teams.pluck(:id) + own_teams.pluck(:id)).uniq |  | ||||||
|       UserTeam.where(id: @team_ids) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   # Team membership in authorized projects |   # Team membership in authorized projects | ||||||
|   def tm_in_authorized_projects |   def tm_in_authorized_projects | ||||||
|     UsersProject.where(project_id: authorized_projects.map(&:id), user_id: self.id) |     UsersProject.where(project_id: authorized_projects.map(&:id), user_id: self.id) | ||||||
|  |  | ||||||
|  | @ -49,10 +49,6 @@ | ||||||
|   .span4 |   .span4 | ||||||
|     %h4 Stats |     %h4 Stats | ||||||
|     %hr |     %hr | ||||||
|     %p |  | ||||||
|       Teams |  | ||||||
|       %span.light.pull-right |  | ||||||
|         = UserTeam.count |  | ||||||
|     %p |     %p | ||||||
|       Forks |       Forks | ||||||
|       %span.light.pull-right |       %span.light.pull-right | ||||||
|  |  | ||||||
|  | @ -1,28 +0,0 @@ | ||||||
| %h3.page_title Edit Team |  | ||||||
| %hr |  | ||||||
| = form_for @team, url: admin_team_path(@team), method: :put do |f| |  | ||||||
|   - if @team.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %span= @team.errors.full_messages.first |  | ||||||
|   .clearfix.team_name_holder |  | ||||||
|     = f.label :name do |  | ||||||
|       Team name is |  | ||||||
|     .input |  | ||||||
|       = f.text_field :name, placeholder: "Example Team", class: "xxlarge" |  | ||||||
| 
 |  | ||||||
|   .clearfix.team-description-holder |  | ||||||
|     = f.label :description, "Details" |  | ||||||
|     .input |  | ||||||
|       = f.text_area :description, maxlength: 250, class: "xxlarge js-gfm-input", rows: 4 |  | ||||||
| 
 |  | ||||||
|   .clearfix.team_name_holder |  | ||||||
|     = f.label :path do |  | ||||||
|       %span.cred Team path is |  | ||||||
|     .input |  | ||||||
|       = f.text_field :path, placeholder: "example-team", class: "xxlarge danger" |  | ||||||
|       %ul.cred |  | ||||||
|         %li It will change web url for access team and team projects. |  | ||||||
| 
 |  | ||||||
|   .form-actions |  | ||||||
|     = f.submit 'Edit team', class: "btn btn-remove" |  | ||||||
|     = link_to  'Cancel', admin_teams_path, class: "btn btn-cancel" |  | ||||||
|  | @ -1,48 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Teams (#{@teams.total_count}) |  | ||||||
|   %small |  | ||||||
|     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. |  | ||||||
| 
 |  | ||||||
|   = link_to 'New Team', new_admin_team_path, class: "btn btn-small pull-right" |  | ||||||
| %br |  | ||||||
| 
 |  | ||||||
| = form_tag admin_teams_path, method: :get, class: 'form-inline' do |  | ||||||
|   = text_field_tag :name, params[:name], class: "span6" |  | ||||||
|   = submit_tag "Search", class: "btn submit btn-primary" |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| 
 |  | ||||||
| %ul.bordered-list |  | ||||||
|   - @teams.each do |team| |  | ||||||
|     %li |  | ||||||
|       .clearfix |  | ||||||
|         .pull-right.prepend-top-10 |  | ||||||
|           = link_to 'Edit', edit_admin_team_path(team), id: "edit_#{dom_id(team)}", class: "btn btn-small" |  | ||||||
|           = link_to 'Destroy', admin_team_path(team), confirm: "REMOVE #{team.name}? Are you sure?", method: :delete, class: "btn btn-small btn-remove" |  | ||||||
| 
 |  | ||||||
|         %h4 |  | ||||||
|           = link_to admin_team_path(team) do |  | ||||||
|             %i.icon-group |  | ||||||
|             = team.name |  | ||||||
| 
 |  | ||||||
|       .clearfix.light.append-bottom-10 |  | ||||||
|         %span |  | ||||||
|           %b Owner: |  | ||||||
|           - if team.owner |  | ||||||
|             = link_to team.owner.name, admin_user_path(team.owner) |  | ||||||
|           - else |  | ||||||
|             (deleted) |  | ||||||
|         \| |  | ||||||
|         %span |  | ||||||
|           %b Users: |  | ||||||
|           %span.badge= team.members.count |  | ||||||
|         \| |  | ||||||
|         %span |  | ||||||
|           %b Projects: |  | ||||||
|           %span.badge= team.projects.count |  | ||||||
| 
 |  | ||||||
|       .clearfix |  | ||||||
|         %p |  | ||||||
|           = truncate team.description, length: 150 |  | ||||||
| 
 |  | ||||||
| = paginate @teams, theme: "gitlab" |  | ||||||
|  | @ -1,20 +0,0 @@ | ||||||
| = form_tag admin_team_member_path(@team, @member), method: :put do |  | ||||||
|   -if @member.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %ul |  | ||||||
|         - @member.errors.full_messages.each do |msg| |  | ||||||
|           %li= msg |  | ||||||
| 
 |  | ||||||
|   .clearfix |  | ||||||
|     %label Default access for Team projects: |  | ||||||
|     .input |  | ||||||
|       = select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3" |  | ||||||
|   .clearfix |  | ||||||
|     %label Team admin? |  | ||||||
|     .input |  | ||||||
|       = check_box_tag :group_admin, true, @team.admin?(@member) |  | ||||||
| 
 |  | ||||||
|   %br |  | ||||||
|   .actions |  | ||||||
|     = submit_tag 'Save', class: "btn btn-primary" |  | ||||||
|     = link_to 'Cancel', :back, class: "btn" |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| %h3 |  | ||||||
|   Edit access #{@member.name} in #{@team.name} team |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| %table.zebra-striped |  | ||||||
|   %tr |  | ||||||
|     %td User: |  | ||||||
|     %td= @member.name |  | ||||||
|   %tr |  | ||||||
|     %td Team: |  | ||||||
|     %td= @team.name |  | ||||||
|   %tr |  | ||||||
|     %td Since: |  | ||||||
|     %td= member_since(@team, @member).stamp("Nov 11, 2010") |  | ||||||
| 
 |  | ||||||
| = render 'form' |  | ||||||
|  | @ -1,27 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   New members for |  | ||||||
|   = link_to @team.name, admin_team_path(@team) |  | ||||||
|   team |  | ||||||
| %hr |  | ||||||
| = form_tag admin_team_members_path(@team), id: "team_members", class: "bulk_import", method: :post  do |  | ||||||
|   - if @team.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %span= @team.errors.full_messages.first |  | ||||||
|   .clearfix |  | ||||||
|     = label_tag :user_ids do |  | ||||||
|       Users to add |  | ||||||
|     .input |  | ||||||
|       = select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_username), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5' |  | ||||||
|   .clearfix.group-description-holder |  | ||||||
|     = label_tag :default_project_access do |  | ||||||
|       Default permission in projects |  | ||||||
|     .input |  | ||||||
|       = select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" } |  | ||||||
|   .clearfix |  | ||||||
|     = label_tag :group_admin do |  | ||||||
|       Is team admin |  | ||||||
|     .input |  | ||||||
|       = check_box_tag :group_admin |  | ||||||
|   .clearfix.form-actions |  | ||||||
|     = submit_tag 'Add users into team', class: "btn btn-primary", id: :add_members_to_team |  | ||||||
|     = link_to 'Cancel', :back, class: "btn" |  | ||||||
|  | @ -1,26 +0,0 @@ | ||||||
| %h3.page_title New Team |  | ||||||
| %hr |  | ||||||
| = form_for @team, url: admin_teams_path do |f| |  | ||||||
|   - if @team.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %span= @team.errors.full_messages.first |  | ||||||
|   .clearfix |  | ||||||
|     = f.label :name do |  | ||||||
|       Team name is |  | ||||||
|     .input |  | ||||||
|       = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left" |  | ||||||
| 
 |  | ||||||
|   .clearfix.team-description-holder |  | ||||||
|     = f.label :description, "Details" |  | ||||||
|     .input |  | ||||||
|       = f.text_area :description, maxlength: 250, class: "xxlarge js-gfm-input", rows: 4 |  | ||||||
| 
 |  | ||||||
|   .form-actions |  | ||||||
|     = f.submit 'Create team', class: "btn btn-create" |  | ||||||
| 
 |  | ||||||
|   %hr |  | ||||||
|   .padded |  | ||||||
|     %ul |  | ||||||
|       %li All created teams are public (users can view who enter into team and which project are assigned for this team) |  | ||||||
|       %li People within a team see only projects they have access to |  | ||||||
|       %li You will be able to assign existing projects for team |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| = form_tag admin_team_project_path(@team, @project), method: :put do |  | ||||||
|   -if @project.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %ul |  | ||||||
|         - @project.errors.full_messages.each do |msg| |  | ||||||
|           %li= msg |  | ||||||
| 
 |  | ||||||
|   .clearfix |  | ||||||
|     %label Max access for Team members: |  | ||||||
|     .input |  | ||||||
|       = select_tag :greatest_project_access, options_for_select(UserTeam.access_roles, @team.max_project_access(@project)), class: "project-access-select chosen span3" |  | ||||||
| 
 |  | ||||||
|   %br |  | ||||||
|   .actions |  | ||||||
|     = submit_tag 'Save', class: "btn btn-primary" |  | ||||||
|     = link_to 'Cancel', :back, class: "btn" |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| %h3 |  | ||||||
|   Edit max access in #{@project.name} for #{@team.name} team |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| %table.zebra-striped |  | ||||||
|   %tr |  | ||||||
|     %td Project: |  | ||||||
|     %td= @project.name |  | ||||||
|   %tr |  | ||||||
|     %td Team: |  | ||||||
|     %td= @team.name |  | ||||||
|   %tr |  | ||||||
|     %td Since: |  | ||||||
|     %td= assigned_since(@team, @project).stamp("Nov 11, 2010") |  | ||||||
| 
 |  | ||||||
| = render 'form' |  | ||||||
|  | @ -1,18 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Team: #{@team.name} |  | ||||||
| %hr |  | ||||||
| = form_tag admin_team_projects_path(@team), id: "assign_projects", class: "bulk_import", method: :post  do |  | ||||||
|   %h6 Choose Projects you want to assign: |  | ||||||
|   .clearfix |  | ||||||
|     = label_tag :project_ids, "Projects" |  | ||||||
|     .input |  | ||||||
|       = select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5' |  | ||||||
| 
 |  | ||||||
|   %h6 Choose greatest user acces for your team in this projects: |  | ||||||
|   .clearfix |  | ||||||
|     = label_tag :greatest_project_access, "Greatest Access" |  | ||||||
|     .input |  | ||||||
|       = select_tag :greatest_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" } |  | ||||||
| 
 |  | ||||||
|   .form-actions |  | ||||||
|     = submit_tag 'Add team to projects', class: "btn btn-create", id: :assign_projects_to_team |  | ||||||
|  | @ -1,96 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Team: #{@team.name} |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   = link_to edit_admin_team_path(@team), class: "btn btn-small pull-right" do |  | ||||||
|     %i.icon-edit |  | ||||||
|     Edit |  | ||||||
| %hr |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| .row |  | ||||||
|   .span6 |  | ||||||
|     .ui-box |  | ||||||
|       %h5.title |  | ||||||
|         Team info: |  | ||||||
|       %ul.well-list |  | ||||||
|         %li |  | ||||||
|           %span.light Name: |  | ||||||
|           %strong= @team.name |  | ||||||
|         %li |  | ||||||
|           %span.light Path: |  | ||||||
|           %strong |  | ||||||
|             = @team.path |  | ||||||
| 
 |  | ||||||
|         %li |  | ||||||
|           %span.light Description: |  | ||||||
|           %strong |  | ||||||
|             = @team.description |  | ||||||
| 
 |  | ||||||
|         %li |  | ||||||
|           %span.light Owned by: |  | ||||||
|           %strong |  | ||||||
|             - if @team.owner |  | ||||||
|               = link_to @team.owner.name, admin_user_path(@team.owner) |  | ||||||
|             - else |  | ||||||
|               (deleted) |  | ||||||
|           .pull-right |  | ||||||
|             = link_to "#", class: "btn btn-small change-owner-link" do |  | ||||||
|               %i.icon-edit |  | ||||||
|               Change owner |  | ||||||
|         %li.change-owner-holder.hide.bgred |  | ||||||
|           .form-holder |  | ||||||
|             %strong.cred New Owner: |  | ||||||
|             = form_for @team, url: admin_team_path(@team) do |f| |  | ||||||
|               = users_select_tag(:"user_team[owner_id]") |  | ||||||
|               .prepend-top-10 |  | ||||||
|                 = f.submit 'Change Owner', class: "btn btn-remove" |  | ||||||
|                 = link_to "Cancel", "#", class: "btn change-owner-cancel-link" |  | ||||||
| 
 |  | ||||||
|         %li |  | ||||||
|           %span.light Created at: |  | ||||||
|           %strong |  | ||||||
|             = @team.created_at.stamp("March 1, 1999") |  | ||||||
| 
 |  | ||||||
|   .span6 |  | ||||||
|     .ui-box |  | ||||||
|       %h5.title |  | ||||||
|         Members (#{@team.members.count}) |  | ||||||
|         .pull-right |  | ||||||
|           = link_to 'Add members', new_admin_team_member_path(@team), class: "btn btn-small", id: :add_members_to_team |  | ||||||
|       %ul.well-list#members_list |  | ||||||
|         - @team.members.each do |member| |  | ||||||
|           %li.member{ class: "user_#{member.id}"} |  | ||||||
|             = link_to [:admin, member] do |  | ||||||
|               %strong |  | ||||||
|                 = member.name |  | ||||||
|             .pull-right |  | ||||||
|               %span.light |  | ||||||
|                 = @team.human_default_projects_access(member) |  | ||||||
|               - if @team.admin?(member) |  | ||||||
|                 %span.label.label-info Admin |  | ||||||
|                 |  | ||||||
|               = link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn btn-small" |  | ||||||
|                 |  | ||||||
|               = 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}" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     .ui-box |  | ||||||
|       %h5.title |  | ||||||
|         Projects (#{@team.projects.count}) |  | ||||||
|         .pull-right |  | ||||||
|           = link_to 'Add projects', new_admin_team_project_path(@team), class: "btn btn-small", id: :assign_projects_to_team |  | ||||||
|       %ul.well-list#projects_list |  | ||||||
|         - @team.projects.each do |project| |  | ||||||
|           %li.project |  | ||||||
|             = link_to [:admin, project] do |  | ||||||
|               %strong |  | ||||||
|                 = project.name_with_namespace |  | ||||||
| 
 |  | ||||||
|             .pull-right |  | ||||||
|               %span.light |  | ||||||
|                 = @team.human_max_project_access(project) |  | ||||||
|                 |  | ||||||
|               = link_to 'Edit', edit_admin_team_project_path(@team, project), class: "btn btn-small" |  | ||||||
|                 |  | ||||||
|               = 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}" |  | ||||||
|  | @ -93,13 +93,6 @@ | ||||||
|             %li |             %li | ||||||
|               %strong= link_to group.name, admin_group_path(group) |               %strong= link_to group.name, admin_group_path(group) | ||||||
| 
 | 
 | ||||||
|     - if @admin_user.owned_teams.present? |  | ||||||
|       .ui-box |  | ||||||
|         %h5.title Owned teams: |  | ||||||
|         %ul.well-list |  | ||||||
|           - @admin_user.owned_teams.each do |team| |  | ||||||
|             %li |  | ||||||
|               %strong= link_to team.name, admin_team_path(team) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   .span6 |   .span6 | ||||||
|  |  | ||||||
|  | @ -3,16 +3,12 @@ | ||||||
|     = link_to 'Projects', '#projects', 'data-toggle' => 'tab', id: 'sidebar-projects-tab' |     = link_to 'Projects', '#projects', 'data-toggle' => 'tab', id: 'sidebar-projects-tab' | ||||||
|   %li |   %li | ||||||
|     = link_to 'Groups', '#groups', 'data-toggle' => 'tab', id: 'sidebar-groups-tab' |     = link_to 'Groups', '#groups', 'data-toggle' => 'tab', id: 'sidebar-groups-tab' | ||||||
|   %li |  | ||||||
|     = link_to 'Teams', '#teams', 'data-toggle' => 'tab', id: 'sidebar-teams-tab' |  | ||||||
| 
 | 
 | ||||||
| .tab-content | .tab-content | ||||||
|   .tab-pane.active#projects |   .tab-pane.active#projects | ||||||
|     = render "projects", projects: @projects |     = render "projects", projects: @projects | ||||||
|   .tab-pane#groups |   .tab-pane#groups | ||||||
|     = render "groups", groups: @groups |     = render "groups", groups: @groups | ||||||
|   .tab-pane#teams |  | ||||||
|     = render "teams", teams: @teams |  | ||||||
| 
 | 
 | ||||||
| .prepend-top-20 | .prepend-top-20 | ||||||
|   %span.rss-icon |   %span.rss-icon | ||||||
|  |  | ||||||
|  | @ -4,8 +4,6 @@ | ||||||
|       %i.icon-home |       %i.icon-home | ||||||
|   = nav_link(controller: :projects) do |   = nav_link(controller: :projects) do | ||||||
|     = link_to "Projects", admin_projects_path |     = link_to "Projects", admin_projects_path | ||||||
|   = nav_link(controller: :teams) do |  | ||||||
|     = link_to "Teams", admin_teams_path |  | ||||||
|   = nav_link(controller: :groups) do |   = nav_link(controller: :groups) do | ||||||
|     = link_to "Groups", admin_groups_path |     = link_to "Groups", admin_groups_path | ||||||
|   = nav_link(controller: :users) do |   = nav_link(controller: :users) do | ||||||
|  |  | ||||||
|  | @ -1,22 +0,0 @@ | ||||||
| = render "projects/settings_nav" |  | ||||||
| 
 |  | ||||||
| %h3.page_title |  | ||||||
|   = "Assign project to team of users" |  | ||||||
| %hr |  | ||||||
| %p.slead |  | ||||||
|   Read more about assign to team of users #{link_to "here", '#', class: 'vlink'}. |  | ||||||
| = form_tag assign_project_teams_path(@project), method: 'post' do |  | ||||||
|   %p.slead Choose Team of users you want to assign: |  | ||||||
|   .padded |  | ||||||
|     = label_tag :team_id, "Team" |  | ||||||
|     .input= select_tag(:team_id, options_from_collection_for_select(@teams, :id, :name), prompt: "Select team", class: "chosen xxlarge", required: true) |  | ||||||
|   %p.slead Choose greatest user acces in team you want to assign: |  | ||||||
|   .padded |  | ||||||
|     = label_tag :team_ids, "Permission" |  | ||||||
|     .input= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen span3" } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   .actions |  | ||||||
|     = submit_tag 'Assign', class: "btn btn-create" |  | ||||||
|     = link_to "Cancel", project_team_index_path(@project), class: "btn btn-cancel" |  | ||||||
| 
 |  | ||||||
|  | @ -1,33 +0,0 @@ | ||||||
| = form_tag team_filter_path(entity), method: 'get' do |  | ||||||
|   %fieldset.dashboard-search-filter |  | ||||||
|     = search_field_tag "search", params[:search], { placeholder: 'Search', class: 'search-text-input' } |  | ||||||
|     = button_tag type: 'submit', class: 'btn' do |  | ||||||
|       %i.icon-search |  | ||||||
| 
 |  | ||||||
|   %fieldset |  | ||||||
|     %legend Status: |  | ||||||
|     %ul.nav.nav-pills.nav-stacked |  | ||||||
|       %li{class: ("active" if !params[:status])} |  | ||||||
|         = link_to team_filter_path(entity, status: nil) do |  | ||||||
|           Open |  | ||||||
|       %li{class: ("active" if params[:status] == 'closed')} |  | ||||||
|         = link_to team_filter_path(entity, status: 'closed') do |  | ||||||
|           Closed |  | ||||||
|       %li{class: ("active" if params[:status] == 'all')} |  | ||||||
|         = link_to team_filter_path(entity, status: 'all') do |  | ||||||
|           All |  | ||||||
| 
 |  | ||||||
|   %fieldset |  | ||||||
|     %legend Projects: |  | ||||||
|     %ul.nav.nav-pills.nav-stacked |  | ||||||
|       - @projects.each do |project| |  | ||||||
|         - unless entities_per_project(project, entity).zero? |  | ||||||
|           %li{class: ("active" if params[:project_id] == project.id.to_s)} |  | ||||||
|             = link_to team_filter_path(entity, project_id: project.id) do |  | ||||||
|               = project.name_with_namespace |  | ||||||
|               %small.pull-right= entities_per_project(project, entity) |  | ||||||
| 
 |  | ||||||
|   %fieldset |  | ||||||
|     %hr |  | ||||||
|     = link_to "Reset", team_filter_path(entity), class: 'btn pull-right' |  | ||||||
| 
 |  | ||||||
|  | @ -1,22 +0,0 @@ | ||||||
| .ui-box |  | ||||||
|   %h5.title |  | ||||||
|     Projects |  | ||||||
|     %small |  | ||||||
|       (#{projects.count}) |  | ||||||
|     - if can? current_user, :manage_user_team, @team |  | ||||||
|       %span.pull-right |  | ||||||
|         = link_to edit_team_path(@team), class: "btn btn-tiny info" do |  | ||||||
|           %i.icon-plus |  | ||||||
|           Assign Project |  | ||||||
|   %ul.well-list |  | ||||||
|     - if projects.blank? |  | ||||||
|       %p.nothing_here_message This team has no projects yet |  | ||||||
|     - projects.each do |project| |  | ||||||
|       %li |  | ||||||
|         = link_to project_path(project), class: dom_class(project) do |  | ||||||
|           %strong.well-title= truncate(project.name_with_namespace, length: 40) |  | ||||||
|           %span.arrow |  | ||||||
|             → |  | ||||||
|           %span.last_activity |  | ||||||
|             %strong Last activity: |  | ||||||
|             %span= project_last_activity(project) |  | ||||||
|  | @ -1,74 +0,0 @@ | ||||||
| .row |  | ||||||
|   .span3 |  | ||||||
|     %ul.nav.nav-pills.nav-stacked |  | ||||||
|       %li.active |  | ||||||
|         = link_to 'Projects', '#tab-projects', 'data-toggle' => 'tab' |  | ||||||
|       %li |  | ||||||
|         = link_to 'Edit Team', '#tab-edit', 'data-toggle' => 'tab' |  | ||||||
|       - if can? current_user, :admin_user_team, @team |  | ||||||
|         %li |  | ||||||
|           = link_to 'Remove', '#tab-remove', 'data-toggle' => 'tab' |  | ||||||
| 
 |  | ||||||
|   .span9 |  | ||||||
|     .tab-content |  | ||||||
|       .tab-pane.active#tab-projects |  | ||||||
|         .ui-box.projects-table |  | ||||||
|           %h5.title Projects |  | ||||||
|           %ul.well-list |  | ||||||
|             - @projects.each do |project| |  | ||||||
|               %li |  | ||||||
|                 - if project.public |  | ||||||
|                   %i.icon-share |  | ||||||
|                 - else |  | ||||||
|                   %i.icon-lock.cgreen |  | ||||||
|                 = link_to project.name_with_namespace, project |  | ||||||
|                 .pull-right |  | ||||||
|                   = link_to 'Edit max access', edit_team_project_path(@team, project), class: "btn btn-small" |  | ||||||
|                   = 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" |  | ||||||
|         .form-holder |  | ||||||
|           = form_tag team_projects_path(@team), id: "assign_projects", class: "bulk_import", method: :post  do |  | ||||||
|             %table.headless |  | ||||||
|               %tr |  | ||||||
|                 %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' |  | ||||||
|                 %td= select_tag :greatest_project_access, options_for_select(UserTeam.access_roles), {class: "project-access-select chosen" } |  | ||||||
|                 %td= submit_tag 'Add Project', class: "btn btn-create", id: :assign_projects_to_team |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       .tab-pane#tab-edit |  | ||||||
|         .ui-box |  | ||||||
|           %h5.title Edit Team |  | ||||||
|           %div.form-holder |  | ||||||
|             = form_for @team, url: team_path(@team) do |f| |  | ||||||
|               - if @team.errors.any? |  | ||||||
|                 .alert.alert-error |  | ||||||
|                   %span= @team.errors.full_messages.first |  | ||||||
|               .clearfix |  | ||||||
|                 = f.label :name do |  | ||||||
|                   Team name is |  | ||||||
|                 .input |  | ||||||
|                   = f.text_field :name, placeholder: "Ex. OpenSource", class: "xlarge left" |  | ||||||
| 
 |  | ||||||
|               .clearfix.team-description-holder |  | ||||||
|                 = f.label :description, "Details" |  | ||||||
|                 .input |  | ||||||
|                   = f.text_area :description, maxlength: 250, class: "xlarge js-gfm-input", rows: 4 |  | ||||||
| 
 |  | ||||||
|               .clearfix |  | ||||||
|                 = f.label :path do |  | ||||||
|                   Team path is |  | ||||||
|                 .input |  | ||||||
|                   = f.text_field :path, placeholder: "opensource", class: "xlarge left" |  | ||||||
| 
 |  | ||||||
|               .form-actions |  | ||||||
|                 = f.submit 'Save team changes', class: "btn btn-primary" |  | ||||||
| 
 |  | ||||||
|       .tab-pane#tab-remove |  | ||||||
|         .ui-box.ui-box-danger |  | ||||||
|           %h5.title Remove team |  | ||||||
|           .ui-box-body |  | ||||||
|             %p |  | ||||||
|               Remove of team will cause removing members access to projects. |  | ||||||
|             %p |  | ||||||
|               %strong Removed team can not be restored! |  | ||||||
| 
 |  | ||||||
|             = link_to 'Remove team', team_path(@team), method: :delete, confirm: "You are sure?", class: "btn btn-remove btn-small" |  | ||||||
|  | @ -1,23 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Issues |  | ||||||
|   %small (in Team projects assigned to Team members) |  | ||||||
|   %small.pull-right #{@issues.total_count} issues |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| .row |  | ||||||
|   .span3 |  | ||||||
|     = render 'filter', entity: 'issue' |  | ||||||
|   .span9 |  | ||||||
|     - if @issues.any? |  | ||||||
|       - @issues.group_by(&:project).each do |group| |  | ||||||
|         %div.ui-box |  | ||||||
|           - @project = group[0] |  | ||||||
|           %h5.title |  | ||||||
|             = link_to_project @project |  | ||||||
|           %ul.well-list.issues-list |  | ||||||
|             - group[1].each do |issue| |  | ||||||
|               = render issue |  | ||||||
|       %hr |  | ||||||
|       = paginate @issues, theme: "gitlab" |  | ||||||
|     - else |  | ||||||
|       %p.nothing_here_message Nothing to show here |  | ||||||
|  | @ -1,20 +0,0 @@ | ||||||
| = form_tag admin_team_member_path(@team, @member), method: :put do |  | ||||||
|   -if @member.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %ul |  | ||||||
|         - @member.errors.full_messages.each do |msg| |  | ||||||
|           %li= msg |  | ||||||
| 
 |  | ||||||
|   .clearfix |  | ||||||
|     %label Default access for Team projects: |  | ||||||
|     .input |  | ||||||
|       = select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3" |  | ||||||
|   .clearfix |  | ||||||
|     %label Team admin? |  | ||||||
|     .input |  | ||||||
|       = check_box_tag :group_admin, true, @team.admin?(@member) |  | ||||||
| 
 |  | ||||||
|   %br |  | ||||||
|   .actions |  | ||||||
|     = submit_tag 'Save', class: "btn btn-save" |  | ||||||
|     = link_to 'Cancel', :back, class: "btn" |  | ||||||
|  | @ -1,31 +0,0 @@ | ||||||
| - user = member.user |  | ||||||
| - allow_admin = can? current_user, :manage_user_team, @team |  | ||||||
| %li{id: dom_id(member), class: "team_member_row user_#{user.id}"} |  | ||||||
|   .row |  | ||||||
|     .span3 |  | ||||||
|       = link_to user_path(user.username), title: user.name, class: "dark" do |  | ||||||
|         = image_tag gravatar_icon(user.email, 40), class: "avatar s32" |  | ||||||
|       = link_to user_path(user.username), title: user.name, class: "dark" do |  | ||||||
|         %strong= truncate(user.name, lenght: 40) |  | ||||||
|         %br |  | ||||||
|         %small.cgray= user.username |  | ||||||
| 
 |  | ||||||
|     .span5.pull-right |  | ||||||
|       - if allow_admin |  | ||||||
|         .pull-left |  | ||||||
|           = form_for(member, as: :team_member, url: team_member_path(@team, user)) do |f| |  | ||||||
|             = label_tag :group_admin do |  | ||||||
|               = f.check_box :group_admin, class: 'trigger-submit' |  | ||||||
|               %span Admin access |  | ||||||
|               |  | ||||||
|             = f.select :permission, options_for_select(UsersProject.access_roles, @team.default_projects_access(user)), {}, class: "span2 trigger-submit" |  | ||||||
|       .pull-right |  | ||||||
|         - if current_user == user |  | ||||||
|           %span.label.label-success This is you! |  | ||||||
|         - if @team.owner == user |  | ||||||
|           %span.label.label-info Owner |  | ||||||
|         - elsif user.blocked? |  | ||||||
|           %span.label.label-error Blocked |  | ||||||
|         - elsif allow_admin |  | ||||||
|           = 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 |  | ||||||
|             %i.icon-minus.icon-white |  | ||||||
|  | @ -1,10 +0,0 @@ | ||||||
| - grouped_user_team_members(team).each do |access, members| |  | ||||||
|   - access_key = Project.access_options.key(access) |  | ||||||
|   - next if params[:type].present? && params[:type] != access_key.tableize |  | ||||||
|   .ui-box |  | ||||||
|     %h5.title |  | ||||||
|       = access_key.pluralize |  | ||||||
|       %small= members.size |  | ||||||
|     %ul.well-list.team-members |  | ||||||
|       - members.sort_by(&:user_name).each do |member| |  | ||||||
|         = render 'teams/members/member', member: member |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Edit access #{@member.name} in #{@team.name} team |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| %table.zebra-striped |  | ||||||
|   %tr |  | ||||||
|     %td User: |  | ||||||
|     %td= @member.name |  | ||||||
|   %tr |  | ||||||
|     %td Team: |  | ||||||
|     %td= @team.name |  | ||||||
|   %tr |  | ||||||
|     %td Since: |  | ||||||
|     %td= member_since(@team, @member).stamp("Nov 11, 2010") |  | ||||||
| 
 |  | ||||||
| = render 'form' |  | ||||||
|  | @ -1,37 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Team Members |  | ||||||
|   (#{@members.count}) |  | ||||||
|   %small |  | ||||||
|     Read more about project permissions |  | ||||||
|     %strong= link_to "here", help_permissions_path, class: "vlink" |  | ||||||
| 
 |  | ||||||
|   - if can? current_user, :manage_user_team, @team |  | ||||||
|     %span.pull-right |  | ||||||
|       = link_to new_team_member_path(@team), class: "btn btn-primary small grouped", title: "New Team Member" do |  | ||||||
|         New Team Member |  | ||||||
| %hr |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| .row |  | ||||||
|   .span3 |  | ||||||
|     %ul.nav.nav-pills.nav-stacked |  | ||||||
|       %li{class: ("active" if !params[:type])} |  | ||||||
|         = link_to team_members_path(@team, type: nil) do |  | ||||||
|           All |  | ||||||
|       %li{class: ("active" if params[:type] == 'masters')} |  | ||||||
|         = link_to team_members_path(@team, type: 'masters') do |  | ||||||
|           Masters |  | ||||||
|       %li{class: ("active" if params[:type] == 'developers')} |  | ||||||
|         = link_to team_members_path(@team, type: 'developers') do |  | ||||||
|           Developers |  | ||||||
|       %li{class: ("active" if params[:type] == 'reporters')} |  | ||||||
|         = link_to team_members_path(@team, type: 'reporters') do |  | ||||||
|           Reporters |  | ||||||
|       %li{class: ("active" if params[:type] == 'guests')} |  | ||||||
|         = link_to team_members_path(@team, type: 'guests') do |  | ||||||
|           Guests |  | ||||||
| 
 |  | ||||||
|   .span9 |  | ||||||
|     .clearfix |  | ||||||
|     %div.team-table |  | ||||||
|       = render "teams/members/team", team: @team |  | ||||||
|  | @ -1,25 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Team: #{@team.name} |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| 
 |  | ||||||
| = form_tag team_members_path(@team), id: "team_members", class: "bulk_import", method: :post  do |  | ||||||
|   %h6 1. Choose people you want in the team |  | ||||||
|   .clearfix |  | ||||||
|     = label_tag :user_ids, "People" |  | ||||||
|     .input |  | ||||||
|       = users_select_tag(:user_ids, multiple: true) |  | ||||||
| 
 |  | ||||||
|   %h6 2. Set access level for them |  | ||||||
|   .clearfix |  | ||||||
|     = label_tag :project_access, "Project Access" |  | ||||||
|     .input= select_tag :default_project_access, options_for_select(Project.access_options), class: "project-access-select chosen" |  | ||||||
| 
 |  | ||||||
|   .clearfix |  | ||||||
|     = label_tag :group_admin do |  | ||||||
|       %span Team Admin? |  | ||||||
|     .input= check_box_tag :group_admin |  | ||||||
| 
 |  | ||||||
|   .actions |  | ||||||
|     = submit_tag 'Add users', class: "btn btn-create", id: :add_members_to_team |  | ||||||
|     = link_to "Cancel", team_members_path(@team), class: "btn btn-cancel" |  | ||||||
|  | @ -1,24 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Merge Requests |  | ||||||
|   %small (authored by or assigned to Team members) |  | ||||||
|   %small.pull-right #{@merge_requests.total_count} merge requests |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| .row |  | ||||||
|   .span3 |  | ||||||
|     = render 'filter', entity: 'merge_request' |  | ||||||
|   .span9 |  | ||||||
|     - if @merge_requests.any? |  | ||||||
|       - @merge_requests.group_by(&:project).each do |group| |  | ||||||
|         .ui-box |  | ||||||
|           - @project = group[0] |  | ||||||
|           %h5.title |  | ||||||
|             = link_to_project @project |  | ||||||
|           %ul.well-list |  | ||||||
|             - group[1].each do |merge_request| |  | ||||||
|               = render(partial: 'merge_requests/merge_request', locals: {merge_request: merge_request}) |  | ||||||
|       %hr |  | ||||||
|       = paginate @merge_requests, theme: "gitlab" |  | ||||||
| 
 |  | ||||||
|     - else |  | ||||||
|       %h3.nothing_here_message Nothing to show here |  | ||||||
|  | @ -1,37 +0,0 @@ | ||||||
| = form_for @team, url: teams_path do |f| |  | ||||||
|   - if @team.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %span= @team.errors.full_messages.first |  | ||||||
|   .clearfix |  | ||||||
|     = f.label :name do |  | ||||||
|       Team name is |  | ||||||
|     .input |  | ||||||
|       = f.text_field :name, placeholder: "Ex. Ruby Developers", class: "xxlarge left" |  | ||||||
| 
 |  | ||||||
|   .clearfix.team-description-holder |  | ||||||
|     = f.label :description, "Details" |  | ||||||
|     .input |  | ||||||
|       = f.text_area :description, maxlength: 250, class: "xxlarge js-gfm-input", rows: 4 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   .clearfix |  | ||||||
|     .input |  | ||||||
|       %ul |  | ||||||
|         %li All created teams are public (users can view who enter into team and which project are assigned for this team) |  | ||||||
|         %li People within a team see only projects they have access to |  | ||||||
|         %li You will be able to assign existing projects for team |  | ||||||
|   .form-actions |  | ||||||
|     = f.submit 'Create team', class: "btn btn-create" |  | ||||||
| 
 |  | ||||||
|   - if current_user.can_create_group? |  | ||||||
|     .clearfix |  | ||||||
|       .input.light |  | ||||||
|         Need a group for several dependent projects? |  | ||||||
|         = link_to new_group_path, class: "btn btn-tiny" do |  | ||||||
|           Create a group |  | ||||||
|   - if current_user.can_create_project? |  | ||||||
|     .clearfix |  | ||||||
|       .input.light |  | ||||||
|         Want to create a project? |  | ||||||
|         = link_to new_project_path, class: "btn btn-tiny" do |  | ||||||
|           Create a project |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| = form_tag team_project_path(@team, @project), method: :put do |  | ||||||
|   -if @project.errors.any? |  | ||||||
|     .alert.alert-error |  | ||||||
|       %ul |  | ||||||
|         - @project.errors.full_messages.each do |msg| |  | ||||||
|           %li= msg |  | ||||||
| 
 |  | ||||||
|   .clearfix |  | ||||||
|     %label Max access for Team members: |  | ||||||
|     .input |  | ||||||
|       = select_tag :greatest_project_access, options_for_select(UserTeam.access_roles, @team.max_project_access(@project)), class: "project-access-select chosen span3" |  | ||||||
| 
 |  | ||||||
|   %br |  | ||||||
|   .actions |  | ||||||
|     = submit_tag 'Save', class: "btn btn-save" |  | ||||||
|     = link_to 'Cancel', :back, class: "btn btn-cancel" |  | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| %h3.page_title |  | ||||||
|   Edit max access in #{link_to @project.name_with_namespace, @project} for #{link_to(@team.name, team_path(@team))} team |  | ||||||
| 
 |  | ||||||
| %hr |  | ||||||
| 
 |  | ||||||
| = render 'form' |  | ||||||
|  | @ -1,28 +0,0 @@ | ||||||
| xml.instruct! |  | ||||||
| xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do |  | ||||||
|   xml.title   "Team feed - #{@team.name}" |  | ||||||
|   xml.link    :href => team_url(@team, :atom), :rel => "self", :type => "application/atom+xml" |  | ||||||
|   xml.link    :href => team_url(@team), :rel => "alternate", :type => "text/html" |  | ||||||
|   xml.id      projects_url |  | ||||||
|   xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? |  | ||||||
| 
 |  | ||||||
|   @events.each do |event| |  | ||||||
|     if event.proper? |  | ||||||
|       xml.entry do |  | ||||||
|         event_link = event_feed_url(event) |  | ||||||
|         event_title = event_feed_title(event) |  | ||||||
| 
 |  | ||||||
|         xml.id      "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" |  | ||||||
|         xml.link    :href => event_link |  | ||||||
|         xml.title   truncate(event_title, :length => 80) |  | ||||||
|         xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") |  | ||||||
|         xml.media   :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(event.author_email) |  | ||||||
|         xml.author do |author| |  | ||||||
|           xml.name event.author_name |  | ||||||
|           xml.email event.author_email |  | ||||||
|         end |  | ||||||
|         xml.summary event_title |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,25 +0,0 @@ | ||||||
| .dashboard |  | ||||||
|   .activities.span8 |  | ||||||
|     = link_to dashboard_path, class: 'btn btn-tiny' do |  | ||||||
|       ← To dashboard |  | ||||||
|       |  | ||||||
|     %span.cgray Events and projects are filtered in scope of team |  | ||||||
|     %hr |  | ||||||
|     - if @events.any? |  | ||||||
|       .content_list |  | ||||||
|     - else |  | ||||||
|       %p.nothing_here_message Projects activity will be displayed here |  | ||||||
|     .loading.hide |  | ||||||
|   .side.span4 |  | ||||||
|     - if @team.description.present? |  | ||||||
|       .description-block |  | ||||||
|         = @team.description |  | ||||||
|     = render "projects", projects: @projects |  | ||||||
|     .prepend-top-20 |  | ||||||
|       = link_to team_path(@team, { format: :atom, private_token: current_user.private_token }), title: "Feed" do |  | ||||||
|         %strong |  | ||||||
|           %i.icon-rss |  | ||||||
|           News Feed |  | ||||||
| 
 |  | ||||||
|     %hr |  | ||||||
|     = render 'shared/promo' |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| :plain  |  | ||||||
|   Pager.append(#{@events.count}, "#{escape_javascript(render(@events))}"); |  | ||||||
|  | @ -155,20 +155,6 @@ Gitlab::Application.routes.draw do | ||||||
|     resources :users_groups, only: [:create, :update, :destroy] |     resources :users_groups, only: [:create, :update, :destroy] | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   # |  | ||||||
|   # Teams Area |  | ||||||
|   # |  | ||||||
|   resources :teams, constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} do |  | ||||||
|     member do |  | ||||||
|       get :issues |  | ||||||
|       get :merge_requests |  | ||||||
|     end |  | ||||||
|     scope module: :teams do |  | ||||||
|       resources :members,   only: [:index, :new, :create, :edit, :update, :destroy] |  | ||||||
|       resources :projects,  only: [:index, :new, :create, :edit, :update, :destroy], constraints: { id: /[a-zA-Z.0-9_\-\/]+/ } |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create] |   resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create] | ||||||
| 
 | 
 | ||||||
|   devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations } |   devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations } | ||||||
|  | @ -307,18 +293,6 @@ Gitlab::Application.routes.draw do | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     scope module: :projects do |  | ||||||
|       resources :teams, only: [] do |  | ||||||
|         collection do |  | ||||||
|           get :available |  | ||||||
|           post :assign |  | ||||||
|         end |  | ||||||
|         member do |  | ||||||
|           delete :resign |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     resources :notes, only: [:index, :create, :destroy] do |     resources :notes, only: [:index, :create, :destroy] do | ||||||
|       collection do |       collection do | ||||||
|         post :preview |         post :preview | ||||||
|  |  | ||||||
|  | @ -1,241 +0,0 @@ | ||||||
| class Userteams < Spinach::FeatureSteps |  | ||||||
|   include SharedAuthentication |  | ||||||
|   include SharedPaths |  | ||||||
|   include SharedProject |  | ||||||
|   include Select2Helper |  | ||||||
| 
 |  | ||||||
|   When 'I do not have teams with me' do |  | ||||||
|     UserTeam.with_member(current_user).destroy_all |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see dashboard page without teams info block' do |  | ||||||
|     page.has_no_css?(".teams-box").must_equal true |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I have teams with my membership' do |  | ||||||
|     team = create :user_team, owner: current_user |  | ||||||
|     team.add_member(current_user, UserTeam.access_roles["Master"], true) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see dashboard page with teams information block' do |  | ||||||
|     page.should have_css(".teams-box") |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'exist user teams' do |  | ||||||
|     team = create :user_team |  | ||||||
|     team.add_member(current_user, UserTeam.access_roles["Master"], true) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'I click on "All teams" link' do |  | ||||||
|     click_link("All Teams") |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see "All teams" page' do |  | ||||||
|     current_path.should == teams_path |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'I should see exist teams in teams list' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     find_in_list(".teams_list tr", team).must_equal true |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I click to "New team" link' do |  | ||||||
|     click_link("New Team") |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'I submit form with new team info' do |  | ||||||
|     fill_in 'name', with: 'gitlab' |  | ||||||
| 
 |  | ||||||
|     fill_in 'user_team_description', with: 'team description' |  | ||||||
|     click_button 'Create team' |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'I should see newly created team' do |  | ||||||
|     page.should have_content "gitlab" |  | ||||||
|     page.should have_content "team description" |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should be redirected to new team page' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     current_path.should == team_path(team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I have teams with projects and members' do |  | ||||||
|     team = create :user_team, owner: current_user |  | ||||||
|     @project = create :project |  | ||||||
|     team.add_member(current_user, UserTeam.access_roles["Master"], true) |  | ||||||
|     team.assign_to_project(@project, UserTeam.access_roles["Master"]) |  | ||||||
|     @event = create(:closed_issue_event, project: @project) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I visit team page' do |  | ||||||
|     visit team_path(UserTeam.last) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see projects list' do |  | ||||||
|     within(".side .ui-box") do |  | ||||||
|       page.should have_content(@project.name) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'project from team has issues assigned to me' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     team.projects.each do |project| |  | ||||||
|       project.issues << create(:issue, assignee: current_user) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I visit team issues page' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     visit issues_team_path(team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see issues from this team assigned to me' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     team.projects.each do |project| |  | ||||||
|       project.issues.assigned_to(current_user).each do |issue| |  | ||||||
|         page.should have_content issue.title |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Given 'I have team with projects and members' do |  | ||||||
|     team = create :user_team, owner: current_user |  | ||||||
|     project = create :project |  | ||||||
|     user = create :user |  | ||||||
|     team.add_member(current_user, UserTeam.access_roles["Master"], true) |  | ||||||
|     team.add_member(user, UserTeam.access_roles["Developer"], false) |  | ||||||
|     team.assign_to_project(project, UserTeam.access_roles["Master"]) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Given 'project from team has issues assigned to teams members' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     team.projects.each do |project| |  | ||||||
|       team.members.each do |member| |  | ||||||
|         project.issues << create(:issue, assignee: member) |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see issues from this team assigned to teams members' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     team.projects.each do |project| |  | ||||||
|       team.members.each do |member| |  | ||||||
|         project.issues.assigned_to(member).each do |issue| |  | ||||||
|           page.should have_content issue.title |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Given 'project from team has merge requests assigned to me' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     team.projects.each do |project| |  | ||||||
|       create(:merge_request, assignee: current_user, project: project) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I visit team merge requests page' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     visit merge_requests_team_path(team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see merge requests from this team assigned to me' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     team.projects.each do |project| |  | ||||||
|       project.merge_requests.each do |merge_request| |  | ||||||
|         page.should have_content merge_request.title |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Given 'project from team has merge requests assigned to team members' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     team.projects.each do |project| |  | ||||||
|       member = team.members.sample |  | ||||||
|       create(:merge_request, assignee: member, project: project) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Given 'I have new user "John"' do |  | ||||||
|     create :user, name: "John" |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I visit team people page' do |  | ||||||
|     team = UserTeam.last |  | ||||||
|     visit team_members_path(team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'I select user "John" from list with role "Reporter"' do |  | ||||||
|     user = User.find_by_name("John") |  | ||||||
|     select2(user.id, from: "#user_ids", multiple: true) |  | ||||||
|     within "#team_members" do |  | ||||||
|       select "Reporter", from: "default_project_access" |  | ||||||
|     end |  | ||||||
|     click_button "Add" |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see user "John" in team list' do |  | ||||||
|     user = User.find_by_name("John") |  | ||||||
|     team_members_list = find(".team-table") |  | ||||||
|     team_members_list.should have_content user.name |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'I have my own project without teams' do |  | ||||||
|     @project = create :project, namespace: current_user.namespace |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   And 'I visit my team page' do |  | ||||||
|     team = UserTeam.where(owner_id: current_user.id).last |  | ||||||
|     visit team_path(team) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I click on link "Assign Project"' do |  | ||||||
|     click_link "Assign Project" |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see form with my own project in available projects list' do |  | ||||||
|     projects_select = find("#project_ids") |  | ||||||
|     projects_select.should have_content(@project.name) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I submit form with selected project and max access' do |  | ||||||
|     within "#assign_projects" do |  | ||||||
|       select @project.name_with_namespace, from: "project_ids" |  | ||||||
|       select "Reporter", from: "greatest_project_access" |  | ||||||
|     end |  | ||||||
|     click_button "Add" |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   Then 'I should see my own project in team projects list' do |  | ||||||
|     projects = find(".projects-table") |  | ||||||
|     projects.should have_content(@project.name) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   When 'I click link "New Team Member"' do |  | ||||||
|     click_link "New Team Member" |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   protected |  | ||||||
| 
 |  | ||||||
|   def current_team |  | ||||||
|     @user_team ||= UserTeam.first |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def project |  | ||||||
|     current_team.projects.first |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def assigned_to_user key, user |  | ||||||
|     project.send(key).where(assignee_id: user) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   def find_in_list(selector, item) |  | ||||||
|     members_list = all(selector) |  | ||||||
|     entered = false |  | ||||||
|     members_list.each do |member_item| |  | ||||||
|       entered = true if member_item.has_content?(item.name) |  | ||||||
|     end |  | ||||||
|     entered |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,65 +0,0 @@ | ||||||
| Feature: UserTeams |  | ||||||
|   Background: |  | ||||||
|     Given I sign in as a user |  | ||||||
|     And I own project "Shop" |  | ||||||
|     And project "Shop" has push event |  | ||||||
| 
 |  | ||||||
|   Scenario: I should see teams info block |  | ||||||
|     When I have teams with my membership |  | ||||||
|     And I visit dashboard page |  | ||||||
|     Then I should see dashboard page with teams information block |  | ||||||
| 
 |  | ||||||
|   Scenario: I should can create new team |  | ||||||
|     When I have teams with my membership |  | ||||||
|     And I visit dashboard page |  | ||||||
|     When I click to "New team" link |  | ||||||
|     And I submit form with new team info |  | ||||||
|     Then I should be redirected to new team page |  | ||||||
|     Then I should see newly created team |  | ||||||
| 
 |  | ||||||
|   Scenario: I should see team dashboard list |  | ||||||
|     When I have teams with projects and members |  | ||||||
|     When I visit team page |  | ||||||
|     Then I should see projects list |  | ||||||
| 
 |  | ||||||
|   Scenario: I should see team issues list |  | ||||||
|     Given I have team with projects and members |  | ||||||
|     And project from team has issues assigned to me |  | ||||||
|     When I visit team issues page |  | ||||||
|     Then I should see issues from this team assigned to me |  | ||||||
| 
 |  | ||||||
|   Scenario: I should see teams members issues list |  | ||||||
|     Given I have team with projects and members |  | ||||||
|     Given project from team has issues assigned to teams members |  | ||||||
|     When I visit team issues page |  | ||||||
|     Then I should see issues from this team assigned to teams members |  | ||||||
| 
 |  | ||||||
|   Scenario: I should see team merge requests list |  | ||||||
|     Given I have team with projects and members |  | ||||||
|     Given project from team has merge requests assigned to me |  | ||||||
|     When I visit team merge requests page |  | ||||||
|     Then I should see merge requests from this team assigned to me |  | ||||||
| 
 |  | ||||||
|   Scenario: I should see teams members merge requests list |  | ||||||
|     Given I have team with projects and members |  | ||||||
|     Given project from team has merge requests assigned to team members |  | ||||||
|     When I visit team merge requests page |  | ||||||
|     Then I should see merge requests from this team assigned to me |  | ||||||
| 
 |  | ||||||
|   @javascript |  | ||||||
|   Scenario: I should add user to projects in Team |  | ||||||
|     Given I have team with projects and members |  | ||||||
|     Given I have new user "John" |  | ||||||
|     When I visit team people page |  | ||||||
|     When I click link "New Team Member" |  | ||||||
|     And I select user "John" from list with role "Reporter" |  | ||||||
|     Then I should see user "John" in team list |  | ||||||
| 
 |  | ||||||
|   Scenario: I should assign my team to my own project |  | ||||||
|     Given I have team with projects and members |  | ||||||
|     And I have my own project without teams |  | ||||||
|     And I visit my team page |  | ||||||
|     When I click on link "Assign Project" |  | ||||||
|     Then I should see form with my own project in available projects list |  | ||||||
|     When I submit form with selected project and max access |  | ||||||
|     Then I should see my own project in team projects list |  | ||||||
|  | @ -35,7 +35,6 @@ module API | ||||||
|     mount Notes |     mount Notes | ||||||
|     mount Internal |     mount Internal | ||||||
|     mount SystemHooks |     mount SystemHooks | ||||||
|     mount UserTeams |  | ||||||
|     mount ProjectSnippets |     mount ProjectSnippets | ||||||
|     mount DeployKeys |     mount DeployKeys | ||||||
|     mount ProjectHooks |     mount ProjectHooks | ||||||
|  |  | ||||||
|  | @ -99,10 +99,6 @@ module API | ||||||
|       expose :id, :title, :key, :created_at |       expose :id, :title, :key, :created_at | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     class UserTeam < Grape::Entity |  | ||||||
|       expose :id, :name, :path, :owner_id |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     class MergeRequest < Grape::Entity |     class MergeRequest < Grape::Entity | ||||||
|       expose :id, :target_branch, :source_branch, :project_id, :title, :state |       expose :id, :target_branch, :source_branch, :project_id, :title, :state | ||||||
|       expose :author, :assignee, using: Entities::UserBasic |       expose :author, :assignee, using: Entities::UserBasic | ||||||
|  |  | ||||||
|  | @ -1,276 +0,0 @@ | ||||||
| module API |  | ||||||
|   # user_teams API |  | ||||||
|   class UserTeams < Grape::API |  | ||||||
|     before { authenticate! } |  | ||||||
| 
 |  | ||||||
|     resource :user_teams do |  | ||||||
|       helpers do |  | ||||||
|         def handle_team_member_errors(errors) |  | ||||||
|           if errors[:permission].any? |  | ||||||
|             render_api_error!(errors[:permission], 422) |  | ||||||
|           end |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         def validate_access_level?(level) |  | ||||||
|           [UsersProject::GUEST, UsersProject::REPORTER, UsersProject::DEVELOPER, UsersProject::MASTER].include? level.to_i |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Get a user_teams list |  | ||||||
|       # |  | ||||||
|       # Example Request: |  | ||||||
|       #  GET /user_teams |  | ||||||
|       get do |  | ||||||
|         if current_user.admin |  | ||||||
|           @user_teams = paginate UserTeam |  | ||||||
|         else |  | ||||||
|           @user_teams = paginate current_user.user_teams |  | ||||||
|         end |  | ||||||
|         present @user_teams, with: Entities::UserTeam |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Create user_team. Available only for admin |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   name (required) - The name of the user_team |  | ||||||
|       #   path (required) - The path of the user_team |  | ||||||
|       # Example Request: |  | ||||||
|       #   POST /user_teams |  | ||||||
|       post do |  | ||||||
|         authenticated_as_admin! |  | ||||||
|         required_attributes! [:name, :path] |  | ||||||
| 
 |  | ||||||
|         attrs = attributes_for_keys [:name, :path] |  | ||||||
|         @user_team = UserTeam.new(attrs) |  | ||||||
|         @user_team.owner = current_user |  | ||||||
| 
 |  | ||||||
|         if @user_team.save |  | ||||||
|           present @user_team, with: Entities::UserTeam |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Get a single user_team |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       # Example Request: |  | ||||||
|       #   GET /user_teams/:id |  | ||||||
|       get ":id" do |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if current_user.admin or current_user.user_teams.include? @user_team |  | ||||||
|           present @user_team, with: Entities::UserTeam |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Get user_team members |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       # Example Request: |  | ||||||
|       #   GET /user_teams/:id/members |  | ||||||
|       get ":id/members" do |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if current_user.admin or current_user.user_teams.include? @user_team |  | ||||||
|           @members = paginate @user_team.members |  | ||||||
|           present @members, with: Entities::TeamMember, user_team: @user_team |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Add a new user_team member |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       #   user_id (required) - The ID of a user |  | ||||||
|       #   access_level (required) - Project access level |  | ||||||
|       # Example Request: |  | ||||||
|       #   POST /user_teams/:id/members |  | ||||||
|       post ":id/members" do |  | ||||||
|         authenticated_as_admin! |  | ||||||
|         required_attributes! [:user_id, :access_level] |  | ||||||
| 
 |  | ||||||
|         if not validate_access_level?(params[:access_level]) |  | ||||||
|           render_api_error!("Wrong access level", 422) |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if @user_team |  | ||||||
|           team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) |  | ||||||
|           # Not existing member |  | ||||||
|           if team_member.nil? |  | ||||||
|             @user_team.add_member(params[:user_id], params[:access_level], false) |  | ||||||
|             team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) |  | ||||||
| 
 |  | ||||||
|             if team_member.nil? |  | ||||||
|               render_api_error!("Error creating membership", 500) |  | ||||||
|             else |  | ||||||
|               @member = team_member.user |  | ||||||
|               present @member, with: Entities::TeamMember, user_team: @user_team |  | ||||||
|             end |  | ||||||
|           else |  | ||||||
|             render_api_error!("Already exists", 409) |  | ||||||
|           end |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Get a single team member from user_team |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       #   user_id (required) - The ID of a team member |  | ||||||
|       # Example Request: |  | ||||||
|       #   GET /user_teams/:id/members/:user_id |  | ||||||
|       get ":id/members/:user_id" do |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if current_user.admin or current_user.user_teams.include? @user_team |  | ||||||
|           team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) |  | ||||||
|           unless team_member.nil? |  | ||||||
|             present team_member.user, with: Entities::TeamMember, user_team: @user_team |  | ||||||
|           else |  | ||||||
|             not_found! |  | ||||||
|           end |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       # Remove a team member from user_team |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       #   user_id (required) - The ID of a team member |  | ||||||
|       # Example Request: |  | ||||||
|       #   DELETE /user_teams/:id/members/:user_id |  | ||||||
|       delete ":id/members/:user_id" do |  | ||||||
|         authenticated_as_admin! |  | ||||||
| 
 |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if @user_team |  | ||||||
|           team_member = @user_team.user_team_user_relationships.find_by_user_id(params[:user_id]) |  | ||||||
|           unless team_member.nil? |  | ||||||
|             team_member.destroy |  | ||||||
|           else |  | ||||||
|             not_found! |  | ||||||
|           end |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Get to user_team assigned projects |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       # Example Request: |  | ||||||
|       #   GET /user_teams/:id/projects |  | ||||||
|       get ":id/projects" do |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if current_user.admin or current_user.user_teams.include? @user_team |  | ||||||
|           @projects = paginate @user_team.projects |  | ||||||
|           present @projects, with: Entities::TeamProject, user_team: @user_team |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       # Add a new user_team project |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       #   project_id (required) - The ID of a project |  | ||||||
|       #   greatest_access_level (required) - Project access level |  | ||||||
|       # Example Request: |  | ||||||
|       #   POST /user_teams/:id/projects |  | ||||||
|       post ":id/projects" do |  | ||||||
|         authenticated_as_admin! |  | ||||||
|         required_attributes! [:project_id, :greatest_access_level] |  | ||||||
| 
 |  | ||||||
|         if not validate_access_level?(params[:greatest_access_level]) |  | ||||||
|           render_api_error!("Wrong greatest_access_level", 422) |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if @user_team |  | ||||||
|           team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) |  | ||||||
| 
 |  | ||||||
|           # No existing project |  | ||||||
|           if team_project.nil? |  | ||||||
|             @user_team.assign_to_projects([params[:project_id]], params[:greatest_access_level]) |  | ||||||
|             team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) |  | ||||||
|             if team_project.nil? |  | ||||||
|               render_api_error!("Error creating project assignment", 500) |  | ||||||
|             else |  | ||||||
|               @project = team_project.project |  | ||||||
|               present @project, with: Entities::TeamProject, user_team: @user_team |  | ||||||
|             end |  | ||||||
|           else |  | ||||||
|             render_api_error!("Already exists", 409) |  | ||||||
|           end |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       # Show a single team project from user_team |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       #   project_id (required) - The ID of a project assigned to the team |  | ||||||
|       # Example Request: |  | ||||||
|       #   GET /user_teams/:id/projects/:project_id |  | ||||||
|       get ":id/projects/:project_id" do |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if current_user.admin or current_user.user_teams.include? @user_team |  | ||||||
|           team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) |  | ||||||
|           unless team_project.nil? |  | ||||||
|             present team_project.project, with: Entities::TeamProject, user_team: @user_team |  | ||||||
|           else |  | ||||||
|             not_found! |  | ||||||
|           end |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       # Remove a team project from user_team |  | ||||||
|       # |  | ||||||
|       # Parameters: |  | ||||||
|       #   id (required) - The ID of a user_team |  | ||||||
|       #   project_id (required) - The ID of a project assigned to the team |  | ||||||
|       # Example Request: |  | ||||||
|       #   DELETE /user_teams/:id/projects/:project_id |  | ||||||
|       delete ":id/projects/:project_id" do |  | ||||||
|         authenticated_as_admin! |  | ||||||
| 
 |  | ||||||
|         @user_team = UserTeam.find(params[:id]) |  | ||||||
|         if @user_team |  | ||||||
|           team_project = @user_team.user_team_project_relationships.find_by_project_id(params[:project_id]) |  | ||||||
|           unless team_project.nil? |  | ||||||
|             team_project.destroy |  | ||||||
|           else |  | ||||||
|             not_found! |  | ||||||
|           end |  | ||||||
|         else |  | ||||||
|           not_found! |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,146 +0,0 @@ | ||||||
| # UserTeamManager class |  | ||||||
| # |  | ||||||
| # Used for manage User teams with project repositories |  | ||||||
| module Gitlab |  | ||||||
|   class UserTeamManager |  | ||||||
|     class << self |  | ||||||
|       def assign(team, project, access) |  | ||||||
|         project = Project.find(project) unless project.is_a? Project |  | ||||||
|         searched_project = team.user_team_project_relationships.find_by_project_id(project.id) |  | ||||||
| 
 |  | ||||||
|         unless searched_project.present? |  | ||||||
|           team.user_team_project_relationships.create(project_id: project.id, greatest_access: access) |  | ||||||
|           update_team_users_access_in_project(team, project, :added) |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def resign(team, project) |  | ||||||
|         project = Project.find(project) unless project.is_a? Project |  | ||||||
| 
 |  | ||||||
|         team.user_team_project_relationships.with_project(project).destroy_all |  | ||||||
| 
 |  | ||||||
|         update_team_users_access_in_project(team, project, :updated) |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def update_team_user_membership(team, member, options) |  | ||||||
|         updates = {} |  | ||||||
| 
 |  | ||||||
|         if options[:default_projects_access].present? |  | ||||||
|           default_projects_access = options[:default_projects_access].to_s |  | ||||||
| 
 |  | ||||||
|           if default_projects_access != team.default_projects_access(member).to_s |  | ||||||
|             updates[:permission] = default_projects_access |  | ||||||
|           end |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         if options[:group_admin].present? |  | ||||||
|           group_admin = options[:group_admin].to_s == "1" ? true : false |  | ||||||
| 
 |  | ||||||
|           if group_admin != team.admin?(member) |  | ||||||
|             updates[:group_admin] = group_admin |  | ||||||
|           end |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         return true if updates.blank? |  | ||||||
| 
 |  | ||||||
|         user_team_relationship = team.user_team_user_relationships.find_by_user_id(member) |  | ||||||
|         return false unless user_team_relationship.update_attributes(updates) |  | ||||||
| 
 |  | ||||||
|         rebuild_project_permissions_to_member(team, member) if updates[:permission] |  | ||||||
| 
 |  | ||||||
|         true |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def update_project_greates_access(team, project, permission) |  | ||||||
|         project_relation = team.user_team_project_relationships.find_by_project_id(project) |  | ||||||
|         if permission != team.max_project_access(project) |  | ||||||
|           if project_relation.update_attributes(greatest_access: permission) |  | ||||||
|             update_team_users_access_in_project(team, project, :updated) |  | ||||||
|             true |  | ||||||
|           else |  | ||||||
|             false |  | ||||||
|           end |  | ||||||
|         else |  | ||||||
|           true |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def rebuild_project_permissions_to_member(team, member) |  | ||||||
|         team.projects.each do |project| |  | ||||||
|           update_team_user_access_in_project(team, member, project, :updated) |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def update_team_users_access_in_project(team, project, action) |  | ||||||
|         members = team.members |  | ||||||
|         members.each do |member| |  | ||||||
|           update_team_user_access_in_project(team, member, project, action) |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def update_team_user_access_in_project(team, user, project, action) |  | ||||||
|         granted_access = max_teams_member_permission_in_project(user, project, action) |  | ||||||
|         project_team_user = UsersProject.find_by_user_id_and_project_id(user.id, project.id) |  | ||||||
| 
 |  | ||||||
|         if granted_access.zero? |  | ||||||
|           project_team_user.destroy if project_team_user.present? |  | ||||||
|           return |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         if project_team_user.present? |  | ||||||
|           project_team_user.update_attributes(project_access: granted_access) |  | ||||||
|         else |  | ||||||
|           project.team << [user, granted_access] |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def max_teams_member_permission_in_project(user, project, action = nil, teams = nil) |  | ||||||
|         result_access = 0 |  | ||||||
| 
 |  | ||||||
|         teams ||= project.user_teams.with_member(user) |  | ||||||
| 
 |  | ||||||
|         if action && (action == :added) |  | ||||||
|           result_access = project.users_projects.with_user(user).first.project_access if project.users_projects.with_user(user).any? |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         if teams.any? |  | ||||||
|           teams.each do |team| |  | ||||||
|             granted_access = max_team_member_permission_in_project(team, user, project) |  | ||||||
|             result_access = [granted_access, result_access].max |  | ||||||
|           end |  | ||||||
|         end |  | ||||||
|         result_access |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def max_team_member_permission_in_project(team, user, project) |  | ||||||
|         member_access = team.default_projects_access(user) |  | ||||||
|         team_access = team.user_team_project_relationships.find_by_project_id(project.id).greatest_access |  | ||||||
| 
 |  | ||||||
|         [team_access, member_access].min |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def add_member_into_team(team, user, access, admin) |  | ||||||
|         user = User.find(user) unless user.is_a? User |  | ||||||
| 
 |  | ||||||
|         team.user_team_user_relationships.create(user_id: user.id, permission: access, group_admin: admin) |  | ||||||
|         team.projects.each do |project| |  | ||||||
|           update_team_user_access_in_project(team, user, project, :added) |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def remove_member_from_team(team, user) |  | ||||||
|         user = User.find(user) unless user.is_a? User |  | ||||||
| 
 |  | ||||||
|         team.user_team_user_relationships.with_user(user).destroy_all |  | ||||||
|         other_teams = [] |  | ||||||
|         team.projects.each do |project| |  | ||||||
|           other_teams << project.user_teams.with_member(user) |  | ||||||
|         end |  | ||||||
|         other_teams.uniq |  | ||||||
|         unless other_teams.any? |  | ||||||
|           UsersProject.in_projects(team.projects).with_user(user).destroy_all |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| # == Schema Information |  | ||||||
| # |  | ||||||
| # Table name: user_team_project_relationships |  | ||||||
| # |  | ||||||
| #  id              :integer          not null, primary key |  | ||||||
| #  project_id      :integer |  | ||||||
| #  user_team_id    :integer |  | ||||||
| #  greatest_access :integer |  | ||||||
| #  created_at      :datetime         not null |  | ||||||
| #  updated_at      :datetime         not null |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| require 'spec_helper' |  | ||||||
| 
 |  | ||||||
| describe UserTeamProjectRelationship do |  | ||||||
|   pending "add some examples to (or delete) #{__FILE__}" |  | ||||||
| end |  | ||||||
|  | @ -1,37 +0,0 @@ | ||||||
| # == Schema Information |  | ||||||
| # |  | ||||||
| # Table name: user_teams |  | ||||||
| # |  | ||||||
| #  id          :integer          not null, primary key |  | ||||||
| #  name        :string(255) |  | ||||||
| #  path        :string(255) |  | ||||||
| #  owner_id    :integer |  | ||||||
| #  created_at  :datetime         not null |  | ||||||
| #  updated_at  :datetime         not null |  | ||||||
| #  description :string(255)      default(""), not null |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| require 'spec_helper' |  | ||||||
| 
 |  | ||||||
| describe UserTeam do |  | ||||||
|   let(:team) { FactoryGirl.create :user_team } |  | ||||||
| 
 |  | ||||||
|   context ".add_member" do |  | ||||||
|     let(:user) { FactoryGirl.create :user } |  | ||||||
| 
 |  | ||||||
|     it "should work" do |  | ||||||
|       team.add_member(user, UsersProject::DEVELOPER, false) |  | ||||||
|       team.members.should include(user) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   context ".remove_member" do |  | ||||||
|     let(:user) { FactoryGirl.create :user } |  | ||||||
|     before { team.add_member(user, UsersProject::DEVELOPER, false) } |  | ||||||
| 
 |  | ||||||
|     it "should work" do |  | ||||||
|       team.remove_member(user) |  | ||||||
|       team.members.should_not include(user) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,18 +0,0 @@ | ||||||
| # == Schema Information |  | ||||||
| # |  | ||||||
| # Table name: user_team_user_relationships |  | ||||||
| # |  | ||||||
| #  id           :integer          not null, primary key |  | ||||||
| #  user_id      :integer |  | ||||||
| #  user_team_id :integer |  | ||||||
| #  group_admin  :boolean |  | ||||||
| #  permission   :integer |  | ||||||
| #  created_at   :datetime         not null |  | ||||||
| #  updated_at   :datetime         not null |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| require 'spec_helper' |  | ||||||
| 
 |  | ||||||
| describe UserTeamUserRelationship do |  | ||||||
|   pending "add some examples to (or delete) #{__FILE__}" |  | ||||||
| end |  | ||||||
|  | @ -1,360 +0,0 @@ | ||||||
| require 'spec_helper' |  | ||||||
| 
 |  | ||||||
| describe API::API do |  | ||||||
|   include ApiHelpers |  | ||||||
| 
 |  | ||||||
|   # Create test objects |  | ||||||
|   let(:user1) { create(:user) } |  | ||||||
|   let(:user2) { create(:user) } |  | ||||||
|   let(:admin) { create(:admin) } |  | ||||||
|   let!(:group1) { create(:group, owner: user1) } |  | ||||||
|   let!(:group2) { create(:group, owner: user2) } |  | ||||||
|   let(:user_team1) { create(:user_team, owner: user1) } |  | ||||||
|   let(:user_team2) { create(:user_team, owner: user2) } |  | ||||||
|   let!(:project1) { create(:project, creator_id: admin.id) } |  | ||||||
|   let!(:project2) { create(:project, creator_id: admin.id) } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   before { |  | ||||||
|     # Add members to teams |  | ||||||
|     user_team1.add_member(user1, UsersProject::MASTER, false) |  | ||||||
|     user_team2.add_member(user2, UsersProject::MASTER, false) |  | ||||||
| 
 |  | ||||||
|     # Add projects to teams |  | ||||||
|     user_team1.assign_to_projects([project1.id], UsersProject::MASTER) |  | ||||||
|     user_team2.assign_to_projects([project2.id], UsersProject::MASTER) |  | ||||||
| 
 |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   describe "GET /user_teams" do |  | ||||||
|     context "when unauthenticated" do |  | ||||||
|       it "should return authentication error" do |  | ||||||
|         get api("/user_teams") |  | ||||||
|         response.status.should == 401 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "normal user: should return an array of user_teams of user1" do |  | ||||||
|         get api("/user_teams", user1) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response.should be_an Array |  | ||||||
|         json_response.length.should == 1 |  | ||||||
|         json_response.first['name'].should == user_team1.name |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "admin: should return an array of all user_teams" do |  | ||||||
|         get api("/user_teams", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response.should be_an Array |  | ||||||
|         json_response.length.should == 2 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   describe "GET /user_teams/:id" do |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "should return one of user1's user_teams" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}", user1) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response['name'] == user_team1.name |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should not return a non existing team" do |  | ||||||
|         get api("/user_teams/1328", user1) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should not return a user_team not attached to user1" do |  | ||||||
|         get api("/user_teams/#{user_team2.id}", user1) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should return any existing user_team" do |  | ||||||
|         get api("/user_teams/#{user_team2.id}", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response['name'].should == user_team2.name |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should not return a non existing user_team" do |  | ||||||
|         get api("/user_teams/1328", admin) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   describe "POST /user_teams" do |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "should not create user_team" do |  | ||||||
|         count_before=UserTeam.count |  | ||||||
|         post api("/user_teams", user1), attributes_for(:user_team) |  | ||||||
|         response.status.should == 403 |  | ||||||
|         UserTeam.count.should == count_before |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should create user_team" do |  | ||||||
|         count_before=UserTeam.count |  | ||||||
|         post api("/user_teams", admin), attributes_for(:user_team) |  | ||||||
|         response.status.should == 201 |  | ||||||
|         UserTeam.count.should == count_before + 1 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should not create user_team, duplicate" do |  | ||||||
|         post api("/user_teams", admin), {:name => "Duplicate Test", :path => user_team2.path} |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should return 400 bad request error if name not given" do |  | ||||||
|         post api("/user_teams", admin), {:path => user_team2.path} |  | ||||||
|         response.status.should == 400 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should return 400 bad request error if path not given" do |  | ||||||
|         post api("/user_teams", admin), {:name => 'test'} |  | ||||||
|         response.status.should == 400 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   # Members |  | ||||||
| 
 |  | ||||||
|   describe "GET /user_teams/:id/members" do |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "should return user1 as member of user1's user_teams" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/members", user1) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response.first['name'].should == user1.name |  | ||||||
|         json_response.first['access_level'].should == UsersProject::MASTER |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should return member of any existing user_team" do |  | ||||||
|         get api("/user_teams/#{user_team2.id}/members", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response.first['name'].should == user2.name |  | ||||||
|         json_response.first['access_level'].should == UsersProject::MASTER |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   describe "POST /user_teams/:id/members" do |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "should not add user2 as member of user_team1" do |  | ||||||
|         post api("/user_teams/#{user_team1.id}/members", user1), user_id: user2.id, access_level: UsersProject::MASTER |  | ||||||
|         response.status.should == 403 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should return ok and add new member" do |  | ||||||
|         count_before=user_team1.user_team_user_relationships.count |  | ||||||
|         post api("/user_teams/#{user_team1.id}/members", admin), user_id: user2.id, access_level: UsersProject::MASTER |  | ||||||
|         response.status.should == 201 |  | ||||||
|         json_response['name'].should == user2.name |  | ||||||
|         json_response['access_level'].should == UsersProject::MASTER |  | ||||||
|         user_team1.user_team_user_relationships.count.should == count_before + 1 |  | ||||||
|       end |  | ||||||
|       it "should return ok if member already exists" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/members", admin), user_id: user2.id, access_level: UsersProject::MASTER |  | ||||||
|         response.status.should == 409 |  | ||||||
|       end |  | ||||||
|       it "should return a 400 error when user id is not given" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/members", admin), access_level: UsersProject::MASTER |  | ||||||
|         response.status.should == 400 |  | ||||||
|       end |  | ||||||
|       it "should return a 400 error when access level is not given" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/members", admin), user_id: user2.id |  | ||||||
|         response.status.should == 400 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should return a 422 error when access level is not known" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/members", admin), user_id: user1.id, access_level: 1234 |  | ||||||
|         response.status.should == 422 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   # Get single member |  | ||||||
|   describe "GET /user_teams/:id/members/:user_id" do |  | ||||||
|     context "when authenticated as member" do |  | ||||||
|       it "should show user1's membership of user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/members/#{user1.id}", user1) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response['name'].should == user1.name |  | ||||||
|         json_response['access_level'].should == UsersProject::MASTER |  | ||||||
|       end |  | ||||||
|       it "should show that user2 is not member of user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/members/#{user2.id}", user1) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as non-member" do |  | ||||||
|       it "should not show user1's membership of user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/members/#{user1.id}", user2) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should show user1's membership of user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/members/#{user1.id}", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response['name'].should == user1.name |  | ||||||
|         json_response['access_level'].should == UsersProject::MASTER |  | ||||||
|       end |  | ||||||
|       it "should return a 404 error when user id is not known" do |  | ||||||
|         get api("/user_teams/#{user_team2.id}/members/1328", admin) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   describe "DELETE /user_teams/:id/members/:user_id" do |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "should not delete user1's membership of user_team1" do |  | ||||||
|         delete api("/user_teams/#{user_team1.id}/members/#{user1.id}", user1) |  | ||||||
|         response.status.should == 403 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should delete user1's membership of user_team1" do |  | ||||||
|         count_before=user_team1.user_team_user_relationships.count |  | ||||||
|         delete api("/user_teams/#{user_team1.id}/members/#{user1.id}", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         user_team1.user_team_user_relationships.count.should == count_before - 1 |  | ||||||
|       end |  | ||||||
|       it "should return a 404 error when user id is not known" do |  | ||||||
|         delete api("/user_teams/#{user_team2.id}/members/1328", admin) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   # Projects |  | ||||||
| 
 |  | ||||||
|   describe "GET /user_teams/:id/projects" do |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "should return project1 as assigned to user_team1 as member user1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/projects", user1) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response.first['name'].should == project1.name |  | ||||||
|         json_response.length.should == user_team1.user_team_project_relationships.count |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should return project2 as assigned to user_team2 as non-member, but admin" do |  | ||||||
|         get api("/user_teams/#{user_team2.id}/projects", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response.first['name'].should == project2.name |  | ||||||
|         json_response.first['greatest_access_level'].should == UsersProject::MASTER |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   describe "POST /user_teams/:id/projects" do |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should return ok and add new project" do |  | ||||||
|         count_before=user_team1.user_team_project_relationships.count |  | ||||||
|         post api("/user_teams/#{user_team1.id}/projects", admin), |  | ||||||
|              project_id: project2.id, |  | ||||||
|              greatest_access_level: UsersProject::MASTER |  | ||||||
|         response.status.should == 201 |  | ||||||
|         json_response['name'].should == project2.name |  | ||||||
|         json_response['greatest_access_level'].should == UsersProject::MASTER |  | ||||||
|         user_team1.user_team_project_relationships.count.should == count_before + 1 |  | ||||||
|       end |  | ||||||
|       it "should return ok if project already exists" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/projects", admin), |  | ||||||
|              project_id: project2.id, |  | ||||||
|              greatest_access_level: UsersProject::MASTER |  | ||||||
|         response.status.should == 409 |  | ||||||
|       end |  | ||||||
|       it "should return a 400 error when project id is not given" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/projects", admin), greatest_access_level: UsersProject::MASTER |  | ||||||
|         response.status.should == 400 |  | ||||||
|       end |  | ||||||
|       it "should return a 400 error when access level is not given" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/projects", admin), project_id: project2.id |  | ||||||
|         response.status.should == 400 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       it "should return a 422 error when access level is not known" do |  | ||||||
|         post api("/user_teams/#{user_team2.id}/projects", admin), |  | ||||||
|              project_id: project2.id, |  | ||||||
|              greatest_access_level: 1234 |  | ||||||
|         response.status.should == 422 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   describe "GET /user_teams/:id/projects/:project_id" do |  | ||||||
|     context "when authenticated as member" do |  | ||||||
|       it "should show project1's assignment to user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/projects/#{project1.id}", user1) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response['name'].should == project1.name |  | ||||||
|         json_response['greatest_access_level'].should == UsersProject::MASTER |  | ||||||
|       end |  | ||||||
|       it "should show project2's is not assigned to user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/projects/#{project2.id}", user1) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as non-member" do |  | ||||||
|       it "should not show project1's assignment to user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/projects/#{project1.id}", user2) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should show project1's assignment to user_team1" do |  | ||||||
|         get api("/user_teams/#{user_team1.id}/projects/#{project1.id}", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         json_response['name'].should == project1.name |  | ||||||
|         json_response['greatest_access_level'].should == UsersProject::MASTER |  | ||||||
|       end |  | ||||||
|       it "should return a 404 error when project id is not known" do |  | ||||||
|         get api("/user_teams/#{user_team2.id}/projects/1328", admin) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   describe "DELETE /user_teams/:id/projects/:project_id" do |  | ||||||
|     context "when authenticated as user" do |  | ||||||
|       it "should not delete project1's assignment to user_team2" do |  | ||||||
|         delete api("/user_teams/#{user_team2.id}/projects/#{project1.id}", user1) |  | ||||||
|         response.status.should == 403 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     context "when authenticated as admin" do |  | ||||||
|       it "should delete project1's assignment to user_team1" do |  | ||||||
|         count_before=user_team1.user_team_project_relationships.count |  | ||||||
|         delete api("/user_teams/#{user_team1.id}/projects/#{project1.id}", admin) |  | ||||||
|         response.status.should == 200 |  | ||||||
|         user_team1.user_team_project_relationships.count.should == count_before - 1 |  | ||||||
|       end |  | ||||||
|       it "should return a 404 error when project id is not known" do |  | ||||||
|         delete api("/user_teams/#{user_team2.id}/projects/1328", admin) |  | ||||||
|         response.status.should == 404 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
| end |  | ||||||
		Loading…
	
		Reference in New Issue