mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Facet "selected" key and toggle_url now toggles, refs #255
This commit is contained in:
parent
2b79f2bdeb
commit
cf6e7840ae
5 changed files with 54 additions and 8 deletions
|
|
@ -165,6 +165,18 @@ def path_with_added_args(request, args, path=None):
|
||||||
return path + query_string
|
return path + query_string
|
||||||
|
|
||||||
|
|
||||||
|
def path_with_removed_args(request, args, path=None):
|
||||||
|
path = path or request.path
|
||||||
|
current = []
|
||||||
|
for key, value in urllib.parse.parse_qsl(request.query_string):
|
||||||
|
if key not in args:
|
||||||
|
current.append((key, value))
|
||||||
|
query_string = urllib.parse.urlencode(current)
|
||||||
|
if query_string:
|
||||||
|
query_string = '?{}'.format(query_string)
|
||||||
|
return path + query_string
|
||||||
|
|
||||||
|
|
||||||
def path_with_ext(request, ext):
|
def path_with_ext(request, ext):
|
||||||
path = request.path
|
path = request.path
|
||||||
path += ext
|
path += ext
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ from datasette.utils import (
|
||||||
is_url,
|
is_url,
|
||||||
path_from_row_pks,
|
path_from_row_pks,
|
||||||
path_with_added_args,
|
path_with_added_args,
|
||||||
|
path_with_removed_args,
|
||||||
to_css_class,
|
to_css_class,
|
||||||
urlsafe_components
|
urlsafe_components
|
||||||
)
|
)
|
||||||
|
|
@ -505,17 +506,25 @@ class TableView(RowTableShared):
|
||||||
facet_rows = await self.execute(
|
facet_rows = await self.execute(
|
||||||
name, facet_sql, params, truncate=False, custom_time_limit=200
|
name, facet_sql, params, truncate=False, custom_time_limit=200
|
||||||
)
|
)
|
||||||
facet_results[column] = [
|
facet_results[column] = []
|
||||||
{
|
for row in facet_rows:
|
||||||
|
selected = other_args.get(column) == row["value"]
|
||||||
|
if selected:
|
||||||
|
toggle_path = path_with_removed_args(
|
||||||
|
request, {column: row["value"]}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
toggle_path = path_with_added_args(
|
||||||
|
request, {column: row["value"]}
|
||||||
|
)
|
||||||
|
facet_results[column].append({
|
||||||
"value": row["value"],
|
"value": row["value"],
|
||||||
"count": row["count"],
|
"count": row["count"],
|
||||||
"toggle_url": urllib.parse.urljoin(
|
"toggle_url": urllib.parse.urljoin(
|
||||||
request.url,
|
request.url, toggle_path
|
||||||
path_with_added_args(request, {column: row["value"]}),
|
|
||||||
),
|
),
|
||||||
}
|
"selected": selected,
|
||||||
for row in facet_rows
|
})
|
||||||
]
|
|
||||||
except sqlite3.OperationalError:
|
except sqlite3.OperationalError:
|
||||||
# Hit time limit
|
# Hit time limit
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
|
|
@ -23,11 +23,13 @@ This works for both the HTML interface and the ``.json`` view. When enabled, fac
|
||||||
{
|
{
|
||||||
"value": "CA",
|
"value": "CA",
|
||||||
"count": 10,
|
"count": 10,
|
||||||
|
"selected": false,
|
||||||
"toggle_url": "http://...&state=CA"
|
"toggle_url": "http://...&state=CA"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": "MI",
|
"value": "MI",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
|
"selected": false,
|
||||||
"toggle_url": "http://...&state=MI"
|
"toggle_url": "http://...&state=MI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -35,16 +37,19 @@ This works for both the HTML interface and the ``.json`` view. When enabled, fac
|
||||||
{
|
{
|
||||||
"value": "San Francisco",
|
"value": "San Francisco",
|
||||||
"count": 6,
|
"count": 6,
|
||||||
|
"selected": false,
|
||||||
"toggle_url": "http://...=San+Francisco"
|
"toggle_url": "http://...=San+Francisco"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": "Detroit",
|
"value": "Detroit",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
|
"selected": false,
|
||||||
"toggle_url": "http://...&city=Detroit"
|
"toggle_url": "http://...&city=Detroit"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": "Los Angeles",
|
"value": "Los Angeles",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
|
"selected": false,
|
||||||
"toggle_url": "http://...=Los+Angeles"
|
"toggle_url": "http://...=Los+Angeles"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -897,11 +897,13 @@ def test_page_size_matching_max_returned_rows(app_client_returend_rows_matches_p
|
||||||
{
|
{
|
||||||
"value": "CA",
|
"value": "CA",
|
||||||
"count": 10,
|
"count": 10,
|
||||||
|
"selected": False,
|
||||||
"toggle_url": "_facet=state&_facet=city&state=CA",
|
"toggle_url": "_facet=state&_facet=city&state=CA",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": "MI",
|
"value": "MI",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
|
"selected": False,
|
||||||
"toggle_url": "_facet=state&_facet=city&state=MI",
|
"toggle_url": "_facet=state&_facet=city&state=MI",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
@ -909,16 +911,19 @@ def test_page_size_matching_max_returned_rows(app_client_returend_rows_matches_p
|
||||||
{
|
{
|
||||||
"value": "San Francisco",
|
"value": "San Francisco",
|
||||||
"count": 6,
|
"count": 6,
|
||||||
|
"selected": False,
|
||||||
"toggle_url": "_facet=state&_facet=city&city=San+Francisco",
|
"toggle_url": "_facet=state&_facet=city&city=San+Francisco",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": "Detroit",
|
"value": "Detroit",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
|
"selected": False,
|
||||||
"toggle_url": "_facet=state&_facet=city&city=Detroit",
|
"toggle_url": "_facet=state&_facet=city&city=Detroit",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"value": "Los Angeles",
|
"value": "Los Angeles",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
|
"selected": False,
|
||||||
"toggle_url": "_facet=state&_facet=city&city=Los+Angeles",
|
"toggle_url": "_facet=state&_facet=city&city=Los+Angeles",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
@ -930,13 +935,15 @@ def test_page_size_matching_max_returned_rows(app_client_returend_rows_matches_p
|
||||||
{
|
{
|
||||||
"value": "MI",
|
"value": "MI",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
"toggle_url": "_facet=state&_facet=city&state=MI",
|
"selected": True,
|
||||||
|
"toggle_url": "_facet=state&_facet=city",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
"city": [
|
"city": [
|
||||||
{
|
{
|
||||||
"value": "Detroit",
|
"value": "Detroit",
|
||||||
"count": 4,
|
"count": 4,
|
||||||
|
"selected": False,
|
||||||
"toggle_url": "_facet=state&_facet=city&state=MI&city=Detroit",
|
"toggle_url": "_facet=state&_facet=city&state=MI&city=Detroit",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,19 @@ def test_path_with_added_args(path, added_args, expected):
|
||||||
assert expected == actual
|
assert expected == actual
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('path,args,expected', [
|
||||||
|
('/foo?bar=1', {'bar'}, '/foo'),
|
||||||
|
('/foo?bar=1&baz=2', {'bar'}, '/foo?baz=2'),
|
||||||
|
])
|
||||||
|
def test_path_with_removed_args(path, args, expected):
|
||||||
|
request = Request(
|
||||||
|
path.encode('utf8'),
|
||||||
|
{}, '1.1', 'GET', None
|
||||||
|
)
|
||||||
|
actual = utils.path_with_removed_args(request, args)
|
||||||
|
assert expected == actual
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('row,pks,expected_path', [
|
@pytest.mark.parametrize('row,pks,expected_path', [
|
||||||
({'A': 'foo', 'B': 'bar'}, ['A', 'B'], 'foo,bar'),
|
({'A': 'foo', 'B': 'bar'}, ['A', 'B'], 'foo,bar'),
|
||||||
({'A': 'f,o', 'B': 'bar'}, ['A', 'B'], 'f%2Co,bar'),
|
({'A': 'f,o', 'B': 'bar'}, ['A', 'B'], 'f%2Co,bar'),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue