diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-09-22 17:25:49 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-09-22 17:25:49 +0000 |
commit | 8cd882355edf7b88011ad7fca13ccba5f948001b (patch) | |
tree | f55e11d8d2c8d5a3f4b728a392194579f93a85f9 /app | |
parent | b3c53efc42ff242e948393ddf7fb3ea6fb340480 (diff) | |
parent | 648557048226ba98c514531135e96df9c34bdda7 (diff) | |
download | gitlab-ce-8cd882355edf7b88011ad7fca13ccba5f948001b.tar.gz |
Merge branch '7-4-pre' into 'master'
7.4 development
Development branch during `master` code freeze for 7.3
See merge request !1096
Diffstat (limited to 'app')
52 files changed, 351 insertions, 363 deletions
diff --git a/app/assets/javascripts/admin.js.coffee b/app/assets/javascripts/admin.js.coffee index 6634bb6cc34..a333eed87f2 100644 --- a/app/assets/javascripts/admin.js.coffee +++ b/app/assets/javascripts/admin.js.coffee @@ -46,10 +46,10 @@ class Admin modal.hide() $('.change-owner-link').show() - $('li.users_project').bind 'ajax:success', -> + $('li.project_member').bind 'ajax:success', -> Turbolinks.visit(location.href) - $('li.users_group').bind 'ajax:success', -> + $('li.group_member').bind 'ajax:success', -> Turbolinks.visit(location.href) @Admin = Admin diff --git a/app/assets/javascripts/groups.js.coffee b/app/assets/javascripts/groups.js.coffee index 49d6605980b..4b1000f9a6a 100644 --- a/app/assets/javascripts/groups.js.coffee +++ b/app/assets/javascripts/groups.js.coffee @@ -1,6 +1,6 @@ class GroupMembers constructor: -> - $('li.users_group').bind 'ajax:success', -> + $('li.group_member').bind 'ajax:success', -> $(this).fadeOut() @GroupMembers = GroupMembers diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 0388997ec69..e6d0c9323c1 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -8,7 +8,7 @@ class Admin::GroupsController < Admin::ApplicationController end def show - @members = @group.members.order("group_access DESC").page(params[:members_page]).per(30) + @members = @group.members.order("access_level DESC").page(params[:members_page]).per(30) @projects = @group.projects.page(params[:projects_page]).per(30) end @@ -40,7 +40,7 @@ class Admin::GroupsController < Admin::ApplicationController end def project_teams_update - @group.add_users(params[:user_ids].split(','), params[:group_access]) + @group.add_users(params[:user_ids].split(','), params[:access_level]) redirect_to [:admin, @group], notice: 'Users were successfully added.' end diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb index 1c7c09d0cd4..2f0d344802f 100644 --- a/app/controllers/admin/projects_controller.rb +++ b/app/controllers/admin/projects_controller.rb @@ -16,10 +16,10 @@ class Admin::ProjectsController < Admin::ApplicationController def show if @group - @group_members = @group.members.order("group_access DESC").page(params[:group_members_page]).per(30) + @group_members = @group.members.order("access_level DESC").page(params[:group_members_page]).per(30) end - @project_members = @project.users_projects.page(params[:project_members_page]).per(30) + @project_members = @project.project_members.page(params[:project_members_page]).per(30) end def transfer diff --git a/app/controllers/users_groups_controller.rb b/app/controllers/groups/group_members_controller.rb index a35a12a866b..63c05d4f33b 100644 --- a/app/controllers/users_groups_controller.rb +++ b/app/controllers/groups/group_members_controller.rb @@ -1,4 +1,4 @@ -class UsersGroupsController < ApplicationController +class Groups::GroupMembersController < ApplicationController before_filter :group # Authorize @@ -7,18 +7,18 @@ class UsersGroupsController < ApplicationController layout 'group' def create - @group.add_users(params[:user_ids].split(','), params[:group_access]) + @group.add_users(params[:user_ids].split(','), params[:access_level]) redirect_to members_group_path(@group), notice: 'Users were successfully added.' end def update - @member = @group.users_groups.find(params[:id]) + @member = @group.group_members.find(params[:id]) @member.update_attributes(member_params) end def destroy - @users_group = @group.users_groups.find(params[:id]) + @users_group = @group.group_members.find(params[:id]) if can?(current_user, :destroy, @users_group) # May fail if last owner. @users_group.destroy respond_to do |format| @@ -43,6 +43,6 @@ class UsersGroupsController < ApplicationController end def member_params - params.require(:users_group).permit(:group_access, :user_id) + params.require(:group_member).permit(:access_level, :user_id) end end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index ddde90d3ee0..36222758eb2 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -65,15 +65,15 @@ class GroupsController < ApplicationController def members @project = group.projects.find(params[:project_id]) if params[:project_id] - @members = group.users_groups + @members = group.group_members if params[:search].present? users = group.users.search(params[:search]).to_a @members = @members.where(user_id: users) end - @members = @members.order('group_access DESC').page(params[:page]).per(50) - @users_group = UsersGroup.new + @members = @members.order('access_level DESC').page(params[:page]).per(50) + @users_group = GroupMember.new end def edit diff --git a/app/controllers/profiles/groups_controller.rb b/app/controllers/profiles/groups_controller.rb index 9a4d088651e..ce9dd50df67 100644 --- a/app/controllers/profiles/groups_controller.rb +++ b/app/controllers/profiles/groups_controller.rb @@ -2,11 +2,11 @@ class Profiles::GroupsController < ApplicationController layout "profile" def index - @user_groups = current_user.users_groups.page(params[:page]).per(20) + @user_groups = current_user.group_members.page(params[:page]).per(20) end def leave - @users_group = group.users_groups.where(user_id: current_user.id).first + @users_group = group.group_members.where(user_id: current_user.id).first if can?(current_user, :destroy, @users_group) @users_group.destroy redirect_to(profile_groups_path, info: "You left #{group.name} group.") diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb index 5c492aeb49d..638d1f9789b 100644 --- a/app/controllers/profiles/notifications_controller.rb +++ b/app/controllers/profiles/notifications_controller.rb @@ -3,8 +3,8 @@ class Profiles::NotificationsController < ApplicationController def show @notification = current_user.notification - @users_projects = current_user.users_projects - @users_groups = current_user.users_groups + @project_members = current_user.project_members + @group_members = current_user.group_members end def update @@ -14,13 +14,13 @@ class Profiles::NotificationsController < ApplicationController current_user.notification_level = params[:notification_level] current_user.save elsif type == 'group' - users_group = current_user.users_groups.find(params[:notification_id]) + users_group = current_user.group_members.find(params[:notification_id]) users_group.notification_level = params[:notification_level] users_group.save else - users_project = current_user.users_projects.find(params[:notification_id]) - users_project.notification_level = params[:notification_level] - users_project.save + project_member = current_user.project_members.find(params[:notification_id]) + project_member.notification_level = params[:notification_level] + project_member.save end end end diff --git a/app/controllers/projects/team_members_controller.rb b/app/controllers/projects/team_members_controller.rb index 1de5bac9ee8..7bb799eba64 100644 --- a/app/controllers/projects/team_members_controller.rb +++ b/app/controllers/projects/team_members_controller.rb @@ -6,17 +6,17 @@ class Projects::TeamMembersController < Projects::ApplicationController def index @group = @project.group - @users_projects = @project.users_projects.order('project_access DESC') + @project_members = @project.project_members.order('access_level DESC') end def new - @user_project_relation = project.users_projects.new + @user_project_relation = project.project_members.new end def create users = User.where(id: params[:user_ids].split(',')) - @project.team << [users, params[:project_access]] + @project.team << [users, params[:access_level]] if params[:redirect_to] redirect_to params[:redirect_to] @@ -26,7 +26,7 @@ class Projects::TeamMembersController < Projects::ApplicationController end def update - @user_project_relation = project.users_projects.find_by(user_id: member) + @user_project_relation = project.project_members.find_by(user_id: member) @user_project_relation.update_attributes(member_params) unless @user_project_relation.valid? @@ -36,7 +36,7 @@ class Projects::TeamMembersController < Projects::ApplicationController end def destroy - @user_project_relation = project.users_projects.find_by(user_id: member) + @user_project_relation = project.project_members.find_by(user_id: member) @user_project_relation.destroy respond_to do |format| @@ -46,7 +46,7 @@ class Projects::TeamMembersController < Projects::ApplicationController end def leave - project.users_projects.find_by(user_id: current_user).destroy + project.project_members.find_by(user_id: current_user).destroy respond_to do |format| format.html { redirect_to :back } @@ -69,6 +69,6 @@ class Projects::TeamMembersController < Projects::ApplicationController end def member_params - params.require(:team_member).permit(:user_id, :project_access) + params.require(:project_member).permit(:user_id, :access_level) end end diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb index 26898bad493..c81bb51583a 100644 --- a/app/finders/projects_finder.rb +++ b/app/finders/projects_finder.rb @@ -19,10 +19,8 @@ class ProjectsFinder # Return ALL group projects group.projects else - projects_members = UsersProject.where( - project_id: group.projects, - user_id: current_user - ) + projects_members = ProjectMember.in_projects(group.projects). + with_user(current_user) if projects_members.any? # User is a project member @@ -34,7 +32,7 @@ class ProjectsFinder # group.projects.where( "projects.id IN (?) OR projects.visibility_level IN (?)", - projects_members.pluck(:project_id), + projects_members.pluck(:source_id), Project.public_and_internal_levels ) else diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c2c9301cc17..07938b8065d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -187,13 +187,6 @@ module ApplicationHelper end end - def first_line(str) - lines = str.split("\n") - line = lines.first - line += "..." if lines.size > 1 - line - end - def broadcast_message BroadcastMessage.current end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index a4f93689a7b..6f738764b0e 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -136,7 +136,7 @@ module EventsHelper end def event_note(text) - text = first_line(text) + text = first_line_in_markdown(text) text = truncate(text, length: 150) sanitize(markdown(text), tags: %w(a img b pre p)) end diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index e4aa90154fb..d269323542f 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -51,6 +51,14 @@ module GitlabMarkdownHelper @markdown.render(text).html_safe end + def first_line_in_markdown(text) + line = text.split("\n").detect do |i| + i.present? && markdown(i).present? + end + line += '...' unless line.nil? + line + end + def render_wiki_content(wiki_page) if wiki_page.format == :markdown markdown(wiki_page.content) diff --git a/app/mailers/emails/groups.rb b/app/mailers/emails/groups.rb index 1654fc55bca..8c09389985e 100644 --- a/app/mailers/emails/groups.rb +++ b/app/mailers/emails/groups.rb @@ -1,7 +1,7 @@ module Emails module Groups def group_access_granted_email(user_group_id) - @membership = UsersGroup.find(user_group_id) + @membership = GroupMember.find(user_group_id) @group = @membership.group @target_url = group_url(@group) mail(to: @membership.user.email, diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb index 6b13a1d746d..d6edfd7059f 100644 --- a/app/mailers/emails/projects.rb +++ b/app/mailers/emails/projects.rb @@ -1,10 +1,10 @@ module Emails module Projects def project_access_granted_email(user_project_id) - @users_project = UsersProject.find user_project_id - @project = @users_project.project + @project_member = ProjectMember.find user_project_id + @project = @project_member.project @target_url = project_url(@project) - mail(to: @users_project.user.email, + mail(to: @project_member.user.email, subject: subject("Access to project was granted")) end diff --git a/app/models/ability.rb b/app/models/ability.rb index f1d57de63bb..716a23a4284 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -14,7 +14,7 @@ class Ability when "MergeRequest" then merge_request_abilities(user, subject) when "Group" then group_abilities(user, subject) when "Namespace" then namespace_abilities(user, subject) - when "UsersGroup" then users_group_abilities(user, subject) + when "GroupMember" then users_group_abilities(user, subject) else [] end.concat(global_abilities(user)) end diff --git a/app/models/concerns/notifiable.rb b/app/models/concerns/notifiable.rb index 722f375e71d..d7dcd97911d 100644 --- a/app/models/concerns/notifiable.rb +++ b/app/models/concerns/notifiable.rb @@ -1,6 +1,6 @@ # == Notifiable concern # -# Contains notification functionality shared between UsersProject and UsersGroup +# Contains notification functionality # module Notifiable extend ActiveSupport::Concern diff --git a/app/models/group.rb b/app/models/group.rb index 66239f7fe6f..b8ed3b8ac73 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -17,8 +17,8 @@ require 'carrierwave/orm/activerecord' require 'file_size_validator' class Group < Namespace - has_many :users_groups, dependent: :destroy - has_many :users, through: :users_groups + has_many :group_members, dependent: :destroy, as: :source, class_name: 'GroupMember' + has_many :users, through: :group_members validate :avatar_type, if: ->(user) { user.avatar_changed? } validates :avatar, file_size: { maximum: 100.kilobytes.to_i } @@ -30,22 +30,22 @@ class Group < Namespace end def owners - @owners ||= users_groups.owners.map(&:user) + @owners ||= group_members.owners.map(&:user) end - def add_users(user_ids, group_access) + def add_users(user_ids, access_level) user_ids.compact.each do |user_id| - user = self.users_groups.find_or_initialize_by(user_id: user_id) - user.update_attributes(group_access: group_access) + user = self.group_members.find_or_initialize_by(user_id: user_id) + user.update_attributes(access_level: access_level) end end - def add_user(user, group_access) - self.users_groups.create(user_id: user.id, group_access: group_access) + def add_user(user, access_level) + self.group_members.create(user_id: user.id, access_level: access_level) end def add_owner(user) - self.add_user(user, UsersGroup::OWNER) + self.add_user(user, Gitlab::Access::OWNER) end def has_owner?(user) @@ -61,7 +61,7 @@ class Group < Namespace end def members - users_groups + group_members end def avatar_type diff --git a/app/models/project_hook.rb b/app/models/hooks/project_hook.rb index 21867a9316c..21867a9316c 100644 --- a/app/models/project_hook.rb +++ b/app/models/hooks/project_hook.rb diff --git a/app/models/service_hook.rb b/app/models/hooks/service_hook.rb index 2e11239c40b..2e11239c40b 100644 --- a/app/models/service_hook.rb +++ b/app/models/hooks/service_hook.rb diff --git a/app/models/system_hook.rb b/app/models/hooks/system_hook.rb index ee32b49bc66..ee32b49bc66 100644 --- a/app/models/system_hook.rb +++ b/app/models/hooks/system_hook.rb diff --git a/app/models/web_hook.rb b/app/models/hooks/web_hook.rb index 752eb8074ac..752eb8074ac 100644 --- a/app/models/web_hook.rb +++ b/app/models/hooks/web_hook.rb diff --git a/app/models/member.rb b/app/models/member.rb new file mode 100644 index 00000000000..7dc13c18bf3 --- /dev/null +++ b/app/models/member.rb @@ -0,0 +1,20 @@ +class Member < ActiveRecord::Base + include Notifiable + include Gitlab::Access + + belongs_to :user + belongs_to :source, polymorphic: true + + validates :user, presence: true + validates :source, presence: true + validates :user_id, uniqueness: { scope: [:source_type, :source_id], message: "already exists in source" } + validates :access_level, inclusion: { in: Gitlab::Access.all_values }, presence: true + + scope :guests, -> { where(access_level: GUEST) } + scope :reporters, -> { where(access_level: REPORTER) } + scope :developers, -> { where(access_level: DEVELOPER) } + scope :masters, -> { where(access_level: MASTER) } + scope :owners, -> { where(access_level: OWNER) } + + delegate :name, :username, :email, to: :user, prefix: true +end diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb new file mode 100644 index 00000000000..e72393c4278 --- /dev/null +++ b/app/models/members/group_member.rb @@ -0,0 +1,43 @@ +class GroupMember < Member + SOURCE_TYPE = 'Namespace' + + belongs_to :group, class_name: 'Group', foreign_key: 'source_id' + + # Make sure group member points only to group as it source + default_value_for :source_type, SOURCE_TYPE + default_value_for :notification_level, Notification::N_GLOBAL + validates_format_of :source_type, with: /\ANamespace\z/ + default_scope { where(source_type: SOURCE_TYPE) } + + scope :with_group, ->(group) { where(source_id: group.id) } + scope :with_user, ->(user) { where(user_id: user.id) } + + after_create :notify_create + after_update :notify_update + + def self.access_level_roles + Gitlab::Access.options_with_owner + end + + def group + source + end + + def access_field + access_level + end + + def notify_create + notification_service.new_group_member(self) + end + + def notify_update + if access_level_changed? + notification_service.update_group_member(self) + end + end + + def notification_service + NotificationService.new + end +end diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb new file mode 100644 index 00000000000..f14900ad3e6 --- /dev/null +++ b/app/models/members/project_member.rb @@ -0,0 +1,137 @@ +class ProjectMember < Member + SOURCE_TYPE = 'Project' + + include Gitlab::ShellAdapter + + belongs_to :project, class_name: 'Project', foreign_key: 'source_id' + + + # Make sure project member points only to project as it source + default_value_for :source_type, SOURCE_TYPE + default_value_for :notification_level, Notification::N_GLOBAL + validates_format_of :source_type, with: /\AProject\z/ + default_scope { where(source_type: SOURCE_TYPE) } + + after_create :post_create_hook + after_update :post_update_hook + after_destroy :post_destroy_hook + + scope :in_project, ->(project) { where(source_id: project.id) } + scope :in_projects, ->(projects) { where(source_id: projects.pluck(:id)) } + scope :with_user, ->(user) { where(user_id: user.id) } + + class << self + + # Add users to project teams with passed access option + # + # access can be an integer representing a access code + # or symbol like :master representing role + # + # Ex. + # add_users_into_projects( + # project_ids, + # user_ids, + # ProjectMember::MASTER + # ) + # + # add_users_into_projects( + # project_ids, + # user_ids, + # :master + # ) + # + def add_users_into_projects(project_ids, user_ids, access) + access_level = if roles_hash.has_key?(access) + roles_hash[access] + elsif roles_hash.values.include?(access.to_i) + access + else + raise "Non valid access" + end + + ProjectMember.transaction do + project_ids.each do |project_id| + user_ids.each do |user_id| + member = ProjectMember.new(access_level: access_level, user_id: user_id) + member.source_id = project_id + member.save + end + end + end + + true + rescue + false + end + + def truncate_teams(project_ids) + ProjectMember.transaction do + members = ProjectMember.where(source_id: project_ids) + members.each do |member| + member.destroy + end + end + + true + rescue + false + end + + def truncate_team project + truncate_teams [project.id] + end + + def roles_hash + Gitlab::Access.sym_options + end + + def access_roles + Gitlab::Access.options + end + end + + def access_field + access_level + end + + def owner? + project.owner == user + end + + def post_create_hook + Event.create( + project_id: self.project.id, + action: Event::JOINED, + author_id: self.user.id + ) + + notification_service.new_team_member(self) unless owner? + system_hook_service.execute_hooks_for(self, :create) + end + + def post_update_hook + notification_service.update_team_member(self) if self.access_level_changed? + end + + def post_destroy_hook + Event.create( + project_id: self.project.id, + action: Event::LEFT, + author_id: self.user.id + ) + + system_hook_service.execute_hooks_for(self, :destroy) + end + + def notification_service + NotificationService.new + end + + def system_hook_service + SystemHooksService.new + end + + def project + source + end +end diff --git a/app/models/project.rb b/app/models/project.rb index 114e40983f8..0adedaa8dcd 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -79,8 +79,8 @@ class Project < ActiveRecord::Base has_many :snippets, dependent: :destroy, class_name: "ProjectSnippet" has_many :hooks, dependent: :destroy, class_name: "ProjectHook" has_many :protected_branches, dependent: :destroy - has_many :users_projects, dependent: :destroy - has_many :users, through: :users_projects + has_many :project_members, dependent: :destroy, as: :source, class_name: 'ProjectMember' + has_many :users, through: :project_members has_many :deploy_keys_projects, dependent: :destroy has_many :deploy_keys, through: :deploy_keys_projects has_many :users_star_projects, dependent: :destroy @@ -353,12 +353,12 @@ class Project < ActiveRecord::Base def team_member_by_name_or_email(name = nil, email = nil) user = users.where("name like ? or email like ?", name, email).first - users_projects.where(user: user) if user + project_members.where(user: user) if user end # Get Team Member record by user id def team_member_by_id(user_id) - users_projects.find_by(user_id: user_id) + project_members.find_by(user_id: user_id) end def name_with_namespace @@ -555,7 +555,7 @@ class Project < ActiveRecord::Base end def project_member(user) - users_projects.where(user_id: user).first + project_members.where(user_id: user).first end def default_branch diff --git a/app/models/project_team.rb b/app/models/project_team.rb index 0bbbd3d00e8..e2af10c6899 100644 --- a/app/models/project_team.rb +++ b/app/models/project_team.rb @@ -32,12 +32,12 @@ class ProjectTeam end def find_tm(user_id) - tm = project.users_projects.find_by(user_id: user_id) + tm = project.project_members.find_by(user_id: user_id) # If user is not in project members # we should check for group membership if group && !tm - tm = group.users_groups.find_by(user_id: user_id) + tm = group.group_members.find_by(user_id: user_id) end tm @@ -52,7 +52,7 @@ class ProjectTeam end def add_users_ids(user_ids, access) - UsersProject.add_users_into_projects( + ProjectMember.add_users_into_projects( [project.id], user_ids, access @@ -61,7 +61,7 @@ class ProjectTeam # Remove all users from project team def truncate - UsersProject.truncate_team(project) + ProjectMember.truncate_team(project) end def users @@ -91,8 +91,8 @@ class ProjectTeam def import(source_project) target_project = project - source_team = source_project.users_projects.to_a - target_user_ids = target_project.users_projects.pluck(:user_id) + source_team = source_project.project_members.to_a + target_user_ids = target_project.project_members.pluck(:user_id) source_team.reject! do |tm| # Skip if user already present in team @@ -102,11 +102,11 @@ class ProjectTeam source_team.map! do |tm| new_tm = tm.dup new_tm.id = nil - new_tm.project_id = target_project.id + new_tm.source = target_project new_tm end - UsersProject.transaction do + ProjectMember.transaction do source_team.each do |tm| tm.save end @@ -135,10 +135,10 @@ class ProjectTeam def max_tm_access(user_id) access = [] - access << project.users_projects.find_by(user_id: user_id).try(:access_field) + access << project.project_members.find_by(user_id: user_id).try(:access_field) if group - access << group.users_groups.find_by(user_id: user_id).try(:access_field) + access << group.group_members.find_by(user_id: user_id).try(:access_field) end access.compact.max @@ -147,8 +147,8 @@ class ProjectTeam private def fetch_members(level = nil) - project_members = project.users_projects - group_members = group ? group.users_groups : [] + project_members = project.project_members + group_members = group ? group.group_members : [] if level project_members = project_members.send(level) diff --git a/app/models/user.rb b/app/models/user.rb index 15e56a62a68..ed3eba4cdf0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -81,21 +81,23 @@ class User < ActiveRecord::Base has_many :emails, dependent: :destroy # Groups - has_many :users_groups, dependent: :destroy - has_many :groups, through: :users_groups - has_many :owned_groups, -> { where users_groups: { group_access: UsersGroup::OWNER } }, through: :users_groups, source: :group - has_many :masters_groups, -> { where users_groups: { group_access: UsersGroup::MASTER } }, through: :users_groups, source: :group + has_many :members, dependent: :destroy + has_many :project_members, source: 'ProjectMember' + has_many :group_members, source: 'GroupMember' + has_many :groups, through: :group_members + has_many :owned_groups, -> { where members: { access_level: Gitlab::Access::OWNER } }, through: :group_members, source: :group + has_many :masters_groups, -> { where members: { access_level: Gitlab::Access::MASTER } }, through: :group_members, source: :group # Projects has_many :groups_projects, through: :groups, source: :projects has_many :personal_projects, through: :namespace, source: :projects - has_many :projects, through: :users_projects + has_many :projects, through: :project_members has_many :created_projects, foreign_key: :creator_id, class_name: 'Project' has_many :users_star_projects, dependent: :destroy has_many :starred_projects, through: :users_star_projects, source: :project has_many :snippets, dependent: :destroy, foreign_key: :author_id, class_name: "Snippet" - has_many :users_projects, dependent: :destroy + has_many :project_members, dependent: :destroy, class_name: 'ProjectMember' has_many :issues, dependent: :destroy, foreign_key: :author_id has_many :notes, dependent: :destroy, foreign_key: :author_id has_many :merge_requests, dependent: :destroy, foreign_key: :author_id @@ -140,7 +142,7 @@ class User < ActiveRecord::Base state_machine :state, initial: :active do after_transition any => :blocked do |user, transition| # Remove user from all projects and - user.users_projects.find_each do |membership| + user.project_members.find_each do |membership| # skip owned resources next if membership.project.owner == user @@ -148,7 +150,7 @@ class User < ActiveRecord::Base end # Remove user from all groups - user.users_groups.find_each do |membership| + user.group_members.find_each do |membership| # skip owned resources next if membership.group.last_owner?(user) @@ -175,7 +177,7 @@ class User < ActiveRecord::Base scope :in_team, ->(team){ where(id: team.member_ids) } scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) } scope :not_in_project, ->(project) { project.users.present? ? where("id not in (:ids)", ids: project.users.map(&:id) ) : all } - scope :without_projects, -> { where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') } + scope :without_projects, -> { where('id NOT IN (SELECT DISTINCT(user_id) FROM members)') } scope :ldap, -> { where(provider: 'ldap') } scope :potential_team_members, ->(team) { team.members.any? ? active.not_in_team(team) : active } @@ -295,7 +297,7 @@ class User < ActiveRecord::Base # Team membership in authorized projects def tm_in_authorized_projects - UsersProject.where(project_id: authorized_projects.map(&:id), user_id: self.id) + ProjectMember.where(source_id: authorized_projects.map(&:id), user_id: self.id) end def is_admin? diff --git a/app/models/users_group.rb b/app/models/users_group.rb deleted file mode 100644 index 270f968ef61..00000000000 --- a/app/models/users_group.rb +++ /dev/null @@ -1,61 +0,0 @@ -# == Schema Information -# -# Table name: users_groups -# -# id :integer not null, primary key -# group_access :integer not null -# group_id :integer not null -# user_id :integer not null -# created_at :datetime -# updated_at :datetime -# notification_level :integer default(3), not null -# - -class UsersGroup < ActiveRecord::Base - include Notifiable - include Gitlab::Access - - def self.group_access_roles - Gitlab::Access.options_with_owner - end - - belongs_to :user - belongs_to :group - - scope :guests, -> { where(group_access: GUEST) } - scope :reporters, -> { where(group_access: REPORTER) } - scope :developers, -> { where(group_access: DEVELOPER) } - scope :masters, -> { where(group_access: MASTER) } - scope :owners, -> { where(group_access: OWNER) } - - scope :with_group, ->(group) { where(group_id: group.id) } - scope :with_user, ->(user) { where(user_id: user.id) } - - after_create :notify_create - after_update :notify_update - - validates :group_access, inclusion: { in: UsersGroup.group_access_roles.values }, presence: true - validates :user_id, presence: true - validates :group_id, presence: true - validates :user_id, uniqueness: { scope: [:group_id], message: "already exists in group" } - - delegate :name, :username, :email, to: :user, prefix: true - - def access_field - group_access - end - - def notify_create - notification_service.new_group_member(self) - end - - def notify_update - if group_access_changed? - notification_service.update_group_member(self) - end - end - - def notification_service - NotificationService.new - end -end diff --git a/app/models/users_project.rb b/app/models/users_project.rb deleted file mode 100644 index 60bdf7a3cfb..00000000000 --- a/app/models/users_project.rb +++ /dev/null @@ -1,152 +0,0 @@ -# == Schema Information -# -# Table name: users_projects -# -# id :integer not null, primary key -# user_id :integer not null -# project_id :integer not null -# created_at :datetime -# updated_at :datetime -# project_access :integer default(0), not null -# notification_level :integer default(3), not null -# - -class UsersProject < ActiveRecord::Base - include Gitlab::ShellAdapter - include Notifiable - include Gitlab::Access - - belongs_to :user - belongs_to :project - - validates :user, presence: true - validates :user_id, uniqueness: { scope: [:project_id], message: "already exists in project" } - validates :project_access, inclusion: { in: Gitlab::Access.values }, presence: true - validates :project, presence: true - - delegate :name, :username, :email, to: :user, prefix: true - - scope :guests, -> { where(project_access: GUEST) } - scope :reporters, -> { where(project_access: REPORTER) } - scope :developers, -> { where(project_access: DEVELOPER) } - scope :masters, -> { where(project_access: MASTER) } - - scope :in_project, ->(project) { where(project_id: project.id) } - scope :in_projects, ->(projects) { where(project_id: projects.map { |p| p.id }) } - scope :with_user, ->(user) { where(user_id: user.id) } - - after_create :post_create_hook - after_update :post_update_hook - after_destroy :post_destroy_hook - - class << self - - # Add users to project teams with passed access option - # - # access can be an integer representing a access code - # or symbol like :master representing role - # - # Ex. - # add_users_into_projects( - # project_ids, - # user_ids, - # UsersProject::MASTER - # ) - # - # add_users_into_projects( - # project_ids, - # user_ids, - # :master - # ) - # - def add_users_into_projects(project_ids, user_ids, access) - project_access = if roles_hash.has_key?(access) - roles_hash[access] - elsif roles_hash.values.include?(access.to_i) - access - else - raise "Non valid access" - end - - UsersProject.transaction do - project_ids.each do |project_id| - user_ids.each do |user_id| - users_project = UsersProject.new(project_access: project_access, user_id: user_id) - users_project.project_id = project_id - users_project.save - end - end - end - - true - rescue - false - end - - def truncate_teams(project_ids) - UsersProject.transaction do - users_projects = UsersProject.where(project_id: project_ids) - users_projects.each do |users_project| - users_project.destroy - end - end - - true - rescue - false - end - - def truncate_team project - truncate_teams [project.id] - end - - def roles_hash - Gitlab::Access.sym_options - end - - def access_roles - Gitlab::Access.options - end - end - - def access_field - project_access - end - - def owner? - project.owner == user - end - - def post_create_hook - Event.create( - project_id: self.project.id, - action: Event::JOINED, - author_id: self.user.id - ) - - notification_service.new_team_member(self) unless owner? - system_hook_service.execute_hooks_for(self, :create) - end - - def post_update_hook - notification_service.update_team_member(self) if self.project_access_changed? - end - - def post_destroy_hook - Event.create( - project_id: self.project.id, - action: Event::LEFT, - author_id: self.user.id - ) - - system_hook_service.execute_hooks_for(self, :destroy) - end - - def notification_service - NotificationService.new - end - - def system_hook_service - SystemHooksService.new - end -end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 36d33e0d7ca..fe39f83b400 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -157,12 +157,12 @@ class NotificationService end end - def new_team_member(users_project) - mailer.project_access_granted_email(users_project.id) + def new_team_member(project_member) + mailer.project_access_granted_email(project_member.id) end - def update_team_member(users_project) - mailer.project_access_granted_email(users_project.id) + def update_team_member(project_member) + mailer.project_access_granted_email(project_member.id) end def new_group_member(users_group) @@ -186,20 +186,20 @@ class NotificationService # Get project users with WATCH notification level def project_watchers(project) - project_members = users_project_notification(project) + project_members = project_member_notification(project) - users_with_project_level_global = users_project_notification(project, Notification::N_GLOBAL) + users_with_project_level_global = project_member_notification(project, Notification::N_GLOBAL) users_with_group_level_global = users_group_notification(project, Notification::N_GLOBAL) users = users_with_global_level_watch([users_with_project_level_global, users_with_group_level_global].flatten.uniq) - users_with_project_setting = select_users_project_setting(project, users_with_project_level_global, users) + users_with_project_setting = select_project_member_setting(project, users_with_project_level_global, users) users_with_group_setting = select_users_group_setting(project, project_members, users_with_group_level_global, users) User.where(id: users_with_project_setting.concat(users_with_group_setting).uniq).to_a end - def users_project_notification(project, notification_level=nil) - project_members = project.users_projects + def project_member_notification(project, notification_level=nil) + project_members = project.project_members if notification_level project_members.where(notification_level: notification_level).pluck(:user_id) @@ -210,7 +210,7 @@ class NotificationService def users_group_notification(project, notification_level) if project.group - project.group.users_groups.where(notification_level: notification_level).pluck(:user_id) + project.group.group_members.where(notification_level: notification_level).pluck(:user_id) else [] end @@ -224,8 +224,8 @@ class NotificationService end # Build a list of users based on project notifcation settings - def select_users_project_setting(project, global_setting, users_global_level_watch) - users = users_project_notification(project, Notification::N_WATCH) + def select_project_member_setting(project, global_setting, users_global_level_watch) + users = project_member_notification(project, Notification::N_WATCH) # If project setting is global, add to watch list if global setting is watch global_setting.each do |user_id| @@ -267,10 +267,10 @@ class NotificationService users.reject do |user| next user.notification.disabled? unless project - tm = project.users_projects.find_by(user_id: user.id) + tm = project.project_members.find_by(user_id: user.id) if !tm && project.group - tm = project.group.users_groups.find_by(user_id: user.id) + tm = project.group.group_members.find_by(user_id: user.id) end # reject users who globally disabled notification and has no membership diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 2bfb0f28d95..12386792aab 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -42,10 +42,7 @@ module Projects system_hook_service.execute_hooks_for(@project, :create) unless @project.group - @project.users_projects.create( - project_access: UsersProject::MASTER, - user: current_user - ) + @project.team << [current_user, :master] end @project.update_column(:last_activity_at, @project.created_at) diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 66f0a02f0af..a59311bf942 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -27,7 +27,7 @@ module Projects #First save the DB entries as they can be rolled back if the repo fork fails project.build_forked_project_link(forked_to_project_id: project.id, forked_from_project_id: @from_project.id) if project.save - project.users_projects.create(project_access: UsersProject::MASTER, user: current_user) + project.team << [current_user, :master] end #Now fork the repo unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path) diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb index bfc725e5eb5..a6b68749a71 100644 --- a/app/services/system_hooks_service.rb +++ b/app/services/system_hooks_service.rb @@ -50,14 +50,14 @@ class SystemHooksService email: model.email, user_id: model.id }) - when UsersProject + when ProjectMember data.merge!({ project_name: model.project.name, project_path: model.project.path, - project_id: model.project_id, + project_id: model.project.id, user_name: model.user.name, user_email: model.user.email, - project_access: model.human_access, + access_level: model.human_access, project_visibility: Project.visibility_levels.key(model.project.visibility_level_field).downcase }) end @@ -65,7 +65,7 @@ class SystemHooksService def build_event_name(model, event) case model - when UsersProject + when ProjectMember return "user_add_to_team" if event == :create return "user_remove_from_team" if event == :destroy else diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index 8634f46053d..d59d2a23179 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -62,7 +62,7 @@ %div = users_select_tag(:user_ids, multiple: true) %div.prepend-top-10 - = select_tag :group_access, options_for_select(UsersGroup.group_access_roles), class: "project-access-select select2" + = select_tag :access_level, options_for_select(GroupMember.access_level_roles), class: "project-access-select select2" %hr = submit_tag 'Add users into group', class: "btn btn-create" .panel.panel-default @@ -70,7 +70,7 @@ %h3.panel-title Members %span.badge - #{@group.users_groups.count} + #{@group.group_members.count} %ul.well-list.group-users-list - @members.each do |member| - user = member.user @@ -80,7 +80,7 @@ = link_to user.name, admin_user_path(user) %span.pull-right.light = member.human_access - = link_to group_users_group_path(@group, member), data: { confirm: remove_user_from_group_message(@group, user) }, method: :delete, remote: true, class: "btn-tiny btn btn-remove", title: 'Remove user from group' do + = link_to group_group_members_path(@group, member), data: { confirm: remove_user_from_group_message(@group, user) }, method: :delete, remote: true, class: "btn-tiny btn btn-remove", title: 'Remove user from group' do %i.icon-minus.icon-white .panel-footer = paginate @members, param_name: 'members_page', theme: 'gitlab' diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 66a72449f40..8413f0cb7f9 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -95,13 +95,13 @@ .panel.panel-default .panel-heading %strong #{@group.name} - group members (#{@group.users_groups.count}) + group members (#{@group.group_members.count}) .pull-right = link_to admin_group_path(@group), class: 'btn btn-small' do %i.icon-edit %ul.well-list - @group_members.each do |member| - = render 'users_groups/users_group', member: member, show_controls: false + = render 'groups/group_members/group_member', member: member, show_controls: false .panel-footer = paginate @group_members, param_name: 'group_members_page', theme: 'gitlab' @@ -115,17 +115,17 @@ %i.icon-edit Manage Access %ul.well-list.team_members - - @project_members.each do |users_project| - - user = users_project.user - %li.users_project + - @project_members.each do |project_member| + - user = project_member.user + %li.project_member .list-item-name %strong = link_to user.name, admin_user_path(user) .pull-right - - if users_project.owner? + - if project_member.owner? %span.light Owner - else - %span.light= users_project.human_access + %span.light= project_member.human_access = link_to project_team_member_path(@project, user), data: { confirm: remove_from_project_team_message(@project, user)}, method: :delete, remote: true, class: "btn btn-small btn-remove" do %i.icon-remove .panel-footer diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index f60d40b5334..a172d12edb1 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -159,13 +159,13 @@ = render 'users/profile', user: @user #groups.tab-pane - - if @user.users_groups.present? + - if @user.group_members.present? .panel.panel-default .panel-heading Groups: %ul.well-list - - @user.users_groups.each do |user_group| + - @user.group_members.each do |user_group| - group = user_group.group - %li.users_group + %li.group_member %span{class: ("list-item-name" unless user_group.owner?)} %strong= link_to group.name, admin_group_path(group) .pull-right @@ -197,7 +197,7 @@ %ul.well-list - @joined_projects.sort_by(&:name_with_namespace).each do |project| - tm = project.team.find_tm(@user.id) - %li.users_project + %li.project_member .list-item-name = link_to admin_project_path(project), class: dom_class(project) do = project.name_with_namespace diff --git a/app/views/events/_event_issue.atom.haml b/app/views/events/_event_issue.atom.haml index 030c961c355..eba2b63797a 100644 --- a/app/views/events/_event_issue.atom.haml +++ b/app/views/events/_event_issue.atom.haml @@ -1,2 +1,3 @@ %div{xmlns: "http://www.w3.org/1999/xhtml"} - = markdown issue.description + - if issue.description.present? + = markdown issue.description diff --git a/app/views/events/_event_merge_request.atom.haml b/app/views/events/_event_merge_request.atom.haml index ab3a485e908..0aea2d17d65 100644 --- a/app/views/events/_event_merge_request.atom.haml +++ b/app/views/events/_event_merge_request.atom.haml @@ -1,2 +1,3 @@ %div{xmlns: "http://www.w3.org/1999/xhtml"} - = markdown merge_request.description + - if merge_request.description.present? + = markdown merge_request.description diff --git a/app/views/groups/_new_group_member.html.haml b/app/views/groups/_new_group_member.html.haml index 3ab9276c541..e590ddbf931 100644 --- a/app/views/groups/_new_group_member.html.haml +++ b/app/views/groups/_new_group_member.html.haml @@ -1,11 +1,11 @@ -= form_for @users_group, url: group_users_groups_path(@group), html: { class: 'form-horizontal users-group-form' } do |f| += form_for @users_group, url: group_group_members_path(@group), html: { class: 'form-horizontal users-group-form' } do |f| .form-group = f.label :user_ids, "People", class: 'control-label' .col-sm-10= users_select_tag(:user_ids, multiple: true, class: 'input-large') .form-group - = f.label :group_access, "Group Access", class: 'control-label' - .col-sm-10= select_tag :group_access, options_for_select(UsersGroup.group_access_roles, @users_group.group_access), class: "project-access-select select2" + = f.label :access_level, "Group Access", class: 'control-label' + .col-sm-10= select_tag :access_level, options_for_select(GroupMember.access_level_roles, @users_group.access_level), class: "project-access-select select2" .form-actions = f.submit 'Add users into group', class: "btn btn-create" diff --git a/app/views/users_groups/_users_group.html.haml b/app/views/groups/group_members/_group_member.html.haml index ad363eaba23..099e50a384e 100644 --- a/app/views/users_groups/_users_group.html.haml +++ b/app/views/groups/group_members/_group_member.html.haml @@ -21,11 +21,11 @@ = link_to leave_profile_group_path(@group), data: { confirm: leave_group_message(@group.name)}, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from group' do %i.icon-minus.icon-white - else - = link_to group_users_group_path(@group, member), data: { confirm: remove_user_from_group_message(@group, user) }, method: :delete, remote: true, class: "btn-tiny btn btn-remove", title: 'Remove user from group' do + = link_to group_group_member_path(@group, member), data: { confirm: remove_user_from_group_message(@group, user) }, method: :delete, remote: true, class: "btn-tiny btn btn-remove", title: 'Remove user from group' do %i.icon-minus.icon-white .edit-member.hide.js-toggle-content = form_for [@group, member], remote: true do |f| .alert.prepend-top-20 - = f.select :group_access, options_for_select(UsersGroup.group_access_roles, member.group_access) + = f.select :access_level, options_for_select(GroupMember.access_level_roles, member.access_level) = f.submit 'Save', class: 'btn btn-save btn-small' diff --git a/app/views/users_groups/update.js.haml b/app/views/groups/group_members/update.js.haml index 5bad48abafd..5bad48abafd 100644 --- a/app/views/users_groups/update.js.haml +++ b/app/views/groups/group_members/update.js.haml diff --git a/app/views/groups/members.html.haml b/app/views/groups/members.html.haml index 19819c96124..ebf407d4ef1 100644 --- a/app/views/groups/members.html.haml +++ b/app/views/groups/members.html.haml @@ -32,7 +32,7 @@ (#{@members.total_count}) %ul.well-list - @members.each do |member| - = render 'users_groups/users_group', member: member, show_roles: show_roles, show_controls: true + = render 'groups/group_members/group_member', member: member, show_roles: show_roles, show_controls: true = paginate @members, theme: 'gitlab' :coffeescript diff --git a/app/views/notify/project_access_granted_email.html.haml b/app/views/notify/project_access_granted_email.html.haml index ce34f825358..4596205f39b 100644 --- a/app/views/notify/project_access_granted_email.html.haml +++ b/app/views/notify/project_access_granted_email.html.haml @@ -1,5 +1,5 @@ %p - = "You have been granted #{@users_project.human_access} access to project" + = "You have been granted #{@project_member.human_access} access to project" %p = link_to project_url(@project) do = @project.name_with_namespace diff --git a/app/views/notify/project_access_granted_email.text.erb b/app/views/notify/project_access_granted_email.text.erb index 66c57def375..de24feb802f 100644 --- a/app/views/notify/project_access_granted_email.text.erb +++ b/app/views/notify/project_access_granted_email.text.erb @@ -1,4 +1,4 @@ -You have been granted <%= @users_project.human_access %> access to project <%= @project.name_with_namespace %> +You have been granted <%= @project_member.human_access %> access to project <%= @project.name_with_namespace %> <%= url_for(project_url(@project)) %> diff --git a/app/views/profiles/notifications/_settings.html.haml b/app/views/profiles/notifications/_settings.html.haml index 218d51d31af..940c553d1ba 100644 --- a/app/views/profiles/notifications/_settings.html.haml +++ b/app/views/profiles/notifications/_settings.html.haml @@ -6,7 +6,7 @@ = notification_icon(notification) %span.str-truncated - - if membership.kind_of? UsersGroup + - if membership.kind_of? GroupMember = link_to membership.group.name, membership.group - else = link_to_project(membership.project) diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index efe9c032190..f84de4430cc 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -39,13 +39,13 @@ .col-md-6 %h4 Groups: %ul.bordered-list - - @users_groups.each do |users_group| + - @group_members.each do |users_group| - notification = Notification.new(users_group) = render 'settings', type: 'group', membership: users_group, notification: notification .col-md-6 %h4 Projects: %ul.bordered-list - - @users_projects.each do |users_project| - - notification = Notification.new(users_project) - = render 'settings', type: 'project', membership: users_project, notification: notification + - @project_members.each do |project_member| + - notification = Notification.new(project_member) + = render 'settings', type: 'project', membership: project_member, notification: notification diff --git a/app/views/projects/team_members/_form.html.haml b/app/views/projects/team_members/_form.html.haml index 5998e4c6b42..2bf61fa12bb 100644 --- a/app/views/projects/team_members/_form.html.haml +++ b/app/views/projects/team_members/_form.html.haml @@ -1,7 +1,7 @@ %h3.page-title New project member(s) -= form_for @user_project_relation, as: :team_member, url: project_team_members_path(@project), html: { class: "form-horizontal users-project-form" } do |f| += form_for @user_project_relation, as: :project_member, url: project_team_members_path(@project), html: { class: "form-horizontal users-project-form" } do |f| -if @user_project_relation.errors.any? .alert.alert-danger %ul @@ -16,8 +16,8 @@ %p 2. Set access level for them .form-group - = f.label :project_access, "Project Access", class: 'control-label' - .col-sm-10= select_tag :project_access, options_for_select(Gitlab::Access.options, @user_project_relation.project_access), class: "project-access-select select2" + = f.label :access_level, "Project Access", class: 'control-label' + .col-sm-10= select_tag :access_level, options_for_select(Gitlab::Access.options, @user_project_relation.access_level), class: "project-access-select select2" .form-actions = f.submit 'Add users', class: "btn btn-create" diff --git a/app/views/projects/team_members/_group_members.html.haml b/app/views/projects/team_members/_group_members.html.haml index 83c4b6f87d5..77ffab89f37 100644 --- a/app/views/projects/team_members/_group_members.html.haml +++ b/app/views/projects/team_members/_group_members.html.haml @@ -1,4 +1,4 @@ -- group_users_count = @group.users_groups.count +- group_users_count = @group.group_members.count .panel.panel-default .panel-heading %strong #{@group.name} @@ -7,8 +7,8 @@ = link_to members_group_path(@group), class: 'btn btn-small' do %i.icon-edit %ul.well-list - - @group.users_groups.order('group_access DESC').limit(20).each do |member| - = render 'users_groups/users_group', member: member, show_controls: false + - @group.group_members.order('access_level DESC').limit(20).each do |member| + = render 'groups/group_members/group_member', member: member, show_controls: false - if group_users_count > 20 %li and #{group_users_count - 20} more. For full list visit #{link_to 'group members page', members_group_path(@group)} diff --git a/app/views/projects/team_members/_team_member.html.haml b/app/views/projects/team_members/_team_member.html.haml index d93bb44ab96..79b78665417 100644 --- a/app/views/projects/team_members/_team_member.html.haml +++ b/app/views/projects/team_members/_team_member.html.haml @@ -4,8 +4,8 @@ - if current_user_can_admin_project - unless @project.personal? && user == current_user .pull-left - = form_for(member, as: :team_member, url: project_team_member_path(@project, member.user)) do |f| - = f.select :project_access, options_for_select(UsersProject.access_roles, member.project_access), {}, class: "medium project-access-select span2 trigger-submit" + = form_for(member, as: :project_member, url: project_team_member_path(@project, member.user)) do |f| + = f.select :access_level, options_for_select(ProjectMember.access_roles, member.access_level), {}, class: "medium project-access-select span2 trigger-submit" = link_to project_team_member_path(@project, user), data: { confirm: remove_from_project_team_message(@project, user)}, method: :delete, class: "btn-tiny btn btn-remove", title: 'Remove user from team' do %i.icon-minus.icon-white diff --git a/app/views/projects/team_members/index.html.haml b/app/views/projects/team_members/index.html.haml index ddb3b9d4a9d..ecb7c689e8a 100644 --- a/app/views/projects/team_members/index.html.haml +++ b/app/views/projects/team_members/index.html.haml @@ -11,6 +11,6 @@ %p.light Read more about project permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" -= render "team", members: @users_projects += render "team", members: @project_members - if @group = render "group_members" diff --git a/app/views/projects/tree/_readme.html.haml b/app/views/projects/tree/_readme.html.haml index 9d0292059d6..ec2701af0eb 100644 --- a/app/views/projects/tree/_readme.html.haml +++ b/app/views/projects/tree/_readme.html.haml @@ -1,6 +1,7 @@ %article.readme-holder#README - %h4.readme-file-title - %i.icon-file - = readme.name + = link_to '#README' do + %h4.readme-file-title + %i.icon-file + = readme.name .wiki = render_readme(readme) |