Introduce PUT method - file adding supported, work needed for better integration

with windows Webdav
This commit is contained in:
Daniel Munn 2012-06-13 23:59:06 +01:00
parent 34611df3fd
commit 9ae871be66
2 changed files with 72 additions and 4 deletions

View File

@ -169,13 +169,13 @@ module RedmineDmsf
return MethodNotAllowed if exist? #If we already exist, why waste the time trying to save? return MethodNotAllowed if exist? #If we already exist, why waste the time trying to save?
parent_folder = nil parent_folder = nil
if (parent.projectless_path != "/") if (parent.projectless_path != "/")
return MethodNotAllowed unless parent.folder? return Conflict unless parent.folder?
parent_folder = parent.folder.id parent_folder = parent.folder.id
end end
f = DmsfFolder.new({:title => basename, :dmsf_folder_id => parent_folder, :description => 'Folder created from WebDav'}) f = DmsfFolder.new({:title => basename, :dmsf_folder_id => parent_folder, :description => 'Folder created from WebDav'})
f.project = project f.project = project
f.user = User.current f.user = User.current
f.save ? OK : MethodNotAllowed f.save ? OK : Conflict
else else
UnsupportedMediaType UnsupportedMediaType
end end
@ -334,6 +334,8 @@ module RedmineDmsf
end end
end end
# Lock
# Locks a file entity only (DMSF Folders do not support locking)
def lock(args) def lock(args)
return Conflict unless (parent.projectless_path == "/" || parent_exists?) && !collection? && file? return Conflict unless (parent.projectless_path == "/" || parent_exists?) && !collection? && file?
token = UUIDTools::UUID.md5_create(UUIDTools::UUID_URL_NAMESPACE, projectless_path).to_s token = UUIDTools::UUID.md5_create(UUIDTools::UUID_URL_NAMESPACE, projectless_path).to_s
@ -348,10 +350,13 @@ module RedmineDmsf
end end
end end
# Unlock
# Token based unlock (authenticated) will ensure that a correct token is sent, further ensuring
# ownership of token before permitting unlock
def unlock(token) def unlock(token)
return NoContent unless file? return NoContent unless file?
token=token.slice(1, token.length - 2) token=token.slice(1, token.length - 2)
if (token.nil? || token.empty?) if (token.nil? || token.empty? || User.current.anonymous?)
BadRequest BadRequest
else else
_token = UUIDTools::UUID.md5_create(UUIDTools::UUID_URL_NAMESPACE, projectless_path).to_s _token = UUIDTools::UUID.md5_create(UUIDTools::UUID_URL_NAMESPACE, projectless_path).to_s
@ -364,6 +369,61 @@ module RedmineDmsf
end end
end end
# HTTP POST request.
#
# Forbidden, as method should not be utilised.
def post(request, response)
raise Forbidden
end
#
#
def put(request, response)
filename = DmsfHelper.temp_dir+'/'+DmsfHelper.temp_filename(basename).gsub(/[\/\\]/,'')
raise BadRequest unless (!collection?)
new_revision = DmsfFileRevision.new
if (exist? && file?) #We're over-writing something, so ultimately a new revision
f = file
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
else
raise BadRequest unless ( parent.projectless_path == "/" || (parent.exist? && parent.folder?) )
f = DmsfFile.new
f.project = project
f.name = basename
f.folder = parent.folder
f.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank?
new_revision.minor_version = 0
new_revision.major_version = 0
end
new_revision.project = project
new_revision.folder = parent.folder
new_revision.file = f
new_revision.user = User.current
new_revision.name = basename
new_revision.title = DmsfFileRevision.filename_to_title(basename)
new_revision.description = nil
new_revision.comment = nil
new_revision.increase_version(2, true)
new_revision.mime_type = Redmine::MimeType.of(new_revision.name)
new_revision.size = request.body.length
raise InternalServerError unless new_revision.valid? && f.save
new_revision.disk_filename = new_revision.new_storage_filename
if new_revision.save
f.reload
new_revision.copy_file_content(request.body)
else
raise InternalServerError
end
Created
end
private private
# Prepare file for download using Rack functionality: # Prepare file for download using Rack functionality:
# Download (see RedmineDmsf::Webdav::Download) extends Rack::File to allow single-file # Download (see RedmineDmsf::Webdav::Download) extends Rack::File to allow single-file

View File

@ -95,13 +95,21 @@ module RedmineDmsf
end end
def lock_check(*args) def lock_check(*args)
@resource_c.check_lock(*args) @resource_c.lock_check(*args)
end end
def unlock(*args) def unlock(*args)
@resource_c.unlock(*args) @resource_c.unlock(*args)
end end
def put(*args)
@resource_c.put(*args)
end
def post(*args)
@resource_c.post(*args)
end
def resource def resource
@resource_c @resource_c
end end