Adds "sorted" scope to Principal and User and sort users/groups properly.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11259 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
c7df78f3b6
commit
e53a5de918
|
@ -64,7 +64,7 @@ class WatchersController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def autocomplete_for_user
|
def autocomplete_for_user
|
||||||
@users = User.active.like(params[:q]).limit(100).all
|
@users = User.active.sorted.like(params[:q]).limit(100).all
|
||||||
if @watched
|
if @watched
|
||||||
@users -= @watched.watcher_users
|
@users -= @watched.watcher_users
|
||||||
end
|
end
|
||||||
|
|
|
@ -316,7 +316,7 @@ module ApplicationHelper
|
||||||
|
|
||||||
def principals_check_box_tags(name, principals)
|
def principals_check_box_tags(name, principals)
|
||||||
s = ''
|
s = ''
|
||||||
principals.sort.each do |principal|
|
principals.each do |principal|
|
||||||
s << "<label>#{ check_box_tag name, principal.id, false } #{h principal}</label>\n"
|
s << "<label>#{ check_box_tag name, principal.id, false } #{h principal}</label>\n"
|
||||||
end
|
end
|
||||||
s.html_safe
|
s.html_safe
|
||||||
|
|
|
@ -26,7 +26,7 @@ module GroupsHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_principals_for_new_group_users(group)
|
def render_principals_for_new_group_users(group)
|
||||||
scope = User.active.not_in_group(group).like(params[:q])
|
scope = User.active.sorted.not_in_group(group).like(params[:q])
|
||||||
principal_count = scope.count
|
principal_count = scope.count
|
||||||
principal_pages = Redmine::Pagination::Paginator.new principal_count, 100, params['page']
|
principal_pages = Redmine::Pagination::Paginator.new principal_count, 100, params['page']
|
||||||
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all
|
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
module MembersHelper
|
module MembersHelper
|
||||||
def render_principals_for_new_members(project)
|
def render_principals_for_new_members(project)
|
||||||
scope = Principal.active.not_member_of(project).like(params[:q]).order('type, login, lastname ASC')
|
scope = Principal.active.sorted.not_member_of(project).like(params[:q])
|
||||||
principal_count = scope.count
|
principal_count = scope.count
|
||||||
principal_pages = Redmine::Pagination::Paginator.new principal_count, 100, params['page']
|
principal_pages = Redmine::Pagination::Paginator.new principal_count, 100, params['page']
|
||||||
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all
|
principals = scope.offset(principal_pages.offset).limit(principal_pages.per_page).all
|
||||||
|
|
|
@ -70,6 +70,7 @@ class Principal < ActiveRecord::Base
|
||||||
where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids)
|
where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids)
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
scope :sorted, lambda { order(*Principal.fields_for_order_statement)}
|
||||||
|
|
||||||
before_create :set_default_empty_values
|
before_create :set_default_empty_values
|
||||||
|
|
||||||
|
@ -88,6 +89,15 @@ class Principal < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns an array of fields names than can be used to make an order statement for principals.
|
||||||
|
# Users are sorted before Groups.
|
||||||
|
# Examples:
|
||||||
|
def self.fields_for_order_statement(table=nil)
|
||||||
|
table ||= table_name
|
||||||
|
columns = ['type DESC'] + (User.name_formatter[:order] - ['id']) + ['lastname', 'id']
|
||||||
|
columns.uniq.map {|field| "#{table}.#{field}"}
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
# Make sure we don't try to insert NULL values (see #4632)
|
# Make sure we don't try to insert NULL values (see #4632)
|
||||||
|
|
|
@ -114,6 +114,7 @@ class User < Principal
|
||||||
group_id = group.is_a?(Group) ? group.id : group.to_i
|
group_id = group.is_a?(Group) ? group.id : group.to_i
|
||||||
where("#{User.table_name}.id NOT IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
|
where("#{User.table_name}.id NOT IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
|
||||||
}
|
}
|
||||||
|
scope :sorted, lambda { order(*User.fields_for_order_statement)}
|
||||||
|
|
||||||
def set_mail_notification
|
def set_mail_notification
|
||||||
self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
|
self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
|
||||||
|
|
|
@ -49,6 +49,20 @@ class PrincipalTest < ActiveSupport::TestCase
|
||||||
assert_equal [], Principal.not_member_of([]).sort
|
assert_equal [], Principal.not_member_of([]).sort
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_sorted_scope_should_sort_users_before_groups
|
||||||
|
scope = Principal.where("type <> ?", 'AnonymousUser')
|
||||||
|
expected_order = scope.all.sort do |a, b|
|
||||||
|
if a.is_a?(User) && b.is_a?(Group)
|
||||||
|
-1
|
||||||
|
elsif a.is_a?(Group) && b.is_a?(User)
|
||||||
|
1
|
||||||
|
else
|
||||||
|
a.name.downcase <=> b.name.downcase
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assert_equal expected_order.map(&:name).map(&:downcase), scope.sorted.all.map(&:name).map(&:downcase)
|
||||||
|
end
|
||||||
|
|
||||||
context "#like" do
|
context "#like" do
|
||||||
setup do
|
setup do
|
||||||
Principal.create!(:login => 'login')
|
Principal.create!(:login => 'login')
|
||||||
|
|
|
@ -34,6 +34,10 @@ class UserTest < ActiveSupport::TestCase
|
||||||
@dlopper = User.find(3)
|
@dlopper = User.find(3)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_sorted_scope_should_sort_user_by_display_name
|
||||||
|
assert_equal User.all.map(&:name).map(&:downcase).sort, User.sorted.all.map(&:name).map(&:downcase)
|
||||||
|
end
|
||||||
|
|
||||||
def test_generate
|
def test_generate
|
||||||
User.generate!(:firstname => 'Testing connection')
|
User.generate!(:firstname => 'Testing connection')
|
||||||
User.generate!(:firstname => 'Testing connection')
|
User.generate!(:firstname => 'Testing connection')
|
||||||
|
|
Loading…
Reference in New Issue