From 0ba5f454c29ffb38d99f0e4ad8c51b8889c766b3 Mon Sep 17 00:00:00 2001 From: "vit.jonas@gmail.com" Date: Sun, 22 May 2011 15:33:52 +0000 Subject: [PATCH] * reworked file upload and file revision creating git-svn-id: http://redmine-dmsf.googlecode.com/svn/trunk/redmine_dmsf@71 5e329b0b-a2ee-ea63-e329-299493fc886d --- app/controllers/dmsf_detail_controller.rb | 94 ++++++++++++-- app/models/dmsf_file.rb | 42 +------ app/models/dmsf_file_lock.rb | 9 ++ app/models/dmsf_file_revision.rb | 115 +++++------------- .../dmsf_detail/_file_new_revision.html.erb | 14 +-- app/views/dmsf_detail/file_detail.html.erb | 4 +- config/locales/cs.yml | 1 + config/locales/de.yml | 1 + config/locales/en-GB.yml | 1 + config/locales/en.yml | 1 + config/locales/es.yml | 1 + config/locales/fr.yml | 1 + config/locales/ja.yml | 1 + config/locales/ru.yml | 1 + 14 files changed, 147 insertions(+), 139 deletions(-) diff --git a/app/controllers/dmsf_detail_controller.rb b/app/controllers/dmsf_detail_controller.rb index 689699ec..b6f2e3df 100644 --- a/app/controllers/dmsf_detail_controller.rb +++ b/app/controllers/dmsf_detail_controller.rb @@ -96,18 +96,42 @@ class DmsfDetailController < ApplicationController flash[:error] = l(:error_file_is_locked) redirect_to :action => "file_detail", :id => @project, :file_id => @file else - new_revision = DmsfFileRevision.from_saved_file(@file, params[:dmsf_file_revision]) + #TODO: validate folder_id + new_revision = DmsfFileRevision.new(params[:dmsf_file_revision]) + + new_revision.file = @file + last_revision = @file.last_revision + new_revision.source_revision = last_revision + new_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 + 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 + 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) + end + new_revision.set_workflow(params[:workflow]) + new_revision.save @file.name = new_revision.name @file.folder = new_revision.folder - @file.save - if @file.locked? - @file.unlock + 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 @@ -195,15 +219,63 @@ class DmsfDetailController < ApplicationController if commited_files && commited_files.is_a?(Hash) files = [] commited_files.each_value do |commited_file| - file = DmsfFile.from_commited_file(@project, @folder, commited_file) - if file.locked_for_user? - flash[:warning] = l(:warning_one_of_files_locked) + 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 - revision = DmsfFileRevision.from_commited_file(file, commited_file) - file.unlock if file.locked? - file.reload - files.push(file) + if file.locked_for_user? + flash[:error] = l(:error_file_is_locked) + 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"]}" + 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 + 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.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) + end + file.save + file.reload + + files.push(file) end 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}:"} diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index 870e7a10..e653ec79 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -79,30 +79,6 @@ class DmsfFile < ActiveRecord::Base end end - def self.from_commited_file(project, folder, commited_file) - file = find_file_by_name(project, folder, commited_file["name"]) - - if file.nil? - file = DmsfFile.new - file.project = project - file.folder = folder - file.name = commited_file["name"] - file.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? - file.save - end - - return file - end - - def new_storage_filename - filename = DmsfHelper.sanitize_filename(self.name) - timestamp = DateTime.now.strftime("%y%m%d%H%M%S") - while File.exist?(File.join(DmsfFile.storage_path, "#{timestamp}_#{self.id}_#{filename}")) - timestamp.succ! - end - "#{timestamp}_#{id}_#{filename}" - end - def locked? self.locks.empty? ? false : self.locks[0].locked end @@ -112,23 +88,15 @@ class DmsfFile < ActiveRecord::Base end def lock - lock = DmsfFileLock.new - lock.file = self - lock.user = User.current - lock.locked = true - lock.save + l = DmsfFileLock.file_lock_state(self, true) self.reload - return lock + return l end def unlock - lock = DmsfFileLock.new - lock.file = self - lock.user = User.current - lock.locked = false - lock.save + l = DmsfFileLock.file_lock_state(self, false) self.reload - return lock + return l end def last_revision @@ -184,7 +152,7 @@ class DmsfFile < ActiveRecord::Base #end end - # to fullfill searchable module expectations + # To fullfill searchable module expectations def self.search(tokens, projects=nil, options={}) tokens = [] << tokens unless tokens.is_a?(Array) projects = [] << projects unless projects.nil? || projects.is_a?(Array) diff --git a/app/models/dmsf_file_lock.rb b/app/models/dmsf_file_lock.rb index 64759ead..c82cc075 100644 --- a/app/models/dmsf_file_lock.rb +++ b/app/models/dmsf_file_lock.rb @@ -20,4 +20,13 @@ class DmsfFileLock < ActiveRecord::Base unloadable belongs_to :file, :class_name => "DmsfFile", :foreign_key => "dmsf_file_id" belongs_to :user + + def self.file_lock_state(file, locked) + lock = DmsfFileLock.new + lock.file = file + lock.user = User.current + lock.locked = locked + lock.save! + end + end \ No newline at end of file diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index b0778d50..8e982abb 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -45,42 +45,11 @@ class DmsfFileRevision < ActiveRecord::Base filename[0, (filename.length - File.extname(filename).length)] end + #TODO: check if better to move to dmsf_upload class def self.filename_to_title(filename) remove_extension(filename).gsub(/_+/, " "); end - def self.from_commited_file(dmsf_file, commited_file) - revision = DmsfFileRevision.new - - commited_disk_filename = commited_file["disk_filename"] - commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_disk_filename}" - commited_file["file"] = File.new(commited_disk_filepath, "rb") - commited_file["mime_type"] = Redmine::MimeType.of(commited_disk_filepath) - - begin - revision.from_form_post(dmsf_file, commited_file) - ensure - commited_file["file"].close - end - - revision.save - File.delete(commited_disk_filepath) - revision - end - - def self.from_saved_file(dmsf_file, saved_file) - revision = DmsfFileRevision.new - - if !saved_file["file"].nil? - #TODO: complete this for file renaming - #dmsf_file.name = saved_file["file"].original_filename - #dmsf_file.save - saved_file["mime_type"] = Redmine::MimeType.of(saved_file["file"].original_filename) - end - - revision.from_form_post(dmsf_file, saved_file) - end - def version "#{self.major_version}.#{self.minor_version}" end @@ -132,6 +101,7 @@ class DmsfFileRevision < ActiveRecord::Base self end + #TODO: use standard clone method def clone new_revision = DmsfFileRevision.new new_revision.file = self.file @@ -153,6 +123,7 @@ class DmsfFileRevision < ActiveRecord::Base return new_revision end + #TODO: validate if it isn't doubled or move it to view def workflow_str case workflow when 1 then l(:title_waiting_for_approval) @@ -177,6 +148,26 @@ class DmsfFileRevision < ActiveRecord::Base end end + def increase_version(version_to_increase, new_content) + if new_content + self.minor_version = case version_to_increase + when 2 then 0 + else self.minor_version + 1 + end + else + self.minor_version = case version_to_increase + when 1 then self.minor_version + 1 + when 2 then 0 + else self.minor_version + end + end + + self.major_version = case version_to_increase + when 2 then self.major_version + 1 + else self.major_version + end + end + def display_title #if self.title.length > 35 # return self.title[0, 30] + "..." @@ -185,63 +176,23 @@ class DmsfFileRevision < ActiveRecord::Base #end end - private - - #FIXME: put file uploaded check to standard validation - def from_form_post_create(posted) - if posted["file"].nil? - raise DmsfContentError, "First revision require uploaded file" - else - self.major_version = case posted["version"] - when "major" then 1 - else 0 - end - self.minor_version = case posted["version"] - when "major" then 0 - else 1 - end + def new_storage_filename + filename = DmsfHelper.sanitize_filename(self.name) + timestamp = DateTime.now.strftime("%y%m%d%H%M%S") + while File.exist?(File.join(DmsfFile.storage_path, "#{timestamp}_#{self.id}_#{filename}")) + timestamp.succ! end - - set_workflow(posted["workflow"]) + "#{timestamp}_#{id}_#{filename}" end - def from_form_post_existing(posted, source_revision) - self.major_version = source_revision.major_version - self.minor_version = source_revision.minor_version - if posted["file"].nil? - self.disk_filename = source_revision.disk_filename - self.minor_version = case posted["version"] - when "same" then self.minor_version - when "major" then 0 - else self.minor_version + 1 - end - self.mime_type = source_revision.mime_type - self.size = source_revision.size - else - self.minor_version = case posted["version"] - when "major" then 0 - else self.minor_version + 1 - end - end - - self.major_version = case posted["version"] - when "major" then self.major_version + 1 - else self.major_version - end - - set_workflow(posted["workflow"]) - end - - def copy_file_content(posted) - self.disk_filename = self.file.new_storage_filename + def copy_file_content(file_upload) + self.disk_filename = self.new_storage_filename File.open(self.disk_file, "wb") do |f| - buffer = "" - while (buffer = posted["file"].read(8192)) + while (buffer = file_upload.read(8192)) f.write(buffer) end end - self.mime_type = posted["mime_type"] 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 8577d9f9..bf21c935 100644 --- a/app/views/dmsf_detail/_file_new_revision.html.erb +++ b/app/views/dmsf_detail/_file_new_revision.html.erb @@ -49,18 +49,18 @@ form_for(:dmsf_file_revision, @revision, :url => {:action => "save_file", :id => <%= label_tag("fileMinorVersionRadio", l(:label_version) + ":") %>

