From 5b71ad4442101cf0af1eb399e78f17ce6dcc284f Mon Sep 17 00:00:00 2001 From: "vit.jonas@gmail.com" Date: Tue, 24 May 2011 08:55:13 +0000 Subject: [PATCH] * file detail validation completed git-svn-id: http://redmine-dmsf.googlecode.com/svn/trunk/redmine_dmsf@74 5e329b0b-a2ee-ea63-e329-299493fc886d --- app/controllers/dmsf_detail_controller.rb | 96 +++++++++++-------- app/models/dmsf_file_revision.rb | 43 ++------- .../dmsf_detail/_file_new_revision.html.erb | 1 + app/views/dmsf_detail/file_detail.html.erb | 6 +- 4 files changed, 67 insertions(+), 79 deletions(-) diff --git a/app/controllers/dmsf_detail_controller.rb b/app/controllers/dmsf_detail_controller.rb index b6f2e3df..7c24f8f0 100644 --- a/app/controllers/dmsf_detail_controller.rb +++ b/app/controllers/dmsf_detail_controller.rb @@ -87,60 +87,71 @@ class DmsfDetailController < ApplicationController end def file_detail - @revision = @file.last_revision.clone + @revision = @file.last_revision end #TODO: don't create revision if nothing change def save_file + unless params[:dmsf_file_revision] + redirect_to :action => "file_detail", :id => @project, :file_id => @file + return + end if @file.locked_for_user? flash[:error] = l(:error_file_is_locked) redirect_to :action => "file_detail", :id => @project, :file_id => @file else #TODO: validate folder_id - new_revision = DmsfFileRevision.new(params[:dmsf_file_revision]) + @revision = DmsfFileRevision.new(params[:dmsf_file_revision]) - new_revision.file = @file + @revision.file = @file last_revision = @file.last_revision - new_revision.source_revision = last_revision - new_revision.user = User.current + @revision.source_revision = last_revision + @revision.user = User.current - new_revision.major_version = last_revision.major_version - new_revision.minor_version = last_revision.minor_version - new_revision.workflow = last_revision.workflow + @revision.major_version = last_revision.major_version + @revision.minor_version = last_revision.minor_version + @revision.workflow = last_revision.workflow version = params[:version].to_i file_upload = params[:file_upload] if file_upload.nil? - new_revision.disk_filename = last_revision.disk_filename - new_revision.increase_version(version, false) - new_revision.mime_type = last_revision.mime_type - new_revision.size = last_revision.size + @revision.disk_filename = last_revision.disk_filename + @revision.increase_version(version, false) + @revision.mime_type = last_revision.mime_type + @revision.size = last_revision.size else - new_revision.increase_version(version, true) - new_revision.copy_file_content(file_upload) - new_revision.mime_type = Redmine::MimeType.of(file_upload.original_filename) + @revision.increase_version(version, true) + @revision.size = file_upload.size + @revision.disk_filename = @revision.new_storage_filename + @revision.mime_type = Redmine::MimeType.of(file_upload.original_filename) end - new_revision.set_workflow(params[:workflow]) + @revision.set_workflow(params[:workflow]) - new_revision.save - - @file.name = new_revision.name - @file.folder = new_revision.folder - if @file.locked? - DmsfFileLock.file_lock_state(@file, false) - flash[:notice] = l(:notice_file_unlocked) + ", " - end - @file.save - @file.reload - - flash[:notice] = (flash[:notice].nil? ? "" : flash[:notice]) + l(:notice_file_revision_created) - Rails.logger.info "#{Time.now} from #{request.remote_ip}/#{request.env["HTTP_X_FORWARDED_FOR"]}: #{User.current.login} created new revision of file #{@project.identifier}://#{@file.dmsf_path_str}" - begin - DmsfMailer.deliver_files_updated(User.current, [@file]) - rescue ActionView::MissingTemplate => e - Rails.logger.error "Could not send email notifications: " + e + if @revision.save + unless file_upload.nil? + @revision.copy_file_content(file_upload) + end + + @file.name = @revision.name + @file.folder = @revision.folder + if @file.locked? + DmsfFileLock.file_lock_state(@file, false) + flash[:notice] = l(:notice_file_unlocked) + ", " + end + @file.save! + @file.reload + + flash[:notice] = (flash[:notice].nil? ? "" : flash[:notice]) + l(:notice_file_revision_created) + Rails.logger.info "#{Time.now} from #{request.remote_ip}/#{request.env["HTTP_X_FORWARDED_FOR"]}: #{User.current.login} created new revision of file #{@project.identifier}://#{@file.dmsf_path_str}" + begin + DmsfMailer.deliver_files_updated(User.current, [@file]) + rescue ActionView::MissingTemplate => e + Rails.logger.error "Could not send email notifications: " + e + end + redirect_to :action => "file_detail", :id => @project, :file_id => @file + else + render :action => "file_detail" end end - redirect_to :action => "file_detail", :id => @project, :file_id => @file end def delete_file @@ -245,11 +256,6 @@ class DmsfDetailController < ApplicationController end commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_file["disk_filename"]}" - file_upload = File.new(commited_disk_filepath, "rb") - if file_upload.nil? - flash[:error] = l(:error_file_commit_require_uploaded_file) - next - end new_revision.folder = @folder new_revision.file = file @@ -261,13 +267,21 @@ class DmsfDetailController < ApplicationController 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? + flash[:error] = l(:error_file_commit_require_uploaded_file) + next + end + + new_revision.save new_revision.copy_file_content(file_upload) file_upload.close File.delete(commited_disk_filepath) - new_revision.save - if file.locked? DmsfFileLock.file_lock_state(file, false) flash[:notice] = l(:notice_file_unlocked) diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index 8e982abb..ae069b76 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -41,6 +41,11 @@ class DmsfFileRevision < ActiveRecord::Base :conditions => ["#{DmsfFile.table_name}.deleted = :false", {:false => false}] } + validates_presence_of :title + validates_presence_of :name + validates_format_of :name, :with => DmsfFolder.invalid_characters, + :message => l(:error_contains_invalid_character) + def self.remove_extension(filename) filename[0, (filename.length - File.extname(filename).length)] end @@ -69,38 +74,6 @@ class DmsfFileRevision < ActiveRecord::Base content_type.to_s end - def from_form_post(file, posted, source_revision = nil) - source_revision = file.last_revision if source_revision.nil? - - self.file = file - self.source_revision = source_revision - - self.name = posted.has_key?("name") ? posted["name"] : self.file.name - - if posted.has_key?("dmsf_folder_id") - self.folder = posted["dmsf_folder_id"].blank? ? nil : DmsfFolder.find(posted["dmsf_folder_id"]) - else - self.folder = self.file.folder - end - - if source_revision.nil? - from_form_post_create(posted) - else - from_form_post_existing(posted, source_revision) - end - - self.user = User.current - self.title = posted["title"] - self.description = posted["description"] - self.comment = posted["comment"] - - unless posted["file"].nil? - copy_file_content(posted) - end - - self - end - #TODO: use standard clone method def clone new_revision = DmsfFileRevision.new @@ -185,14 +158,12 @@ class DmsfFileRevision < ActiveRecord::Base "#{timestamp}_#{id}_#{filename}" end - def copy_file_content(file_upload) - self.disk_filename = self.new_storage_filename + def copy_file_content(open_file) File.open(self.disk_file, "wb") do |f| - while (buffer = file_upload.read(8192)) + while (buffer = open_file.read(8192)) f.write(buffer) end end - self.size = File.size(self.disk_file) end end \ No newline at end of file diff --git a/app/views/dmsf_detail/_file_new_revision.html.erb b/app/views/dmsf_detail/_file_new_revision.html.erb index bf21c935..a4674136 100644 --- a/app/views/dmsf_detail/_file_new_revision.html.erb +++ b/app/views/dmsf_detail/_file_new_revision.html.erb @@ -21,6 +21,7 @@ end form_for(:dmsf_file_revision, @revision, :url => {:action => "save_file", :id => @project, :file_id => @file}, :html => {:method=>:post, :multipart => true}) do |f| %> + <%= error_messages_for("revision") %>

diff --git a/app/views/dmsf_detail/file_detail.html.erb b/app/views/dmsf_detail/file_detail.html.erb index cb6fe512..42e4f4c8 100644 --- a/app/views/dmsf_detail/file_detail.html.erb +++ b/app/views/dmsf_detail/file_detail.html.erb @@ -151,8 +151,10 @@ jQuery("#newRevisionFormContentToggle").text("[+]"); jQuery("#newRevisionFormContent").hide(); }); - jQuery("#newRevisionFormContentToggle").text("[+]"); - jQuery("#newRevisionFormContent").hide(); + <% if @revision.valid? %> + jQuery("#newRevisionFormContentToggle").text("[+]"); + jQuery("#newRevisionFormContent").hide(); + <% end %> }); <% end %> \ No newline at end of file