mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
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 <em>description with HTML</em>.",
"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
This commit is contained in:
parent
515eaa8ccb
commit
80bf3afa43
7 changed files with 54 additions and 31 deletions
|
|
@ -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 = {
|
||||
|
|
|
|||
25
datasette/templates/_description_source_license.html
Normal file
25
datasette/templates/_description_source_license.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{% if metadata.description_html or metadata.description %}
|
||||
<div class="metadata-description">
|
||||
{% if metadata.description_html %}
|
||||
{{ metadata.description_html|safe }}
|
||||
{% else %}
|
||||
{{ metadata.description }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if metadata.license or metadata.license_url or metadata.source or metadata.source_url %}
|
||||
<p>
|
||||
{% if metadata.license or metadata.license_url %}Data license:
|
||||
{% if metadata.license_url %}
|
||||
<a href="{{ metadata.license_url }}">{{ metadata.license or metadata.license_url }}</a>
|
||||
{% 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 %}
|
||||
<a href="{{ metadata.source_url }}">
|
||||
{% endif %}{{ metadata.source or metadata.source_url }}{% if metadata.source_url %}</a>{% endif %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
|
@ -20,19 +20,17 @@
|
|||
<div class="ft">
|
||||
Powered by <a href="https://github.com/simonw/datasette" title="Datasette v{{ datasette_version }}">Datasette</a>
|
||||
{% 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 %}
|
||||
<a href="{{ metadata.license_url }}">{{ metadata.license }}</a>
|
||||
<a href="{{ metadata.license_url }}">{{ metadata.license or metadata.license_url }}</a>
|
||||
{% else %}
|
||||
{{ metadata.license }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if metadata.source_url %}·
|
||||
{% if metadata.source %}
|
||||
Data source: <a href="{{ metadata.source_url }}">{{ metadata.source }}</a>
|
||||
{% else %}
|
||||
<a href="{{ metadata.source_url }}">Data source</a>
|
||||
{% endif %}
|
||||
{% if metadata.source or metadata.source_url %}·
|
||||
Data source: {% if metadata.source_url %}
|
||||
<a href="{{ metadata.source_url }}">
|
||||
{% endif %}{{ metadata.source or metadata.source_url }}{% if metadata.source_url %}</a>{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,9 @@
|
|||
{% block content %}
|
||||
<div class="hd"><a href="/">home</a></div>
|
||||
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #{{ database_hash[:6] }}">{{ database }}</h1>
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #{{ database_hash[:6] }}">{{ metadata.title or database }}</h1>
|
||||
|
||||
{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
|
||||
<form class="sql" action="/{{ database }}-{{ database_hash }}" method="get">
|
||||
<h3>Custom SQL query</h3>
|
||||
|
|
|
|||
|
|
@ -6,24 +6,8 @@
|
|||
|
||||
{% block content %}
|
||||
<h1>{{ metadata.title or "Datasette" }}</h1>
|
||||
{% if metadata.license or metadata.source_url %}
|
||||
<p>
|
||||
{% if metadata.license %}Data license:
|
||||
{% if metadata.license_url %}
|
||||
<a href="{{ metadata.license_url }}">{{ metadata.license }}</a>
|
||||
{% else %}
|
||||
{{ metadata.license }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if metadata.source_url %}{% if metadata.license %}·{% endif %}
|
||||
{% if metadata.source %}
|
||||
Data source: <a href="{{ metadata.source_url }}">{{ metadata.source }}</a>
|
||||
{% else %}
|
||||
<a href="{{ metadata.source_url }}">Data source</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
|
||||
{% for database in databases %}
|
||||
<h2 style="padding-left: 10px; border-left: 10px solid #{{ database.hash[:6] }}"><a href="{{ database.path }}">{{ database.name }}</a></h2>
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@
|
|||
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #{{ database_hash[:6] }}">{{ table }}: {{ ', '.join(primary_key_values) }}</a></h1>
|
||||
|
||||
{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
|
||||
<p>This data as <a href="{{ url_json }}">.json</a>, <a href="{{ url_jsono }}">.jsono</a></p>
|
||||
|
||||
{% include custom_rows_and_columns_templates %}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,9 @@
|
|||
{% block content %}
|
||||
<div class="hd"><a href="/">home</a> / <a href="/{{ database }}-{{ database_hash }}">{{ database }}</a></div>
|
||||
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #{{ database_hash[:6] }}">{{ table }}{% if is_view %} (view){% endif %}</h1>
|
||||
<h1 style="padding-left: 10px; border-left: 10px solid #{{ database_hash[:6] }}">{{ metadata.title or table }}{% if is_view %} (view){% endif %}</h1>
|
||||
|
||||
{% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %}
|
||||
|
||||
{% if filtered_table_rows or human_filter_description %}
|
||||
<h3>{% if filtered_table_rows or filtered_table_rows == 0 %}{{ "{:,}".format(filtered_table_rows) }} row{% if filtered_table_rows == 1 %}{% else %}s{% endif %}{% endif %}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue