Skip to content

Commit

Permalink
Refactored alternate_url_json mechanism, refs #1620, #1533
Browse files Browse the repository at this point in the history
  • Loading branch information
simonw committed Feb 2, 2022
1 parent b72b242 commit 8d5779a
Show file tree
Hide file tree
Showing 10 changed files with 27 additions and 62 deletions.
3 changes: 3 additions & 0 deletions datasette/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
{% for url in extra_js_urls %}
<script {% if url.module %}type="module" {% endif %}src="{{ url.url }}"{% if url.sri %} integrity="{{ url.sri }}" crossorigin="anonymous"{% endif %}></script>
{% endfor %}
{%- if alternate_url_json -%}
<link rel="alternate" type="application/json+datasette" href="{{ alternate_url_json }}">
{%- endif -%}
{%- block extra_head %}{% endblock -%}
</head>
<body class="{% block body_class %}{% endblock %}">
Expand Down
1 change: 0 additions & 1 deletion datasette/templates/database.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

{% block extra_head %}
{{- super() -}}
<link rel="alternate" type="application/json+datasette" href="{{ alternate_url_json }}">
{% include "_codemirror.html" %}
{% endblock %}

Expand Down
1 change: 0 additions & 1 deletion datasette/templates/query.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

{% block extra_head %}
{{- super() -}}
<link rel="alternate" type="application/json+datasette" href="{{ alternate_url_json }}">
{% if columns %}
<style>
@media only screen and (max-width: 576px) {
Expand Down
1 change: 0 additions & 1 deletion datasette/templates/row.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

{% block extra_head %}
{{- super() -}}
<link rel="alternate" type="application/json+datasette" href="{{ alternate_url_json }}">
<style>
@media only screen and (max-width: 576px) {
{% for column in columns %}
Expand Down
1 change: 0 additions & 1 deletion datasette/templates/table.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

{% block extra_head %}
{{- super() -}}
<link rel="alternate" type="application/json+datasette" href="{{ alternate_url_json }}">
<script src="{{ urls.static('table.js') }}" defer></script>
<style>
@media only screen and (max-width: 576px) {
Expand Down
17 changes: 14 additions & 3 deletions datasette/views/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def __init__(

class BaseView:
ds = None
has_json_alternate = True

def __init__(self, datasette):
self.ds = datasette
Expand Down Expand Up @@ -137,10 +138,20 @@ async def render(self, templates, request, context=None):
],
},
}
# Hacky cheat to add extra headers
headers = {}
if "_extra_headers" in context:
headers.update(context["_extra_headers"])
if self.has_json_alternate:
alternate_url_json = self.ds.absolute_url(
request,
self.ds.urls.path(path_with_format(request=request, format="json")),
)
template_context["alternate_url_json"] = alternate_url_json
headers.update(
{
"Link": '{}; rel="alternate"; type="application/json+datasette"'.format(
alternate_url_json
)
}
)
return Response.html(
await self.ds.render_template(
template,
Expand Down
32 changes: 0 additions & 32 deletions datasette/views/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,6 @@ async def database_actions():

attached_databases = [d.name for d in await db.attached_databases()]

alternate_url_json = self.ds.absolute_url(
request,
self.ds.urls.path(path_with_format(request=request, format="json")),
)
return (
{
"database": database,
Expand All @@ -144,7 +140,6 @@ async def database_actions():
),
},
{
"alternate_url_json": alternate_url_json,
"database_actions": database_actions,
"show_hidden": request.args.get("_show_hidden"),
"editable": True,
Expand All @@ -153,11 +148,6 @@ async def database_actions():
and not db.is_mutable
and not db.is_memory,
"attached_databases": attached_databases,
"_extra_headers": {
"Link": '{}; rel="alternate"; type="application/json+datasette"'.format(
alternate_url_json
)
},
},
(f"database-{to_css_class(database)}.html", "database.html"),
)
Expand Down Expand Up @@ -318,26 +308,14 @@ async def data(
else:

async def extra_template():
alternate_url_json = self.ds.absolute_url(
request,
self.ds.urls.path(
path_with_format(request=request, format="json")
),
)
return {
"alternate_url_json": alternate_url_json,
"request": request,
"path_with_added_args": path_with_added_args,
"path_with_removed_args": path_with_removed_args,
"named_parameter_values": named_parameter_values,
"canned_query": canned_query,
"success_message": request.args.get("_success") or "",
"canned_write": True,
"_extra_headers": {
"Link": '{}; rel="alternate"; type="application/json+datasette"'.format(
alternate_url_json
)
},
}

return (
Expand Down Expand Up @@ -470,12 +448,7 @@ async def extra_template():
show_hide_link = path_with_added_args(request, {"_hide_sql": 1})
show_hide_text = "hide"
hide_sql = show_hide_text == "show"
alternate_url_json = self.ds.absolute_url(
request,
self.ds.urls.path(path_with_format(request=request, format="json")),
)
return {
"alternate_url_json": alternate_url_json,
"display_rows": display_rows,
"custom_sql": True,
"named_parameter_values": named_parameter_values,
Expand All @@ -489,11 +462,6 @@ async def extra_template():
"show_hide_text": show_hide_text,
"show_hide_hidden": markupsafe.Markup(show_hide_hidden),
"hide_sql": hide_sql,
"_extra_headers": {
"Link": '{}; rel="alternate"; type="application/json+datasette"'.format(
alternate_url_json
)
},
}

return (
Expand Down
20 changes: 0 additions & 20 deletions datasette/views/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -851,12 +851,7 @@ async def table_actions():
for table_column in table_columns
if table_column not in columns
]
alternate_url_json = self.ds.absolute_url(
request,
self.ds.urls.path(path_with_format(request=request, format="json")),
)
d = {
"alternate_url_json": alternate_url_json,
"table_actions": table_actions,
"use_rowid": use_rowid,
"filters": filters,
Expand Down Expand Up @@ -887,11 +882,6 @@ async def table_actions():
"metadata": metadata,
"view_definition": await db.get_view_definition(table),
"table_definition": await db.get_table_definition(table),
"_extra_headers": {
"Link": '{}; rel="alternate"; type="application/json+datasette"'.format(
alternate_url_json
)
},
}
d.update(extra_context_from_filters)
return d
Expand Down Expand Up @@ -975,12 +965,7 @@ async def template_data():
)
for column in display_columns:
column["sortable"] = False
alternate_url_json = self.ds.absolute_url(
request,
self.ds.urls.path(path_with_format(request=request, format="json")),
)
return {
"alternate_url_json": alternate_url_json,
"foreign_key_tables": await self.foreign_key_tables(
database, table, pk_values
),
Expand All @@ -995,11 +980,6 @@ async def template_data():
.get(database, {})
.get("tables", {})
.get(table, {}),
"_extra_headers": {
"Link": '{}; rel="alternate"; type="application/json+datasette"'.format(
alternate_url_json
)
},
}

data = {
Expand Down
4 changes: 2 additions & 2 deletions docs/json_api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -442,9 +442,9 @@ in ``metadata.json`` - see :ref:`label_columns`.
Discovering the JSON for a page
-------------------------------

The :ref:`database <DatabaseView>`, :ref:`table <TableView>`, :ref:`custom/canned query <sql>` and :ref:`row <RowView>` HTML pages all provide a mechanism for discovering their JSON equivalents using the HTML ``link`` mechanism.
Most of the HTML pages served by Datasette provide a mechanism for discovering their JSON equivalents using the HTML ``link`` mechanism.

You can find this near the top of those pages, looking like this:
You can find this near the top of the source code of those pages, looking like this:

.. code-block:: python
Expand Down
9 changes: 8 additions & 1 deletion tests/test_html.py
Original file line number Diff line number Diff line change
Expand Up @@ -875,12 +875,14 @@ def test_trace_correctly_escaped(app_client):
@pytest.mark.parametrize(
"path,expected",
(
# Instance index page
("/", "http://localhost/.json"),
# Table page
("/fixtures/facetable", "http://localhost/fixtures/facetable.json"),
(
"/fixtures/table%2Fwith%2Fslashes.csv",
"http://localhost/fixtures/table%2Fwith%2Fslashes.csv?_format=json",
),
("/fixtures/facetable", "http://localhost/fixtures/facetable.json"),
# Row page
(
"/fixtures/no_primary_key/1",
Expand All @@ -901,6 +903,11 @@ def test_trace_correctly_escaped(app_client):
"/fixtures/neighborhood_search?text=town",
"http://localhost/fixtures/neighborhood_search.json?text=town",
),
# /-/ pages
(
"/-/plugins",
"http://localhost/-/plugins.json",
),
),
)
def test_alternate_url_json(app_client, path, expected):
Expand Down

0 comments on commit 8d5779a

Please sign in to comment.