diff --git a/datasette/app.py b/datasette/app.py index f705dd78..4262e615 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -20,6 +20,7 @@ from .utils import ( InvalidSql, path_from_row_pks, path_with_added_args, + path_with_ext, compound_pks_from_path, sqlite_timelimit, validate_sql_select, @@ -174,7 +175,10 @@ class BaseView(HTTPMethodView): extra_template_data() if callable(extra_template_data) else extra_template_data - )} + ), **{ + 'url_json': path_with_ext(request, '.json'), + 'url_jsono': path_with_ext(request, '.jsono'), + }} r = self.jinja.render( self.template, request, @@ -240,19 +244,26 @@ class DatabaseView(BaseView): async def data(self, request, name, hash): sql = 'select * from sqlite_master' + custom_sql = False params = {} if request.args.get('sql'): params = request.raw_args sql = params.pop('sql') validate_sql_select(sql) + custom_sql = True rows = await self.execute(name, sql, params) columns = [r[0] for r in rows.description] return { 'database': name, 'rows': rows, 'columns': columns, + 'query': { + 'sql': sql, + 'params': params, + } }, { 'database_hash': hash, + 'custom_sql': custom_sql, } diff --git a/datasette/templates/database.html b/datasette/templates/database.html index 6ee9cc6e..58cc5748 100644 --- a/datasette/templates/database.html +++ b/datasette/templates/database.html @@ -7,7 +7,11 @@

{{ database }}

-

download {{ database }}.db

+{% if custom_sql %} +

This data as .json, .jsono

+{% else %} +

download {{ database }}.db

+{% endif %} diff --git a/datasette/templates/row.html b/datasette/templates/row.html index 3518b1e0..a82ccfc1 100644 --- a/datasette/templates/row.html +++ b/datasette/templates/row.html @@ -17,6 +17,8 @@

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

+

This data as .json, .jsono

+
diff --git a/datasette/templates/table.html b/datasette/templates/table.html index c2fb40da..657e7fc6 100644 --- a/datasette/templates/table.html +++ b/datasette/templates/table.html @@ -22,6 +22,8 @@

{{ "{:,}".format(table_rows) }} total row{% if table_rows == 1 %}{% else %}s{% endif %} in this table

{% endif %} +

This data as .json, .jsono

+
@@ -42,8 +44,10 @@ {% endfor %}
+ + {% if after_link %} -

Next page

+

Next page

{% endif %} {% endblock %} diff --git a/datasette/utils.py b/datasette/utils.py index e4e18d47..87e5da8d 100644 --- a/datasette/utils.py +++ b/datasette/utils.py @@ -110,6 +110,14 @@ def path_with_added_args(request, args): return request.path + '?' + urllib.parse.urlencode(current) +def path_with_ext(request, ext): + path = request.path + path += ext + if request.query_string: + path += '?' + request.query_string + return path + + _css_re = re.compile(r'''['"\n\\]''')