Patch #5957 » users_export7.patch
| app/controllers/users_controller.rb | ||
|---|---|---|
| 28 | 28 |
include SortHelper |
| 29 | 29 |
helper :custom_fields |
| 30 | 30 |
include CustomFieldsHelper |
| 31 |
include UsersHelper |
|
| 31 | 32 |
helper :principal_memberships |
| 32 | 33 |
helper :activities |
| 33 | 34 |
include ActivitiesHelper |
| ... | ... | |
| 61 | 62 |
@groups = Group.givable.sort |
| 62 | 63 |
render :layout => !request.xhr? |
| 63 | 64 |
} |
| 65 |
format.csv {
|
|
| 66 |
send_data(users_to_csv(scope.order(sort_clause)), :type => 'text/csv; header=present', :filename => 'users.csv') |
|
| 67 |
} |
|
| 64 | 68 |
format.api |
| 65 | 69 |
end |
| 66 | 70 |
end |
| app/helpers/users_helper.rb | ||
|---|---|---|
| 18 | 18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 19 | 19 | |
| 20 | 20 |
module UsersHelper |
| 21 |
include ApplicationHelper |
|
| 22 | ||
| 21 | 23 |
def users_status_options_for_select(selected) |
| 22 | 24 |
user_count_by_status = User.group('status').count.to_hash
|
| 23 |
options_for_select([[l(:label_all), ''], |
|
| 24 |
["#{l(:status_active)} (#{user_count_by_status[1].to_i})", '1'],
|
|
| 25 |
["#{l(:status_registered)} (#{user_count_by_status[2].to_i})", '2'],
|
|
| 26 |
["#{l(:status_locked)} (#{user_count_by_status[3].to_i})", '3']], selected.to_s)
|
|
| 25 |
options_for_select([[l(:label_all), '']] + (User.valid_statuses.map {|c| ["#{l('status_' + User::LABEL_BY_STATUS[c])} (#{user_count_by_status[c].to_i})", c]}), selected.to_s)
|
|
| 27 | 26 |
end |
| 28 | 27 | |
| 29 | 28 |
def user_mail_notification_options(user) |
| ... | ... | |
| 61 | 60 |
end |
| 62 | 61 |
tabs |
| 63 | 62 |
end |
| 63 | ||
| 64 |
def users_to_csv(users) |
|
| 65 |
Redmine::Export::CSV.generate(:encoding => params[:encoding]) do |csv| |
|
| 66 |
columns = [ |
|
| 67 |
'login', |
|
| 68 |
'firstname', |
|
| 69 |
'lastname', |
|
| 70 |
'mail', |
|
| 71 |
'admin', |
|
| 72 |
'created_on', |
|
| 73 |
'last_login_on', |
|
| 74 |
'status' |
|
| 75 |
] |
|
| 76 | ||
| 77 |
# csv header fields |
|
| 78 |
csv << columns.map{|column| l('field_' + column)}
|
|
| 79 |
# csv lines |
|
| 80 |
users.each do |user| |
|
| 81 |
csv << columns.map do |column| |
|
| 82 |
if column == 'status' |
|
| 83 |
l(("status_#{User::LABEL_BY_STATUS[user.status]}"))
|
|
| 84 |
else |
|
| 85 |
format_object(user.send(column), false) |
|
| 86 |
end |
|
| 87 |
end |
|
| 88 |
end |
|
| 89 |
end |
|
| 90 |
end |
|
| 64 | 91 |
end |
| app/views/users/index.html.erb | ||
|---|---|---|
| 4 | 4 | |
| 5 | 5 |
<h2><%=l(:label_user_plural)%></h2> |
| 6 | 6 | |
| 7 |
<%= form_tag(users_path, :method => :get) do %>
|
|
| 7 |
<%= form_tag(users_path, { :method => :get, :id => 'users_form' }) do %>
|
|
| 8 | 8 |
<fieldset><legend><%= l(:label_filter_plural) %></legend> |
| 9 | 9 |
<label for='status'><%= l(:field_status) %>:</label> |
| 10 | 10 |
<%= select_tag 'status', users_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %> |
| ... | ... | |
| 19 | 19 |
<%= submit_tag l(:button_apply), :class => "small", :name => nil %> |
| 20 | 20 |
<%= link_to l(:button_clear), users_path, :class => 'icon icon-reload' %> |
| 21 | 21 |
</fieldset> |
| 22 |
<%= hidden_field_tag 'encoding', l(:general_csv_encoding) unless l(:general_csv_encoding).casecmp('UTF-8') == 0 %>
|
|
| 22 | 23 |
<% end %> |
| 23 | 24 |
|
| 24 | 25 | |
| ... | ... | |
| 55 | 56 |
</table> |
| 56 | 57 |
</div> |
| 57 | 58 |
<span class="pagination"><%= pagination_links_full @user_pages, @user_count %></span> |
| 59 |
<% other_formats_links do |f| %> |
|
| 60 |
<%= f.link_to_with_query_parameters 'CSV', {}, :onclick => "showModal('csv-export-options', '330px'); return false;" %>
|
|
| 61 |
<% end %> |
|
| 62 |
<div id="csv-export-options" style="display: none;"> |
|
| 63 |
<h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3> |
|
| 64 |
<%= export_csv_encoding_select_tag %> |
|
| 65 |
<p class="buttons"> |
|
| 66 |
<%= submit_tag l(:button_export), :name => nil, :id => 'csv-export-button' %> |
|
| 67 |
<%= submit_tag l(:button_cancel), :name => nil, :onclick => 'hideModal(this);', :type => 'button' %> |
|
| 68 |
</p> |
|
| 69 |
</div> |
|
| 70 |
<%= javascript_tag do %> |
|
| 71 |
$(document).ready(function(){
|
|
| 72 |
$('input#csv-export-button').click(function(){
|
|
| 73 |
$('form input#encoding').val($('select#encoding option:selected').val());
|
|
| 74 |
$('form#users_form').attr('action', "<%= users_path(:format => 'csv') %>").submit();
|
|
| 75 |
$('form#users_form').attr('action', '<%= users_path %>');
|
|
| 76 |
hideModal(this); |
|
| 77 |
}); |
|
| 78 |
}); |
|
| 79 |
<% end %> |
|
| 58 | 80 |
<% else %> |
| 59 | 81 |
<p class="nodata"><%= l(:label_no_data) %></p> |
| 60 | 82 |
<% end %> |
| test/functional/users_controller_test.rb | ||
|---|---|---|
| 64 | 64 |
end |
| 65 | 65 |
end |
| 66 | 66 | |
| 67 |
def test_index_csv |
|
| 68 |
with_settings :default_language => 'en' do |
|
| 69 |
get :index, :params => { :format => 'csv' }
|
|
| 70 |
assert_response :success |
|
| 71 | ||
| 72 |
assert_equal User.logged.status(1).count, response.body.chomp.split("\n").size - 1
|
|
| 73 |
assert_include 'active', response.body |
|
| 74 |
assert_not_include 'locked', response.body |
|
| 75 |
assert_equal 'text/csv; header=present', @response.content_type |
|
| 76 |
end |
|
| 77 |
end |
|
| 78 | ||
| 79 |
def test_index_csv_with_status_filter |
|
| 80 |
with_settings :default_language => 'en' do |
|
| 81 |
get :index, :params => { :status => 3, :format => 'csv' }
|
|
| 82 |
assert_response :success |
|
| 83 | ||
| 84 |
assert_equal User.logged.status(3).count, response.body.chomp.split("\n").size - 1
|
|
| 85 |
assert_include 'locked', response.body |
|
| 86 |
assert_not_include 'active', response.body |
|
| 87 |
assert_equal 'text/csv; header=present', @response.content_type |
|
| 88 |
end |
|
| 89 |
end |
|
| 90 | ||
| 91 |
def test_index_csv_with_name_filter |
|
| 92 |
get :index, :params => {:name => 'John', :format => 'csv'}
|
|
| 93 |
assert_response :success |
|
| 94 | ||
| 95 |
assert_equal User.logged.like('John').count, response.body.chomp.split("\n").size - 1
|
|
| 96 |
assert_include 'John', response.body |
|
| 97 |
assert_equal 'text/csv; header=present', @response.content_type |
|
| 98 |
end |
|
| 99 | ||
| 100 |
def test_index_csv_with_group_filter |
|
| 101 |
get :index, :params => {:group_id => '10', :format => 'csv'}
|
|
| 102 |
assert_response :success |
|
| 103 | ||
| 104 |
assert_equal Group.find(10).users.count, response.body.chomp.split("\n").size - 1
|
|
| 105 |
assert_equal 'text/csv; header=present', @response.content_type |
|
| 106 |
end |
|
| 107 | ||
| 67 | 108 |
def test_show |
| 68 | 109 |
@request.session[:user_id] = nil |
| 69 | 110 |
get :show, :params => {:id => 2}
|
- « Previous
- 1
- …
- 7
- 8
- 9
- Next »