Allow groups to appear in the search results if the group owner allows it
This commit is contained in:
parent
363900a3e7
commit
6051c28fc0
|
@ -22,6 +22,7 @@ v 8.2.0 (unreleased)
|
||||||
- Include commit logs in project search
|
- Include commit logs in project search
|
||||||
- Add "added", "modified" and "removed" properties to commit object in webhook
|
- Add "added", "modified" and "removed" properties to commit object in webhook
|
||||||
- Rename "Back to" links to "Go to" because its not always a case it point to place user come from
|
- Rename "Back to" links to "Go to" because its not always a case it point to place user come from
|
||||||
|
- Allow groups to appear in the search results if the group owner allows it
|
||||||
|
|
||||||
v 8.1.3
|
v 8.1.3
|
||||||
- Spread out runner contacted_at updates
|
- Spread out runner contacted_at updates
|
||||||
|
|
|
@ -4,12 +4,12 @@ class GroupsController < Groups::ApplicationController
|
||||||
before_action :group, except: [:new, :create]
|
before_action :group, except: [:new, :create]
|
||||||
|
|
||||||
# Authorize
|
# Authorize
|
||||||
before_action :authorize_read_group!, except: [:show, :new, :create]
|
before_action :authorize_read_group!, except: [:show, :new, :create, :autocomplete]
|
||||||
before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects]
|
before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects]
|
||||||
before_action :authorize_create_group!, only: [:new, :create]
|
before_action :authorize_create_group!, only: [:new, :create]
|
||||||
|
|
||||||
# Load group projects
|
# Load group projects
|
||||||
before_action :load_projects, except: [:new, :create, :projects, :edit, :update]
|
before_action :load_projects, except: [:new, :create, :projects, :edit, :update, :autocomplete]
|
||||||
before_action :event_filter, only: :show
|
before_action :event_filter, only: :show
|
||||||
|
|
||||||
layout :determine_layout
|
layout :determine_layout
|
||||||
|
@ -133,7 +133,7 @@ class GroupsController < Groups::ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def group_params
|
def group_params
|
||||||
params.require(:group).permit(:name, :description, :path, :avatar)
|
params.require(:group).permit(:name, :description, :path, :avatar, :public)
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_events
|
def load_events
|
||||||
|
|
|
@ -6,33 +6,34 @@ class GroupsFinder
|
||||||
private
|
private
|
||||||
|
|
||||||
def all_groups(current_user)
|
def all_groups(current_user)
|
||||||
if current_user
|
group_ids = if current_user
|
||||||
if current_user.authorized_groups.any?
|
if current_user.authorized_groups.any?
|
||||||
# User has access to groups
|
# User has access to groups
|
||||||
#
|
#
|
||||||
# Return only:
|
# Return only:
|
||||||
# groups with public projects
|
# groups with public projects
|
||||||
# groups with internal projects
|
# groups with internal projects
|
||||||
# groups with joined projects
|
# groups with joined projects
|
||||||
#
|
#
|
||||||
group_ids = Project.public_and_internal_only.pluck(:namespace_id) +
|
Project.public_and_internal_only.pluck(:namespace_id) +
|
||||||
current_user.authorized_groups.pluck(:id)
|
current_user.authorized_groups.pluck(:id)
|
||||||
Group.where(id: group_ids)
|
else
|
||||||
else
|
# User has no group membership
|
||||||
# User has no group membership
|
#
|
||||||
#
|
# Return only:
|
||||||
# Return only:
|
# groups with public projects
|
||||||
# groups with public projects
|
# groups with internal projects
|
||||||
# groups with internal projects
|
#
|
||||||
#
|
Project.public_and_internal_only.pluck(:namespace_id)
|
||||||
Group.where(id: Project.public_and_internal_only.pluck(:namespace_id))
|
end
|
||||||
end
|
else
|
||||||
else
|
# Not authenticated
|
||||||
# Not authenticated
|
#
|
||||||
#
|
# Return only:
|
||||||
# Return only:
|
# groups with public projects
|
||||||
# groups with public projects
|
Project.public_only.pluck(:namespace_id)
|
||||||
Group.where(id: Project.public_only.pluck(:namespace_id))
|
end
|
||||||
end
|
|
||||||
|
Group.where("public IS TRUE OR id IN(?)", group_ids)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -70,7 +70,7 @@ module SearchHelper
|
||||||
|
|
||||||
# Autocomplete results for the current user's groups
|
# Autocomplete results for the current user's groups
|
||||||
def groups_autocomplete(term, limit = 5)
|
def groups_autocomplete(term, limit = 5)
|
||||||
current_user.authorized_groups.search(term).limit(limit).map do |group|
|
GroupsFinder.new.execute(current_user).search(term).limit(limit).map do |group|
|
||||||
{
|
{
|
||||||
label: "group: #{search_result_sanitize(group.name)}",
|
label: "group: #{search_result_sanitize(group.name)}",
|
||||||
url: group_path(group)
|
url: group_path(group)
|
||||||
|
|
|
@ -120,7 +120,7 @@ class Group < Namespace
|
||||||
end
|
end
|
||||||
|
|
||||||
def public_profile?
|
def public_profile?
|
||||||
projects.public_only.any?
|
self.public || projects.public_only.any?
|
||||||
end
|
end
|
||||||
|
|
||||||
def post_create_hook
|
def post_create_hook
|
||||||
|
|
|
@ -25,6 +25,15 @@
|
||||||
%hr
|
%hr
|
||||||
= link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar"
|
= link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar"
|
||||||
|
|
||||||
|
.form-group
|
||||||
|
%hr
|
||||||
|
= f.label :public, class: 'control-label' do
|
||||||
|
Public
|
||||||
|
.col-sm-10
|
||||||
|
.checkbox
|
||||||
|
= f.check_box :public
|
||||||
|
%span.descr Make this group public (even if there is no any public project inside this group)
|
||||||
|
|
||||||
.form-actions
|
.form-actions
|
||||||
= f.submit 'Save group', class: "btn btn-save"
|
= f.submit 'Save group', class: "btn btn-save"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddPublicToGroup < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :namespaces, :public, :boolean, default: false
|
||||||
|
end
|
||||||
|
end
|
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20151026182941) do
|
ActiveRecord::Schema.define(version: 20151103001141) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -501,14 +501,15 @@ ActiveRecord::Schema.define(version: 20151026182941) do
|
||||||
add_index "milestones", ["project_id"], name: "index_milestones_on_project_id", using: :btree
|
add_index "milestones", ["project_id"], name: "index_milestones_on_project_id", using: :btree
|
||||||
|
|
||||||
create_table "namespaces", force: true do |t|
|
create_table "namespaces", force: true do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
t.string "path", null: false
|
t.string "path", null: false
|
||||||
t.integer "owner_id"
|
t.integer "owner_id"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.string "type"
|
t.string "type"
|
||||||
t.string "description", default: "", null: false
|
t.string "description", default: "", null: false
|
||||||
t.string "avatar"
|
t.string "avatar"
|
||||||
|
t.boolean "public", default: false
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "namespaces", ["created_at", "id"], name: "index_namespaces_on_created_at_and_id", using: :btree
|
add_index "namespaces", ["created_at", "id"], name: "index_namespaces_on_created_at_and_id", using: :btree
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe GroupsFinder do
|
||||||
|
let(:user) { create :user }
|
||||||
|
let!(:group) { create :group }
|
||||||
|
let!(:public_group) { create :group, public: true }
|
||||||
|
|
||||||
|
describe :execute do
|
||||||
|
it 'finds public group' do
|
||||||
|
groups = GroupsFinder.new.execute(user)
|
||||||
|
expect(groups.size).to eq(1)
|
||||||
|
expect(groups.first).to eq(public_group)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -42,6 +42,11 @@ describe SearchHelper do
|
||||||
expect(search_autocomplete_opts(project.name).size).to eq(1)
|
expect(search_autocomplete_opts(project.name).size).to eq(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "includes the public group" do
|
||||||
|
group = create(:group, public: true)
|
||||||
|
expect(search_autocomplete_opts(group.name).size).to eq(1)
|
||||||
|
end
|
||||||
|
|
||||||
context "with a current project" do
|
context "with a current project" do
|
||||||
before { @project = create(:project) }
|
before { @project = create(:project) }
|
||||||
|
|
||||||
|
|
|
@ -84,4 +84,23 @@ describe Group do
|
||||||
expect(group.avatar_type).to eq(["only images allowed"])
|
expect(group.avatar_type).to eq(["only images allowed"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "public_profile?" do
|
||||||
|
it "returns true for public group" do
|
||||||
|
group = create(:group, public: true)
|
||||||
|
expect(group.public_profile?).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns true for non-public group with public project" do
|
||||||
|
group = create(:group)
|
||||||
|
create(:project, :public, group: group)
|
||||||
|
expect(group.public_profile?).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false for non-public group with no public projects" do
|
||||||
|
group = create(:group)
|
||||||
|
create(:project, group: group)
|
||||||
|
expect(group.public_profile?).to be_falsy
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue