Exception handling when a file or folder is missing

This commit is contained in:
Karel Picman 2014-01-20 09:38:30 +01:00
parent 67e50b6568
commit 4aa3d3923d
3 changed files with 73 additions and 59 deletions

View File

@ -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

View File

@ -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

View File

@ -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