From fd5d23a86cde1016ab9b8acbeacebd0cea4678b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B1=E5=8D=9A=E4=BA=9E?= Date: Sun, 21 Dec 2025 18:37:52 +0800 Subject: [PATCH] fix save file issue --- .../admin/e_paper_subscribers_controller.rb | 228 ++++++++++++------ app/controllers/e_papers_controller.rb | 35 ++- app/views/e_papers/showpaper.html.erb | 1 + modules/e_paper/showpaper.html.erb | 4 + 4 files changed, 184 insertions(+), 84 deletions(-) mode change 100755 => 100644 app/controllers/admin/e_paper_subscribers_controller.rb mode change 100755 => 100644 app/controllers/e_papers_controller.rb create mode 100644 app/views/e_papers/showpaper.html.erb create mode 100644 modules/e_paper/showpaper.html.erb diff --git a/app/controllers/admin/e_paper_subscribers_controller.rb b/app/controllers/admin/e_paper_subscribers_controller.rb old mode 100755 new mode 100644 index d2a2eeb..4e3cd4c --- a/app/controllers/admin/e_paper_subscribers_controller.rb +++ b/app/controllers/admin/e_paper_subscribers_controller.rb @@ -1,5 +1,25 @@ +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" @@ -8,115 +28,136 @@ class Admin::EPaperSubscribersController < OrbitAdminController 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) + @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' + 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 - if !subscriber.nil? - subscriber.destroy - end + 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) + @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"' + 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) + @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'}) + 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(params["import_file"].tempfile) - subscribe_sheet = workbook['Subscribe'] + 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) + + 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}) - subscribe_sheet.each_with_index do |row, i| - next if i < 1 - c0 = row.cells[0] - c1 = row.cells[1] - if c0 - email = c0.value - if email.present? - subscriber = EPaperSubscriber.where(:email=>email).first - if subscriber.nil? - subscriber = EPaperSubscriber.new(:email=>email) - end - language = c1.value - if language.blank? - language = I18n.locale.to_s - end - subscriber.subscribed = true - subscriber.language = language - subscriber.save + + 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 - 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 - unsubscribe_sheet.each_with_index do |row, i| - next if i < 1 - c0 = row.cells[0] - c1 = row.cells[1] - if c0 - email = c0.value - if email.present? - subscriber = EPaperSubscriber.where(:email=>email).first - if subscriber.nil? - subscriber = EPaperSubscriber.new(:email=>email) - end - language = c1.value - if language.blank? - language = I18n.locale.to_s - end - subscriber.subscribed = false - subscriber.language = language - subscriber.save + + 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 - 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 - finish_percent = 100 - thread.update(:status=>{:status=>'finish','all_count'=>all_count,'current_count'=>current_count,'finish_percent'=>finish_percent}) + + 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 @@ -125,45 +166,82 @@ class Admin::EPaperSubscribersController < OrbitAdminController @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"' + 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_subscriber',:status=>{:status=>'Processing'}) + thread = Multithread.create( + :key=>'delete_epaper_subscribers', + :status=>{:status=>'Processing'} + ) else thread.update(:status=>{:status=>'Processing'}) end - if subscriber_ids + + 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.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}) + thread.update( + :status=>{ + :status=>'Deleting', + 'all_count'=>all_count, + 'current_count'=>current_count, + 'finish_percent'=>finish_percent + } + ) end end - finish_percent = 100 - thread.update(:status=>{:status=>'finish','all_count'=>all_count,'current_count'=>current_count,'finish_percent'=>finish_percent}) + + 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 \ No newline at end of file + +end diff --git a/app/controllers/e_papers_controller.rb b/app/controllers/e_papers_controller.rb old mode 100755 new mode 100644 index 8e53510..56a5bc5 --- a/app/controllers/e_papers_controller.rb +++ b/app/controllers/e_papers_controller.rb @@ -1,5 +1,5 @@ class EPapersController < ApplicationController - FrontendMethods = ["papers", "topics"] + FrontendMethods = ["papers", "topics","showpaper"] EmptyImg = "data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" EmptyImgUrl = "#{EmptyImg}\" style=\"display: none;" def self.custom_widget_data @@ -91,7 +91,7 @@ class EPapersController < ApplicationController { "title" => criteria.title, "description" => criteria.description, - "link_to_show" => OrbitHelper.url_to_show(criteria.to_param) + "?method=topics" + "link_to_show" => OrbitHelper.url_to_show(criteria.to_param) + "?method=showpaper" } end { @@ -114,7 +114,7 @@ class EPapersController < ApplicationController member_name = member.name end { - + "content" => epaper.content, "publish_date" => epaper.period, "description" => epaper.description, @@ -129,6 +129,23 @@ class EPapersController < ApplicationController } end + def showpaper + params = OrbitHelper.params + if params[:uid].present? + criteria = PaperCriteria.where(:uid => params[:uid]).first + return if criteria.nil? + end + if criteria.banner_image.present? + banner_image = EPaperImage.find(criteria.banner_image).image.url + end + { + "title" => criteria.title, + "banner_image" => banner_image, + "content" => criteria.content, + "description" => criteria.description + } + end + def topics params = OrbitHelper.params if params[:uid].present? @@ -197,7 +214,7 @@ class EPapersController < ApplicationController { "title" => criteria.title, "description" => criteria.description, - "link_to_show" => OrbitHelper.widget_item_url(criteria.to_param) + "?method=topics" + "link_to_show" => OrbitHelper.widget_item_url(criteria.to_param) + "?method=showpaper" } end { @@ -263,7 +280,7 @@ class EPapersController < ApplicationController { "categories" => data, "extras" => { - "read_more" => OrbitHelper.widget_more_url + "?method=topics" + "read_more" => OrbitHelper.widget_more_url + "?method=showpaper" } } end @@ -300,7 +317,7 @@ class EPapersController < ApplicationController { "categories" => data, "extras" => { - "read_more" => OrbitHelper.widget_more_url + "?method=topics" + "read_more" => OrbitHelper.widget_more_url + "?method=showpaper" } } end @@ -332,8 +349,8 @@ class EPapersController < ApplicationController def unsubscribeuser subscriber = EPaperSubscriber.where(:email => params[:email]).first rescue nil if !subscriber.nil? - subscriber.subscribed = false - subscriber.save + subscriber.subscribed = false + subscriber.save data = {"success" => true, "msg" => "Successfully Unsubscribed!!!"} else data = {"success" => false, "msg" => "You are not a subscriber!!!"} @@ -348,4 +365,4 @@ class EPapersController < ApplicationController asc_flag ? tmp : -tmp end end -end \ No newline at end of file +end diff --git a/app/views/e_papers/showpaper.html.erb b/app/views/e_papers/showpaper.html.erb new file mode 100644 index 0000000..648b75c --- /dev/null +++ b/app/views/e_papers/showpaper.html.erb @@ -0,0 +1 @@ +<%= render_view %> \ No newline at end of file diff --git a/modules/e_paper/showpaper.html.erb b/modules/e_paper/showpaper.html.erb new file mode 100644 index 0000000..e5d293c --- /dev/null +++ b/modules/e_paper/showpaper.html.erb @@ -0,0 +1,4 @@ +

{{title}}

+ +
{{description}}
+
{{content}}
\ No newline at end of file