From eff4f931afdce32a19857e31af5c81710364f835 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sat, 25 Oct 2025 13:26:29 -0700 Subject: [PATCH] Fix check_visibility to use action's resource_class, refs #2510 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated check_visibility() to use the action's resource_class to determine the correct Resource type to instantiate, rather than hardcoding based on the action name. This follows the pattern used elsewhere in the codebase and properly supports QueryResource for view-query actions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- datasette/app.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index e9337f5e..ac54f055 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -1065,15 +1065,25 @@ class Datasette: - visible: bool - can the actor see it? - private: bool - if visible, can anonymous users NOT see it? """ - from datasette.resources import DatabaseResource, TableResource + from datasette.permissions import Resource + + # Convert old-style resource to Resource object using action's resource_class + action_obj = self.actions.get(action) + if not action_obj: + raise ValueError(f"Unknown action: {action}") + + resource_class = action_obj.resource_class - # Convert old-style resource to Resource object if resource is None: resource_obj = None elif isinstance(resource, str): - resource_obj = DatabaseResource(database=resource) + # Database resource + resource_obj = object.__new__(resource_class) + Resource.__init__(resource_obj, parent=resource, child=None) elif isinstance(resource, tuple) and len(resource) == 2: - resource_obj = TableResource(database=resource[0], table=resource[1]) + # Database + child resource (table or query) + resource_obj = object.__new__(resource_class) + Resource.__init__(resource_obj, parent=resource[0], child=resource[1]) else: resource_obj = None