From 6c0c207d1f96740c19ac18d021396ac15bbafbd5 Mon Sep 17 00:00:00 2001 From: viehlieb Date: Thu, 28 Sep 2023 15:43:12 +0200 Subject: [PATCH] repair garbage collected tempfile --- .../group_order_invoices_controller.rb | 62 +++++++++---------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/app/controllers/group_order_invoices_controller.rb b/app/controllers/group_order_invoices_controller.rb index 2e5a8408..885082ee 100644 --- a/app/controllers/group_order_invoices_controller.rb +++ b/app/controllers/group_order_invoices_controller.rb @@ -3,20 +3,28 @@ class GroupOrderInvoicesController < ApplicationController before_action :authenticate_finance def show - begin - @group_order_invoice = GroupOrderInvoice.find(params[:id]) - if FoodsoftConfig[:contact][:tax_number] - respond_to do |format| - format.pdf do - send_group_order_invoice_pdf @group_order_invoice if FoodsoftConfig[:contact][:tax_number] - end - end - else - raise RecordInvalid + @group_order_invoice = GroupOrderInvoice.find(params[:id]) + raise RecordInvalid unless FoodsoftConfig[:contact][:tax_number] + + respond_to do |format| + format.pdf do + send_group_order_invoice_pdf @group_order_invoice if FoodsoftConfig[:contact][:tax_number] end - rescue ActiveRecord::RecordInvalid => error - redirect_back fallback_location: root_path, notice: 'Something went wrong', alert: I18n.t('errors.general_msg', msg: "#{error} " + I18n.t('errors.check_tax_number')) end + rescue ActiveRecord::RecordInvalid => e + redirect_back fallback_location: root_path, notice: 'Something went wrong', alert: I18n.t('errors.general_msg', msg: "#{e} " + I18n.t('errors.check_tax_number')) + end + + def create + go = GroupOrder.find(params[:group_order]) + @order = go.order + GroupOrderInvoice.find_or_create_by!(group_order_id: go.id) + respond_to do |format| + format.js + end + redirect_back fallback_location: root_path + rescue StandardError => e + redirect_back fallback_location: root_path, notice: 'Something went wrong', :alert => I18n.t('errors.general_msg', :msg => e) end def destroy @@ -45,43 +53,33 @@ class GroupOrderInvoicesController < ApplicationController end end - def create - go = GroupOrder.find(params[:group_order]) - @order = go.order - GroupOrderInvoice.find_or_create_by!(group_order_id: go.id) - respond_to do |format| - format.js - end - redirect_back fallback_location: root_path - rescue => error - redirect_back fallback_location: root_path, notice: 'Something went wrong', :alert => I18n.t('errors.general_msg', :msg => error) - end - def download_all order = Order.find(params[:order_id]) invoices = order.group_orders.map(&:group_order_invoice) pdf = {} - + file_paths = [] temp_file = Tempfile.new("all_invoices_for_order_#{order.id}.zip") - Zip::File.open(temp_file.path, Zip::File::CREATE) do |zipfile| invoices.each do |invoice| pdf = create_invoice_pdf(invoice) - invoice_file = Tempfile.new("#{pdf.filename}") - File.open(invoice_file.path, 'w:ASCII-8BIT') do |file| + file_path = File.join("tmp", pdf.filename) + File.open(file_path, 'w:ASCII-8BIT') do |file| file.write(pdf.to_pdf) end - zipfile.add("#{pdf.filename}", invoice_file.path) unless zipfile.find_entry("#{pdf.filename}") + file_paths << file_path + zipfile.add(pdf.filename, file_path) unless zipfile.find_entry(pdf.filename) end end zip_data = File.read(temp_file.path) - + file_paths.each do |file_path| + File.delete(file_path) + end respond_to do |format| - format.html { + format.html do send_data(zip_data, type: 'application/zip', filename: "#{l order.ends, format: :file}-#{order.supplier.name}-#{order.id}.zip", disposition: 'attachment') - } + end end end end