Continued refactor, refs #577

This commit is contained in:
Simon Willison 2020-02-03 22:49:53 -08:00
commit 328ce115e3
2 changed files with 50 additions and 38 deletions

View file

@ -14,6 +14,7 @@ from pathlib import Path
import click import click
from markupsafe import Markup from markupsafe import Markup
from jinja2 import ChoiceLoader, Environment, FileSystemLoader, PrefixLoader, escape from jinja2 import ChoiceLoader, Environment, FileSystemLoader, PrefixLoader, escape
from jinja2.environment import Template
import uvicorn import uvicorn
from .views.base import DatasetteError, ureg, AsgiRouter from .views.base import DatasetteError, ureg, AsgiRouter
@ -529,44 +530,22 @@ class Datasette:
for renderer in hook_renderers: for renderer in hook_renderers:
self.renderers[renderer["extension"]] = renderer["callback"] 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( async def render_template(
self, templates, context=None, request=None, view_name=None self, templates, context=None, request=None, view_name=None
): ):
if isinstance(templates, str): if isinstance(templates, Template):
templates = [templates] template = templates
template = self.jinja_env.select_template(templates) select_templates = []
select_templates = [ else:
"{}{}".format("*" if template_name == template.name else "", template_name) if isinstance(templates, str):
for template_name in templates 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 = [] body_scripts = []
# pylint: disable=no-member # pylint: disable=no-member
for script in pm.hook.extra_body_script( for script in pm.hook.extra_body_script(
@ -604,8 +583,6 @@ class Datasette:
"select_templates": select_templates, "select_templates": select_templates,
"zip": zip, "zip": zip,
"body_scripts": body_scripts, "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, "format_bytes": format_bytes,
}, },
**extra_template_vars, **extra_template_vars,

View file

@ -72,14 +72,49 @@ class BaseView(AsgiView):
def database_color(self, database): def database_color(self, database):
return "ff0000" 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): async def render(self, templates, request, context):
template = self.ds.jinja_env.select_template(templates)
return await self.ds.render_template( return await self.ds.render_template(
templates, template,
{ {
**context, **context,
**{ **{
"database_url": self.database_url, "database_url": self.database_url,
"database_color": self.database_color, "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, request=request,