Compare commits

...

1 commit

Author SHA1 Message Date
Simon Willison
b1e168b9c9 Incomplete WIP for #880 2020-07-01 14:03:15 -07:00
3 changed files with 29 additions and 6 deletions

View file

@ -356,12 +356,14 @@ class DataView(BaseView):
if "table_and_format" in args: if "table_and_format" in args:
db = self.ds.databases[database] db = self.ds.databases[database]
async def async_table_exists(t): async def async_table_or_query_exists(t):
return await db.table_exists(t) return await db.table_exists(t) or await self.ds.get_canned_query(
database, t, request.actor
)
table, _ext_format = await resolve_table_and_format( table, _ext_format = await resolve_table_and_format(
table_and_format=urllib.parse.unquote_plus(args["table_and_format"]), table_and_format=urllib.parse.unquote_plus(args["table_and_format"]),
table_exists=async_table_exists, table_exists=async_table_or_query_exists,
allowed_formats=self.ds.renderers.keys(), allowed_formats=self.ds.renderers.keys(),
) )
_format = _format or _ext_format _format = _format or _ext_format

View file

@ -144,6 +144,7 @@ class QueryView(DataView):
_size=None, _size=None,
named_parameters=None, named_parameters=None,
write=False, write=False,
json_format=False,
): ):
params = {key: request.args.get(key) for key in request.args} params = {key: request.args.get(key) for key in request.args}
if "sql" in params: if "sql" in params:
@ -212,6 +213,16 @@ class QueryView(DataView):
message = metadata.get("on_error_message") or str(e) message = metadata.get("on_error_message") or str(e)
message_type = self.ds.ERROR message_type = self.ds.ERROR
redirect_url = metadata.get("on_error_redirect") redirect_url = metadata.get("on_error_redirect")
if json_format:
return (
{
"message": message,
"message_type": message_type,
"redirect_url": redirect_url,
},
{},
[],
)
self.ds.add_message(request, message, message_type) self.ds.add_message(request, message, message_type)
return self.redirect(request, redirect_url or request.path) return self.redirect(request, redirect_url or request.path)
else: else:

View file

@ -18,6 +18,7 @@ from datasette.utils import (
path_with_added_args, path_with_added_args,
path_with_removed_args, path_with_removed_args,
path_with_replaced_args, path_with_replaced_args,
resolve_table_and_format,
sqlite3, sqlite3,
to_css_class, to_css_class,
urlsafe_components, urlsafe_components,
@ -223,9 +224,17 @@ class TableView(RowTableShared):
async def post(self, request, db_name, table_and_format): async def post(self, request, db_name, table_and_format):
# Handle POST to a canned query # Handle POST to a canned query
canned_query = await self.ds.get_canned_query( async def async_query_exists(query):
db_name, table_and_format, request.actor canned_query = await self.ds.get_canned_query(db_name, query, request.actor)
return bool(canned_query)
query, _format = await resolve_table_and_format(
table_and_format=urllib.parse.unquote_plus(table_and_format),
table_exists=async_query_exists,
allowed_formats=self.ds.renderers.keys(),
) )
canned_query = await self.ds.get_canned_query(db_name, query, request.actor)
assert canned_query, "You may only POST to a canned query" assert canned_query, "You may only POST to a canned query"
return await QueryView(self.ds).data( return await QueryView(self.ds).data(
request, request,
@ -234,9 +243,10 @@ class TableView(RowTableShared):
canned_query["sql"], canned_query["sql"],
metadata=canned_query, metadata=canned_query,
editable=False, editable=False,
canned_query=table_and_format, canned_query=query,
named_parameters=canned_query.get("params"), named_parameters=canned_query.get("params"),
write=bool(canned_query.get("write")), write=bool(canned_query.get("write")),
json_format=(_format == "json"),
) )
async def data( async def data(