mirror of
https://github.com/simonw/datasette.git
synced 2026-07-08 08:34:42 +02:00
* Add web UI to edit and delete stored queries Stored query pages now offer Edit and Delete actions in the query actions menu, gated by the update-query and delete-query permissions. - New QueryEditView (GET/POST at /<db>/<query>/-/edit) renders a pre-filled form for editing a query's title, description, SQL and privacy, reusing the create-query analysis UI. Changing the SQL still requires execute-sql; metadata-only edits do not. - QueryDeleteView gains a GET confirmation page and HTML form POST that redirects to the query list, while keeping the existing JSON API. - New default query_actions hook adds the Edit/Delete links for stored (non-config, non-trusted) queries the actor is allowed to manage. Permission semantics (already enforced by default_query_permissions_sql) are surfaced in the UI: owners can always edit/delete their queries; non-private queries can be edited/deleted by any actor with the relevant permission; private queries remain owner-only. Shared the create-query form styles into _query_form_styles.html so the edit form can reuse them. Animated demo: https://github.com/simonw/datasette/pull/2764#issuecomment-4655694668 Closes #2760 https://claude.ai/code/session_019GU9g3pZAERukLKYNa4uAL
48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
from datasette import hookimpl
|
|
from datasette.resources import QueryResource
|
|
|
|
|
|
@hookimpl
|
|
def query_actions(datasette, actor, database, query_name, request):
|
|
# Only stored queries (with a name) can be edited or deleted
|
|
if not query_name:
|
|
return None
|
|
|
|
async def inner():
|
|
query = await datasette.get_query(database, query_name)
|
|
if query is None:
|
|
return []
|
|
# Config-defined and trusted queries are managed outside the UI
|
|
if query.source == "config" or query.is_trusted:
|
|
return []
|
|
|
|
links = []
|
|
if await datasette.allowed(
|
|
action="update-query",
|
|
resource=QueryResource(database, query_name),
|
|
actor=actor,
|
|
):
|
|
links.append(
|
|
{
|
|
"href": datasette.urls.table(database, query_name) + "/-/edit",
|
|
"label": "Edit this query",
|
|
"description": (
|
|
"Change the title, description, SQL or visibility."
|
|
),
|
|
}
|
|
)
|
|
if await datasette.allowed(
|
|
action="delete-query",
|
|
resource=QueryResource(database, query_name),
|
|
actor=actor,
|
|
):
|
|
links.append(
|
|
{
|
|
"href": datasette.urls.table(database, query_name) + "/-/delete",
|
|
"label": "Delete this query",
|
|
"description": "Permanently remove this saved query.",
|
|
}
|
|
)
|
|
return links
|
|
|
|
return inner
|