Facet "selected" key and toggle_url now toggles, refs #255

This commit is contained in:
Simon Willison 2018-05-14 17:42:10 -03:00
commit cf6e7840ae
No known key found for this signature in database
GPG key ID: 17E2DEA2588B7F52
5 changed files with 54 additions and 8 deletions

View file

@ -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

View file

@ -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

View file

@ -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"
} }
] ]

View file

@ -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",
}, },
], ],

View file

@ -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'),