better gluon.tools.Expose, thanks Richard
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.2.1 (2012-11-01 21:07:42) stable
|
Version 2.2.1 (2012-11-01 21:09:04) stable
|
||||||
|
|||||||
+25
-17
@@ -4587,16 +4587,23 @@ class PluginManager(object):
|
|||||||
|
|
||||||
|
|
||||||
class Expose(object):
|
class Expose(object):
|
||||||
def __init__(self, base=None, basename='base'):
|
def __init__(self, base=None, basename='base', extensions=None, allow_download=True):
|
||||||
|
"""
|
||||||
|
extensions: an optional list of file extensions for filtering displayed files:
|
||||||
|
['.py', '.jpg']
|
||||||
|
allow_download: whether to allow downloading selected files
|
||||||
|
"""
|
||||||
current.session.forget()
|
current.session.forget()
|
||||||
base = base or os.path.join(current.request.folder, 'static')
|
base = base or os.path.join(current.request.folder, 'static')
|
||||||
self.basename = basename
|
self.basename = basename
|
||||||
args = self.args = current.request.raw_args and \
|
self.args = current.request.raw_args and \
|
||||||
current.request.raw_args.split('/') or []
|
[arg for arg in current.request.raw_args.split('/') if arg] or []
|
||||||
filename = os.path.join(base, *args)
|
filename = os.path.join(base, *self.args)
|
||||||
|
if not os.path.exists(filename):
|
||||||
|
raise HTTP(404, "FILE NOT FOUND")
|
||||||
if not os.path.normpath(filename).startswith(base):
|
if not os.path.normpath(filename).startswith(base):
|
||||||
raise HTTP(401, "NOT AUTHORIZED")
|
raise HTTP(401, "NOT AUTHORIZED")
|
||||||
if not os.path.isdir(filename):
|
if allow_download and not os.path.isdir(filename):
|
||||||
current.response.headers['Content-Type'] = contenttype(filename)
|
current.response.headers['Content-Type'] = contenttype(filename)
|
||||||
raise HTTP(200, open(filename, 'rb'), **current.response.headers)
|
raise HTTP(200, open(filename, 'rb'), **current.response.headers)
|
||||||
self.path = path = os.path.join(filename, '*')
|
self.path = path = os.path.join(filename, '*')
|
||||||
@@ -4604,23 +4611,24 @@ class Expose(object):
|
|||||||
if os.path.isdir(f) and not self.isprivate(f)]
|
if os.path.isdir(f) and not self.isprivate(f)]
|
||||||
self.filenames = [f[len(path) - 1:] for f in sorted(glob.glob(path))
|
self.filenames = [f[len(path) - 1:] for f in sorted(glob.glob(path))
|
||||||
if not os.path.isdir(f) and not self.isprivate(f)]
|
if not os.path.isdir(f) and not self.isprivate(f)]
|
||||||
|
if extensions:
|
||||||
|
self.filenames = [f for f in self.filenames if os.path.splitext(f)[-1] in extensions]
|
||||||
|
|
||||||
def breadcrumbs(self, basename):
|
def breadcrumbs(self, basename):
|
||||||
path = []
|
path = []
|
||||||
span = SPAN()
|
span = SPAN()
|
||||||
span.append(A(basename, _href=URL()))
|
span.append(A(basename, _href=URL()))
|
||||||
span.append('/')
|
for arg in self.args:
|
||||||
args = current.request.raw_args and \
|
span.append('/')
|
||||||
current.request.raw_args.split('/') or []
|
|
||||||
for arg in args:
|
|
||||||
path.append(arg)
|
path.append(arg)
|
||||||
span.append(A(arg, _href=URL(args='/'.join(path))))
|
span.append(A(arg, _href=URL(args='/'.join(path))))
|
||||||
span.append('/')
|
|
||||||
return span
|
return span
|
||||||
|
|
||||||
def table_folders(self):
|
def table_folders(self):
|
||||||
return TABLE(*[TR(TD(A(folder, _href=URL(args=self.args + [folder]))))
|
if self.folders:
|
||||||
for folder in self.folders])
|
return SPAN(H3('Folders'), TABLE(*[TR(TD(A(folder, _href=URL(args=self.args + [folder]))))
|
||||||
|
for folder in self.folders]))
|
||||||
|
return ''
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def isprivate(f):
|
def isprivate(f):
|
||||||
@@ -4628,21 +4636,21 @@ class Expose(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def isimage(f):
|
def isimage(f):
|
||||||
return f.rsplit('.')[-1].lower() in ('png', 'jpg', 'jpeg', 'gif', 'tiff')
|
return os.path.splitext(f)[-1].lower() in ('.png', '.jpg', '.jpeg', '.gif', '.tiff')
|
||||||
|
|
||||||
def table_files(self, width=160):
|
def table_files(self, width=160):
|
||||||
return TABLE(*[TR(TD(A(f, _href=URL(args=self.args + [f]))),
|
if self.filenames:
|
||||||
|
return SPAN(H3('Files'), TABLE(*[TR(TD(A(f, _href=URL(args=self.args + [f]))),
|
||||||
TD(IMG(_src=URL(args=self.args + [f]),
|
TD(IMG(_src=URL(args=self.args + [f]),
|
||||||
_style='max-width:%spx' % width)
|
_style='max-width:%spx' % width)
|
||||||
if width and self.isimage(f) else ''))
|
if width and self.isimage(f) else ''))
|
||||||
for f in self.filenames])
|
for f in self.filenames]))
|
||||||
|
return ''
|
||||||
|
|
||||||
def xml(self):
|
def xml(self):
|
||||||
return DIV(
|
return DIV(
|
||||||
H2(self.breadcrumbs(self.basename)),
|
H2(self.breadcrumbs(self.basename)),
|
||||||
H3('Folders'),
|
|
||||||
self.table_folders(),
|
self.table_folders(),
|
||||||
H3('Files'),
|
|
||||||
self.table_files()).xml()
|
self.table_files()).xml()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user