extra_css_urls(template, database, table, datasette)

The extra_css_urls and extra_js_urls hooks now take additional optional
parameters.

Also refactored them out of the Datasette class and into RenderMixin.

Plus improved plugin documentation to explicitly list parameters.
This commit is contained in:
Simon Willison 2018-08-28 11:56:57 +01:00
commit b7c6a9f9bd
No known key found for this signature in database
GPG key ID: 17E2DEA2588B7F52
7 changed files with 124 additions and 52 deletions

View file

@ -2,7 +2,6 @@ import asyncio
import click
import collections
import hashlib
import itertools
import os
import sys
import threading
@ -258,33 +257,6 @@ class Datasette:
def get_view_definition(self, database_name, view):
return self.get_table_definition(database_name, view, 'view')
def asset_urls(self, key):
# Flatten list-of-lists from plugins:
seen_urls = set()
for url_or_dict in itertools.chain(
itertools.chain.from_iterable(getattr(pm.hook, key)()),
(self.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}
def extra_css_urls(self):
return self.asset_urls("extra_css_urls")
def extra_js_urls(self):
return self.asset_urls("extra_js_urls")
def update_with_inherited_metadata(self, metadata):
# Fills in source/license with defaults, if available
metadata.update(

View file

@ -16,12 +16,12 @@ def prepare_jinja2_environment(env):
@hookspec
def extra_css_urls():
def extra_css_urls(template, database, table, datasette):
"Extra CSS URLs added by this plugin"
@hookspec
def extra_js_urls():
def extra_js_urls(template, database, table, datasette):
"Extra JavaScript URLs added by this plugin"

View file

@ -1,5 +1,6 @@
import asyncio
import csv
import itertools
import json
import re
import time
@ -46,6 +47,32 @@ class DatasetteError(Exception):
class RenderMixin(HTTPMethodView):
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}
def render(self, templates, **context):
template = self.ds.jinja_env.select_template(templates)
select_templates = [
@ -69,6 +96,12 @@ class RenderMixin(HTTPMethodView):
"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
),
}
}
)
@ -432,8 +465,6 @@ class BaseView(RenderMixin):
"url_csv": url_csv,
"url_csv_path": url_csv_path,
"url_csv_args": url_csv_args,
"extra_css_urls": self.ds.extra_css_urls(),
"extra_js_urls": self.ds.extra_js_urls(),
"datasette_version": __version__,
"config": self.ds.config_dict(),
}

View file

@ -51,6 +51,4 @@ class IndexView(RenderMixin):
databases=databases,
metadata=self.ds.metadata(),
datasette_version=__version__,
extra_css_urls=self.ds.extra_css_urls(),
extra_js_urls=self.ds.extra_js_urls(),
)