epaper/app/controllers/admin/e_paper_subscribers_control...

248 lines
7.2 KiB
Ruby

require 'rubyXL'
class Admin::EPaperSubscribersController < OrbitAdminController
RackTempMiddleExist = defined?(Rack::TempfileReaper)
RACK_TEMPFILES = defined?(Rack::RACK_TEMPFILES) ? Rack::RACK_TEMPFILES : 'rack.tempfiles'
Is_Rails5 = (Rails.version.to_f >= 5)
if RackTempMiddleExist
if Is_Rails5
def fix_tempfile_reaper
request.set_header(RACK_TEMPFILES, [])
end
else
def fix_tempfile_reaper
env[RACK_TEMPFILES] = nil
end
end
else
def fix_tempfile_reaper; end
end
def initialize
super
@app_title = "e_paper"
end
def index
@table_fields = [t('email'), t('status'), t('language')]
@filter_fields = filter_fields([], [])
@filter_fields.delete(:status)
@filter_fields.delete(:category)
@filter_fields.delete(:tags)
@subscribers = EPaperSubscriber.order_by(sort)
@subscribers = search_data(@subscribers, [:email]).page(params[:page]).per(10)
@thread = (params[:thread_id] ? Multithread.find(params[:thread_id]) : nil rescue nil)
if @thread && @thread.status[:status] == 'finish'
@thread = nil
end
render :partial => "index" if request.xhr?
end
def destroy
subscriber = EPaperSubscriber.find(params[:id]) rescue nil
subscriber.destroy if subscriber
redirect_to admin_e_paper_subscribers_path
end
def export_excel
@epaper_subscribers = EPaperSubscriber.where(:email.nin=>[nil,""]).desc(:created_at)
@subscribers = @epaper_subscribers.where(:subscribed.ne=>false)
@unsubscribers = @epaper_subscribers.where(:subscribed=>false)
respond_to do |format|
format.xlsx {
response.headers['Content-Disposition'] =
'attachment; filename="' +
Site.first.title + '-' +
I18n.t('e_paper.e_paper') + '-' +
I18n.t('e_paper.subscriber') + '.xlsx"'
}
end
end
def get_subscribers_modal
@epaper_subscribers = EPaperSubscriber.where(:email.nin=>[nil,""]).desc(:created_at)
@subscribers = @epaper_subscribers.where(:subscribed.ne=>false)
@unsubscribers = @epaper_subscribers.where(:subscribed=>false)
render :partial => 'modal_select', :layout => false
end
def import_from_excel
thread = Multithread.where(:key=>'import_epaper_subscribers').first
if thread.nil?
thread = Multithread.create(:key=>'import_epaper_subscribers', :status=>{:status=>'Processing'})
else
thread.update(:status=>{:status=>'Processing'})
end
file = params["import_file"]
tempfile = file.tempfile
ObjectSpace.undefine_finalizer(tempfile)
fix_tempfile_reaper
Thread.new do
workbook = RubyXL::Parser.parse(tempfile)
subscribe_sheet = workbook['Subscribe']
unsubscribe_sheet = workbook['Unsubscribe']
all_count =
(subscribe_sheet ? (subscribe_sheet.count - 1) : 0) +
(unsubscribe_sheet ? (unsubscribe_sheet.count - 1) : 0)
puts_every_count = [all_count * 3 / 100, 1].max
current_count = 0
finish_percent = 0
thread.update(
:status=>{
:status=>'Importing',
'all_count'=>all_count,
'current_count'=>current_count,
'finish_percent'=>finish_percent
}
)
if subscribe_sheet
subscribe_sheet.each_with_index do |row, i|
next if i < 1
email = row.cells[0]&.value
next if email.blank?
subscriber = EPaperSubscriber.where(:email=>email).first || EPaperSubscriber.new(:email=>email)
subscriber.subscribed = true
subscriber.language = row.cells[1]&.value.presence || I18n.locale.to_s
subscriber.save
current_count += 1
if current_count % puts_every_count == 0
finish_percent = (current_count * 100.0 / all_count).round(1)
thread.update(:status=>{:status=>'Importing','all_count'=>all_count,'current_count'=>current_count,'finish_percent'=>finish_percent})
end
end
end
if unsubscribe_sheet
unsubscribe_sheet.each_with_index do |row, i|
next if i < 1
email = row.cells[0]&.value
next if email.blank?
subscriber = EPaperSubscriber.where(:email=>email).first || EPaperSubscriber.new(:email=>email)
subscriber.subscribed = false
subscriber.language = row.cells[1]&.value.presence || I18n.locale.to_s
subscriber.save
current_count += 1
if current_count % puts_every_count == 0
finish_percent = (current_count * 100.0 / all_count).round(1)
thread.update(:status=>{:status=>'Importing','all_count'=>all_count,'current_count'=>current_count,'finish_percent'=>finish_percent})
end
end
end
thread.update(
:status=>{
:status=>'finish',
'all_count'=>all_count,
'current_count'=>current_count,
'finish_percent'=>100
}
)
end
redirect_to admin_e_paper_subscribers_path(thread_id: thread.id)
end
def download_excel_format
@subscribers = []
@unsubscribers = []
respond_to do |format|
format.xlsx {
response.headers['Content-Disposition'] =
'attachment; filename="' +
Site.first.title + '-' +
I18n.t('e_paper.e_paper') + '-' +
I18n.t('e_paper.subscriber') + 'excel_format.xlsx"'
}
end
end
def batch_delete_subscribers
@thread = (params[:thread_id] ? Multithread.find(params[:thread_id]) : nil rescue nil)
if @thread && @thread.status[:status] == 'finish'
@thread = nil
end
end
def delete_subscribers
subscriber_ids = params['subscriber_ids']
thread = Multithread.where(:key=>'delete_epaper_subscribers').first
if thread.nil?
thread = Multithread.create(
:key=>'delete_epaper_subscribers',
:status=>{:status=>'Processing'}
)
else
thread.update(:status=>{:status=>'Processing'})
end
if subscriber_ids.present?
all_count = subscriber_ids.count
puts_every_count = [all_count * 3 / 100, 1].max
current_count = 0
finish_percent = 0
thread.update(
:status=>{
:status=>'Deleting',
'all_count'=>all_count,
'current_count'=>current_count,
'finish_percent'=>finish_percent
}
)
Thread.new do
EPaperSubscriber.where(:id.in=>subscriber_ids).to_a.each do |s|
s.destroy
current_count += 1
if current_count % puts_every_count == 0
finish_percent = (current_count * 100.0 / all_count).round(1)
thread.update(
:status=>{
:status=>'Deleting',
'all_count'=>all_count,
'current_count'=>current_count,
'finish_percent'=>finish_percent
}
)
end
end
thread.update(
:status=>{
:status=>'finish',
'all_count'=>all_count,
'current_count'=>current_count,
'finish_percent'=>100
}
)
end
else
thread.update(:status=>{:status=>'finish'})
end
redirect_to admin_e_paper_subscribers_batch_delete_subscribers_path(thread_id: thread.id)
end
end