Merge branch '23079-remove-default-scope-in-sortable' into 'master'

Removes default scope from sortable

Closes #23079

See merge request !13558
This commit is contained in:
Douwe Maan 2017-09-07 16:15:32 +00:00
commit 523a1c69ab
38 changed files with 67 additions and 53 deletions

View File

@ -2,7 +2,7 @@ class Admin::BroadcastMessagesController < Admin::ApplicationController
before_action :finder, only: [:edit, :update, :destroy] before_action :finder, only: [:edit, :update, :destroy]
def index def index
@broadcast_messages = BroadcastMessage.reorder("ends_at DESC").page(params[:page]) @broadcast_messages = BroadcastMessage.order(ends_at: :desc).page(params[:page])
@broadcast_message = BroadcastMessage.new @broadcast_message = BroadcastMessage.new
end end

View File

@ -1,7 +1,7 @@
class Admin::DashboardController < Admin::ApplicationController class Admin::DashboardController < Admin::ApplicationController
def index def index
@projects = Project.without_deleted.with_route.limit(10) @projects = Project.order_id_desc.without_deleted.with_route.limit(10)
@users = User.limit(10) @users = User.order_id_desc.limit(10)
@groups = Group.with_route.limit(10) @groups = Group.order_id_desc.with_route.limit(10)
end end
end end

View File

@ -17,7 +17,7 @@ class Admin::UsersController < Admin::ApplicationController
end end
def keys def keys
@keys = user.keys @keys = user.keys.order_id_desc
end end
def new def new

View File

@ -1,5 +1,7 @@
class Dashboard::GroupsController < Dashboard::ApplicationController class Dashboard::GroupsController < Dashboard::ApplicationController
def index def index
@sort = params[:sort] || 'id_desc'
@groups = @groups =
if params[:parent_id] && Group.supports_nested_groups? if params[:parent_id] && Group.supports_nested_groups?
parent = Group.find_by(id: params[:parent_id]) parent = Group.find_by(id: params[:parent_id])
@ -15,7 +17,7 @@ class Dashboard::GroupsController < Dashboard::ApplicationController
@groups = @groups.search(params[:filter_groups]) if params[:filter_groups].present? @groups = @groups.search(params[:filter_groups]) if params[:filter_groups].present?
@groups = @groups.includes(:route) @groups = @groups.includes(:route)
@groups = @groups.sort(@sort = params[:sort]) @groups = @groups.sort(@sort)
@groups = @groups.page(params[:page]) @groups = @groups.page(params[:page])
respond_to do |format| respond_to do |format|

View File

@ -1,7 +1,7 @@
class Profiles::EmailsController < Profiles::ApplicationController class Profiles::EmailsController < Profiles::ApplicationController
def index def index
@primary = current_user.email @primary = current_user.email
@emails = current_user.emails @emails = current_user.emails.order_id_desc
end end
def create def create

View File

@ -2,7 +2,7 @@ class Profiles::KeysController < Profiles::ApplicationController
skip_before_action :authenticate_user!, only: [:get_keys] skip_before_action :authenticate_user!, only: [:get_keys]
def index def index
@keys = current_user.keys @keys = current_user.keys.order_id_desc
@key = Key.new @key = Key.new
end end

View File

@ -27,7 +27,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
@merge_request.merge_request_diff @merge_request.merge_request_diff
end end
@merge_request_diffs = @merge_request.merge_request_diffs.viewable.select_without_diff @merge_request_diffs = @merge_request.merge_request_diffs.viewable.select_without_diff.order_id_desc
@comparable_diffs = @merge_request_diffs.select { |diff| diff.id < @merge_request_diff.id } @comparable_diffs = @merge_request_diffs.select { |diff| diff.id < @merge_request_diff.id }
if params[:start_sha].present? if params[:start_sha].present?

View File

@ -47,6 +47,10 @@ class Projects::ProjectMembersController < Projects::ApplicationController
end end
end end
def import
@projects = current_user.authorized_projects.order_id_desc
end
def apply_import def apply_import
source_project = Project.find(params[:source_project_id]) source_project = Project.find(params[:source_project_id])

View File

@ -9,6 +9,7 @@ class MoveToProjectFinder
projects = @user.projects_where_can_admin_issues projects = @user.projects_where_can_admin_issues
projects = projects.search(search) if search.present? projects = projects.search(search) if search.present?
projects = projects.excluding_project(from_project) projects = projects.excluding_project(from_project)
projects = projects.order_id_desc
# infinite scroll using offset # infinite scroll using offset
projects = projects.where('projects.id < ?', offset_id) if offset_id.present? projects = projects.where('projects.id < ?', offset_id) if offset_id.present?

