diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 67e557f4..29b272fa 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -298,56 +298,64 @@ class DmsfController < ApplicationController end def email_entries(selected_folders, selected_files) - zip = DmsfZip.new - zip_entries(zip, selected_folders, selected_files) - - ziped_content = "#{DmsfHelper.temp_dir}/#{DmsfHelper.temp_filename('dmsf_email_sent_documents.zip')}"; - - File.open(ziped_content, 'wb') do |f| - zip_file = File.open(zip.finish, 'rb') - while (buffer = zip_file.read(8192)) - f.write(buffer) - end - end + begin + zip = DmsfZip.new + zip_entries(zip, selected_folders, selected_files) - max_filesize = Setting.plugin_redmine_dmsf['dmsf_max_email_filesize'].to_f - if max_filesize > 0 && File.size(ziped_content) > max_filesize * 1048576 - raise EmailMaxFileSize + ziped_content = "#{DmsfHelper.temp_dir}/#{DmsfHelper.temp_filename('dmsf_email_sent_documents.zip')}"; + + File.open(ziped_content, 'wb') do |f| + zip_file = File.open(zip.finish, 'rb') + while (buffer = zip_file.read(8192)) + f.write(buffer) + end + end + + max_filesize = Setting.plugin_redmine_dmsf['dmsf_max_email_filesize'].to_f + if max_filesize > 0 && File.size(ziped_content) > max_filesize * 1048576 + raise EmailMaxFileSize + end + + zip.files.each do |f| + log_activity(f, 'emailing zip') + audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id, + :action => DmsfFileRevisionAccess::EmailAction) + audit.save! + end + + @email_params = {'zipped_content' => ziped_content} + render :action => 'email_entries' + rescue Exception => e + flash[:error] = e.message + ensure + zip.close if zip end - - zip.files.each do |f| - log_activity(f, 'emailing zip') - audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id, - :action => DmsfFileRevisionAccess::EmailAction) - audit.save! - end - - @email_params = {'zipped_content' => ziped_content} - render :action => 'email_entries' - ensure - zip.close if zip end def download_entries(selected_folders, selected_files) - zip = DmsfZip.new - zip_entries(zip, selected_folders, selected_files) - - zip.files.each do |f| - log_activity(f, 'download zip') - audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id, - :action => DmsfFileRevisionAccess::DownloadAction) - audit.save! + begin + zip = DmsfZip.new + zip_entries(zip, selected_folders, selected_files) + + zip.files.each do |f| + log_activity(f, 'download zip') + audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id, + :action => DmsfFileRevisionAccess::DownloadAction) + audit.save! + end + + send_file(zip.finish, + :filename => filename_for_content_disposition("#{@project.name}-#{DateTime.now.strftime('%y%m%d%H%M%S')}.zip"), + :type => 'application/zip', + :disposition => 'attachment') + rescue Exception => e + flash[:error] = e.message + ensure + zip.close if zip end - - send_file(zip.finish, - :filename => filename_for_content_disposition("#{@project.name}-#{DateTime.now.strftime('%y%m%d%H%M%S')}.zip"), - :type => 'application/zip', - :disposition => 'attachment') - ensure - zip.close if zip end - def zip_entries(zip, selected_folders, selected_files) + def zip_entries(zip, selected_folders, selected_files) if selected_folders && selected_folders.is_a?(Array) selected_folders.each do |selected_folder_id| check_project(folder = DmsfFolder.visible.find(selected_folder_id)) @@ -364,12 +372,10 @@ class DmsfController < ApplicationController end end end - max_files = Setting.plugin_redmine_dmsf['dmsf_max_file_download'].to_i if max_files > 0 && zip.files.length > max_files raise ZipMaxFilesError, zip.files.length - end - + end zip end diff --git a/app/controllers/dmsf_files_controller.rb b/app/controllers/dmsf_files_controller.rb index 2e11e810..c612b455 100644 --- a/app/controllers/dmsf_files_controller.rb +++ b/app/controllers/dmsf_files_controller.rb @@ -143,8 +143,10 @@ class DmsfFilesController < ApplicationController flash[:notice] = l(:notice_file_deleted) log_activity('deleted') DmsfMailer.files_deleted(User.current, [@file]).deliver - else - flash[:error] = l(:error_file_is_locked) + else + @file.errors.each do |e, msg| + flash[:error] = msg + end end end redirect_to :controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @file.folder @@ -155,9 +157,10 @@ class DmsfFilesController < ApplicationController if @revision.delete flash[:notice] = l(:notice_revision_deleted) log_activity('deleted') - else - # TODO: check this error handling - @revision.errors.each {|e,msg| flash[:error] = msg} + else + @revision.errors.each do |e, msg| + flash[:error] = msg + end end end redirect_to :action => 'show', :id => @file diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index 68f7fe31..a33ca3c7 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -105,15 +105,20 @@ class DmsfFile < ActiveRecord::Base errors[:base] << l(:error_file_is_locked) return false end - if Setting.plugin_redmine_dmsf['dmsf_really_delete_files'] - self.revisions.visible.each {|r| r.delete(true)} - self.destroy - else - # Revisions of a deleted file SHOULD be deleted too - self.revisions.visible.each {|r| r.delete } - self.deleted = true - self.deleted_by_user = User.current - save + begin + if Setting.plugin_redmine_dmsf['dmsf_really_delete_files'] + self.revisions.visible.each {|r| r.delete(true)} + self.destroy + else + # Revisions of a deleted file SHOULD be deleted too + self.revisions.visible.each {|r| r.delete } + self.deleted = true + self.deleted_by_user = User.current + save + end + rescue Exception => e + errors[:base] << e.message + return false end end