Replaced way too lax SourceRootFileLoader with SelectedFileLoader
This commit is contained in:
parent
fc4e786745
commit
6f83a175da
2 changed files with 41 additions and 26 deletions
|
|
@ -635,30 +635,8 @@ class Server():
|
|||
if octoprint.util.is_running_from_source():
|
||||
root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
|
||||
allowed = ["AUTHORS.md", "CHANGELOG.md", "THIRDPARTYLICENSES.md"]
|
||||
|
||||
class SourceRootFilesystemLoader(jinja2.FileSystemLoader):
|
||||
def __init__(self, template_filter, prefix, *args, **kwargs):
|
||||
jinja2.FileSystemLoader.__init__(self, *args, **kwargs)
|
||||
self._filter = template_filter
|
||||
if not prefix.endswith("/"):
|
||||
prefix += "/"
|
||||
self._prefix = prefix
|
||||
|
||||
def get_source(self, environment, template):
|
||||
if not template.startswith(self._prefix):
|
||||
raise jinja2.TemplateNotFound(template)
|
||||
|
||||
template = template[len(self._prefix):]
|
||||
if not self._filter(template):
|
||||
raise jinja2.TemplateNotFound(template)
|
||||
|
||||
return jinja2.FileSystemLoader.get_source(self, environment, template)
|
||||
|
||||
def list_templates(self):
|
||||
templates = jinja2.FileSystemLoader.list_templates(self)
|
||||
return map(lambda t: self._prefix + t, filter(self._filter, templates))
|
||||
|
||||
loaders.append(SourceRootFilesystemLoader(lambda t: t in allowed, "_data/", root))
|
||||
files = {name: os.path.join(root, name) for name in allowed}
|
||||
loaders.append(octoprint.util.jinja.SelectedFilesLoader(files))
|
||||
|
||||
jinja_loader = jinja2.ChoiceLoader(loaders)
|
||||
app.jinja_loader = jinja_loader
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import os
|
|||
from jinja2 import nodes
|
||||
from jinja2.ext import Extension
|
||||
from jinja2.loaders import FileSystemLoader, PrefixLoader, ChoiceLoader, \
|
||||
TemplateNotFound, split_template_path
|
||||
BaseLoader, TemplateNotFound, split_template_path
|
||||
|
||||
class FilteredFileSystemLoader(FileSystemLoader):
|
||||
"""
|
||||
|
|
@ -54,6 +54,39 @@ class FilteredFileSystemLoader(FileSystemLoader):
|
|||
return all(filter_results)
|
||||
|
||||
|
||||
class SelectedFilesLoader(BaseLoader):
|
||||
def __init__(self, files, encoding="utf-8"):
|
||||
self.files = files
|
||||
self.encoding = encoding
|
||||
|
||||
def get_source(self, environment, template):
|
||||
if not template in self.files:
|
||||
raise TemplateNotFound(template)
|
||||
|
||||
from jinja2.loaders import open_if_exists
|
||||
|
||||
path = self.files[template]
|
||||
f = open_if_exists(path)
|
||||
if f is None:
|
||||
raise TemplateNotFound(template)
|
||||
try:
|
||||
contents = f.read().decode(self.encoding)
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
mtime = os.path.getmtime(path)
|
||||
|
||||
def uptodate():
|
||||
try:
|
||||
return os.path.getmtime(path) == mtime
|
||||
except OSError:
|
||||
return False
|
||||
return contents, path, uptodate
|
||||
|
||||
def list_templates(self):
|
||||
return self.files.keys()
|
||||
|
||||
|
||||
class ExceptionHandlerExtension(Extension):
|
||||
tags = {"try"}
|
||||
|
||||
|
|
@ -115,7 +148,11 @@ def get_all_template_paths(loader):
|
|||
return files
|
||||
|
||||
def collect_templates_for_loader(loader):
|
||||
if isinstance(loader, FilteredFileSystemLoader):
|
||||
if isinstance(loader, SelectedFilesLoader):
|
||||
import copy
|
||||
return copy.copy(loader.files.values())
|
||||
|
||||
elif isinstance(loader, FilteredFileSystemLoader):
|
||||
result = []
|
||||
for folder in loader.searchpath:
|
||||
result += walk_folder(folder)
|
||||
|
|
|
|||
Loading…
Reference in a new issue