Incomplete WIP for #880

json-post
Simon Willison 2020-07-01 14:03:15 -07:00
rodzic f7c3fc978c
commit b1e168b9c9
3 zmienionych plików z 29 dodań i 6 usunięć

Wyświetl plik

@ -356,12 +356,14 @@ class DataView(BaseView):
if "table_and_format" in args:
db = self.ds.databases[database]
async def async_table_exists(t):
return await db.table_exists(t)
async def async_table_or_query_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_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(),
)
_format = _format or _ext_format

Wyświetl plik

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

Wyświetl plik

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