From 4f8e8df6e09ba5dad0b1dcf5382d74987bb52605 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Wed, 16 Mar 2011 18:20:08 +0000 Subject: [PATCH] Adds a Group filter on the admin users list (#7893). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@5150 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/users_controller.rb | 14 ++++++++++---- app/models/user.rb | 5 +++++ app/views/users/index.rhtml | 6 ++++++ test/functional/users_controller_test.rb | 15 ++++++++++++--- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c7dadf04..764282f9 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,5 +1,5 @@ # Redmine - project management software -# Copyright (C) 2006-2010 Jean-Philippe Lang +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -38,6 +38,9 @@ class UsersController < ApplicationController @limit = per_page_option end + scope = User + scope = scope.in_group(params[:group_id].to_i) if params[:group_id].present? + @status = params[:status] ? params[:status].to_i : 1 c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status]) @@ -46,17 +49,20 @@ class UsersController < ApplicationController c << ["LOWER(login) LIKE ? OR LOWER(firstname) LIKE ? OR LOWER(lastname) LIKE ? OR LOWER(mail) LIKE ?", name, name, name, name] end - @user_count = User.count(:conditions => c.conditions) + @user_count = scope.count(:conditions => c.conditions) @user_pages = Paginator.new self, @user_count, @limit, params['page'] @offset ||= @user_pages.current.offset - @users = User.find :all, + @users = scope.find :all, :order => sort_clause, :conditions => c.conditions, :limit => @limit, :offset => @offset respond_to do |format| - format.html { render :layout => !request.xhr? } + format.html { + @groups = Group.all.sort + render :layout => !request.xhr? + } format.api end end diff --git a/app/models/user.rb b/app/models/user.rb index e26d087b..465a3c5a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -74,6 +74,11 @@ class User < Principal validates_confirmation_of :password, :allow_nil => true validates_inclusion_of :mail_notification, :in => MAIL_NOTIFICATION_OPTIONS.collect(&:first), :allow_blank => true + named_scope :in_group, lambda {|group| + group_id = group.is_a?(Group) ? group.id : group.to_i + { :conditions => ["#{User.table_name}.id IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id] } + } + def before_create self.mail_notification = Setting.default_notification_option if self.mail_notification.blank? true diff --git a/app/views/users/index.rhtml b/app/views/users/index.rhtml index 69ad7374..7d9fde3c 100644 --- a/app/views/users/index.rhtml +++ b/app/views/users/index.rhtml @@ -8,6 +8,12 @@
<%= l(:label_filter_plural) %> <%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %> + +<% if @groups.present? %> + +<%= select_tag 'group_id', '' + options_from_collection_for_select(@groups, :id, :name, params[:group_id].to_i), :onchange => "this.form.submit(); return false;" %> +<% end %> + <%= text_field_tag 'name', params[:name], :size => 30 %> <%= submit_tag l(:button_apply), :class => "small", :name => nil %> diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb index 8aa311eb..107ce106 100644 --- a/test/functional/users_controller_test.rb +++ b/test/functional/users_controller_test.rb @@ -1,5 +1,5 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +# Redmine - project management software +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -24,7 +24,7 @@ class UsersController; def rescue_action(e) raise e end; end class UsersControllerTest < ActionController::TestCase include Redmine::I18n - fixtures :users, :projects, :members, :member_roles, :roles, :auth_sources, :custom_fields, :custom_values + fixtures :users, :projects, :members, :member_roles, :roles, :auth_sources, :custom_fields, :custom_values, :groups_users def setup @controller = UsersController.new @@ -59,6 +59,15 @@ class UsersControllerTest < ActionController::TestCase assert_equal 'John', users.first.firstname end + def test_index_with_group_filter + get :index, :group_id => '10' + assert_response :success + assert_template 'index' + users = assigns(:users) + assert users.any? + assert_equal([], (users - Group.find(10).users)) + end + def test_show @request.session[:user_id] = nil get :show, :id => 2