From dbca8c97588d1fcc4155b079eb54157991be3aa7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 13:23:32 -0800 Subject: [PATCH 1/9] Add timestamps to identity --- .../20150205211843_add_timestamps_to_identities.rb | 5 +++++ db/schema.rb | 14 ++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 db/migrate/20150205211843_add_timestamps_to_identities.rb diff --git a/db/migrate/20150205211843_add_timestamps_to_identities.rb b/db/migrate/20150205211843_add_timestamps_to_identities.rb new file mode 100644 index 00000000000..77cddbfec3b --- /dev/null +++ b/db/migrate/20150205211843_add_timestamps_to_identities.rb @@ -0,0 +1,5 @@ +class AddTimestampsToIdentities < ActiveRecord::Migration + def change + add_timestamps(:identities) + end +end diff --git a/db/schema.rb b/db/schema.rb index 0e4af3df7c2..88a70182d45 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150125163100) do +ActiveRecord::Schema.define(version: 20150205211843) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -87,9 +87,11 @@ ActiveRecord::Schema.define(version: 20150125163100) do add_index "forked_project_links", ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree create_table "identities", force: true do |t| - t.string "extern_uid" - t.string "provider" - t.integer "user_id" + t.string "extern_uid" + t.string "provider" + t.integer "user_id" + t.datetime "created_at" + t.datetime "updated_at" end add_index "identities", ["user_id"], name: "index_identities_on_user_id", using: :btree @@ -323,12 +325,12 @@ ActiveRecord::Schema.define(version: 20150125163100) do t.string "import_url" t.integer "visibility_level", default: 0, null: false t.boolean "archived", default: false, null: false - t.string "avatar" t.string "import_status" t.float "repository_size", default: 0.0 t.integer "star_count", default: 0, null: false t.string "import_type" t.string "import_source" + t.string "avatar" end add_index "projects", ["creator_id"], name: "index_projects_on_creator_id", using: :btree @@ -426,7 +428,6 @@ ActiveRecord::Schema.define(version: 20150125163100) do t.integer "notification_level", default: 1, null: false t.datetime "password_expires_at" t.integer "created_by_id" - t.datetime "last_credential_check_at" t.string "avatar" t.string "confirmation_token" t.datetime "confirmed_at" @@ -434,6 +435,7 @@ ActiveRecord::Schema.define(version: 20150125163100) do t.string "unconfirmed_email" t.boolean "hide_no_ssh_key", default: false t.string "website_url", default: "", null: false + t.datetime "last_credential_check_at" t.string "github_access_token" t.string "gitlab_access_token" end From 62ed1c537e9b8aa85d354b377f18083fb71b8e05 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 14:20:55 -0800 Subject: [PATCH 2/9] Explicitly define ordering in models using default_scope --- app/controllers/admin/dashboard_controller.rb | 6 ++-- app/controllers/admin/groups_controller.rb | 2 +- app/controllers/admin/users_controller.rb | 4 +-- app/controllers/profiles/keys_controller.rb | 2 +- app/models/broadcast_message.rb | 2 ++ app/models/concerns/internal_id.rb | 1 + app/models/concerns/sortable.rb | 32 +++++++++++++++++++ app/models/email.rb | 2 ++ app/models/event.rb | 1 + app/models/hooks/web_hook.rb | 1 + app/models/identity.rb | 1 + app/models/key.rb | 1 + app/models/label.rb | 2 ++ app/models/member.rb | 1 + app/models/merge_request_diff.rb | 2 ++ app/models/namespace.rb | 1 + app/models/note.rb | 1 + app/models/project.rb | 11 ++++--- app/models/service.rb | 1 + app/models/snippet.rb | 1 + app/models/user.rb | 6 ++-- lib/api/issues.rb | 2 -- 22 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 app/models/concerns/sortable.rb diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index be19139c9b1..c491e5c7550 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -1,7 +1,7 @@ class Admin::DashboardController < Admin::ApplicationController def index - @projects = Project.order("created_at DESC").limit(10) - @users = User.order("created_at DESC").limit(10) - @groups = Group.order("created_at DESC").limit(10) + @projects = Project.limit(10) + @users = User.limit(10) + @groups = Group.limit(10) end end diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 8c7d90a5d9f..ae610d4871c 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -2,7 +2,7 @@ class Admin::GroupsController < Admin::ApplicationController before_filter :group, only: [:edit, :show, :update, :destroy, :project_update, :project_teams_update] def index - @groups = Group.order('name ASC') + @groups = Group.order_name @groups = @groups.search(params[:name]) if params[:name].present? @groups = @groups.page(params[:page]).per(20) end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index aea8545d38e..932bfc777e6 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -5,13 +5,13 @@ class Admin::UsersController < Admin::ApplicationController @users = User.filter(params[:filter]) @users = @users.search(params[:name]) if params[:name].present? @users = @users.sort(@sort = params[:sort]) - @users = @users.alphabetically.page(params[:page]) + @users = @users.order_name.page(params[:page]) end def show @personal_projects = user.personal_projects @joined_projects = user.projects.joined(@user) - @keys = user.keys.order('id DESC') + @keys = user.keys end def new diff --git a/app/controllers/profiles/keys_controller.rb b/app/controllers/profiles/keys_controller.rb index 88414b13564..4e2bd0a9b4b 100644 --- a/app/controllers/profiles/keys_controller.rb +++ b/app/controllers/profiles/keys_controller.rb @@ -3,7 +3,7 @@ class Profiles::KeysController < ApplicationController skip_before_filter :authenticate_user!, only: [:get_keys] def index - @keys = current_user.keys.order('id DESC') + @keys = current_user.keys end def show diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb index 4d0c04bcc3d..05f5e979695 100644 --- a/app/models/broadcast_message.rb +++ b/app/models/broadcast_message.rb @@ -14,6 +14,8 @@ # class BroadcastMessage < ActiveRecord::Base + include Sortable + validates :message, presence: true validates :starts_at, presence: true validates :ends_at, presence: true diff --git a/app/models/concerns/internal_id.rb b/app/models/concerns/internal_id.rb index 821ed54fb98..e86357e3dee 100644 --- a/app/models/concerns/internal_id.rb +++ b/app/models/concerns/internal_id.rb @@ -1,5 +1,6 @@ module InternalId extend ActiveSupport::Concern + include Sortable included do validate :set_iid, on: :create diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb new file mode 100644 index 00000000000..49001cabc7c --- /dev/null +++ b/app/models/concerns/sortable.rb @@ -0,0 +1,32 @@ +# == Sortable concern +# +# Set default scope for ordering objects +# +module Sortable + extend ActiveSupport::Concern + + included do + # By default all models should be ordered + # by created_at field starting from newest + default_scope { order(created_at: :desc, id: :desc) } + scope :order_name, -> { reorder(name: :asc) } + scope :order_recent, -> { reorder(created_at: :desc, id: :desc) } + scope :order_oldest, -> { reorder(created_at: :asc, id: :asc) } + scope :order_recent_updated, -> { reorder(updated_at: :desc, id: :desc) } + scope :order_oldest_updated, -> { reorder(updated_at: :asc, id: :asc) } + end + + module ClassMethods + def sort(method) + case method.to_s + when 'name' then order_name_asc + when 'recent' then order_recent + when 'oldest' then order_oldest + when 'recent_updated' then order_recent_updated + when 'oldest_updated' then order_oldest_updated + else + self + end + end + end +end diff --git a/app/models/email.rb b/app/models/email.rb index 57f476bd519..556b0e9586e 100644 --- a/app/models/email.rb +++ b/app/models/email.rb @@ -10,6 +10,8 @@ # class Email < ActiveRecord::Base + include Sortable + belongs_to :user validates :user_id, presence: true diff --git a/app/models/event.rb b/app/models/event.rb index 2a6c690ab91..9a42d380f87 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -15,6 +15,7 @@ # class Event < ActiveRecord::Base + include Sortable default_scope { where.not(author_id: nil) } CREATED = 1 diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index c8fa9c50918..defef7216f2 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -16,6 +16,7 @@ # class WebHook < ActiveRecord::Base + include Sortable include HTTParty default_value_for :push_events, true diff --git a/app/models/identity.rb b/app/models/identity.rb index 80e0e3a8a23..b2c3792d1ce 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -9,6 +9,7 @@ # class Identity < ActiveRecord::Base + include Sortable belongs_to :user validates :extern_uid, allow_blank: true, uniqueness: { scope: :provider } diff --git a/app/models/key.rb b/app/models/key.rb index d2d1af68822..e2e59296eed 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -15,6 +15,7 @@ require 'digest/md5' class Key < ActiveRecord::Base + include Sortable include Gitlab::Popen belongs_to :user diff --git a/app/models/label.rb b/app/models/label.rb index 2b2b02e0645..c8f6a7cd48c 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -11,6 +11,8 @@ # class Label < ActiveRecord::Base + include Sortable + DEFAULT_COLOR = '#428BCA' belongs_to :project diff --git a/app/models/member.rb b/app/models/member.rb index 671ef466baa..fe3d2f40e87 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -14,6 +14,7 @@ # class Member < ActiveRecord::Base + include Sortable include Notifiable include Gitlab::Access diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index a71122d5e07..acac1ca4cf7 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -14,6 +14,8 @@ require Rails.root.join("app/models/commit") class MergeRequestDiff < ActiveRecord::Base + include Sortable + # Prevent store of diff # if commits amount more then 200 COMMITS_SAFE_SIZE = 200 diff --git a/app/models/namespace.rb b/app/models/namespace.rb index e7fd3024750..ba0b2b71cf9 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -14,6 +14,7 @@ # class Namespace < ActiveRecord::Base + include Sortable include Gitlab::ShellAdapter has_many :projects, dependent: :destroy diff --git a/app/models/note.rb b/app/models/note.rb index 0b988cc3e0f..a3f2980cebd 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -23,6 +23,7 @@ require 'file_size_validator' class Note < ActiveRecord::Base include Mentionable + default_scope { order(created_at: :asc, id: :asc) } default_value_for :system, false attr_mentionable :note diff --git a/app/models/project.rb b/app/models/project.rb index 390e1457ca1..246479624ee 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -33,6 +33,7 @@ require 'carrierwave/orm/activerecord' require 'file_size_validator' class Project < ActiveRecord::Base + include Sortable include Gitlab::ShellAdapter include Gitlab::VisibilityLevel include Gitlab::ConfigHelper @@ -53,7 +54,7 @@ class Project < ActiveRecord::Base attr_accessor :new_default_branch # Relations - belongs_to :creator, foreign_key: 'creator_id', class_name: 'User' + belongs_to :creator, foreign_key: 'creator_id', class_name: 'User' belongs_to :group, -> { where(type: Group) }, foreign_key: 'namespace_id' belongs_to :namespace @@ -86,7 +87,7 @@ class Project < ActiveRecord::Base has_many :merge_requests, dependent: :destroy, foreign_key: 'target_project_id' # Merge requests from source project should be kept when source project was removed has_many :fork_merge_requests, foreign_key: 'source_project_id', class_name: MergeRequest - has_many :issues, -> { order 'issues.state DESC, issues.created_at DESC' }, dependent: :destroy + has_many :issues, dependent: :destroy has_many :labels, dependent: :destroy has_many :services, dependent: :destroy has_many :events, dependent: :destroy @@ -139,14 +140,16 @@ class Project < ActiveRecord::Base mount_uploader :avatar, AttachmentUploader # Scopes + scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') } + scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } + scope :sorted_by_names, -> { joins(:namespace).reorder('namespaces.name ASC, projects.name ASC') } + scope :without_user, ->(user) { where('projects.id NOT IN (:ids)', ids: user.authorized_projects.map(&:id) ) } scope :without_team, ->(team) { team.projects.present? ? where('projects.id NOT IN (:ids)', ids: team.projects.map(&:id)) : scoped } scope :not_in_group, ->(group) { where('projects.id NOT IN (:ids)', ids: group.project_ids ) } scope :in_team, ->(team) { where('projects.id IN (:ids)', ids: team.projects.map(&:id)) } scope :in_namespace, ->(namespace) { where(namespace_id: namespace.id) } scope :in_group_namespace, -> { joins(:group) } - scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') } - scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } 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) } diff --git a/app/models/service.rb b/app/models/service.rb index 15948e63e41..caabe8e971d 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -15,6 +15,7 @@ # To add new service you should build a class inherited from Service # and implement a set of methods class Service < ActiveRecord::Base + include Sortable serialize :properties, JSON default_value_for :active, false diff --git a/app/models/snippet.rb b/app/models/snippet.rb index a3222d29892..82c1ab94446 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -16,6 +16,7 @@ # class Snippet < ActiveRecord::Base + include Sortable include Linguist::BlobHelper include Gitlab::VisibilityLevel diff --git a/app/models/user.rb b/app/models/user.rb index 552a37c9533..41c52440320 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -49,6 +49,7 @@ require 'carrierwave/orm/activerecord' require 'file_size_validator' class User < ActiveRecord::Base + include Sortable include Gitlab::ConfigHelper include TokenAuthenticatable extend Gitlab::ConfigHelper @@ -176,7 +177,6 @@ class User < ActiveRecord::Base scope :admins, -> { where(admin: true) } scope :blocked, -> { with_state(:blocked) } scope :active, -> { with_state(:active) } - 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) ) : all } @@ -290,7 +290,7 @@ class User < ActiveRecord::Base def authorized_groups @authorized_groups ||= begin group_ids = (groups.pluck(:id) + authorized_projects.pluck(:namespace_id)) - Group.where(id: group_ids).order('namespaces.name ASC') + Group.where(id: group_ids) end end @@ -301,7 +301,7 @@ class User < ActiveRecord::Base project_ids = personal_projects.pluck(:id) project_ids.push(*groups_projects.pluck(:id)) project_ids.push(*projects.pluck(:id).uniq) - Project.where(id: project_ids).joins(:namespace).order('namespaces.name ASC') + Project.where(id: project_ids) end end diff --git a/lib/api/issues.rb b/lib/api/issues.rb index d2828b24c36..e2c2cd4c3da 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -39,7 +39,6 @@ module API issues = current_user.issues issues = filter_issues_state(issues, params[:state]) unless params[:state].nil? issues = filter_issues_labels(issues, params[:labels]) unless params[:labels].nil? - issues = issues.order('issues.id DESC') present paginate(issues), with: Entities::Issue end @@ -70,7 +69,6 @@ module API unless params[:milestone].nil? issues = filter_issues_milestone(issues, params[:milestone]) end - issues = issues.order('issues.id DESC') present paginate(issues), with: Entities::Issue end From e0aa5c371ea1c633a0648f13cd7bea35f3aea75c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 16:49:41 -0800 Subject: [PATCH 3/9] Fix method overlap for issue sorting --- app/models/concerns/internal_id.rb | 1 - app/models/concerns/sortable.rb | 4 ++-- app/models/issue.rb | 1 + app/models/merge_request.rb | 1 + app/models/milestone.rb | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/models/concerns/internal_id.rb b/app/models/concerns/internal_id.rb index e86357e3dee..821ed54fb98 100644 --- a/app/models/concerns/internal_id.rb +++ b/app/models/concerns/internal_id.rb @@ -1,6 +1,5 @@ module InternalId extend ActiveSupport::Concern - include Sortable included do validate :set_iid, on: :create diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index 49001cabc7c..dc46b2e5463 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -17,7 +17,7 @@ module Sortable end module ClassMethods - def sort(method) + def order_by(method) case method.to_s when 'name' then order_name_asc when 'recent' then order_recent @@ -25,7 +25,7 @@ module Sortable when 'recent_updated' then order_recent_updated when 'oldest_updated' then order_oldest_updated else - self + all end end end diff --git a/app/models/issue.rb b/app/models/issue.rb index 8a9e969248c..19e43ebd788 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -24,6 +24,7 @@ class Issue < ActiveRecord::Base include Issuable include InternalId include Taskable + include Sortable ActsAsTaggableOn.strict_case_match = true diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index ad2e8d7879b..f758126cfeb 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -28,6 +28,7 @@ class MergeRequest < ActiveRecord::Base include Issuable include Taskable include InternalId + include Sortable belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project" belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project" diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 8fd3e56d2ee..9bbb2bafb98 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -15,6 +15,7 @@ class Milestone < ActiveRecord::Base include InternalId + include Sortable belongs_to :project has_many :issues From bbca6a0abd9f5559fe4abbf2cb2100a0e4717ac8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 19:15:05 -0800 Subject: [PATCH 4/9] Refactor sorting in project --- app/controllers/admin/groups_controller.rb | 3 +- app/controllers/admin/users_controller.rb | 4 +- app/controllers/application_controller.rb | 4 +- app/controllers/dashboard_controller.rb | 2 +- app/helpers/sorting_helper.rb | 79 +++++++++++++++++++ app/models/concerns/issuable.rb | 10 +-- app/models/concerns/sortable.rb | 25 +++--- app/models/group.rb | 26 +++--- app/models/project.rb | 11 +-- app/models/user.rb | 9 +-- app/views/admin/groups/index.html.haml | 21 +++++ app/views/admin/projects/index.html.haml | 18 ++--- app/views/admin/users/index.html.haml | 24 +++--- .../dashboard/_projects_filter.html.haml | 16 ++-- app/views/explore/groups/index.html.haml | 15 ++-- app/views/explore/projects/index.html.haml | 14 ++-- app/views/shared/_sort_dropdown.html.haml | 20 ++--- features/steps/groups.rb | 2 +- 18 files changed, 195 insertions(+), 108 deletions(-) diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index ae610d4871c..65dc027c8eb 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -2,7 +2,8 @@ class Admin::GroupsController < Admin::ApplicationController before_filter :group, only: [:edit, :show, :update, :destroy, :project_update, :project_teams_update] def index - @groups = Group.order_name + @groups = Group.all + @groups = @groups.sort(@sort = params[:sort]) @groups = @groups.search(params[:name]) if params[:name].present? @groups = @groups.page(params[:page]).per(20) end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 932bfc777e6..e5d15528d78 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -2,10 +2,10 @@ class Admin::UsersController < Admin::ApplicationController before_filter :user, only: [:show, :edit, :update, :destroy] def index - @users = User.filter(params[:filter]) + @users = User.order_name_asc.filter(params[:filter]) @users = @users.search(params[:name]) if params[:name].present? @users = @users.sort(@sort = params[:sort]) - @users = @users.order_name.page(params[:page]) + @users = @users.page(params[:page]) end def show diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 36e13706768..6553027b430 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -254,7 +254,7 @@ class ApplicationController < ActionController::Base end def set_filters_params - params[:sort] ||= 'newest' + params[:sort] ||= 'created_desc' params[:scope] = 'all' if params[:scope].blank? params[:state] = 'opened' if params[:state].blank? @@ -280,7 +280,7 @@ class ApplicationController < ActionController::Base author_id = @filter_params[:author_id] milestone_id = @filter_params[:milestone_id] - @sort = @filter_params[:sort].try(:humanize) + @sort = @filter_params[:sort] @assignees = User.where(id: collection.pluck(:assignee_id)) @authors = User.where(id: collection.pluck(:author_id)) @milestones = Milestone.where(id: collection.pluck(:milestone_id)) diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index cd876024ba3..9e59264e418 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -9,7 +9,7 @@ class DashboardController < ApplicationController # If user needs more - point to Dashboard#projects page @projects_limit = 30 - @groups = current_user.authorized_groups.sort_by(&:human_name) + @groups = current_user.authorized_groups.order_name_asc @has_authorized_projects = @projects.count > 0 @projects_count = @projects.count @projects = @projects.limit(@projects_limit) diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb index 492e065b713..bb12d43f397 100644 --- a/app/helpers/sorting_helper.rb +++ b/app/helpers/sorting_helper.rb @@ -1,4 +1,19 @@ module SortingHelper + def sort_options_hash + { + sort_value_name => sort_title_name, + sort_value_recently_updated => sort_title_recently_updated, + sort_value_oldest_updated => sort_title_oldest_updated, + sort_value_recently_created => sort_title_recently_created, + sort_value_oldest_created => sort_title_oldest_created, + sort_value_milestone_soon => sort_title_milestone_soon, + sort_value_milestone_later => sort_title_milestone_later, + sort_value_largest_repo => sort_title_largest_repo, + sort_value_recently_signin => sort_title_recently_signin, + sort_value_oldest_signin => sort_title_oldest_signin, + } + end + def sort_title_oldest_updated 'Oldest updated' end @@ -14,4 +29,68 @@ module SortingHelper def sort_title_recently_created 'Recently created' end + + def sort_title_milestone_soon + 'Milestone due soon' + end + + def sort_title_milestone_later + 'Milestone due later' + end + + def sort_title_name + 'Name' + end + + def sort_title_largest_repo + 'Largest repository' + end + + def sort_title_recently_signin + 'Recent sign in' + end + + def sort_title_oldest_signin + 'Oldest sign in' + end + + def sort_value_oldest_updated + 'updated_asc' + end + + def sort_value_recently_updated + 'updated_desc' + end + + def sort_value_oldest_created + 'created_asc' + end + + def sort_value_recently_created + 'created_desc' + end + + def sort_value_milestone_soon + 'milestone_due_asc' + end + + def sort_value_milestone_later + 'milestone_due_desc' + end + + def sort_value_name + 'name_asc' + end + + def sort_value_largest_repo + 'repository_size_desc' + end + + def sort_value_recently_signin + 'recent_sign_in' + end + + def sort_value_oldest_signin + 'oldest_sign_in' + end end diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index fb038a3cc3f..9bc0dfb3574 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -54,15 +54,7 @@ module Issuable end def sort(method) - case method.to_s - when 'newest' then reorder("#{table_name}.created_at DESC") - when 'oldest' then reorder("#{table_name}.created_at ASC") - when 'recently_updated' then reorder("#{table_name}.updated_at DESC") - when 'last_updated' then reorder("#{table_name}.updated_at ASC") - when 'milestone_due_soon' then joins(:milestone).reorder("milestones.due_date ASC") - when 'milestone_due_later' then joins(:milestone).reorder("milestones.due_date DESC") - else reorder("#{table_name}.created_at DESC") - end + order_by(method) end end diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index dc46b2e5463..c894dbda6ef 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -9,21 +9,26 @@ module Sortable # By default all models should be ordered # by created_at field starting from newest default_scope { order(created_at: :desc, id: :desc) } - scope :order_name, -> { reorder(name: :asc) } - scope :order_recent, -> { reorder(created_at: :desc, id: :desc) } - scope :order_oldest, -> { reorder(created_at: :asc, id: :asc) } - scope :order_recent_updated, -> { reorder(updated_at: :desc, id: :desc) } - scope :order_oldest_updated, -> { reorder(updated_at: :asc, id: :asc) } + + scope :order_name_asc, -> { reorder(name: :asc) } + scope :order_created_desc, -> { reorder(created_at: :desc, id: :desc) } + scope :order_created_asc, -> { reorder(created_at: :asc, id: :asc) } + scope :order_updated_desc, -> { reorder(updated_at: :desc, id: :desc) } + scope :order_updated_asc, -> { reorder(updated_at: :asc, id: :asc) } + scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } + scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } end module ClassMethods def order_by(method) case method.to_s - when 'name' then order_name_asc - when 'recent' then order_recent - when 'oldest' then order_oldest - when 'recent_updated' then order_recent_updated - when 'oldest_updated' then order_oldest_updated + when 'name_asc' then order_name_asc + when 'updated_asc' then order_updated_asc + when 'updated_desc' then order_updated_desc + when 'created_asc' then order_created_asc + when 'created_desc' then order_created_desc + when 'milestone_due_asc' then order_milestone_due_asc + when 'milestone_due_desc' then order_milestone_due_desc else all end diff --git a/app/models/group.rb b/app/models/group.rb index 042b79a7850..d6ec0be6081 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -28,6 +28,16 @@ class Group < Namespace after_create :post_create_hook after_destroy :post_destroy_hook + class << self + def search(query) + where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%") + end + + def sort(method) + order_by(method) + end + end + def human_name name end @@ -88,20 +98,4 @@ class Group < Namespace def system_hook_service SystemHooksService.new end - - class << self - def search(query) - where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%") - end - - def sort(method) - case method.to_s - when "newest" then reorder("namespaces.created_at DESC") - when "oldest" then reorder("namespaces.created_at ASC") - when "recently_updated" then reorder("namespaces.updated_at DESC") - when "last_updated" then reorder("namespaces.updated_at ASC") - else reorder("namespaces.path, namespaces.name ASC") - end - end - end end diff --git a/app/models/project.rb b/app/models/project.rb index 246479624ee..a793e21f12d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -231,13 +231,10 @@ class Project < ActiveRecord::Base end def sort(method) - case method.to_s - when 'newest' then reorder('projects.created_at DESC') - when 'oldest' then reorder('projects.created_at ASC') - when 'recently_updated' then reorder('projects.updated_at DESC') - when 'last_updated' then reorder('projects.updated_at ASC') - when 'largest_repository' then reorder('projects.repository_size DESC') - else reorder('namespaces.path, projects.name ASC') + if method == 'repository_size_desc' + reorder(repository_size: :desc, id: :desc) + else + order_by(method) end end end diff --git a/app/models/user.rb b/app/models/user.rb index 41c52440320..ba61ecf3981 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,11 +199,10 @@ class User < ActiveRecord::Base def sort(method) case method.to_s - when 'recent_sign_in' then reorder('users.last_sign_in_at DESC') - when 'oldest_sign_in' then reorder('users.last_sign_in_at ASC') - when 'recently_created' then reorder('users.created_at DESC') - when 'late_created' then reorder('users.created_at ASC') - else reorder("users.name ASC") + when 'recent_sign_in' then reorder(last_sign_in_at: :desc) + when 'oldest_sign_in' then reorder(last_sign_in_at: :asc) + else + order_by(method) end end diff --git a/app/views/admin/groups/index.html.haml b/app/views/admin/groups/index.html.haml index 1d7fef43184..8ae9a1edea9 100644 --- a/app/views/admin/groups/index.html.haml +++ b/app/views/admin/groups/index.html.haml @@ -8,10 +8,31 @@ %hr = form_tag admin_groups_path, method: :get, class: 'form-inline' do + = hidden_field_tag :sort, @sort .form-group = text_field_tag :name, params[:name], class: "form-control input-mn-300" = button_tag "Search", class: "btn submit btn-primary" + .pull-right + .dropdown.inline + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %span.light sort: + - if @sort.present? + = sort_options_hash[@sort] + - else + = sort_title_recently_created + %b.caret + %ul.dropdown-menu + %li + = link_to admin_groups_path(sort: sort_value_recently_created) do + = sort_title_recently_created + = link_to admin_groups_path(sort: sort_value_oldest_created) do + = sort_title_oldest_created + = link_to admin_groups_path(sort: sort_value_recently_updated) do + = sort_title_recently_updated + = link_to admin_groups_path(sort: sort_value_oldest_updated) do + = sort_title_oldest_updated + %hr %ul.bordered-list diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index aa59f38d213..36a4a2fb4af 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -47,24 +47,22 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to admin_projects_path(sort: nil) do - Name - = link_to admin_projects_path(sort: 'newest') do + = link_to admin_projects_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to admin_projects_path(sort: 'oldest') do + = link_to admin_projects_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to admin_projects_path(sort: 'recently_updated') do + = link_to admin_projects_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to admin_projects_path(sort: 'last_updated') do + = link_to admin_projects_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated - = link_to admin_projects_path(sort: 'largest_repository') do - Largest repository + = link_to admin_projects_path(sort: sort_value_largest_repo) do + = sort_title_largest_repo = link_to 'New Project', new_project_path, class: "btn btn-new" %ul.well-list - @projects.each do |project| diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 8e1ecb41a85..6e15cec467b 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -36,22 +36,26 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_name %b.caret %ul.dropdown-menu %li - = link_to admin_users_path(sort: nil) do - Name - = link_to admin_users_path(sort: 'recent_sign_in') do - Recent sign in - = link_to admin_users_path(sort: 'oldest_sign_in') do - Oldest sign in - = link_to admin_users_path(sort: 'recently_created') do + = link_to admin_users_path(sort: sort_value_name) do + = sort_title_name + = link_to admin_users_path(sort: sort_value_recently_signin) do + = sort_title_recently_signin + = link_to admin_users_path(sort: sort_value_oldest_signin) do + = sort_title_oldest_signin + = link_to admin_users_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to admin_users_path(sort: 'late_created') do + = link_to admin_users_path(sort: sort_value_oldest_created) do = sort_title_oldest_created + = link_to admin_users_path(sort: sort_value_recently_updated) do + = sort_title_recently_updated + = link_to admin_users_path(sort: sort_value_oldest_updated) do + = sort_title_oldest_updated = link_to 'New User', new_admin_user_path, class: "btn btn-new" %ul.well-list diff --git a/app/views/dashboard/_projects_filter.html.haml b/app/views/dashboard/_projects_filter.html.haml index 0e990ccfab4..7b5d46072e3 100644 --- a/app/views/dashboard/_projects_filter.html.haml +++ b/app/views/dashboard/_projects_filter.html.haml @@ -82,19 +82,19 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to projects_dashboard_filter_path(sort: nil) do - Name - = link_to projects_dashboard_filter_path(sort: 'newest') do + = link_to projects_dashboard_filter_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to projects_dashboard_filter_path(sort: 'oldest') do + = link_to projects_dashboard_filter_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to projects_dashboard_filter_path(sort: 'recently_updated') do + = link_to projects_dashboard_filter_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to projects_dashboard_filter_path(sort: 'last_updated') do + = link_to projects_dashboard_filter_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated + = link_to projects_dashboard_filter_path(sort: sort_value_name) do + = sort_title_name diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index 9b1d7d0416d..5cf514927af 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -1,6 +1,7 @@ .clearfix .pull-left = form_tag explore_groups_path, method: :get, class: 'form-inline form-tiny' do |f| + = hidden_field_tag :sort, @sort .form-group = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input input-mn-300", id: "groups_search" .form-group @@ -11,21 +12,19 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to explore_groups_path(sort: nil) do - Name - = link_to explore_groups_path(sort: 'newest') do + = link_to explore_groups_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to explore_groups_path(sort: 'oldest') do + = link_to explore_groups_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to explore_groups_path(sort: 'recently_updated') do + = link_to explore_groups_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to explore_groups_path(sort: 'last_updated') do + = link_to explore_groups_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated %hr diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml index 02586077d8c..02d02912791 100644 --- a/app/views/explore/projects/index.html.haml +++ b/app/views/explore/projects/index.html.haml @@ -11,21 +11,19 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort.humanize + = sort_options_hash[@sort] - else - Name + = sort_title_recently_created %b.caret %ul.dropdown-menu %li - = link_to explore_projects_path(sort: nil) do - Name - = link_to explore_projects_path(sort: 'newest') do + = link_to explore_projects_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to explore_projects_path(sort: 'oldest') do + = link_to explore_projects_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to explore_projects_path(sort: 'recently_updated') do + = link_to explore_projects_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to explore_projects_path(sort: 'last_updated') do + = link_to explore_projects_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated %hr diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml index 3e6a62380f3..ba14c8643cd 100644 --- a/app/views/shared/_sort_dropdown.html.haml +++ b/app/views/shared/_sort_dropdown.html.haml @@ -2,21 +2,21 @@ %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} %span.light sort: - if @sort.present? - = @sort + = sort_options_hash[@sort] - else - Newest + = sort_title_recently_created %b.caret %ul.dropdown-menu.dropdown-menu-align-right %li - = link_to page_filter_path(sort: 'newest') do + = link_to page_filter_path(sort: sort_value_recently_created) do = sort_title_recently_created - = link_to page_filter_path(sort: 'oldest') do + = link_to page_filter_path(sort: sort_value_oldest_created) do = sort_title_oldest_created - = link_to page_filter_path(sort: 'recently_updated') do + = link_to page_filter_path(sort: sort_value_recently_updated) do = sort_title_recently_updated - = link_to page_filter_path(sort: 'last_updated') do + = link_to page_filter_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated - = link_to page_filter_path(sort: 'milestone_due_soon') do - Milestone due soon - = link_to page_filter_path(sort: 'milestone_due_later') do - Milestone due later + = link_to page_filter_path(sort: sort_value_milestone_soon) do + = sort_title_milestone_soon + = link_to page_filter_path(sort: sort_value_milestone_later) do + = sort_title_milestone_later diff --git a/features/steps/groups.rb b/features/steps/groups.rb index 895ee7ba081..610e7fd3a48 100644 --- a/features/steps/groups.rb +++ b/features/steps/groups.rb @@ -83,7 +83,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps end step 'I should be redirected to group "Samurai" page' do - current_path.should == group_path(Group.last) + current_path.should == group_path(Group.find_by(name: 'Samurai')) end step 'I should see newly created group "Samurai"' do From c5be267e40c0ba05c2a7de6a71d154f1b5161160 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 20:21:21 -0800 Subject: [PATCH 5/9] Refactor issuable sorting a bit --- app/models/concerns/issuable.rb | 9 ++++++++- app/models/concerns/sortable.rb | 11 ++++++----- app/models/project.rb | 2 +- features/steps/admin/groups.rb | 2 +- spec/models/user_spec.rb | 6 +++--- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 9bc0dfb3574..f5e23e9dc2d 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -29,6 +29,8 @@ module Issuable scope :only_opened, -> { with_state(:opened) } scope :only_reopened, -> { with_state(:reopened) } scope :closed, -> { with_state(:closed) } + scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } + scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } delegate :name, :email, @@ -54,7 +56,12 @@ module Issuable end def sort(method) - order_by(method) + case method.to_s + when 'milestone_due_asc' then order_milestone_due_asc + when 'milestone_due_desc' then order_milestone_due_desc + else + order_by(method) + end end end diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index c894dbda6ef..cca1ee08fe8 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -10,25 +10,26 @@ module Sortable # by created_at field starting from newest default_scope { order(created_at: :desc, id: :desc) } - scope :order_name_asc, -> { reorder(name: :asc) } scope :order_created_desc, -> { reorder(created_at: :desc, id: :desc) } scope :order_created_asc, -> { reorder(created_at: :asc, id: :asc) } scope :order_updated_desc, -> { reorder(updated_at: :desc, id: :desc) } scope :order_updated_asc, -> { reorder(updated_at: :asc, id: :asc) } - scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } - scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } + + if column_names.include?('name') + scope :order_name_asc, -> { reorder(name: :asc) } + scope :order_name_desc, -> { reorder(name: :desc) } + end end module ClassMethods def order_by(method) case method.to_s when 'name_asc' then order_name_asc + when 'name_desc' then order_name_desc when 'updated_asc' then order_updated_asc when 'updated_desc' then order_updated_desc when 'created_asc' then order_created_asc when 'created_desc' then order_created_desc - when 'milestone_due_asc' then order_milestone_due_asc - when 'milestone_due_desc' then order_milestone_due_desc else all end diff --git a/app/models/project.rb b/app/models/project.rb index a793e21f12d..a9ead7830ab 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -140,7 +140,7 @@ class Project < ActiveRecord::Base mount_uploader :avatar, AttachmentUploader # Scopes - scope :sorted_by_activity, -> { reorder('projects.last_activity_at DESC') } + scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) } scope :sorted_by_stars, -> { reorder('projects.star_count DESC') } scope :sorted_by_names, -> { joins(:namespace).reorder('namespaces.name ASC, projects.name ASC') } diff --git a/features/steps/admin/groups.rb b/features/steps/admin/groups.rb index 5e45063b4b5..6bcec48be88 100644 --- a/features/steps/admin/groups.rb +++ b/features/steps/admin/groups.rb @@ -33,7 +33,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps end step 'I should be redirected to group page' do - current_path.should == admin_group_path(Group.last) + current_path.should == admin_group_path(Group.find_by(path: 'gitlab')) end When 'I select user "John Doe" from user list as "Reporter"' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 83341e516a5..629d51b960d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -474,7 +474,7 @@ describe User do @user = create :user, created_at: Date.today, last_sign_in_at: Date.today, name: 'Alpha' @user1 = create :user, created_at: Date.today - 1, last_sign_in_at: Date.today - 1, name: 'Omega' end - + it "sorts users as recently_signed_in" do User.sort('recent_sign_in').first.should == @user end @@ -484,11 +484,11 @@ describe User do end it "sorts users as recently_created" do - User.sort('recently_created').first.should == @user + User.sort('created_desc').first.should == @user end it "sorts users as late_created" do - User.sort('late_created').first.should == @user1 + User.sort('created_asc').first.should == @user1 end it "sorts users by name when nil is passed" do From 8952fc015fae476a20051c01cf4217d82d30c83d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 20:29:41 -0800 Subject: [PATCH 6/9] Apply default scope to labels and remove one for notes --- app/controllers/projects/commits_controller.rb | 2 +- app/controllers/projects/labels_controller.rb | 2 +- app/controllers/projects/merge_requests_controller.rb | 2 +- app/finders/notes_finder.rb | 3 ++- app/models/label.rb | 4 +--- app/models/note.rb | 1 - app/views/shared/_issuable_filter.html.haml | 2 +- 7 files changed, 7 insertions(+), 9 deletions(-) diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb index 0a85c36a758..b133afe44b5 100644 --- a/app/controllers/projects/commits_controller.rb +++ b/app/controllers/projects/commits_controller.rb @@ -13,7 +13,7 @@ class Projects::CommitsController < Projects::ApplicationController @commits = @repo.commits(@ref, @path, @limit, @offset) @note_counts = Note.where(commit_id: @commits.map(&:id)). - group(:commit_id).count + group(:commit_id).count respond_to do |format| format.html diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 6c7bde9c5d5..b61fef3b627 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -7,7 +7,7 @@ class Projects::LabelsController < Projects::ApplicationController respond_to :js, :html def index - @labels = @project.labels.order_by_name.page(params[:page]).per(20) + @labels = @project.labels.page(params[:page]).per(20) end def new diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 912f9eb5b6b..01be318ede2 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -23,7 +23,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController def show @note_counts = Note.where(commit_id: @merge_request.commits.map(&:id)). - group(:commit_id).count + group(:commit_id).count respond_to do |format| format.html diff --git a/app/finders/notes_finder.rb b/app/finders/notes_finder.rb index 6fe15b41060..e2bd0a2560e 100644 --- a/app/finders/notes_finder.rb +++ b/app/finders/notes_finder.rb @@ -22,6 +22,7 @@ class NotesFinder end # Use overlapping intervals to avoid worrying about race conditions - notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP) + notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP). + order(created_at: :asc, id: :asc) end end diff --git a/app/models/label.rb b/app/models/label.rb index c8f6a7cd48c..9d7099c5652 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -11,8 +11,6 @@ # class Label < ActiveRecord::Base - include Sortable - DEFAULT_COLOR = '#428BCA' belongs_to :project @@ -30,7 +28,7 @@ class Label < ActiveRecord::Base format: { with: /\A[^&\?,&]+\z/ }, uniqueness: { scope: :project_id } - scope :order_by_name, -> { reorder("labels.title ASC") } + default_scope { order(title: :asc) } alias_attribute :name, :title diff --git a/app/models/note.rb b/app/models/note.rb index a3f2980cebd..0b988cc3e0f 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -23,7 +23,6 @@ require 'file_size_validator' class Note < ActiveRecord::Base include Mentionable - default_scope { order(created_at: :asc, id: :asc) } default_value_for :system, false attr_mentionable :note diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml index 4f683258fac..cd97481bb6c 100644 --- a/app/views/shared/_issuable_filter.html.haml +++ b/app/views/shared/_issuable_filter.html.haml @@ -98,7 +98,7 @@ = link_to page_filter_path(label_name: nil) do Any - if @project.labels.any? - - @project.labels.order_by_name.each do |label| + - @project.labels.each do |label| %li = link_to page_filter_path(label_name: label.name) do = render_colored_label(label) From bdfb349ff70f0fde6d4dc7b4317c3bc7ead580a4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 22:00:54 -0800 Subject: [PATCH 7/9] Refactor and improve sorting objects in API for projects, issues and merge requests --- doc/api/issues.md | 4 ++ doc/api/merge_requests.md | 8 ++- doc/api/projects.md | 18 +++++- lib/api/helpers.rb | 16 ++++++ lib/api/issues.rb | 10 +++- lib/api/merge_requests.rb | 29 ++++------ lib/api/projects.rb | 73 ++++++++++++------------ spec/requests/api/merge_requests_spec.rb | 4 ++ 8 files changed, 100 insertions(+), 62 deletions(-) diff --git a/doc/api/issues.md b/doc/api/issues.md index 8d073c46d33..5a2f6a4c229 100644 --- a/doc/api/issues.md +++ b/doc/api/issues.md @@ -18,6 +18,8 @@ Parameters: - `state` (optional) - Return `all` issues or just those that are `opened` or `closed` - `labels` (optional) - Comma-separated list of label names +- `order_by` (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` +- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` ```json [ @@ -105,6 +107,8 @@ Parameters: - `state` (optional) - Return `all` issues or just those that are `opened` or `closed` - `labels` (optional) - Comma-separated list of label names - `milestone` (optional) - Milestone title +- `order_by` (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` +- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` ## Single issue diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md index acae55d07ef..1f3fd26a241 100644 --- a/doc/api/merge_requests.md +++ b/doc/api/merge_requests.md @@ -2,7 +2,9 @@ ## List merge requests -Get all merge requests for this project. The `state` parameter can be used to get only merge requests with a given state (`opened`, `closed`, or `merged`) or all of them (`all`). The pagination parameters `page` and `per_page` can be used to restrict the list of merge requests. +Get all merge requests for this project. +The `state` parameter can be used to get only merge requests with a given state (`opened`, `closed`, or `merged`) or all of them (`all`). +The pagination parameters `page` and `per_page` can be used to restrict the list of merge requests. ``` GET /projects/:id/merge_requests @@ -14,8 +16,8 @@ Parameters: - `id` (required) - The ID of a project - `state` (optional) - Return `all` requests or just those that are `merged`, `opened` or `closed` -- `order_by` (optional) - Return requests ordered by `created_at` or `updated_at` fields -- `sort` (optional) - Return requests sorted in `asc` or `desc` order +- `order_by` (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` +- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` ```json [ diff --git a/doc/api/projects.md b/doc/api/projects.md index 559d35d316a..454f6fa2e91 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -11,8 +11,8 @@ GET /projects Parameters: - `archived` (optional) - if passed, limit by archived status -- `order_by` (optional) - Return requests ordered by `id`, `name`, `created_at` or `last_activity_at` fields -- `sort` (optional) - Return requests sorted in `asc` or `desc` order +- `order_by` (optional) - Return requests ordered by `id`, `name`, `path`, `created_at`, `updated_at` or `last_activity_at` fields. Default is `created_at` +- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` - `search` (optional) - Return list of authorized projects according to a search criteria ```json @@ -98,6 +98,13 @@ Get a list of projects which are owned by the authenticated user. GET /projects/owned ``` +Parameters: + +- `archived` (optional) - if passed, limit by archived status +- `order_by` (optional) - Return requests ordered by `id`, `name`, `path`, `created_at`, `updated_at` or `last_activity_at` fields. Default is `created_at` +- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` +- `search` (optional) - Return list of authorized projects according to a search criteria + ### List ALL projects Get a list of all GitLab projects (admin only). @@ -106,6 +113,13 @@ Get a list of all GitLab projects (admin only). GET /projects/all ``` +Parameters: + +- `archived` (optional) - if passed, limit by archived status +- `order_by` (optional) - Return requests ordered by `id`, `name`, `path`, `created_at`, `updated_at` or `last_activity_at` fields. Default is `created_at` +- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` +- `search` (optional) - Return list of authorized projects according to a search criteria + ### Get single project Get a specific project, identified by project ID or NAMESPACE/PROJECT_NAME, which is owned by the authenticated user. diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index be9e4280d65..8fa30460ba6 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -154,6 +154,22 @@ module API Gitlab::Access.options_with_owner.values.include? level.to_i end + def issuable_order_by + if params["order_by"] == 'updated_at' + 'updated_at' + else + 'created_at' + end + end + + def issuable_sort + if params["sort"] == 'asc' + :asc + else + :desc + end + end + # error helpers def forbidden!(reason = nil) diff --git a/lib/api/issues.rb b/lib/api/issues.rb index e2c2cd4c3da..ff062be6040 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -27,7 +27,9 @@ module API # Parameters: # state (optional) - Return "opened" or "closed" issues # labels (optional) - Comma-separated list of label names - + # order_by (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` + # sort (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` + # # Example Requests: # GET /issues # GET /issues?state=opened @@ -39,7 +41,7 @@ module API issues = current_user.issues issues = filter_issues_state(issues, params[:state]) unless params[:state].nil? issues = filter_issues_labels(issues, params[:labels]) unless params[:labels].nil? - + issues.reorder(issuable_order_by => issuable_sort) present paginate(issues), with: Entities::Issue end end @@ -52,6 +54,8 @@ module API # state (optional) - Return "opened" or "closed" issues # labels (optional) - Comma-separated list of label names # milestone (optional) - Milestone title + # order_by (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` + # sort (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` # # Example Requests: # GET /projects/:id/issues @@ -66,10 +70,12 @@ module API issues = user_project.issues issues = filter_issues_state(issues, params[:state]) unless params[:state].nil? issues = filter_issues_labels(issues, params[:labels]) unless params[:labels].nil? + unless params[:milestone].nil? issues = filter_issues_milestone(issues, params[:milestone]) end + issues.reorder(issuable_order_by => issuable_sort) present paginate(issues), with: Entities::Issue end diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index a0ebd8d0c1b..25b7857f4b1 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -25,6 +25,8 @@ module API # Parameters: # id (required) - The ID of a project # state (optional) - Return requests "merged", "opened" or "closed" + # order_by (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` + # sort (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` # # Example: # GET /projects/:id/merge_requests @@ -37,25 +39,18 @@ module API # get ":id/merge_requests" do authorize! :read_merge_request, user_project + merge_requests = user_project.merge_requests - mrs = case params["state"] - when "opened" then user_project.merge_requests.opened - when "closed" then user_project.merge_requests.closed - when "merged" then user_project.merge_requests.merged - else user_project.merge_requests - end + merge_requests = + case params["state"] + when "opened" then merge_requests.opened + when "closed" then merge_requests.closed + when "merged" then merge_requests.merged + else merge_requests + end - sort = case params["sort"] - when 'desc' then 'DESC' - else 'ASC' - end - - mrs = case params["order_by"] - when 'updated_at' then mrs.order("updated_at #{sort}") - else mrs.order("created_at #{sort}") - end - - present paginate(mrs), with: Entities::MergeRequest + merge_requests.reorder(issuable_order_by => issuable_sort) + present paginate(merge_requests), with: Entities::MergeRequest end # Show MR diff --git a/lib/api/projects.rb b/lib/api/projects.rb index d96288bb982..0677e85beab 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -11,6 +11,37 @@ module API attrs[:visibility_level] = Gitlab::VisibilityLevel::PUBLIC if !attrs[:visibility_level].present? && publik == true attrs end + + def filter_projects(projects) + # If the archived parameter is passed, limit results accordingly + if params[:archived].present? + projects = projects.where(archived: parse_boolean(params[:archived])) + end + + if params[:search].present? + projects = projects.search(params[:search]) + end + + projects.reorder(project_order_by => project_sort) + end + + def project_order_by + order_fields = %w(id name path created_at updated_at last_activity_at) + + if order_fields.include?(params['order_by']) + params['order_by'] + else + 'created_at' + end + end + + def project_sort + if params["sort"] == 'asc' + :asc + else + :desc + end + end end # Get a projects list for authenticated user @@ -19,25 +50,7 @@ module API # GET /projects get do @projects = current_user.authorized_projects - sort = params[:sort] == 'desc' ? 'desc' : 'asc' - - @projects = case params["order_by"] - when 'id' then @projects.reorder("id #{sort}") - when 'name' then @projects.reorder("name #{sort}") - when 'created_at' then @projects.reorder("created_at #{sort}") - when 'last_activity_at' then @projects.reorder("last_activity_at #{sort}") - else @projects - end - - # If the archived parameter is passed, limit results accordingly - if params[:archived].present? - @projects = @projects.where(archived: parse_boolean(params[:archived])) - end - - if params[:search].present? - @projects = @projects.search(params[:search]) - end - + @projects = filter_projects(@projects) @projects = paginate @projects present @projects, with: Entities::Project end @@ -47,16 +60,8 @@ module API # Example Request: # GET /projects/owned get '/owned' do - sort = params[:sort] == 'desc' ? 'desc' : 'asc' @projects = current_user.owned_projects - @projects = case params["order_by"] - when 'id' then @projects.reorder("id #{sort}") - when 'name' then @projects.reorder("name #{sort}") - when 'created_at' then @projects.reorder("created_at #{sort}") - when 'last_activity_at' then @projects.reorder("last_activity_at #{sort}") - else @projects - end - + @projects = filter_projects(@projects) @projects = paginate @projects present @projects, with: Entities::Project end @@ -67,16 +72,8 @@ module API # GET /projects/all get '/all' do authenticated_as_admin! - sort = params[:sort] == 'desc' ? 'desc' : 'asc' - - @projects = case params["order_by"] - when 'id' then Project.order("id #{sort}") - when 'name' then Project.order("name #{sort}") - when 'created_at' then Project.order("created_at #{sort}") - when 'last_activity_at' then Project.order("last_activity_at #{sort}") - else Project - end - + @projects = Project.all + @projects = filter_projects(@projects) @projects = paginate @projects present @projects, with: Entities::Project end diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 5795082f5cb..0870a298eff 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -28,6 +28,7 @@ describe API::API, api: true do json_response.length.should == 3 json_response.first['title'].should == merge_request.title end + it "should return an array of all merge_requests" do get api("/projects/#{project.id}/merge_requests?state", user) response.status.should == 200 @@ -35,6 +36,7 @@ describe API::API, api: true do json_response.length.should == 3 json_response.first['title'].should == merge_request.title end + it "should return an array of open merge_requests" do get api("/projects/#{project.id}/merge_requests?state=opened", user) response.status.should == 200 @@ -42,6 +44,7 @@ describe API::API, api: true do json_response.length.should == 1 json_response.first['title'].should == merge_request.title end + it "should return an array of closed merge_requests" do get api("/projects/#{project.id}/merge_requests?state=closed", user) response.status.should == 200 @@ -50,6 +53,7 @@ describe API::API, api: true do json_response.first['title'].should == merge_request_closed.title json_response.second['title'].should == merge_request_merged.title end + it "should return an array of merged merge_requests" do get api("/projects/#{project.id}/merge_requests?state=merged", user) response.status.should == 200 From f9e6f668981f6f57d41c34d68a84879a48593269 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 5 Feb 2015 22:40:35 -0800 Subject: [PATCH 8/9] Fix tests --- spec/features/admin/admin_users_spec.rb | 6 +++--- spec/features/issues_spec.rb | 18 +++++++++-------- spec/requests/api/merge_requests_spec.rb | 25 +++++++++++++----------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb index 82da19746f8..59c4ffb5624 100644 --- a/spec/features/admin/admin_users_spec.rb +++ b/spec/features/admin/admin_users_spec.rb @@ -32,14 +32,14 @@ describe "Admin::Users", feature: true do it "should apply defaults to user" do click_button "Create user" - user = User.last + user = User.find_by(username: 'bang') user.projects_limit.should == Gitlab.config.gitlab.default_projects_limit user.can_create_group.should == Gitlab.config.gitlab.default_can_create_group end it "should create user with valid data" do click_button "Create user" - user = User.last + user = User.find_by(username: 'bang') user.name.should == "Big Bang" user.email.should == "bigbang@mail.com" end @@ -52,7 +52,7 @@ describe "Admin::Users", feature: true do it "should send valid email to user with email & password" do click_button "Create user" - user = User.last + user = User.find_by(username: 'bang') email = ActionMailer::Base.deliveries.last email.subject.should have_content("Account was created") email.text_part.body.should have_content(user.email) diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb index e6fa376f3eb..29aeb6a400a 100644 --- a/spec/features/issues_spec.rb +++ b/spec/features/issues_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe "Issues", feature: true do + include SortingHelper + let(:project) { create(:project) } before do @@ -80,7 +82,7 @@ describe "Issues", feature: true do title: title) end - @issue = Issue.first # with title 'foobar' + @issue = Issue.find_by(title: 'foobar') @issue.milestone = create(:milestone, project: project) @issue.assignee = nil @issue.save @@ -130,14 +132,14 @@ describe "Issues", feature: true do let(:later_due_milestone) { create(:milestone, due_date: '2013-12-12') } it 'sorts by newest' do - visit project_issues_path(project, sort: 'newest') + visit project_issues_path(project, sort: sort_value_recently_created) first_issue.should include("foo") last_issue.should include("baz") end it 'sorts by oldest' do - visit project_issues_path(project, sort: 'oldest') + visit project_issues_path(project, sort: sort_value_oldest_created) first_issue.should include("baz") last_issue.should include("foo") @@ -146,7 +148,7 @@ describe "Issues", feature: true do it 'sorts by most recently updated' do baz.updated_at = Time.now + 100 baz.save - visit project_issues_path(project, sort: 'recently_updated') + visit project_issues_path(project, sort: sort_value_recently_updated) first_issue.should include("baz") end @@ -154,7 +156,7 @@ describe "Issues", feature: true do it 'sorts by least recently updated' do baz.updated_at = Time.now - 100 baz.save - visit project_issues_path(project, sort: 'last_updated') + visit project_issues_path(project, sort: sort_value_oldest_updated) first_issue.should include("baz") end @@ -168,13 +170,13 @@ describe "Issues", feature: true do end it 'sorts by recently due milestone' do - visit project_issues_path(project, sort: 'milestone_due_soon') + visit project_issues_path(project, sort: sort_value_milestone_soon) first_issue.should include("foo") end it 'sorts by least recently due milestone' do - visit project_issues_path(project, sort: 'milestone_due_later') + visit project_issues_path(project, sort: sort_value_milestone_later) first_issue.should include("bar") end @@ -191,7 +193,7 @@ describe "Issues", feature: true do end it 'sorts with a filter applied' do - visit project_issues_path(project, sort: 'oldest', assignee_id: user2.id) + visit project_issues_path(project, sort: sort_value_oldest_created, assignee_id: user2.id) first_issue.should include("bar") last_issue.should include("foo") diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 0870a298eff..b5deb072cd1 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -26,7 +26,7 @@ describe API::API, api: true do response.status.should == 200 json_response.should be_an Array json_response.length.should == 3 - json_response.first['title'].should == merge_request.title + json_response.last['title'].should == merge_request.title end it "should return an array of all merge_requests" do @@ -34,7 +34,7 @@ describe API::API, api: true do response.status.should == 200 json_response.should be_an Array json_response.length.should == 3 - json_response.first['title'].should == merge_request.title + json_response.last['title'].should == merge_request.title end it "should return an array of open merge_requests" do @@ -42,7 +42,7 @@ describe API::API, api: true do response.status.should == 200 json_response.should be_an Array json_response.length.should == 1 - json_response.first['title'].should == merge_request.title + json_response.last['title'].should == merge_request.title end it "should return an array of closed merge_requests" do @@ -50,8 +50,8 @@ describe API::API, api: true do response.status.should == 200 json_response.should be_an Array json_response.length.should == 2 - json_response.first['title'].should == merge_request_closed.title - json_response.second['title'].should == merge_request_merged.title + json_response.second['title'].should == merge_request_closed.title + json_response.first['title'].should == merge_request_merged.title end it "should return an array of merged merge_requests" do @@ -73,9 +73,10 @@ describe API::API, api: true do response.status.should == 200 json_response.should be_an Array json_response.length.should == 3 - json_response.first['id'].should == @mr_earlier.id - json_response.last['id'].should == @mr_later.id + json_response.last['id'].should == @mr_earlier.id + json_response.first['id'].should == @mr_later.id end + it "should return an array of merge_requests in descending order" do get api("/projects/#{project.id}/merge_requests?sort=desc", user) response.status.should == 200 @@ -84,21 +85,23 @@ describe API::API, api: true do json_response.first['id'].should == @mr_later.id json_response.last['id'].should == @mr_earlier.id end + it "should return an array of merge_requests ordered by updated_at" do get api("/projects/#{project.id}/merge_requests?order_by=updated_at", user) response.status.should == 200 json_response.should be_an Array json_response.length.should == 3 - json_response.first['id'].should == @mr_earlier.id - json_response.last['id'].should == @mr_later.id + json_response.last['id'].should == @mr_earlier.id + json_response.first['id'].should == @mr_later.id end + it "should return an array of merge_requests ordered by created_at" do get api("/projects/#{project.id}/merge_requests?sort=created_at", user) response.status.should == 200 json_response.should be_an Array json_response.length.should == 3 - json_response.first['id'].should == @mr_earlier.id - json_response.last['id'].should == @mr_later.id + json_response.last['id'].should == @mr_earlier.id + json_response.first['id'].should == @mr_later.id end end end From ce0811ae5cf2c69ccf24e101b1ec1554a42e9856 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 6 Feb 2015 09:19:51 -0800 Subject: [PATCH 9/9] Improve tests --- features/steps/project/forked_merge_requests.rb | 8 ++++---- features/steps/project/source/browse_files.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/features/steps/project/forked_merge_requests.rb b/features/steps/project/forked_merge_requests.rb index ccef84cdcc5..a5484ad3a00 100644 --- a/features/steps/project/forked_merge_requests.rb +++ b/features/steps/project/forked_merge_requests.rb @@ -70,8 +70,8 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps find("#merge_request_source_branch").value.should have_content "new_design" find("#merge_request_target_branch").value.should have_content "master" find("#merge_request_title").value.should == "New Design" - verify_commit_link(".mr_target_commit",@project) - verify_commit_link(".mr_source_commit",@forked_project) + verify_commit_link(".mr_target_commit", @project) + verify_commit_link(".mr_source_commit", @forked_project) end step 'I update the merge request title' do @@ -114,7 +114,7 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps step 'I fill out an invalid "Merge Request On Forked Project" merge request' do select "Select branch", from: "merge_request_target_branch" find(:select, "merge_request_source_project_id", {}).value.should == @forked_project.id.to_s - find(:select, "merge_request_target_project_id", {}).value.should == project.id.to_s + find(:select, "merge_request_target_project_id", {}).value.should == @project.id.to_s find(:select, "merge_request_source_branch", {}).value.should == "" find(:select, "merge_request_target_branch", {}).value.should == "" click_button "Compare branches" @@ -125,7 +125,7 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps end step 'the target repository should be the original repository' do - page.should have_select("merge_request_target_project_id", selected: project.path_with_namespace) + page.should have_select("merge_request_target_project_id", selected: @project.path_with_namespace) end # Verify a link is generated against the correct project diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb index 770e8162497..1fe01e55aa4 100644 --- a/features/steps/project/source/browse_files.rb +++ b/features/steps/project/source/browse_files.rb @@ -174,7 +174,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps click_link 'add a file' # Remove pre-receive hook so we can push without auth - FileUtils.rm(File.join(Project.last.repository.path, 'hooks', 'pre-receive')) + FileUtils.rm(File.join(@project.repository.path, 'hooks', 'pre-receive')) end private