diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-04-09 20:37:04 +0300 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-04-09 20:37:04 +0300 |
commit | 0f2798d498c69372137d13a8ba3ec8e87b7f0a8a (patch) | |
tree | e2fa3ed8d25c5a54e4b8baf70e710008d1a03754 /app/models/user.rb | |
parent | 52cd655f71c6a5393b71640c13cd95e35e8d2624 (diff) | |
parent | 85e039049cba5ac1bf92e6cbba2ea1236d6892f7 (diff) | |
download | gitlab-ce-0f2798d498c69372137d13a8ba3ec8e87b7f0a8a.tar.gz |
Merge branch 'feature/refactoring_scopes_pr' of https://github.com/Undev/gitlabhq into Undev-feature/refactoring_scopes_pr
Conflicts:
db/schema.rb
Diffstat (limited to 'app/models/user.rb')
-rw-r--r-- | app/models/user.rb | 111 |
1 files changed, 30 insertions, 81 deletions
diff --git a/app/models/user.rb b/app/models/user.rb index a835e528dbd..fb2e62279a5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -59,11 +59,10 @@ class User < ActiveRecord::Base # # Namespace for personal projects - has_one :namespace, - dependent: :destroy, - foreign_key: :owner_id, - class_name: "Namespace", - conditions: 'type IS NULL' + has_one :namespace, dependent: :destroy, foreign_key: :owner_id, class_name: "Namespace", conditions: 'type IS NULL' + + # Namespaces (owned groups and own namespace) + has_many :namespaces, foreign_key: :owner_id # Profile has_many :keys, dependent: :destroy @@ -72,15 +71,11 @@ class User < ActiveRecord::Base has_many :groups, class_name: "Group", foreign_key: :owner_id # Teams - has_many :own_teams, - class_name: "UserTeam", - foreign_key: :owner_id, - dependent: :destroy - - has_many :user_team_user_relationships, dependent: :destroy - has_many :user_teams, through: :user_team_user_relationships + 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 + has_many :team_projects, through: :user_team_project_relationships # Projects has_many :users_projects, dependent: :destroy @@ -88,14 +83,14 @@ class User < ActiveRecord::Base has_many :notes, dependent: :destroy, foreign_key: :author_id has_many :merge_requests, dependent: :destroy, foreign_key: :author_id has_many :events, dependent: :destroy, foreign_key: :author_id, class_name: "Event" + has_many :recent_events, foreign_key: :author_id, class_name: "Event", order: "id DESC" has_many :assigned_issues, dependent: :destroy, foreign_key: :assignee_id, class_name: "Issue" has_many :assigned_merge_requests, dependent: :destroy, foreign_key: :assignee_id, class_name: "MergeRequest" - has_many :projects, through: :users_projects - has_many :recent_events, - class_name: "Event", - foreign_key: :author_id, - order: "id DESC" + has_many :personal_projects, through: :namespace, source: :projects + has_many :projects, through: :users_projects + has_many :own_projects, foreign_key: :creator_id + has_many :owned_projects, through: :namespaces, source: :projects # # Validations @@ -109,9 +104,7 @@ class User < ActiveRecord::Base format: { with: Gitlab::Regex.username_regex, message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" } - validates :notification_level, - inclusion: { in: Notification.notification_levels }, - presence: true + validates :notification_level, inclusion: { in: Notification.notification_levels }, presence: true validate :namespace_uniq, if: ->(user) { user.username_changed? } @@ -145,6 +138,9 @@ class User < ActiveRecord::Base scope :alphabetically, -> { order('name ASC') } 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) ) : scoped } + scope :without_projects, -> { where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') } + scope :potential_team_members, ->(team) { team.members.any? ? active.not_in_team(team) : active } # @@ -171,18 +167,6 @@ class User < ActiveRecord::Base end end - def not_in_project(project) - if project.users.present? - where("id not in (:ids)", ids: project.users.map(&:id) ) - else - scoped - end - end - - def without_projects - where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') - end - def create_from_omniauth(auth, ldap = false) gitlab_auth.create_from_omniauth(auth, ldap) end @@ -229,56 +213,36 @@ class User < ActiveRecord::Base end end - # Namespaces user has access to - def namespaces - namespaces = [] - - # Add user account namespace - namespaces << self.namespace if self.namespace - - # Add groups you can manage - namespaces += groups.all - - namespaces - end - # Groups where user is an owner def owned_groups groups end + def owned_teams + own_teams + end + # Groups user has access to def authorized_groups - @authorized_groups ||= begin - groups = Group.where(id: self.authorized_projects.pluck(:namespace_id)).all - groups = groups + self.groups - groups.uniq - end + @group_ids ||= (groups.pluck(:id) + authorized_projects.pluck(:namespace_id)) + Group.where(id: @group_ids) end # Projects user has access to def authorized_projects - project_ids = users_projects.pluck(:project_id) - project_ids = project_ids | owned_projects.pluck(:id) - Project.where(id: project_ids) + @project_ids ||= (owned_projects.pluck(:id) + projects.pluck(:id)).uniq + Project.where(id: @project_ids) end - # Projects in user namespace - def personal_projects - Project.personal(self) - end - - # Projects where user is an owner - def owned_projects - Project.where("(projects.namespace_id IN (:namespaces)) OR - (projects.namespace_id IS NULL AND projects.creator_id = :user_id)", - namespaces: namespaces.map(&:id), user_id: self.id) + def authorized_teams + @team_ids ||= (user_teams.pluck(:id) + own_teams.pluck(:id)).uniq + UserTeam.where(id: @team_ids) end # Team membership 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) end def is_admin? @@ -348,28 +312,13 @@ class User < ActiveRecord::Base end def several_namespaces? - namespaces.size > 1 + namespaces.many? end def namespace_id namespace.try :id end - def authorized_teams - @authorized_teams ||= begin - ids = [] - ids << UserTeam.with_member(self).pluck('user_teams.id') - ids << UserTeam.created_by(self).pluck('user_teams.id') - ids.flatten - - UserTeam.where(id: ids) - end - end - - def owned_teams - UserTeam.where(owner_id: self.id) - end - def name_with_username "#{name} (#{username})" end |