* 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
This commit is contained in:
vit.jonas@gmail.com 2011-05-22 15:33:52 +00:00
parent e0cdc6303a
commit 0ba5f454c2
14 changed files with 147 additions and 139 deletions

View File

@ -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}:"}

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -49,18 +49,18 @@ form_for(:dmsf_file_revision, @revision, :url => {:action => "save_file", :id =>
<%= label_tag("fileMinorVersionRadio", l(:label_version) + ":") %>
</p>
<div class="data clear">
<%= 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) %><br />
<%= 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) %><br />
<%= 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) %><br />
</div>
<p>
<%= 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 =>
</div>
<div class="splitcontentright clear">
<p>
<%= label_tag("fileFileUpload", l(:label_new_content) + ":") %>
<%= label_tag("file_upload", l(:label_new_content) + ":") %>
<div class="data">
<%= file_field_tag("dmsf_file_revision[file]", :size => 30, :id => "fileFileUpload") %>
<%= file_field_tag("file_upload", :size => 30) %>
<br />
<small>
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)

View File

@ -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);

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"