redmine_dmsf/lib/redmine_dmsf/webdav/base_resource.rb
2015-04-08 10:04:46 +02:00

163 lines
4.7 KiB
Ruby

# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'dav4rack'
module RedmineDmsf
module Webdav
class BaseResource < DAV4Rack::Resource
include Redmine::I18n
include ActionView::Helpers::NumberHelper
def initialize(*args)
webdav_setting = Setting.plugin_redmine_dmsf['dmsf_webdav']
raise NotFound if !webdav_setting.nil? && webdav_setting.empty?
super(*args)
end
DIR_FILE = "<tr><td class=\"name\"><a href=\"%s\">%s</a></td><td class=\"size\">%s</td><td class=\"type\">%s</td><td class=\"mtime\">%s</td></tr>"
def accessor=(klass)
@__proxy = klass
end
#Overridable function to provide better listing for GET requests
def long_name
nil
end
#Overridable function to provide better listing for GET requests
def special_type
nil
end
# Base attribute overriding in order to allow non-ascii characters in path
def path
@path.force_encoding('utf-8')
end
# Base attribute overriding in order to allow non-ascii characters in path
def public_path
@public_path.force_encoding('utf-8')
end
#Generate HTML for Get requests
def html_display
@response.body = ''
Confict unless collection?
entities = children.map{|child|
DIR_FILE % [
child.public_path,
child.long_name || child.name,
child.collection? ? '-' : number_to_human_size(child.content_length),
child.special_type || child.content_type,
child.last_modified
]
} * "\n"
entities = DIR_FILE % [
parent.public_path,
l(:parent_directory),
'-',
'',
'',
] + entities if parent
@response.body << index_page % [ path.empty? ? '/' : path, path.empty? ? '/' : path , entities ]
end
# Run method through proxy class - ensuring always compatible child is generated
def child(name)
new_public = public_path.dup
new_public = new_public + '/' unless new_public[-1,1] == '/'
new_public = '/' + new_public unless new_public[0,1] == '/'
new_path = path.dup
new_path = new_path + '/' unless new_path[-1,1] == '/'
new_path = '/' + new_path unless new_path[0,1] == '/'
@__proxy.class.new("#{new_public}#{name}", "#{new_path}#{name}", request, response, options.merge(:user => @user))
end
def parent
p = @__proxy.parent
return nil unless p
return p.resource.nil? ? p : p.resource
end
#Override index_page from DAV4Rack::Resource
def index_page
return <<-PAGE
<html><head>
<title>%s</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<style type='text/css'>
table { width:100%%; }
.name { text-align:left; }
.size, .mtime { text-align:right; }
.type { width:11em; }
.mtime { width:15em; }
</style>
</head><body>
<h1>%s</h1>
<hr />
<table>
<tr>
<th class='name'>Name</th>
<th class='size'>Size</th>
<th class='type'>Type</th>
<th class='mtime'>Last Modified</th>
</tr>
%s
</table>
<hr />
</body></html>
PAGE
end
protected
def basename
File.basename(path)
end
def dirname
File.dirname(path)
end
#return instance of Project based on path
def project
return @Project unless @Project.nil?
pinfo = @path.split('/').drop(1)
if pinfo.length > 0
begin
@Project = Project.find(pinfo.first)
rescue
end
end
end
#Make it easy to find the path without project in it.
def projectless_path
'/' + path.split('/').drop(2).join('/')
end
def path_prefix
public_path.gsub(/#{Regexp.escape(path)}$/, '')
end
end
end
end