Code improvements
This commit is contained in:
parent
f2a9ee258e
commit
5551ccd720
10 changed files with 42 additions and 33 deletions
|
@ -9,7 +9,7 @@ class GroupsController < Groups::ApplicationController
|
|||
before_action :group, except: [:index, :new, :create]
|
||||
|
||||
# Authorize
|
||||
before_action :authorize_read_group!, except: [:index, :show, :new, :create, :autocomplete]
|
||||
before_action :authorize_read_group!, except: [:index, :new, :create]
|
||||
before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects]
|
||||
before_action :authorize_create_group!, only: [:new, :create]
|
||||
|
||||
|
@ -105,7 +105,7 @@ class GroupsController < Groups::ApplicationController
|
|||
|
||||
# Dont allow unauthorized access to group
|
||||
def authorize_read_group!
|
||||
unless @group and (@projects.present? or can?(current_user, :read_group, @group))
|
||||
unless can?(current_user, :read_group, @group)
|
||||
if current_user.nil?
|
||||
return authenticate_user!
|
||||
else
|
||||
|
|
|
@ -3,6 +3,16 @@ class UsersController < ApplicationController
|
|||
before_action :set_user
|
||||
|
||||
def show
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
@contributed_projects = contributed_projects.joined(@user).reject(&:forked?)
|
||||
|
||||
@projects = PersonalProjectsFinder.new(@user).execute(current_user)
|
||||
@projects = @projects.page(params[:page]).per(PER_PAGE)
|
||||
|
||||
@groups = @user.groups.order_id_desc
|
||||
|
||||
>>>>>>> Code improvements
|
||||
respond_to do |format|
|
||||
format.html
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
class GroupsFinder
|
||||
def execute(current_user = nil)
|
||||
|
||||
segments = all_groups(current_user)
|
||||
|
||||
if segments.length > 1
|
||||
|
@ -15,17 +14,9 @@ class GroupsFinder
|
|||
|
||||
def all_groups(current_user)
|
||||
if current_user
|
||||
[current_user.authorized_groups, public_and_internal_groups]
|
||||
[current_user.authorized_groups, Group.unscoped.public_and_internal_only]
|
||||
else
|
||||
[Group.public_only]
|
||||
[Group.unscoped.public_only]
|
||||
end
|
||||
end
|
||||
|
||||
def public_groups
|
||||
Group.unscoped.public_only
|
||||
end
|
||||
|
||||
def public_and_internal_groups
|
||||
Group.unscoped.public_and_internal_only
|
||||
end
|
||||
end
|
||||
|
|
|
@ -28,7 +28,7 @@ module GroupsHelper
|
|||
group = Group.find_by(path: group)
|
||||
end
|
||||
|
||||
if group && group.avatar.present?
|
||||
if group && can?(current_user, :read_group, group) && group.avatar.present?
|
||||
group.avatar.url
|
||||
else
|
||||
'no_group_avatar.png'
|
||||
|
|
|
@ -83,7 +83,7 @@ class Ability
|
|||
subject.group
|
||||
end
|
||||
|
||||
if group && group.projects.public_only.any?
|
||||
if group && group.public?
|
||||
[:read_group]
|
||||
else
|
||||
[]
|
||||
|
@ -271,16 +271,13 @@ class Ability
|
|||
def group_abilities(user, group)
|
||||
rules = []
|
||||
|
||||
if user.admin? || group.users.include?(user) || ProjectsFinder.new.execute(user, group: group).any?
|
||||
rules << :read_group
|
||||
end
|
||||
rules << :read_group if can_read_group?(user, group)
|
||||
|
||||
# Only group masters and group owners can create new projects and change permission level
|
||||
if group.has_master?(user) || group.has_owner?(user) || user.admin?
|
||||
rules += [
|
||||
:create_projects,
|
||||
:admin_milestones,
|
||||
:change_visibility_level
|
||||
:admin_milestones
|
||||
]
|
||||
end
|
||||
|
||||
|
@ -289,13 +286,20 @@ class Ability
|
|||
rules += [
|
||||
:admin_group,
|
||||
:admin_namespace,
|
||||
:admin_group_member
|
||||
:admin_group_member,
|
||||
:change_visibility_level
|
||||
]
|
||||
end
|
||||
|
||||
rules.flatten
|
||||
end
|
||||
|
||||
def can_read_group?(user, group)
|
||||
is_project_member = ProjectsFinder.new.execute(user, group: group).any?
|
||||
internal_group_allowed = group.internal? && user.present?
|
||||
user.admin? || group.users.include?(user) || is_project_member || group.public? || internal_group_allowed
|
||||
end
|
||||
|
||||
def namespace_abilities(user, namespace)
|
||||
rules = []
|
||||
|
||||
|
|
8
app/models/concerns/shared_scopes.rb
Normal file
8
app/models/concerns/shared_scopes.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
module SharedScopes
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
scope :public_only, -> { where(visibility_level: Group::PUBLIC) }
|
||||
scope :public_and_internal_only, -> { where(visibility_level: [Group::PUBLIC, Group::INTERNAL] ) }
|
||||
end
|
||||
end
|
|
@ -21,7 +21,7 @@ class Group < Namespace
|
|||
include Gitlab::ConfigHelper
|
||||
include Gitlab::VisibilityLevel
|
||||
include Referable
|
||||
|
||||
include SharedScopes
|
||||
|
||||
has_many :group_members, dependent: :destroy, as: :source, class_name: 'GroupMember'
|
||||
alias_method :members, :group_members
|
||||
|
@ -35,10 +35,6 @@ class Group < Namespace
|
|||
after_create :post_create_hook
|
||||
after_destroy :post_destroy_hook
|
||||
|
||||
scope :public_only, -> { where(visibility_level: Group::PUBLIC) }
|
||||
scope :public_and_internal_only, -> { where(visibility_level: [Group::PUBLIC, Group::INTERNAL] ) }
|
||||
|
||||
|
||||
class << self
|
||||
def search(query)
|
||||
where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%")
|
||||
|
@ -69,6 +65,10 @@ class Group < Namespace
|
|||
name
|
||||
end
|
||||
|
||||
def visibility_level_field
|
||||
visibility_level
|
||||
end
|
||||
|
||||
def avatar_url(size = nil)
|
||||
if avatar.present?
|
||||
[gitlab_config.url, avatar.url].join
|
||||
|
|
|
@ -52,6 +52,7 @@ class Project < ActiveRecord::Base
|
|||
include AfterCommitQueue
|
||||
include CaseSensitivity
|
||||
include TokenAuthenticatable
|
||||
include SharedScopes
|
||||
|
||||
extend Gitlab::ConfigHelper
|
||||
|
||||
|
@ -213,8 +214,6 @@ class Project < ActiveRecord::Base
|
|||
scope :in_group_namespace, -> { joins(:group) }
|
||||
scope :personal, ->(user) { where(namespace_id: user.namespace_id) }
|
||||
scope :joined, ->(user) { where('namespace_id != ?', user.namespace_id) }
|
||||
scope :public_only, -> { where(visibility_level: Project::PUBLIC) }
|
||||
scope :public_and_internal_only, -> { where(visibility_level: Project.public_and_internal_levels) }
|
||||
scope :non_archived, -> { where(archived: false) }
|
||||
scope :for_milestones, ->(ids) { joins(:milestones).where('milestones.id' => ids).distinct }
|
||||
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
class AddVisibilityLevelToGroups < ActiveRecord::Migration
|
||||
def change
|
||||
#All groups will be private when created
|
||||
add_column :namespaces, :visibility_level, :integer, null: false, default: 0
|
||||
|
||||
#Set all existing groups to public
|
||||
Group.update_all(visibility_level: 20)
|
||||
add_column :namespaces, :visibility_level, :integer, null: false, default: 20
|
||||
end
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20160305220806) do
|
||||
ActiveRecord::Schema.define(version: 20160301124843) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
||||
|
|
Loading…
Reference in a new issue