* 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:
parent
e0cdc6303a
commit
0ba5f454c2
@ -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}:"}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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) %>)
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user