View File

@ -121,7 +121,7 @@ class ProjectsFinder < UnionFinder
end end
def sort(items) def sort(items)
params[:sort].present? ? items.sort(params[:sort]) : items params[:sort].present? ? items.sort(params[:sort]) : items.order_id_desc
end end
def by_archived(projects) def by_archived(projects)

View File

@ -118,7 +118,7 @@ class TodosFinder
end end
def sort(items) def sort(items)
params[:sort] ? items.sort(params[:sort]) : items.reorder(id: :desc) params[:sort] ? items.sort(params[:sort]) : items.order_id_desc
end end
def by_action(items) def by_action(items)

View File

@ -56,7 +56,7 @@ module IssuesHelper
end end
def project_options(issuable, current_user, ability: :read_project) def project_options(issuable, current_user, ability: :read_project)
projects = current_user.authorized_projects projects = current_user.authorized_projects.order_id_desc
projects = projects.select do |project| projects = projects.select do |project|
current_user.can?(ability, project) current_user.can?(ability, project)
end end

View File

@ -92,7 +92,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| current_user.authorized_groups.order_id_desc.search(term).limit(limit).map do |group|
{ {
category: "Groups", category: "Groups",
id: group.id, id: group.id,
@ -104,7 +104,7 @@ module SearchHelper
# Autocomplete results for the current user's projects # Autocomplete results for the current user's projects
def projects_autocomplete(term, limit = 5) def projects_autocomplete(term, limit = 5)
current_user.authorized_projects.search_by_title(term) current_user.authorized_projects.order_id_desc.search_by_title(term)
.sorted_by_stars.non_archived.limit(limit).map do |p| .sorted_by_stars.non_archived.limit(limit).map do |p|
{ {
category: "Projects", category: "Projects",

View File

@ -33,7 +33,7 @@ class BroadcastMessage < ActiveRecord::Base
end end
def self.current_and_future_messages def self.current_and_future_messages
where('ends_at > :now', now: Time.zone.now).reorder(id: :asc) where('ends_at > :now', now: Time.zone.now).order_id_asc
end end
def active? def active?

View File

@ -6,10 +6,6 @@ module Sortable
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
# By default all models should be ordered
# by created_at field starting from newest
default_scope { order_id_desc }
scope :order_id_desc, -> { reorder(id: :desc) } scope :order_id_desc, -> { reorder(id: :desc) }
scope :order_id_asc, -> { reorder(id: :asc) } scope :order_id_asc, -> { reorder(id: :asc) }
scope :order_created_desc, -> { reorder(created_at: :desc) } scope :order_created_desc, -> { reorder(created_at: :desc) }

View File

@ -73,7 +73,7 @@ class User < ActiveRecord::Base
# #
# Namespace for personal projects # Namespace for personal projects
has_one :namespace, -> { where type: nil }, dependent: :destroy, foreign_key: :owner_id, autosave: true # rubocop:disable Cop/ActiveRecordDependent has_one :namespace, -> { where(type: nil) }, dependent: :destroy, foreign_key: :owner_id, autosave: true # rubocop:disable Cop/ActiveRecordDependent
# Profile # Profile
has_many :keys, -> do has_many :keys, -> do
@ -260,11 +260,13 @@ class User < ActiveRecord::Base
end end
def sort(method) def sort(method)
case method.to_s order_method = method || 'id_desc'
case order_method.to_s
when 'recent_sign_in' then order_recent_sign_in when 'recent_sign_in' then order_recent_sign_in
when 'oldest_sign_in' then order_oldest_sign_in when 'oldest_sign_in' then order_oldest_sign_in
else else
order_by(method) order_by(order_method)
end end
end end
@ -372,7 +374,7 @@ class User < ActiveRecord::Base
# Returns a user for the given SSH key. # Returns a user for the given SSH key.
def find_by_ssh_key_id(key_id) def find_by_ssh_key_id(key_id)
find_by(id: Key.unscoped.select(:user_id).where(id: key_id)) Key.find_by(id: key_id)&.user
end end
def find_by_full_path(path, follow_redirects: false) def find_by_full_path(path, follow_redirects: false)

View File

@ -115,7 +115,7 @@ module QuickActions
if issuable.allows_multiple_assignees? if issuable.allows_multiple_assignees?
issuable.assignees.pluck(:id) + users.map(&:id) issuable.assignees.pluck(:id) + users.map(&:id)
else else
[users.last.id] [users.first.id]
end end
end end

View File

@ -8,7 +8,7 @@
= form_tag apply_import_project_project_members_path(@project), method: 'post', class: 'form-horizontal' do = form_tag apply_import_project_project_members_path(@project), method: 'post', class: 'form-horizontal' do
.form-group .form-group
= label_tag :source_project_id, "Project", class: 'control-label' = label_tag :source_project_id, "Project", class: 'control-label'
.col-sm-10= select_tag(:source_project_id, options_from_collection_for_select(current_user.authorized_projects, :id, :name_with_namespace), prompt: "Select project", class: "select2 lg", required: true) .col-sm-10= select_tag(:source_project_id, options_from_collection_for_select(@projects, :id, :name_with_namespace), prompt: "Select project", class: "select2 lg", required: true)
.form-actions .form-actions
= button_tag 'Import project members', class: "btn btn-create" = button_tag 'Import project members', class: "btn btn-create"

View File

@ -0,0 +1,5 @@
---
title: Removes Sortable default scope.
merge_request: 13558
author:
type: fixed

View File

@ -52,7 +52,7 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps
end end
step 'I visit the forks page of the "Shop" project' do step 'I visit the forks page of the "Shop" project' do
@project = Project.where(name: 'Shop').last @project = Project.where(name: 'Shop').first
visit project_forks_path(@project) visit project_forks_path(@project)
end end

View File

@ -20,7 +20,7 @@ module API
use :pagination use :pagination
end end
get do get do
messages = BroadcastMessage.all messages = BroadcastMessage.all.order_id_desc
present paginate(messages), with: Entities::BroadcastMessage present paginate(messages), with: Entities::BroadcastMessage
end end

View File

@ -21,7 +21,7 @@ module API
get ":id/merge_requests/:merge_request_iid/versions" do get ":id/merge_requests/:merge_request_iid/versions" do
merge_request = find_merge_request_with_access(params[:merge_request_iid]) merge_request = find_merge_request_with_access(params[:merge_request_iid])
present paginate(merge_request.merge_request_diffs), with: Entities::MergeRequestDiff present paginate(merge_request.merge_request_diffs.order_id_desc), with: Entities::MergeRequestDiff
end end
desc 'Get a single merge request diff version' do desc 'Get a single merge request diff version' do

View File

@ -28,7 +28,7 @@ module API
end end
def list_milestones_for(parent) def list_milestones_for(parent)
milestones = parent.milestones milestones = parent.milestones.order_id_desc
milestones = Milestone.filter_by_state(milestones, params[:state]) milestones = Milestone.filter_by_state(milestones, params[:state])
milestones = filter_by_iid(milestones, params[:iids]) if params[:iids].present? milestones = filter_by_iid(milestones, params[:iids]) if params[:iids].present?
milestones = filter_by_search(milestones, params[:search]) if params[:search] milestones = filter_by_search(milestones, params[:search]) if params[:search]

View File

@ -20,7 +20,7 @@ module API
get ":id/merge_requests/:merge_request_id/versions" do get ":id/merge_requests/:merge_request_id/versions" do
merge_request = find_merge_request_with_access(params[:merge_request_id]) merge_request = find_merge_request_with_access(params[:merge_request_id])
present merge_request.merge_request_diffs, with: ::API::Entities::MergeRequestDiff present merge_request.merge_request_diffs.order_id_desc, with: ::API::Entities::MergeRequestDiff
end end
desc 'Get a single merge request diff version' do desc 'Get a single merge request diff version' do

View File

@ -34,6 +34,7 @@ module API
milestones = user_project.milestones milestones = user_project.milestones
milestones = filter_milestones_state(milestones, params[:state]) milestones = filter_milestones_state(milestones, params[:state])
milestones = filter_by_iid(milestones, params[:iid]) if params[:iid].present? milestones = filter_by_iid(milestones, params[:iid]) if params[:iid].present?
milestones = milestones.order_id_desc
present paginate(milestones), with: ::API::Entities::Milestone present paginate(milestones), with: ::API::Entities::Milestone
end end

View File

@ -120,7 +120,7 @@ module API
get do get do
authenticate! authenticate!
present_projects current_user.authorized_projects, present_projects current_user.authorized_projects.order_id_desc,
with: ::API::V3::Entities::ProjectWithAccess with: ::API::V3::Entities::ProjectWithAccess
end end

View File

@ -18,7 +18,7 @@ feature 'Import/Export - project import integration test', js: true do
context 'when selecting the namespace' do context 'when selecting the namespace' do
let(:user) { create(:admin) } let(:user) { create(:admin) }
let!(:namespace) { create(:namespace, name: 'asd', owner: user) } let!(:namespace) { user.namespace }
let(:project_path) { 'test-project-path' + SecureRandom.hex } let(:project_path) { 'test-project-path' + SecureRandom.hex }
context 'prefilled the path' do context 'prefilled the path' do
@ -66,12 +66,11 @@ feature 'Import/Export - project import integration test', js: true do
end end
scenario 'invalid project' do scenario 'invalid project' do
namespace = create(:namespace, name: 'asdf', owner: user) project = create(:project, namespace: user.namespace)
project = create(:project, namespace: namespace)
visit new_project_path visit new_project_path
select2(namespace.id, from: '#project_namespace_id') select2(user.namespace.id, from: '#project_namespace_id')
fill_in :project_path, with: project.name, visible: true fill_in :project_path, with: project.name, visible: true
click_link 'GitLab export' click_link 'GitLab export'
attach_file('file', file) attach_file('file', file)

View File

@ -15,7 +15,7 @@ describe GroupMembersFinder, '#execute' do
result = described_class.new(group).execute result = described_class.new(group).execute
expect(result.to_a).to eq([member3, member2, member1]) expect(result.to_a).to match_array([member3, member2, member1])
end end
it 'returns members for nested group', :nested_groups do it 'returns members for nested group', :nested_groups do
@ -27,6 +27,6 @@ describe GroupMembersFinder, '#execute' do
result = described_class.new(nested_group).execute result = described_class.new(nested_group).execute
expect(result.to_a).to eq([member4, member3, member1]) expect(result.to_a).to match_array([member1, member3, member4])
end end
end end

View File

@ -17,6 +17,6 @@ describe MembersFinder, '#execute' do
result = described_class.new(project, user2).execute result = described_class.new(project, user2).execute
expect(result.to_a).to eq([member3, member2, member1]) expect(result.to_a).to match_array([member1, member2, member3])
end end
end end

View File

@ -404,6 +404,6 @@ describe Namespace do
let!(:project1) { create(:project_empty_repo, namespace: group) } let!(:project1) { create(:project_empty_repo, namespace: group) }
let!(:project2) { create(:project_empty_repo, namespace: child) } let!(:project2) { create(:project_empty_repo, namespace: child) }
it { expect(group.all_projects.to_a).to eq([project2, project1]) } it { expect(group.all_projects.to_a).to match_array([project2, project1]) }
end end
end end

View File

@ -1519,7 +1519,7 @@ describe User do
developer_project = create(:project) { |p| p.add_developer(user) } developer_project = create(:project) { |p| p.add_developer(user) }
master_project = create(:project) { |p| p.add_master(user) } master_project = create(:project) { |p| p.add_master(user) }
expect(user.projects_where_can_admin_issues.to_a).to eq([master_project, developer_project, reporter_project]) expect(user.projects_where_can_admin_issues.to_a).to match_array([master_project, developer_project, reporter_project])
expect(user.can?(:admin_issue, master_project)).to eq(true) expect(user.can?(:admin_issue, master_project)).to eq(true)
expect(user.can?(:admin_issue, developer_project)).to eq(true) expect(user.can?(:admin_issue, developer_project)).to eq(true)
expect(user.can?(:admin_issue, reporter_project)).to eq(true) expect(user.can?(:admin_issue, reporter_project)).to eq(true)

View File

@ -14,7 +14,7 @@ describe API::MergeRequestDiffs, 'MergeRequestDiffs' do
describe 'GET /projects/:id/merge_requests/:merge_request_iid/versions' do describe 'GET /projects/:id/merge_requests/:merge_request_iid/versions' do
it 'returns 200 for a valid merge request' do it 'returns 200 for a valid merge request' do
get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/versions", user) get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/versions", user)
merge_request_diff = merge_request.merge_request_diffs.first merge_request_diff = merge_request.merge_request_diffs.last
expect(response.status).to eq 200 expect(response.status).to eq 200
expect(response).to include_pagination_headers expect(response).to include_pagination_headers

View File

@ -595,7 +595,7 @@ describe API::Projects do
expect { post api("/projects/user/#{user.id}", admin), name: 'Foo Project' }.to change {Project.count}.by(1) expect { post api("/projects/user/#{user.id}", admin), name: 'Foo Project' }.to change {Project.count}.by(1)
expect(response).to have_http_status(201) expect(response).to have_http_status(201)
project = Project.first project = Project.last
expect(project.name).to eq('Foo Project') expect(project.name).to eq('Foo Project')
expect(project.path).to eq('foo-project') expect(project.path).to eq('foo-project')
@ -606,7 +606,7 @@ describe API::Projects do
.to change { Project.count }.by(1) .to change { Project.count }.by(1)
expect(response).to have_http_status(201) expect(response).to have_http_status(201)
project = Project.first project = Project.last
expect(project.name).to eq('Foo Project') expect(project.name).to eq('Foo Project')
expect(project.path).to eq('path-project-Foo') expect(project.path).to eq('path-project-Foo')

View File

@ -14,7 +14,7 @@ describe API::V3::MergeRequestDiffs, 'MergeRequestDiffs' do
describe 'GET /projects/:id/merge_requests/:merge_request_id/versions' do describe 'GET /projects/:id/merge_requests/:merge_request_id/versions' do
it 'returns 200 for a valid merge request' do it 'returns 200 for a valid merge request' do
get v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/versions", user) get v3_api("/projects/#{project.id}/merge_requests/#{merge_request.id}/versions", user)
merge_request_diff = merge_request.merge_request_diffs.first merge_request_diff = merge_request.merge_request_diffs.last
expect(response.status).to eq 200 expect(response.status).to eq 200
expect(json_response.size).to eq(merge_request.merge_request_diffs.size) expect(json_response.size).to eq(merge_request.merge_request_diffs.size)

View File

@ -93,7 +93,7 @@ describe 'cycle analytics events' do
context 'with private project and builds' do context 'with private project and builds' do
before do before do
project.members.first.update(access_level: Gitlab::Access::GUEST) project.members.last.update(access_level: Gitlab::Access::GUEST)
end end
it 'does not list the test events' do it 'does not list the test events' do

View File

@ -1237,7 +1237,7 @@ describe NotificationService, :mailer do
end end
it do it do
group_member = group.members.first group_member = group.members.last
expect do expect do
notification.decline_group_invite(group_member) notification.decline_group_invite(group_member)
@ -1285,7 +1285,7 @@ describe NotificationService, :mailer do
end end
it do it do
project_member = project.members.first project_member = project.members.last
expect do expect do
notification.decline_project_invite(project_member) notification.decline_project_invite(project_member)

View File

@ -140,9 +140,14 @@ shared_examples 'a GitHub-ish import controller: POST create' do
end end
context "when a namespace with the provider user's username already exists" do context "when a namespace with the provider user's username already exists" do
let!(:existing_namespace) { create(:namespace, name: other_username, owner: user) } let!(:existing_namespace) { user.namespace }
context "when the namespace is owned by the GitLab user" do context "when the namespace is owned by the GitLab user" do
before do
user.username = other_username
user.save
end
it "takes the existing namespace" do it "takes the existing namespace" do
expect(Gitlab::GithubImport::ProjectCreator) expect(Gitlab::GithubImport::ProjectCreator)
.to receive(:new).with(provider_repo, provider_repo.name, existing_namespace, user, access_params, type: provider) .to receive(:new).with(provider_repo, provider_repo.name, existing_namespace, user, access_params, type: provider)
@ -153,12 +158,9 @@ shared_examples 'a GitHub-ish import controller: POST create' do
end end
context "when the namespace is not owned by the GitLab user" do context "when the namespace is not owned by the GitLab user" do
before do
existing_namespace.owner = create(:user)
existing_namespace.save
end
it "creates a project using user's namespace" do it "creates a project using user's namespace" do
create(:user, username: other_username)
expect(Gitlab::GithubImport::ProjectCreator) expect(Gitlab::GithubImport::ProjectCreator)
.to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider)
.and_return(double(execute: true)) .and_return(double(execute: true))

View File

@ -127,6 +127,7 @@ describe PostReceive do
it "asks the project to trigger all hooks" do it "asks the project to trigger all hooks" do
allow(Project).to receive(:find_by).and_return(project) allow(Project).to receive(:find_by).and_return(project)
expect(project).to receive(:execute_hooks).twice expect(project).to receive(:execute_hooks).twice
expect(project).to receive(:execute_services).twice expect(project).to receive(:execute_services).twice
@ -135,6 +136,7 @@ describe PostReceive do
it "enqueues a UpdateMergeRequestsWorker job" do it "enqueues a UpdateMergeRequestsWorker job" do
allow(Project).to receive(:find_by).and_return(project) allow(Project).to receive(:find_by).and_return(project)
expect(UpdateMergeRequestsWorker).to receive(:perform_async).with(project.id, project.owner.id, any_args) expect(UpdateMergeRequestsWorker).to receive(:perform_async).with(project.id, project.owner.id, any_args)
described_class.new.perform(gl_repository, key_id, base64_changes) described_class.new.perform(gl_repository, key_id, base64_changes)