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