datasette/datasette
Simon Willison 400fa08e4c
Add keyset pagination to allowed_resources() (#2562)
* Add keyset pagination to allowed_resources()

This replaces the unbounded list return with PaginatedResources,
which supports efficient keyset pagination for handling thousands
of resources.

Closes #2560

Changes:
- allowed_resources() now returns PaginatedResources instead of list
- Added limit (1-1000, default 100) and next (keyset token) parameters
- Added include_reasons parameter (replaces allowed_resources_with_reasons)
- Removed allowed_resources_with_reasons() method entirely
- PaginatedResources.all() async generator for automatic pagination
- Uses tilde-encoding for tokens (matching table pagination)
- Updated all callers to use .resources accessor
- Updated documentation with new API and examples

The PaginatedResources object has:
- resources: List of Resource objects for current page
- next: Token for next page (None if no more results)
- all(): Async generator that yields all resources across pages

Example usage:
    page = await ds.allowed_resources("view-table", actor, limit=100)
    for table in page.resources:
        print(table.child)

    # Iterate all pages automatically
    async for table in page.all():
        print(table.child)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-31 14:50:46 -07:00
..
publish Use service-specific image ID for Cloud Run deploys, refs #2036 2023-03-08 12:25:55 -08:00
static Ran prettier 2025-10-25 15:38:07 -07:00
templates Permission tabs include allow debug page 2025-10-30 17:54:07 -07:00
utils Add keyset pagination to allowed_resources() (#2562) 2025-10-31 14:50:46 -07:00
views Add keyset pagination to allowed_resources() (#2562) 2025-10-31 14:50:46 -07:00
__init__.py track_event() mechanism for analytics and plugins 2024-01-31 15:21:40 -08:00
__main__.py Add support for running datasette as a module (#556) 2019-07-11 09:07:44 -07:00
actor_auth_cookie.py Remove python-baseconv dependency, refs #1733, closes #1734 2022-05-02 12:39:06 -07:00
app.py Add keyset pagination to allowed_resources() (#2562) 2025-10-31 14:50:46 -07:00
blob_renderer.py Rename route match groups for consistency, refs #1667, #1660 2022-03-19 09:52:08 -07:00
cli.py Forbid same DB passed twice or via config_dir, closes #2561 2025-10-30 21:40:09 -07:00
database.py Filter out temp database from attached_databases() 2025-10-30 15:48:10 -07:00
default_actions.py Fix view-database-download permission handling 2025-10-25 15:38:07 -07:00
default_magic_parameters.py Fix datetime.utcnow deprecation warning 2024-03-15 15:32:12 -07:00
default_menu_links.py Update permission hooks to include source_plugin column and simplify menu_links 2025-10-25 15:38:07 -07:00
default_permissions.py Permissions SQL API improvements (#2558) 2025-10-30 15:48:46 -07:00
events.py Fix type annotation bugs and remove unused imports 2025-10-26 16:03:13 -07:00
facets.py Fix huge performance bug in DateFacet, refs #2407 2024-08-21 14:38:11 -07:00
filters.py Fix type annotation bugs and remove unused imports 2025-10-26 16:03:13 -07:00
forbidden.py Fixed a bunch of unused imports spotted with ruff 2024-02-06 17:27:20 -08:00
handle_exception.py debugger: load 'ipdb' if present 2024-08-20 20:02:35 -07:00
hookspecs.py Remove permission_allowed hook entirely, refs #2528 2025-10-25 15:38:07 -07:00
inspect.py Modernize code to Python 3.6+ (#1158) 2020-12-23 09:04:32 -08:00
permissions.py Add keyset pagination to allowed_resources() (#2562) 2025-10-31 14:50:46 -07:00
plugins.py Fix type annotation bugs and remove unused imports 2025-10-26 16:03:13 -07:00
renderer.py Fix type annotation bugs and remove unused imports 2025-10-26 16:03:13 -07:00
resources.py Migrate view-query permission to SQL-based system, refs #2510 2025-10-25 15:38:07 -07:00
sql_functions.py _search= queries now correctly escaped, fixes #651 2019-12-29 18:48:30 +00:00
tracer.py Tracer now catches errors, closes #2405 2024-08-21 12:19:18 -07:00
url_builder.py count all rows button on table page, refs #2408 2024-08-21 19:09:25 -07:00
version.py Release 1.0a19 2025-04-21 22:38:53 -07:00