Skip to content

Commit

Permalink
Handle tables/with/slashes, closes #14
Browse files Browse the repository at this point in the history
  • Loading branch information
simonw committed Nov 29, 2023
1 parent 56310bd commit fff989a
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 16 deletions.
4 changes: 2 additions & 2 deletions datasette_enrichments/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from abc import ABC, abstractmethod
import asyncio
from datasette import hookimpl
from datasette.utils import async_call_with_supported_arguments
from datasette.utils import async_call_with_supported_arguments, tilde_encode
import json
import secrets
from datasette.plugins import pm
Expand Down Expand Up @@ -272,7 +272,7 @@ async def inner():
"href": datasette.urls.path(
"/-/enrich/{}/{}{}".format(
database,
table,
tilde_encode(table),
"?{}".format(request.query_string)
if request.query_string
else "",
Expand Down
19 changes: 12 additions & 7 deletions datasette_enrichments/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
async_call_with_supported_arguments,
path_with_removed_args,
MultiParams,
tilde_decode,
tilde_encode,
)
from .utils import get_with_auth
import urllib.parse
Expand All @@ -19,7 +21,7 @@ async def enrichment_view(datasette, request):
from . import get_enrichments

database = request.url_vars["database"]
table = request.url_vars["table"]
table = tilde_decode(request.url_vars["table"])
slug = request.url_vars["enrichment"]

await check_permissions(datasette, request, database)
Expand Down Expand Up @@ -89,7 +91,7 @@ async def enrichment_picker(datasette, request):
from . import get_enrichments

database = request.url_vars["database"]
table = request.url_vars["table"]
table = tilde_decode(request.url_vars["table"])

await check_permissions(datasette, request, database)

Expand All @@ -106,10 +108,13 @@ async def enrichment_picker(datasette, request):
)
# re-encode
query_string = urllib.parse.urlencode(bits)
response = await get_with_auth(
datasette,
datasette.urls.table(database, table, "json") + "?" + query_string,
)
url = datasette.urls.table(database, table, "json") + "?" + query_string
response = await get_with_auth(datasette, url)
if response.status_code != 200:
return Response.text(
"Error fetching data from {}: {}".format(url, response.text),
status=500,
)
filtered_data = response.json()
if "count" not in filtered_data:
# Fix for Datasette < 1.0
Expand Down Expand Up @@ -150,7 +155,7 @@ async def enrich_data_post(datasette, request, enrichment, filtered_data):
await check_permissions(datasette, request, database)

db = datasette.get_database(database)
table = request.url_vars["table"]
table = tilde_decode(request.url_vars["table"])

# Enqueue the enrichment to be run
filters = []
Expand Down
23 changes: 16 additions & 7 deletions tests/test_enrichments.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import asyncio
from datasette_enrichments.utils import wait_for_job
from datasette.app import Datasette
from datasette.utils import tilde_encode
import pytest
import sqlite3


@pytest.mark.asyncio
@pytest.mark.parametrize("is_root", [True, False])
@pytest.mark.parametrize("table", ("t", "rowid_table"))
@pytest.mark.parametrize("table", ("t", "rowid_table", "foo/bar"))
async def test_uppercase_plugin(tmpdir, is_root, table):
data = str(tmpdir / "data.db")
db = sqlite3.connect(data)
Expand All @@ -18,6 +19,9 @@ async def test_uppercase_plugin(tmpdir, is_root, table):
db.execute("create table rowid_table (s text)")
db.execute("insert into rowid_table (s) values ('one')")
db.execute("insert into rowid_table (s) values ('two')")
db.execute("create table [foo/bar] (s text)")
db.execute("insert into [foo/bar] (s) values ('one')")
db.execute("insert into [foo/bar] (s) values ('two')")
datasette = Datasette(
[data],
metadata={
Expand All @@ -29,24 +33,29 @@ async def test_uppercase_plugin(tmpdir, is_root, table):
},
)

encoded_table = tilde_encode(table)

if not is_root:
response1 = await datasette.client.get("/-/enrich/data/{}".format(table))
response1 = await datasette.client.get(
"/-/enrich/data/{}".format(encoded_table)
)
assert response1.status_code == 403
return

cookies = {"ds_actor": datasette.sign({"a": {"id": "root"}}, "actor")}
response1 = await datasette.client.get(
"/-/enrich/data/{}".format(table), cookies=cookies
"/-/enrich/data/{}".format(encoded_table), cookies=cookies
)
assert response1.status_code == 200
assert (
'<a href="/-/enrich/data/{}/uppercasedemo">Convert to uppercase</a>'.format(
table
encoded_table
)
in response1.text
)

response2 = await datasette.client.get(
"/-/enrich/data/{}/uppercasedemo".format(table), cookies=cookies
"/-/enrich/data/{}/uppercasedemo".format(encoded_table), cookies=cookies
)
assert "<h2>Convert to uppercase</h2>" in response2.text

Expand All @@ -57,13 +66,13 @@ async def test_uppercase_plugin(tmpdir, is_root, table):
assert not hasattr(datasette, "_initialize_called_with")

response3 = await datasette.client.post(
"/-/enrich/data/{}/uppercasedemo".format(table),
"/-/enrich/data/{}/uppercasedemo".format(encoded_table),
cookies=cookies,
data={"columns": "s", "csrftoken": csrftoken},
)
assert response3.status_code == 302
assert response3.headers["location"].startswith(
"/data/{}?_enrichment_job=".format(table)
"/data/{}?_enrichment_job=".format(encoded_table)
)
# It should be queued up
job_id = response3.headers["location"].split("=")[-1]
Expand Down

0 comments on commit fff989a

Please sign in to comment.