From 7ff51598c468deb1d2c0d4c23a808458c9b1e3a2 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 30 Nov 2017 08:05:01 -0800 Subject: [PATCH] git commit -m "datasette --template-dir=mytemplates/" argument You can now pass an additional argument specifying a directory to look for custom templates in. Datasette will fall back on the default templates if a template is not found in that directory. Refs #12, #153 --- datasette/app.py | 11 +++++++---- datasette/cli.py | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index a74a0d51..afe20258 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -771,7 +771,7 @@ class Datasette: def __init__( self, files, num_threads=3, cache_headers=True, page_size=100, max_returned_rows=1000, sql_time_limit_ms=1000, cors=False, - inspect_data=None, metadata=None, sqlite_extensions=None): + inspect_data=None, metadata=None, sqlite_extensions=None, template_dir=None): self.files = files self.num_threads = num_threads self.executor = futures.ThreadPoolExecutor( @@ -786,6 +786,7 @@ class Datasette: self.metadata = metadata or {} self.sqlite_functions = [] self.sqlite_extensions = sqlite_extensions or [] + self.template_dir = template_dir def asset_urls(self, key): for url_or_dict in (self.metadata.get(key) or []): @@ -892,10 +893,12 @@ class Datasette: def app(self): app = Sanic(__name__) + template_paths = [] + if self.template_dir: + template_paths.append(self.template_dir) + template_paths.append(str(app_root / 'datasette' / 'templates')) self.jinja_env = Environment( - loader=FileSystemLoader([ - str(app_root / 'datasette' / 'templates') - ]), + loader=FileSystemLoader(template_paths), autoescape=True, ) self.jinja_env.filters['escape_css_string'] = escape_css_string diff --git a/datasette/cli.py b/datasette/cli.py index 632f3383..664e9255 100644 --- a/datasette/cli.py +++ b/datasette/cli.py @@ -156,7 +156,8 @@ def package(files, tag, metadata, extra_options, branch, **extra_metadata): ) @click.option('--inspect-file', help='Path to JSON file created using "datasette build"') @click.option('-m', '--metadata', type=click.File(mode='r'), help='Path to JSON file containing license/source metadata') -def serve(files, host, port, debug, reload, cors, page_size, max_returned_rows, sql_time_limit_ms, sqlite_extensions, inspect_file, metadata): +@click.option('-t', '--template-dir', type=click.Path(exists=True, file_okay=False, dir_okay=True), help='Path to directory containing custom templates') +def serve(files, host, port, debug, reload, cors, page_size, max_returned_rows, sql_time_limit_ms, sqlite_extensions, inspect_file, metadata, template_dir): """Serve up specified SQLite database files with a web UI""" if reload: import hupper @@ -181,6 +182,7 @@ def serve(files, host, port, debug, reload, cors, page_size, max_returned_rows, inspect_data=inspect_data, metadata=metadata_data, sqlite_extensions=sqlite_extensions, + template_dir=template_dir, ) # Force initial hashing/table counting ds.inspect()