OSDN Git Service

Adds a Group filter on the admin users list (#7893).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 16 Mar 2011 18:20:08 +0000 (18:20 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 16 Mar 2011 18:20:08 +0000 (18:20 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@5150 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/users_controller.rb
app/models/user.rb
app/views/users/index.rhtml
test/functional/users_controller_test.rb

index c7f9dcf..2c4ca37 100644 (file)
@@ -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
index 62e8324..a5ec74a 100644 (file)
@@ -76,6 +76,11 @@ class User < Principal
 
   before_destroy :remove_references_before_destroy
   
+  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
index 0730826..79e5093 100644 (file)
@@ -8,6 +8,12 @@
 <fieldset><legend><%= l(:label_filter_plural) %></legend>
 <label><%= l(:field_status) %>:</label>
 <%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;"  %>
+
+<% if @groups.present? %>
+<label><%= l(:label_group) %>:</label>
+<%= select_tag 'group_id', '<option></option>' + options_from_collection_for_select(@groups, :id, :name, params[:group_id].to_i), :onchange => "this.form.submit(); return false;"  %>
+<% end %>
+
 <label><%= l(:label_user) %>:</label>
 <%= text_field_tag 'name', params[:name], :size => 30 %>
 <%= submit_tag l(:button_apply), :class => "small", :name => nil %>
index 6837dea..2b34ce9 100644 (file)
@@ -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