From d48320f9e0a702f207acca24f686a0edfe363a14 Mon Sep 17 00:00:00 2001 From: Patrick Gansterer Date: Sun, 7 Mar 2021 18:13:10 +0100 Subject: [PATCH] Add CSV download for User --- app/controllers/admin/users_controller.rb | 4 +++ app/views/admin/users/index.html.haml | 3 ++ lib/users_csv.rb | 39 +++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 lib/users_csv.rb diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index d4e2b78a..97ff4177 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -5,6 +5,10 @@ class Admin::UsersController < Admin::BaseController @users = params[:show_deleted] ? User.deleted : User.undeleted @users = @users.includes(:mail_delivery_status) + if request.format.csv? + send_data UsersCsv.new(@users).to_csv, filename: 'users.csv', type: 'text/csv' + end + # if somebody uses the search field: @users = @users.natural_search(params[:user_name]) unless params[:user_name].blank? diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index afc831a0..4c0f1228 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -2,6 +2,9 @@ - content_for :actionbar do = link_to t('.new_user'), new_admin_user_path, class: 'btn btn-primary' + = link_to url_for(search: params[:q], format: :csv), class: 'btn' do + = glyph :download + CSV - content_for :sidebar do %p= t('.first_paragraph', url: link_to(t('.new_users'), new_admin_user_path)).html_safe diff --git a/lib/users_csv.rb b/lib/users_csv.rb new file mode 100644 index 00000000..56ec3a23 --- /dev/null +++ b/lib/users_csv.rb @@ -0,0 +1,39 @@ +class UsersCsv < RenderCSV + include ApplicationHelper + + def header + row = [ + User.human_attribute_name(:id), + User.human_attribute_name(:name), + User.human_attribute_name(:nick), + User.human_attribute_name(:first_name), + User.human_attribute_name(:last_name), + User.human_attribute_name(:email), + User.human_attribute_name(:phone), + User.human_attribute_name(:last_login), + User.human_attribute_name(:last_activity), + User.human_attribute_name(:iban), + User.human_attribute_name(:ordergroup) + ] + row + User.custom_fields.pluck(:label) + end + + def data + @object.each do |o| + row = [ + o.id, + o.name, + o.nick, + o.first_name, + o.last_name, + o.email, + o.phone, + o.last_login, + o.last_activity, + o.iban, + o.ordergroup&.name + ] + yield row + User.custom_fields.map { |f| o.settings.custom_fields[f[:name]] } + end + end +end