diff options
author | Rémy Coutable <remy@rymai.me> | 2016-09-14 18:43:53 +0200 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2016-09-14 18:43:53 +0200 |
commit | 8a40e0efa9fbba9afbe28e6c910109a04de6d6bc (patch) | |
tree | e0e5e40263110cff947337dde757a278f589d00f /app | |
parent | cbf478856e0858e9155c2d657a3fc1281a009294 (diff) | |
parent | 1b200b19f2ec0abed51540abd186c9803ac8a301 (diff) | |
download | gitlab-ce-8a40e0efa9fbba9afbe28e6c910109a04de6d6bc.tar.gz |
Merge branch 'master' of https://dev.gitlab.org/gitlab/gitlabhq
Diffstat (limited to 'app')
-rw-r--r-- | app/models/member.rb | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/app/models/member.rb b/app/models/member.rb index 64e0d33fb20..69406379948 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -28,17 +28,34 @@ class Member < ActiveRecord::Base allow_nil: true } + # This scope encapsulates (most of) the conditions a row in the member table + # must satisfy if it is a valid permission. Of particular note: + # + # * Access requests must be excluded + # * Blocked users must be excluded + # * Invitations take effect immediately + # * expires_at is not implemented. A background worker purges expired rows + scope :active, -> do + is_external_invite = arel_table[:user_id].eq(nil).and(arel_table[:invite_token].not_eq(nil)) + user_is_active = User.arel_table[:state].eq(:active) + + includes(:user).references(:users) + .where(is_external_invite.or(user_is_active)) + .where(requested_at: nil) + end + scope :invite, -> { where.not(invite_token: nil) } scope :non_invite, -> { where(invite_token: nil) } scope :request, -> { where.not(requested_at: nil) } - scope :has_access, -> { where('access_level > 0') } - - 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) } - scope :owners_and_masters, -> { where(access_level: [OWNER, MASTER]) } + + scope :has_access, -> { active.where('access_level > 0') } + + scope :guests, -> { active.where(access_level: GUEST) } + scope :reporters, -> { active.where(access_level: REPORTER) } + scope :developers, -> { active.where(access_level: DEVELOPER) } + scope :masters, -> { active.where(access_level: MASTER) } + scope :owners, -> { active.where(access_level: OWNER) } + scope :owners_and_masters, -> { active.where(access_level: [OWNER, MASTER]) } before_validation :generate_invite_token, on: :create, if: -> (member) { member.invite_email.present? } |