diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-09-14 19:32:51 +0300 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-09-14 19:32:51 +0300 |
commit | c69b8e04591907d030b2cd544a606fd0e576116a (patch) | |
tree | 317db4259219bc7f3a3ff6e3c38c802a8d086d2c /app/models | |
parent | eb4a9bfbca5427e6b9a8fcf2ed0b1f9f96ae099d (diff) | |
download | gitlab-ce-c69b8e04591907d030b2cd544a606fd0e576116a.tar.gz |
Huge replace of old users_project and users_group references
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/ability.rb | 2 | ||||
-rw-r--r-- | app/models/concerns/notifiable.rb | 2 | ||||
-rw-r--r-- | app/models/group.rb | 20 | ||||
-rw-r--r-- | app/models/group_member.rb | 2 | ||||
-rw-r--r-- | app/models/member.rb | 14 | ||||
-rw-r--r-- | app/models/members/group_member.rb | 40 | ||||
-rw-r--r-- | app/models/members/project_member.rb | 133 | ||||
-rw-r--r-- | app/models/project_member.rb | 2 | ||||
-rw-r--r-- | app/models/project_team.rb | 22 | ||||
-rw-r--r-- | app/models/user.rb | 16 | ||||
-rw-r--r-- | app/models/users_group.rb | 61 | ||||
-rw-r--r-- | app/models/users_project.rb | 152 |
12 files changed, 213 insertions, 253 deletions
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/group_member.rb b/app/models/group_member.rb deleted file mode 100644 index 88c207deef9..00000000000 --- a/app/models/group_member.rb +++ /dev/null @@ -1,2 +0,0 @@ -class GroupMember < Member -end diff --git a/app/models/member.rb b/app/models/member.rb index 13827db175b..7dc13c18bf3 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -8,11 +8,13 @@ class Member < ActiveRecord::Base 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.values }, presence: true + validates :access_level, inclusion: { in: Gitlab::Access.all_values }, presence: true - 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 :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..7f68662de70 --- /dev/null +++ b/app/models/members/group_member.rb @@ -0,0 +1,40 @@ +class GroupMember < Member + SOURCE_TYPE = 'Group' + + # Make sure group member points only to group as it source + default_value_for :source_type, SOURCE_TYPE + validates_format_of :source_type, with: /\AGroup\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..403b87b7e36 --- /dev/null +++ b/app/models/members/project_member.rb @@ -0,0 +1,133 @@ +class ProjectMember < Member + SOURCE_TYPE = 'Project' + + include Gitlab::ShellAdapter + + # Make sure project member points only to project as it source + default_value_for :source_type, SOURCE_TYPE + 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_member.rb b/app/models/project_member.rb deleted file mode 100644 index 67f65285560..00000000000 --- a/app/models/project_member.rb +++ /dev/null @@ -1,2 +0,0 @@ -class ProjectMember < Member -end diff --git a/app/models/project_team.rb b/app/models/project_team.rb index 0bbbd3d00e8..330e2aa728c 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 @@ -106,7 +106,7 @@ class ProjectTeam 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..b235437817a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -81,10 +81,12 @@ 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 group_members: { access_level: Gitlab::Access::OWNER } }, through: :group_members, source: :group + has_many :masters_groups, -> { where group_members: { access_level: Gitlab::Access::MASTER } }, through: :group_members, source: :group # Projects has_many :groups_projects, through: :groups, source: :projects @@ -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) @@ -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 |