From 80bf3afa43e3cb396c7a7c9b168eedbc6fe0fa15 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 7 Dec 2017 08:42:54 -0800 Subject: [PATCH] metadata.json support for per-table/per-database metadata Also added support for descriptions and HTML descriptions. Here's an example metadata.json file illustrating custom per-database and per- table metadata: { "title": "Overall datasette title", "description_html": "This is a description with HTML.", "databases": { "db1": { "title": "First database", "description": "This is a string description & has no HTML", "license_url": "http://example.com/", "license": "The example license", "queries": { "canned_query": "select * from table1 limit 3;" }, "tables": { "table1": { "title": "Custom title for table1", "description": "Tables can have descriptions too", "source": "This has a custom source", "source_url": "http://example.com/" } } } } } Closes #165, Refs #164 --- datasette/app.py | 16 +++++++++--- .../_description_source_license.html | 25 +++++++++++++++++++ datasette/templates/base.html | 14 +++++------ datasette/templates/database.html | 4 ++- datasette/templates/index.html | 20 ++------------- datasette/templates/row.html | 2 ++ datasette/templates/table.html | 4 ++- 7 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 datasette/templates/_description_source_license.html diff --git a/datasette/app.py b/datasette/app.py index de6d0b91..7cd56cda 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -242,12 +242,13 @@ class BaseView(RenderMixin): **{ 'url_json': path_with_ext(request, '.json'), 'url_jsono': path_with_ext(request, '.jsono'), - 'metadata': self.ds.metadata, 'extra_css_urls': self.ds.extra_css_urls(), 'extra_js_urls': self.ds.extra_js_urls(), 'datasette_version': __version__, } } + if 'metadata' not in context: + context['metadata'] = self.ds.metadata r = self.render( templates, **context, @@ -379,6 +380,9 @@ class DatabaseView(BaseView): 'database_hash': hash, 'show_hidden': request.args.get('_show_hidden'), 'editable': True, + 'metadata': self.ds.metadata.get( + 'databases', {} + ).get(name, {}), }, ('database-{}.html'.format(to_css_class(name)), 'database.html') @@ -686,7 +690,10 @@ class TableView(RowTableShared): '_rows_and_columns-{}-{}.html'.format(to_css_class(name), to_css_class(table)), '_rows_and_columns-table-{}-{}.html'.format(to_css_class(name), to_css_class(table)), '_rows_and_columns.html', - ] + ], + 'metadata': self.ds.metadata.get( + 'databases', {} + ).get(name, {}).get('tables', {}).get(table, {}), } return { @@ -750,7 +757,10 @@ class RowView(RowTableShared): '_rows_and_columns-{}-{}.html'.format(to_css_class(name), to_css_class(table)), '_rows_and_columns-row-{}-{}.html'.format(to_css_class(name), to_css_class(table)), '_rows_and_columns.html', - ] + ], + 'metadata': self.ds.metadata.get( + 'databases', {} + ).get(name, {}).get('tables', {}).get(table, {}), } data = { diff --git a/datasette/templates/_description_source_license.html b/datasette/templates/_description_source_license.html new file mode 100644 index 00000000..eba4eb1a --- /dev/null +++ b/datasette/templates/_description_source_license.html @@ -0,0 +1,25 @@ +{% if metadata.description_html or metadata.description %} +
+ {% if metadata.description_html %} + {{ metadata.description_html|safe }} + {% else %} + {{ metadata.description }} + {% endif %} +
+{% endif %} +{% if metadata.license or metadata.license_url or metadata.source or metadata.source_url %} +

+ {% if metadata.license or metadata.license_url %}Data license: + {% if metadata.license_url %} + {{ metadata.license or metadata.license_url }} + {% else %} + {{ metadata.license }} + {% endif %} + {% endif %} + {% if metadata.source or metadata.source_url %}{% if metadata.license or metadata.license_url %}·{% endif %} + Data source: {% if metadata.source_url %} + + {% endif %}{{ metadata.source or metadata.source_url }}{% if metadata.source_url %}{% endif %} + {% endif %} +

+{% endif %} diff --git a/datasette/templates/base.html b/datasette/templates/base.html index 3614a790..0c21af0e 100644 --- a/datasette/templates/base.html +++ b/datasette/templates/base.html @@ -20,19 +20,17 @@
Powered by Datasette {% if query_ms %}· Query took {{ query_ms|round(3) }}ms{% endif %} - {% if metadata.license %}· Data license: + {% if metadata.license or metadata.license_url %}· Data license: {% if metadata.license_url %} - {{ metadata.license }} + {{ metadata.license or metadata.license_url }} {% else %} {{ metadata.license }} {% endif %} {% endif %} - {% if metadata.source_url %}· - {% if metadata.source %} - Data source: {{ metadata.source }} - {% else %} - Data source - {% endif %} + {% if metadata.source or metadata.source_url %}· + Data source: {% if metadata.source_url %} + + {% endif %}{{ metadata.source or metadata.source_url }}{% if metadata.source_url %}{% endif %} {% endif %}
diff --git a/datasette/templates/database.html b/datasette/templates/database.html index 4793743e..8867578a 100644 --- a/datasette/templates/database.html +++ b/datasette/templates/database.html @@ -12,7 +12,9 @@ {% block content %}
home
-

{{ database }}

+

{{ metadata.title or database }}

+ +{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}

Custom SQL query

diff --git a/datasette/templates/index.html b/datasette/templates/index.html index 85987d0c..d1cc0eee 100644 --- a/datasette/templates/index.html +++ b/datasette/templates/index.html @@ -6,24 +6,8 @@ {% block content %}

{{ metadata.title or "Datasette" }}

-{% if metadata.license or metadata.source_url %} -

- {% if metadata.license %}Data license: - {% if metadata.license_url %} - {{ metadata.license }} - {% else %} - {{ metadata.license }} - {% endif %} - {% endif %} - {% if metadata.source_url %}{% if metadata.license %}·{% endif %} - {% if metadata.source %} - Data source: {{ metadata.source }} - {% else %} - Data source - {% endif %} - {% endif %} -

-{% endif %} + +{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %} {% for database in databases %}

{{ database.name }}

diff --git a/datasette/templates/row.html b/datasette/templates/row.html index b338f007..53cbd15d 100644 --- a/datasette/templates/row.html +++ b/datasette/templates/row.html @@ -20,6 +20,8 @@

{{ table }}: {{ ', '.join(primary_key_values) }}

+{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %} +

This data as .json, .jsono

{% include custom_rows_and_columns_templates %} diff --git a/datasette/templates/table.html b/datasette/templates/table.html index 6b014c12..70262bc7 100644 --- a/datasette/templates/table.html +++ b/datasette/templates/table.html @@ -19,7 +19,9 @@ {% block content %} -

{{ table }}{% if is_view %} (view){% endif %}

+

{{ metadata.title or table }}{% if is_view %} (view){% endif %}

+ +{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %} {% if filtered_table_rows or human_filter_description %}

{% if filtered_table_rows or filtered_table_rows == 0 %}{{ "{:,}".format(filtered_table_rows) }} row{% if filtered_table_rows == 1 %}{% else %}s{% endif %}{% endif %}