- <%= radio_button_tag("dmsf_file_revision[version]", "same", @revision.version == @file.last_revision.version, :id => "fileSameVersionRadio") %> + <%= radio_button_tag("version", 0, @revision.version == @file.last_revision.version, :id => "fileSameVersionRadio") %> <%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version %> <%= l(:option_version_same) %>
- <%= radio_button_tag("dmsf_file_revision[version]", "minor", + <%= radio_button_tag("version", 1, @revision.major_version == @file.last_revision.major_version && @revision.minor_version != @file.last_revision.minor_version, :id => "fileMinorVersionRadio") %> <%= @file.last_revision.major_version %>.<%= @file.last_revision.minor_version + 1 %> <%= l(:option_version_minor) %>
- <%= radio_button_tag("dmsf_file_revision[version]", "major", @revision.major_version != @file.last_revision.major_version) %> + <%= radio_button_tag("version", 2, @revision.major_version != @file.last_revision.major_version) %> <%= @file.last_revision.major_version + 1 %>.0 <%= l(:option_version_major) %>

- <%= label_tag("dmsf_file_revision_workflow", l(:label_workflow) + ":") %> - <%= f.select(:workflow, + <%= label_tag("workflow", l(:label_workflow) + ":") %> + <%= select_tag("workflow", options_for_select([ [l(:option_workflow_none), nil], [l(:option_workflow_waiting_for_approval), 1], @@ -70,9 +70,9 @@ form_for(:dmsf_file_revision, @revision, :url => {:action => "save_file", :id =>

- <%= label_tag("fileFileUpload", l(:label_new_content) + ":") %> + <%= label_tag("file_upload", l(:label_new_content) + ":") %>

- <%= file_field_tag("dmsf_file_revision[file]", :size => 30, :id => "fileFileUpload") %> + <%= file_field_tag("file_upload", :size => 30) %>
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>) diff --git a/app/views/dmsf_detail/file_detail.html.erb b/app/views/dmsf_detail/file_detail.html.erb index 0285e8fc..cb6fe512 100644 --- a/app/views/dmsf_detail/file_detail.html.erb +++ b/app/views/dmsf_detail/file_detail.html.erb @@ -137,8 +137,8 @@ if(!window.confirm("<%= l(:question_do_you_really_want_to_delete_this_entry) %>")) event.preventDefault(); }) - jQuery("#fileFileUpload").change(function() { - if(jQuery("input[name=\"file[version]\"]:checked").val() == "same") { + jQuery("#file_upload").change(function() { + if(jQuery("input[name=\"version\"]:checked").val() == "0") { jQuery("#fileMinorVersionRadio").prop("checked", true); } jQuery("#fileSameVersionRadio").prop("disabled", true); diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 56e58df6..d583d48c 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -139,4 +139,5 @@ cs: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file diff --git a/config/locales/de.yml b/config/locales/de.yml index 6c4e5fbd..a3ee85a3 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -135,4 +135,5 @@ de: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index d28f17f5..082af0b1 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -135,4 +135,5 @@ en-GB: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 3af01129..8ab7bc71 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -139,4 +139,5 @@ en: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file diff --git a/config/locales/es.yml b/config/locales/es.yml index c5e6b670..206d5273 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -137,4 +137,5 @@ es: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 3fc307e0..2b09911e 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -135,4 +135,5 @@ fr: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 3af01129..8ab7bc71 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -139,4 +139,5 @@ en: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 41ee743c..8bfe6ce8 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -135,4 +135,5 @@ ru: :field_folder: "Folder" :error_create_cycle_in_folder_dependency: "create cycle in folder dependency" :error_contains_invalid_character: "contains invalid character(s)" + :error_file_commit_require_uploaded_file: "File commit require uploaded file" \ No newline at end of file