From f291b7f425aced4170054181ca14d7ecfa81422d Mon Sep 17 00:00:00 2001 From: "vit.jonas@gmail.com" Date: Sat, 28 May 2011 09:33:10 +0000 Subject: [PATCH] * moved multiupload handling to separated controller git-svn-id: http://redmine-dmsf.googlecode.com/svn/trunk/redmine_dmsf@97 5e329b0b-a2ee-ea63-e329-299493fc886d --- app/controllers/dmsf_detail_controller.rb | 125 +------------ app/controllers/dmsf_upload_controller.rb | 169 ++++++++++++++++++ app/{helpers => models}/dmsf_upload.rb | 0 app/views/dmsf/_multi_upload.html.erb | 4 +- .../_upload_file.html.erb | 0 .../_upload_file_locked.html.erb | 0 .../upload_file.html.erb | 0 .../upload_files.html.erb | 0 config/routes.rb | 30 +++- init.rb | 4 +- 10 files changed, 198 insertions(+), 134 deletions(-) create mode 100644 app/controllers/dmsf_upload_controller.rb rename app/{helpers => models}/dmsf_upload.rb (100%) rename app/views/{dmsf_detail => dmsf_upload}/_upload_file.html.erb (100%) rename app/views/{dmsf_detail => dmsf_upload}/_upload_file_locked.html.erb (100%) rename app/views/{dmsf_detail => dmsf_upload}/upload_file.html.erb (100%) rename app/views/{dmsf_detail => dmsf_upload}/upload_files.html.erb (100%) diff --git a/app/controllers/dmsf_detail_controller.rb b/app/controllers/dmsf_detail_controller.rb index 197694f3..a2f11d5c 100644 --- a/app/controllers/dmsf_detail_controller.rb +++ b/app/controllers/dmsf_detail_controller.rb @@ -24,8 +24,7 @@ class DmsfDetailController < ApplicationController before_filter :find_project before_filter :authorize, :except => [:delete_entries] before_filter :find_parent, :only => [:folder_new, :create_folder, :save_folder] - before_filter :find_folder, :only => [:delete_folder, :save_folder, - :upload_files, :commit_files, :folder_detail, :delete_entries] + before_filter :find_folder, :only => [:delete_folder, :save_folder, :folder_detail, :delete_entries] before_filter :find_file, :only => [:save_file, :delete_file, :file_detail] def delete_entries @@ -249,128 +248,6 @@ class DmsfDetailController < ApplicationController redirect_to :action => "file_detail", :id => @project, :file_id => @revision.file end - def upload_files - uploaded_files = params[:uploaded_files] - @uploads = [] - if uploaded_files && uploaded_files.is_a?(Hash) - # standard file input uploads - uploaded_files.each_value do |uploaded_file| - @uploads.push(DmsfUpload.create_from_uploaded_file(@project, @folder, uploaded_file)) - end - else - # plupload multi upload completed - uploaded = params[:uploaded] - if uploaded && uploaded.is_a?(Hash) - uploaded.each_value do |uploaded_file| - @uploads.push(DmsfUpload.new(@project, @folder, uploaded_file)) - end - end - end - end - - # plupload single file multi upload handling - def upload_file - @tempfile = params[:file] - @disk_filename = DmsfHelper.temp_filename(@tempfile.original_filename) - File.open("#{DmsfHelper.temp_dir}/#{@disk_filename}", "wb") do |f| - while (buffer = @tempfile.read(8192)) - f.write(buffer) - end - end - - render :layout => false - end - - #TODO: flash notice when files saved and unlocked - #TODO: separate control for approval - def commit_files - commited_files = params[:commited_files] - if commited_files && commited_files.is_a?(Hash) - files = [] - failed_uploads = [] - commited_files.each_value do |commited_file| - name = commited_file["name"]; - - new_revision = DmsfFileRevision.new - file = DmsfFile.find_file_by_name(@project, @folder, name) - if file.nil? - file = DmsfFile.new - file.project = @project - file.name = name - file.folder = @folder - file.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? - - new_revision.minor_version = 0 - new_revision.major_version = 0 - else - if file.locked_for_user? - failed_uploads.push(commited_file) - next - end - last_revision = file.last_revision - new_revision.source_revision = last_revision - new_revision.major_version = last_revision.major_version - new_revision.minor_version = last_revision.minor_version - new_revision.workflow = last_revision.workflow - end - - commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_file["disk_filename"]}" - - new_revision.folder = @folder - new_revision.file = file - new_revision.user = User.current - new_revision.name = name - new_revision.title = commited_file["title"] - new_revision.description = commited_file["description"] - new_revision.comment = commited_file["comment"] - new_revision.increase_version(commited_file["version"].to_i, true) - new_revision.set_workflow(commited_file["workflow"]) - new_revision.mime_type = Redmine::MimeType.of(new_revision.name) - new_revision.size = File.size(commited_disk_filepath) - new_revision.disk_filename = new_revision.new_storage_filename - - file_upload = File.new(commited_disk_filepath, "rb") - if file_upload.nil? - failed_uploads.push(commited_file) - flash[:error] = l(:error_file_commit_require_uploaded_file) - next - end - - if new_revision.save - if file.locked? - DmsfFileLock.file_lock_state(file, false) - flash[:notice] = l(:notice_file_unlocked) - end - file.save! - file.reload - - # Need to save file first to generate id for it in case of creation. - # File id is needed to properly generate revision disk filename - new_revision.copy_file_content(file_upload) - file_upload.close - File.delete(commited_disk_filepath) - - files.push(file) - else - failed_uploads.push(commited_file) - end - end - unless files.empty? - Rails.logger.info "#{Time.now} from #{request.remote_ip}/#{request.env["HTTP_X_FORWARDED_FOR"]}: #{User.current.login} uploaded for project #{@project.identifier}:" - files.each {|file| Rails.logger.info "\t#{file.dmsf_path_str}:"} - begin - DmsfMailer.deliver_files_updated(User.current, files) - rescue ActionView::MissingTemplate => e - Rails.logger.error "Could not send email notifications: " + e - end - end - unless failed_uploads.empty? - flash[:warning] = l(:warning_some_files_were_not_commited, :files => failed_uploads.map{|u| u["name"]}.join(", ")) - end - end - redirect_to :controller => "dmsf", :action => "index", :id => @project, :folder_id => @folder - end - private def copy_folder(folder) diff --git a/app/controllers/dmsf_upload_controller.rb b/app/controllers/dmsf_upload_controller.rb new file mode 100644 index 00000000..27491dc4 --- /dev/null +++ b/app/controllers/dmsf_upload_controller.rb @@ -0,0 +1,169 @@ +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011 Vít Jonáš +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class DmsfUploadController < ApplicationController + unloadable + + menu_item :dmsf + + before_filter :find_project + before_filter :authorize + before_filter :find_folder, :except => [:upload_file] + + def upload_files + uploaded_files = params[:uploaded_files] + @uploads = [] + if uploaded_files && uploaded_files.is_a?(Hash) + # standard file input uploads + uploaded_files.each_value do |uploaded_file| + @uploads.push(DmsfUpload.create_from_uploaded_file(@project, @folder, uploaded_file)) + end + else + # plupload multi upload completed + uploaded = params[:uploaded] + if uploaded && uploaded.is_a?(Hash) + uploaded.each_value do |uploaded_file| + @uploads.push(DmsfUpload.new(@project, @folder, uploaded_file)) + end + end + end + end + + # async single file upload handling + def upload_file + @tempfile = params[:file] + @disk_filename = DmsfHelper.temp_filename(@tempfile.original_filename) + File.open("#{DmsfHelper.temp_dir}/#{@disk_filename}", "wb") do |f| + while (buffer = @tempfile.read(8192)) + f.write(buffer) + end + end + + render :layout => false + end + + #TODO: flash notice when files saved and unlocked + #TODO: separate control for approval + def commit_files + commited_files = params[:commited_files] + if commited_files && commited_files.is_a?(Hash) + files = [] + failed_uploads = [] + commited_files.each_value do |commited_file| + name = commited_file["name"]; + + new_revision = DmsfFileRevision.new + file = DmsfFile.find_file_by_name(@project, @folder, name) + if file.nil? + file = DmsfFile.new + file.project = @project + file.name = name + file.folder = @folder + file.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? + + new_revision.minor_version = 0 + new_revision.major_version = 0 + else + if file.locked_for_user? + failed_uploads.push(commited_file) + next + end + last_revision = file.last_revision + new_revision.source_revision = last_revision + new_revision.major_version = last_revision.major_version + new_revision.minor_version = last_revision.minor_version + new_revision.workflow = last_revision.workflow + end + + commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_file["disk_filename"]}" + + new_revision.folder = @folder + new_revision.file = file + new_revision.user = User.current + new_revision.name = name + new_revision.title = commited_file["title"] + new_revision.description = commited_file["description"] + new_revision.comment = commited_file["comment"] + new_revision.increase_version(commited_file["version"].to_i, true) + new_revision.set_workflow(commited_file["workflow"]) + new_revision.mime_type = Redmine::MimeType.of(new_revision.name) + new_revision.size = File.size(commited_disk_filepath) + new_revision.disk_filename = new_revision.new_storage_filename + + file_upload = File.new(commited_disk_filepath, "rb") + if file_upload.nil? + failed_uploads.push(commited_file) + flash[:error] = l(:error_file_commit_require_uploaded_file) + next + end + + if new_revision.save + if file.locked? + DmsfFileLock.file_lock_state(file, false) + flash[:notice] = l(:notice_file_unlocked) + end + file.save! + file.reload + + # Need to save file first to generate id for it in case of creation. + # File id is needed to properly generate revision disk filename + new_revision.copy_file_content(file_upload) + file_upload.close + File.delete(commited_disk_filepath) + + files.push(file) + else + failed_uploads.push(commited_file) + end + end + unless files.empty? + Rails.logger.info "#{Time.now} from #{request.remote_ip}/#{request.env["HTTP_X_FORWARDED_FOR"]}: #{User.current.login} uploaded for project #{@project.identifier}:" + files.each {|file| Rails.logger.info "\t#{file.dmsf_path_str}:"} + begin + DmsfMailer.deliver_files_updated(User.current, files) + rescue ActionView::MissingTemplate => e + Rails.logger.error "Could not send email notifications: " + e + end + end + unless failed_uploads.empty? + flash[:warning] = l(:warning_some_files_were_not_commited, :files => failed_uploads.map{|u| u["name"]}.join(", ")) + end + end + redirect_to :controller => "dmsf", :action => "index", :id => @project, :folder_id => @folder + end + + private + + def find_project + @project = Project.find(params[:id]) + end + + def find_folder + @folder = DmsfFolder.find(params[:folder_id]) if params.keys.include?("folder_id") + check_project(@folder) + rescue DmsfAccessError + render_403 + end + + def check_project(entry) + if !entry.nil? && entry.project != @project + raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) + end + end + +end \ No newline at end of file diff --git a/app/helpers/dmsf_upload.rb b/app/models/dmsf_upload.rb similarity index 100% rename from app/helpers/dmsf_upload.rb rename to app/models/dmsf_upload.rb diff --git a/app/views/dmsf/_multi_upload.html.erb b/app/views/dmsf/_multi_upload.html.erb index 64af9d63..f66ade01 100644 --- a/app/views/dmsf/_multi_upload.html.erb +++ b/app/views/dmsf/_multi_upload.html.erb @@ -1,5 +1,5 @@
- <% form_tag({:controller => "dmsf_detail", :action => "upload_files", :id => @project, :folder_id => @folder}, + <% form_tag({:controller => "dmsf_upload", :action => "upload_files", :id => @project, :folder_id => @folder}, :id => "uploadform", :method=>:post, :multipart => true) do %> <% if Setting.attachment_max_size.to_i >= 102400 %>
@@ -89,7 +89,7 @@ uploader = jQuery("div",uploader); uploader.plupload({ runtimes : 'gears,html5,flash,html4', - url : '<%= url_for({:controller => "dmsf_detail", :action => "upload_file", :id => @project, :folder_id => @folder}) %>', + url : '<%= url_for({:controller => "dmsf_upload", :action => "upload_file", :id => @project, :folder_id => @folder}) %>', max_file_size : "100mb", max_file_count: '<%= Setting.plugin_redmine_dmsf["dmsf_max_file_upload"].to_i if Setting.plugin_redmine_dmsf["dmsf_max_file_upload"].to_i > 0 %>', multipart: true, diff --git a/app/views/dmsf_detail/_upload_file.html.erb b/app/views/dmsf_upload/_upload_file.html.erb similarity index 100% rename from app/views/dmsf_detail/_upload_file.html.erb rename to app/views/dmsf_upload/_upload_file.html.erb diff --git a/app/views/dmsf_detail/_upload_file_locked.html.erb b/app/views/dmsf_upload/_upload_file_locked.html.erb similarity index 100% rename from app/views/dmsf_detail/_upload_file_locked.html.erb rename to app/views/dmsf_upload/_upload_file_locked.html.erb diff --git a/app/views/dmsf_detail/upload_file.html.erb b/app/views/dmsf_upload/upload_file.html.erb similarity index 100% rename from app/views/dmsf_detail/upload_file.html.erb rename to app/views/dmsf_upload/upload_file.html.erb diff --git a/app/views/dmsf_detail/upload_files.html.erb b/app/views/dmsf_upload/upload_files.html.erb similarity index 100% rename from app/views/dmsf_detail/upload_files.html.erb rename to app/views/dmsf_upload/upload_files.html.erb diff --git a/config/routes.rb b/config/routes.rb index 01f89c73..1b9f41d0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,24 @@ -ActionController::Routing::Routes.draw do |map| - map.resource :dmsf, :member => {:sync => :put} do |dmsf| - dmsf.resource :dmsf_detail, :as => 'detail' - dmsf.resource :dmsf_state, :as => 'state' - end -end +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011 Vít Jonáš +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +#ActionController::Routing::Routes.draw do |map| +# map.resource :dmsf, :member => {:sync => :put} do |dmsf| +# dmsf.resource :dmsf_detail, :as => 'detail' +# dmsf.resource :dmsf_state, :as => 'state' +# end +#end diff --git a/init.rb b/init.rb index 10d83759..fd8ea83a 100644 --- a/init.rb +++ b/init.rb @@ -56,8 +56,8 @@ Redmine::Plugin.register :redmine_dmsf do permission :view_dmsf_files, {:dmsf => [:download_file, :download_revision, :entries_operation, :email_entries_send], :dmsf_detail => [:file_detail]} permission :folder_manipulation, {:dmsf_detail => [:folder_new, :create_folder, :delete_folder, :folder_detail, :save_folder]} - permission :file_manipulation, {:dmsf_detail => [:upload_files, :upload_file, :commit_files, :save_file, :delete_file], - :dmsf_state => [:lock_file, :unlock_file]} + permission :file_manipulation, {:dmsf_detail => [:save_file, :delete_file], + :dmsf_state => [:lock_file, :unlock_file], :dmsf_upload => [:upload_files, :upload_file, :commit_files]} permission :file_approval, {:dmsf_detail => [:approve_file, :delete_revision], :dmsf_state => [:file_notify_activate, :file_notify_deactivate, :folder_notify_activate, :folder_notify_deactivate]} permission :force_file_unlock, {:dmsf_state => [:force_file_unlock]}