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 end
def email_entries(selected_folders, selected_files) def email_entries(selected_folders, selected_files)
zip = DmsfZip.new begin
zip_entries(zip, 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
max_filesize = Setting.plugin_redmine_dmsf['dmsf_max_email_filesize'].to_f ziped_content = "#{DmsfHelper.temp_dir}/#{DmsfHelper.temp_filename('dmsf_email_sent_documents.zip')}";
if max_filesize > 0 && File.size(ziped_content) > max_filesize * 1048576
raise EmailMaxFileSize 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 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 end
def download_entries(selected_folders, selected_files) def download_entries(selected_folders, selected_files)
zip = DmsfZip.new begin
zip_entries(zip, selected_folders, selected_files) zip = DmsfZip.new
zip_entries(zip, selected_folders, selected_files)
zip.files.each do |f|
log_activity(f, 'download zip') zip.files.each do |f|
audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id, log_activity(f, 'download zip')
:action => DmsfFileRevisionAccess::DownloadAction) audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id,
audit.save! :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 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 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) if selected_folders && selected_folders.is_a?(Array)
selected_folders.each do |selected_folder_id| selected_folders.each do |selected_folder_id|
check_project(folder = DmsfFolder.visible.find(selected_folder_id)) check_project(folder = DmsfFolder.visible.find(selected_folder_id))
@ -364,12 +372,10 @@ class DmsfController < ApplicationController
end end
end end
end end
max_files = Setting.plugin_redmine_dmsf['dmsf_max_file_download'].to_i max_files = Setting.plugin_redmine_dmsf['dmsf_max_file_download'].to_i
if max_files > 0 && zip.files.length > max_files if max_files > 0 && zip.files.length > max_files
raise ZipMaxFilesError, zip.files.length raise ZipMaxFilesError, zip.files.length
end end
zip zip
end end

View File

@ -143,8 +143,10 @@ class DmsfFilesController < ApplicationController
flash[:notice] = l(:notice_file_deleted) flash[:notice] = l(:notice_file_deleted)
log_activity('deleted') log_activity('deleted')
DmsfMailer.files_deleted(User.current, [@file]).deliver DmsfMailer.files_deleted(User.current, [@file]).deliver
else else
flash[:error] = l(:error_file_is_locked) @file.errors.each do |e, msg|
flash[:error] = msg
end
end end
end end
redirect_to :controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @file.folder redirect_to :controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @file.folder
@ -155,9 +157,10 @@ class DmsfFilesController < ApplicationController
if @revision.delete if @revision.delete
flash[:notice] = l(:notice_revision_deleted) flash[:notice] = l(:notice_revision_deleted)
log_activity('deleted') log_activity('deleted')
else else
# TODO: check this error handling @revision.errors.each do |e, msg|
@revision.errors.each {|e,msg| flash[:error] = msg} flash[:error] = msg
end
end end
end end
redirect_to :action => 'show', :id => @file redirect_to :action => 'show', :id => @file

View File

@ -105,15 +105,20 @@ class DmsfFile < ActiveRecord::Base
errors[:base] << l(:error_file_is_locked) errors[:base] << l(:error_file_is_locked)
return false return false
end end
if Setting.plugin_redmine_dmsf['dmsf_really_delete_files'] begin
self.revisions.visible.each {|r| r.delete(true)} if Setting.plugin_redmine_dmsf['dmsf_really_delete_files']
self.destroy self.revisions.visible.each {|r| r.delete(true)}
else self.destroy
# Revisions of a deleted file SHOULD be deleted too else
self.revisions.visible.each {|r| r.delete } # Revisions of a deleted file SHOULD be deleted too
self.deleted = true self.revisions.visible.each {|r| r.delete }
self.deleted_by_user = User.current self.deleted = true
save self.deleted_by_user = User.current
save
end
rescue Exception => e
errors[:base] << e.message
return false
end end
end end