From 328ce115e39723e9f465f9aa6b31a3f3f839d391 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Mon, 3 Feb 2020 22:49:53 -0800 Subject: [PATCH] Continued refactor, refs #577 --- datasette/app.py | 51 +++++++++++------------------------------ datasette/views/base.py | 37 +++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index ba9e0234..48cb2f0e 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -14,6 +14,7 @@ from pathlib import Path import click from markupsafe import Markup from jinja2 import ChoiceLoader, Environment, FileSystemLoader, PrefixLoader, escape +from jinja2.environment import Template import uvicorn from .views.base import DatasetteError, ureg, AsgiRouter @@ -529,44 +530,22 @@ class Datasette: for renderer in hook_renderers: self.renderers[renderer["extension"]] = renderer["callback"] - def _asset_urls(self, key, template, context): - # Flatten list-of-lists from plugins: - seen_urls = set() - for url_or_dict in itertools.chain( - itertools.chain.from_iterable( - getattr(pm.hook, key)( - template=template.name, - database=context.get("database"), - table=context.get("table"), - datasette=self.ds, - ) - ), - (self.ds.metadata(key) or []), - ): - if isinstance(url_or_dict, dict): - url = url_or_dict["url"] - sri = url_or_dict.get("sri") - else: - url = url_or_dict - sri = None - if url in seen_urls: - continue - seen_urls.add(url) - if sri: - yield {"url": url, "sri": sri} - else: - yield {"url": url} - async def render_template( self, templates, context=None, request=None, view_name=None ): - if isinstance(templates, str): - templates = [templates] - template = self.jinja_env.select_template(templates) - select_templates = [ - "{}{}".format("*" if template_name == template.name else "", template_name) - for template_name in templates - ] + if isinstance(templates, Template): + template = templates + select_templates = [] + else: + if isinstance(templates, str): + templates = [templates] + template = self.jinja_env.select_template(templates) + select_templates = [ + "{}{}".format( + "*" if template_name == template.name else "", template_name + ) + for template_name in templates + ] body_scripts = [] # pylint: disable=no-member for script in pm.hook.extra_body_script( @@ -604,8 +583,6 @@ class Datasette: "select_templates": select_templates, "zip": zip, "body_scripts": body_scripts, - "extra_css_urls": self._asset_urls("extra_css_urls", template, context), - "extra_js_urls": self._asset_urls("extra_js_urls", template, context), "format_bytes": format_bytes, }, **extra_template_vars, diff --git a/datasette/views/base.py b/datasette/views/base.py index af3c5623..7e579a30 100644 --- a/datasette/views/base.py +++ b/datasette/views/base.py @@ -72,14 +72,49 @@ class BaseView(AsgiView): def database_color(self, database): return "ff0000" + def _asset_urls(self, key, template, context): + # Flatten list-of-lists from plugins: + seen_urls = set() + for url_or_dict in itertools.chain( + itertools.chain.from_iterable( + getattr(pm.hook, key)( + template=template.name, + database=context.get("database"), + table=context.get("table"), + datasette=self.ds, + ) + ), + (self.ds.metadata(key) or []), + ): + if isinstance(url_or_dict, dict): + url = url_or_dict["url"] + sri = url_or_dict.get("sri") + else: + url = url_or_dict + sri = None + if url in seen_urls: + continue + seen_urls.add(url) + if sri: + yield {"url": url, "sri": sri} + else: + yield {"url": url} + async def render(self, templates, request, context): + template = self.ds.jinja_env.select_template(templates) return await self.ds.render_template( - templates, + template, { **context, **{ "database_url": self.database_url, "database_color": self.database_color, + "extra_css_urls": self._asset_urls( + "extra_css_urls", template, context + ), + "extra_js_urls": self._asset_urls( + "extra_js_urls", template, context + ), }, }, request=request,