mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-12-01 12:24:28 +01:00
[feature]async generation of users exports
This commit is contained in:
parent
a9d92237df
commit
a2066d8c09
@ -91,24 +91,51 @@ class API::MembersController < API::ApiController
|
|||||||
# export subscriptions
|
# export subscriptions
|
||||||
def export_subscriptions
|
def export_subscriptions
|
||||||
authorize :export
|
authorize :export
|
||||||
@subscriptions = Subscription.all.includes(:plan, :user => [:profile])
|
|
||||||
|
|
||||||
render xlsx: 'export_subscriptions.xlsx', filename: "export_subscriptions.xlsx"
|
export = Export.where({category:'users', export_type: 'subscriptions'}).where('created_at > ?', Subscription.maximum('updated_at')).last
|
||||||
|
if export.nil? || !FileTest.exist?(export.file)
|
||||||
|
@export = Export.new({category:'users', export_type: 'subscriptions', user: current_user})
|
||||||
|
if @export.save
|
||||||
|
render json: {export_id: @export.id}, status: :ok
|
||||||
|
else
|
||||||
|
render json: @export.errors, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_file File.join(Rails.root, export.file), :type => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', :disposition => 'attachment'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# export reservations
|
# export reservations
|
||||||
def export_reservations
|
def export_reservations
|
||||||
authorize :export
|
authorize :export
|
||||||
@reservations = Reservation.all.includes(:slots, :reservable, :user => [:profile])
|
|
||||||
|
|
||||||
render xlsx: 'export_reservations.xlsx', filename: "export_reservations.xlsx"
|
export = Export.where({category:'users', export_type: 'reservations'}).where('created_at > ?', Reservation.maximum('updated_at')).last
|
||||||
|
if export.nil? || !FileTest.exist?(export.file)
|
||||||
|
@export = Export.new({category:'users', export_type: 'reservations', user: current_user})
|
||||||
|
if @export.save
|
||||||
|
render json: {export_id: @export.id}, status: :ok
|
||||||
|
else
|
||||||
|
render json: @export.errors, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_file File.join(Rails.root, export.file), :type => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', :disposition => 'attachment'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def export_members
|
def export_members
|
||||||
authorize :export
|
authorize :export
|
||||||
@members = User.with_role(:member).includes(:group, :trainings, :tags, :invoices, :projects, :subscriptions => [:plan], :profile => [:address])
|
|
||||||
|
|
||||||
render xlsx: 'export_members.xlsx', filename: "export_members.xlsx"
|
export = Export.where({category:'users', export_type: 'members'}).where('created_at > ?', User.with_role(:member).maximum('updated_at')).last
|
||||||
|
if export.nil? || !FileTest.exist?(export.file)
|
||||||
|
@export = Export.new({category:'users', export_type: 'members', user: current_user})
|
||||||
|
if @export.save
|
||||||
|
render json: {export_id: @export.id}, status: :ok
|
||||||
|
else
|
||||||
|
render json: @export.errors, status: :unprocessable_entity
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_file File.join(Rails.root, export.file), :type => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', :disposition => 'attachment'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def merge
|
def merge
|
||||||
|
@ -26,6 +26,8 @@ class Export < ActiveRecord::Base
|
|||||||
case category
|
case category
|
||||||
when 'statistics'
|
when 'statistics'
|
||||||
StatisticsExportWorker.perform_async(self.id)
|
StatisticsExportWorker.perform_async(self.id)
|
||||||
|
when 'users'
|
||||||
|
UsersExportWorker.perform_async(self.id)
|
||||||
else
|
else
|
||||||
raise NoMethodError, "Unknown export service for #{category}/#{export_type}"
|
raise NoMethodError, "Unknown export service for #{category}/#{export_type}"
|
||||||
end
|
end
|
||||||
|
65
app/services/users_export_service.rb
Normal file
65
app/services/users_export_service.rb
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
require 'abstract_controller'
|
||||||
|
require 'action_controller'
|
||||||
|
require 'action_view'
|
||||||
|
require 'active_record'
|
||||||
|
|
||||||
|
# require any helpers
|
||||||
|
require './app/helpers/application_helper'
|
||||||
|
|
||||||
|
class UsersExportService
|
||||||
|
|
||||||
|
# export subscriptions
|
||||||
|
def export_subscriptions(export)
|
||||||
|
@subscriptions = Subscription.all.includes(:plan, :user => [:profile])
|
||||||
|
|
||||||
|
ActionController::Base.prepend_view_path './app/views/'
|
||||||
|
# place data in view_assigns
|
||||||
|
view_assigns = {subscriptions: @subscriptions}
|
||||||
|
av = ActionView::Base.new(ActionController::Base.view_paths, view_assigns)
|
||||||
|
av.class_eval do
|
||||||
|
# include any needed helpers (for the view)
|
||||||
|
include ApplicationHelper
|
||||||
|
end
|
||||||
|
|
||||||
|
content = av.render template: 'exports/users_subscriptions.xlsx.axlsx'
|
||||||
|
# write content to file
|
||||||
|
File.open(export.file,"w+b") {|f| f.puts content }
|
||||||
|
end
|
||||||
|
|
||||||
|
# export reservations
|
||||||
|
def export_reservations(export)
|
||||||
|
@reservations = Reservation.all.includes(:slots, :reservable, :user => [:profile])
|
||||||
|
|
||||||
|
ActionController::Base.prepend_view_path './app/views/'
|
||||||
|
# place data in view_assigns
|
||||||
|
view_assigns = {reservations: @reservations}
|
||||||
|
av = ActionView::Base.new(ActionController::Base.view_paths, view_assigns)
|
||||||
|
av.class_eval do
|
||||||
|
# include any needed helpers (for the view)
|
||||||
|
include ApplicationHelper
|
||||||
|
end
|
||||||
|
|
||||||
|
content = av.render template: 'exports/users_reservations.xlsx.axlsx'
|
||||||
|
# write content to file
|
||||||
|
File.open(export.file,"w+b") {|f| f.puts content }
|
||||||
|
end
|
||||||
|
|
||||||
|
# export members
|
||||||
|
def export_members(export)
|
||||||
|
@members = User.with_role(:member).includes(:group, :trainings, :tags, :invoices, :projects, :subscriptions => [:plan], :profile => [:address])
|
||||||
|
|
||||||
|
ActionController::Base.prepend_view_path './app/views/'
|
||||||
|
# place data in view_assigns
|
||||||
|
view_assigns = {members: @members}
|
||||||
|
av = ActionView::Base.new(ActionController::Base.view_paths, view_assigns)
|
||||||
|
av.class_eval do
|
||||||
|
# include any needed helpers (for the view)
|
||||||
|
include ApplicationHelper
|
||||||
|
end
|
||||||
|
|
||||||
|
content = av.render template: 'exports/users_members.xlsx.axlsx'
|
||||||
|
# write content to file
|
||||||
|
File.open(export.file,"w+b") {|f| f.puts content }
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
27
app/workers/users_export_worker.rb
Normal file
27
app/workers/users_export_worker.rb
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
class UsersExportWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
|
||||||
|
def perform(export_id)
|
||||||
|
export = Export.find(export_id)
|
||||||
|
|
||||||
|
unless export.user.is_admin?
|
||||||
|
raise SecurityError, 'Not allowed to export'
|
||||||
|
end
|
||||||
|
|
||||||
|
unless export.category == 'users'
|
||||||
|
raise KeyError, 'Wrong worker called'
|
||||||
|
end
|
||||||
|
|
||||||
|
service = UsersExportService.new
|
||||||
|
method_name = "export_#{export.export_type}"
|
||||||
|
|
||||||
|
if %w(members subscriptions reservations).include?(export.export_type) and service.respond_to?(method_name)
|
||||||
|
service.public_send(method_name, export)
|
||||||
|
|
||||||
|
NotificationCenter.call type: :notify_admin_export_complete,
|
||||||
|
receiver: export.user,
|
||||||
|
attached_object: export
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
@ -259,6 +259,9 @@ en:
|
|||||||
statistics_project: "of statistics about projects"
|
statistics_project: "of statistics about projects"
|
||||||
statistics_subscription: "of subscription statistics"
|
statistics_subscription: "of subscription statistics"
|
||||||
statistics_training: "of statistics about trainings"
|
statistics_training: "of statistics about trainings"
|
||||||
|
users_members: "of the members' list"
|
||||||
|
users_subscriptions: "of the subscriptions' list"
|
||||||
|
users_reservations: "of the reservations' list"
|
||||||
is_over: "is over."
|
is_over: "is over."
|
||||||
download_here: "Download here"
|
download_here: "Download here"
|
||||||
|
|
||||||
|
@ -259,6 +259,9 @@ fr:
|
|||||||
statistics_project: "des statistiques sur les projets"
|
statistics_project: "des statistiques sur les projets"
|
||||||
statistics_subscription: "des statistiques d'abonnements"
|
statistics_subscription: "des statistiques d'abonnements"
|
||||||
statistics_training: "des statistiques sur les formations"
|
statistics_training: "des statistiques sur les formations"
|
||||||
|
users_members: "de la liste des membres"
|
||||||
|
users_subscriptions: "de la liste des abonnements"
|
||||||
|
users_reservations: "de la liste des réservations"
|
||||||
is_over: "est terminé."
|
is_over: "est terminé."
|
||||||
download_here: "Téléchargez ici"
|
download_here: "Téléchargez ici"
|
||||||
|
|
||||||
|
@ -261,6 +261,9 @@ en:
|
|||||||
statistics_project: "of statistics about projects"
|
statistics_project: "of statistics about projects"
|
||||||
statistics_subscription: "of subscription statistics"
|
statistics_subscription: "of subscription statistics"
|
||||||
statistics_training: "of statistics about trainings"
|
statistics_training: "of statistics about trainings"
|
||||||
|
users_members: "of the members' list"
|
||||||
|
users_subscriptions: "of the subscriptions' list"
|
||||||
|
users_reservations: "of the reservations' list"
|
||||||
click_to_download: "Excel file generated successfully. To download it, click"
|
click_to_download: "Excel file generated successfully. To download it, click"
|
||||||
here: "here"
|
here: "here"
|
||||||
|
|
||||||
|
@ -261,6 +261,9 @@ fr:
|
|||||||
statistics_project: "des statistiques sur les projets"
|
statistics_project: "des statistiques sur les projets"
|
||||||
statistics_subscription: "des statistiques d'abonnements"
|
statistics_subscription: "des statistiques d'abonnements"
|
||||||
statistics_training: "des statistiques sur les formations"
|
statistics_training: "des statistiques sur les formations"
|
||||||
|
users_members: "de la liste des membres"
|
||||||
|
users_subscriptions: "de la liste des abonnements"
|
||||||
|
users_reservations: "de la liste des réservations"
|
||||||
click_to_download: "La génération est terminée. Pour télécharger le fichier Excel, cliquez"
|
click_to_download: "La génération est terminée. Pour télécharger le fichier Excel, cliquez"
|
||||||
here: "ici"
|
here: "ici"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user