{"id": 647103735, "node_id": "MDU6SXNzdWU2NDcxMDM3MzU=", "number": 875, "title": "\"Logged in as: XXX - logout\" navigation item", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 3, "created_at": "2020-06-29T04:31:14Z", "updated_at": "2020-07-02T00:13:24Z", "closed_at": "2020-06-29T18:43:50Z", "author_association": "OWNER", "pull_request": null, "body": "_Originally posted by @simonw in https://github.com/simonw/datasette/issues/840#issuecomment-650895874_", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/875/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 646992096, "node_id": "MDU6SXNzdWU2NDY5OTIwOTY=", "number": 872, "title": "Release non-alpha plugins when 0.45 is out", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 0, "created_at": "2020-06-28T19:42:01Z", "updated_at": "2020-07-01T23:48:51Z", "closed_at": "2020-07-01T23:48:51Z", "author_association": "OWNER", "pull_request": null, "body": "I have several plugins currently marked as alphas because they depend on `0.45a3`. When 0.45 is released I can ship new versions of these plugins that are full releases, not alphas - and switch them to depending on 0.45 (as opposed to the alpha):\r\n\r\n- [x] https://github.com/simonw/datasette-init\r\n- [x] https://github.com/simonw/datasette-glitch\r\n- [x] https://github.com/simonw/datasette-saved-queries\r\n- [x] https://github.com/simonw/datasette-write", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/872/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 649373451, "node_id": "MDU6SXNzdWU2NDkzNzM0NTE=", "number": 885, "title": "Blog entry about the release", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 1, "created_at": "2020-07-01T22:44:37Z", "updated_at": "2020-07-01T22:44:48Z", "closed_at": "2020-07-01T22:44:47Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/885/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 648673556, "node_id": "MDU6SXNzdWU2NDg2NzM1NTY=", "number": 882, "title": "Release notes for 0.45", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 2, "created_at": "2020-07-01T05:00:17Z", "updated_at": "2020-07-01T21:48:08Z", "closed_at": "2020-07-01T21:48:08Z", "author_association": "OWNER", "pull_request": null, "body": "These are mostly done thanks to the alphas, but I went to have more paragraphs of prose and less bullet points.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/882/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 649329013, "node_id": "MDU6SXNzdWU2NDkzMjkwMTM=", "number": 884, "title": "Only show \"log out\" button if user is authenticated using a ds_actor cookie", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 0, "created_at": "2020-07-01T21:21:28Z", "updated_at": "2020-07-01T21:26:07Z", "closed_at": "2020-07-01T21:26:06Z", "author_association": "OWNER", "pull_request": null, "body": "Right now the \"Log out\" button in the navigation will show up even if the user was authenticated by a plugin using a mechanism other than the `ds_actor` cookie. It should only show if the logged-in user has that cookie.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/884/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 634112607, "node_id": "MDU6SXNzdWU2MzQxMTI2MDc=", "number": 812, "title": "Ability to customize what happens when a view permission fails", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 3, "created_at": "2020-06-08T04:26:14Z", "updated_at": "2020-07-01T04:17:46Z", "closed_at": "2020-07-01T04:17:45Z", "author_association": "OWNER", "pull_request": null, "body": "Currently view permission failures raise a `Forbidden` error which is transformed into a 403.\r\n\r\nIt would be good if this page could offer a way forward - maybe just by linking to (or redirecting to) a login screen. This behaviour will vary based on authentication plugins, so a new plugin hook is probably the best way to do this.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/812/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 637363686, "node_id": "MDU6SXNzdWU2MzczNjM2ODY=", "number": 835, "title": "Mechanism for skipping CSRF checks on API posts", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 13, "created_at": "2020-06-11T22:41:10Z", "updated_at": "2020-07-01T03:08:07Z", "closed_at": "2020-07-01T03:08:07Z", "author_association": "OWNER", "pull_request": null, "body": "While experimenting with https://github.com/simonw/datasette-auth-tokens I realized it's not currently possible to build API client programs that POST to Datasette because there's no mechanism for them to skip the CSRF checks added in #798.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/835/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 647879783, "node_id": "MDU6SXNzdWU2NDc4Nzk3ODM=", "number": 876, "title": "Add log out link to the pattern portfolio", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 1, "created_at": "2020-06-30T05:42:15Z", "updated_at": "2020-06-30T23:50:04Z", "closed_at": "2020-06-30T23:47:31Z", "author_association": "OWNER", "pull_request": null, "body": "Follows #875", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/876/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 648569227, "node_id": "MDU6SXNzdWU2NDg1NjkyMjc=", "number": 879, "title": "Database page documentation still talks about hashes in URLs", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 1, "created_at": "2020-06-30T23:43:17Z", "updated_at": "2020-06-30T23:48:06Z", "closed_at": "2020-06-30T23:45:42Z", "author_association": "OWNER", "pull_request": null, "body": "https://datasette.readthedocs.io/en/0.44/pages.html\r\n\r\n> Note that these URLs end in a 7 character hash. This hash is derived from the contents of the database, and ensures that each URL is immutable: the data returned from a URL containing the hash will always be the same, since if the contents of the database file changes by even a single byte a new hash will be generated.\r\n\r\nThis isn't accurate any more - that's not default behaviour, and it may be removed entirely in #647.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/879/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 636722501, "node_id": "MDU6SXNzdWU2MzY3MjI1MDE=", "number": 832, "title": "Having view-table permission but NOT view-database should still grant access to /db/table", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 12, "created_at": "2020-06-11T05:12:59Z", "updated_at": "2020-06-30T23:42:11Z", "closed_at": "2020-06-30T23:42:11Z", "author_association": "OWNER", "pull_request": null, "body": "Stumbled into this while working on `datasette-permissions-sql`. I had granted table permissions, but the permission check wasn't even executed because the user failed the previous `view-database` check.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/832/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 637966833, "node_id": "MDU6SXNzdWU2Mzc5NjY4MzM=", "number": 840, "title": "Log out mechanism for clearing ds_actor cookie", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 4, "created_at": "2020-06-12T19:41:51Z", "updated_at": "2020-06-29T04:31:43Z", "closed_at": "2020-06-29T04:31:43Z", "author_association": "OWNER", "pull_request": null, "body": "Need a cookie clearing mechanism and a way to show that you are logged in.\r\n\r\n`datasette-auth-github` had a solution for this that can be pulled into core.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/840/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 647095808, "node_id": "MDU6SXNzdWU2NDcwOTU4MDg=", "number": 874, "title": "/favicon.ico 500 error", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 0, "created_at": "2020-06-29T04:04:22Z", "updated_at": "2020-06-29T04:27:18Z", "closed_at": "2020-06-29T04:27:18Z", "author_association": "OWNER", "pull_request": null, "body": "```\r\nTraceback (most recent call last):\r\n File \"...datasette/datasette/app.py\", line 969, in route_path\r\n response = await view(request, send)\r\nTypeError: favicon() missing 1 required positional argument: 'send'\r\n```", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/874/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 644309017, "node_id": "MDU6SXNzdWU2NDQzMDkwMTc=", "number": 864, "title": "datasette.add_message() doesn't work inside plugins", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 6, "created_at": "2020-06-24T04:30:06Z", "updated_at": "2020-06-29T00:51:01Z", "closed_at": "2020-06-29T00:51:01Z", "author_association": "OWNER", "pull_request": null, "body": "Similar problem to #863 - calling `datasette.add_message()` in a view registered using the `register_routes()` plugin hook doesn't work, because the code that writes accumulated messages to the `ds_messages` signed cookie lives in the `BaseView` class here:\r\n\r\nhttps://github.com/simonw/datasette/blob/28bb1c51897f3956861755e345e18b8e0b1423ac/datasette/views/base.py#L94-L97", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/864/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 646840273, "node_id": "MDU6SXNzdWU2NDY4NDAyNzM=", "number": 871, "title": "Rename the _timestamp magic parameters to _now", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 1, "created_at": "2020-06-28T04:49:08Z", "updated_at": "2020-06-28T19:49:49Z", "closed_at": "2020-06-28T19:49:49Z", "author_association": "OWNER", "pull_request": null, "body": "I like the shorter name better. Follows on from #842.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/871/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 637342551, "node_id": "MDU6SXNzdWU2MzczNDI1NTE=", "number": 834, "title": "startup() plugin hook", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 6, "created_at": "2020-06-11T21:48:14Z", "updated_at": "2020-06-28T19:38:50Z", "closed_at": "2020-06-13T17:56:12Z", "author_association": "OWNER", "pull_request": null, "body": "It might be useful to have an `startup` hook which gets passed the `datasette` object as soon as Datasette has finished initializing.\r\n\r\nMy initial use-case for this is configuration verification - checking that the `\"plugins\"` configuration block for this plugin contains valid details.\r\n\r\nI imagine there are plenty of other potential uses for this as well.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/834/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 638212085, "node_id": "MDU6SXNzdWU2MzgyMTIwODU=", "number": 842, "title": "Magic parameters for canned queries", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 18, "created_at": "2020-06-13T18:50:08Z", "updated_at": "2020-06-28T03:30:31Z", "closed_at": "2020-06-28T02:58:18Z", "author_association": "OWNER", "pull_request": null, "body": "Now that writable canned queries (#698) have landed, it would be neat if they supported \"magic\" parameters - parameters that are automatically populated with:\r\n\r\n- the current actor ID / other actor properties\r\n- the current date and time\r\n- the user's IP or user-agent\r\n\r\nAnd maybe other things potentially added by plugins.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/842/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 646734280, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQwOTQ2ODE3", "number": 869, "title": "Magic parameters for canned queries", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 1, "created_at": "2020-06-27T18:37:21Z", "updated_at": "2020-06-28T02:58:18Z", "closed_at": "2020-06-28T02:58:17Z", "author_association": "OWNER", "pull_request": "simonw/datasette/pulls/869", "body": "Implementation for #842\r\n\r\nTODO:\r\n\r\n- [x] Add tests for built-in magic parameters\r\n- [x] Magic parameters should not show up as blank form fields on the query page\r\n- [x] Update documentation for new `_request_X` (now called `_header_X`) implementation where X is a key from the ASGI scope\r\n- [x] Make sure these only work for canned queries, not for arbitrary SQL queries (security issue)\r\n- [x] Add test for the `register_magic_parameters` plugin hook\r\n- [x] Add documentation for the `register_magic_parameters` plugin hook\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/869/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 645975649, "node_id": "MDU6SXNzdWU2NDU5NzU2NDk=", "number": 867, "title": "register_routes() should support non-async view functions too", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 1, "created_at": "2020-06-26T03:11:25Z", "updated_at": "2020-06-27T18:30:41Z", "closed_at": "2020-06-27T18:30:40Z", "author_association": "OWNER", "pull_request": null, "body": "I was looking at this: https://github.com/simonw/datasette-block-robots/blob/main/datasette_block_robots/__init__.py\r\n```python\r\nfrom datasette import hookimpl\r\nfrom datasette.utils.asgi import Response\r\n\r\n\r\nasync def robots_txt():\r\n return Response.text(\"User-agent: *\\nDisallow: /\")\r\n\r\n\r\n@hookimpl\r\ndef register_routes():\r\n return [\r\n (r\"^/robots\\.txt$\", robots_txt),\r\n ]\r\n```\r\nAnd I realized that if `register_routes()` could support non-async view functions it could be reduced to this:\r\n```python\r\n@hookimpl\r\ndef register_routes():\r\n return [\r\n (r\"^/robots\\.txt$\", lambda: Response.text(\"User-agent: *\\nDisallow: /\")),\r\n ]\r\n```", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/867/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 640943441, "node_id": "MDU6SXNzdWU2NDA5NDM0NDE=", "number": 853, "title": "Ensure register_routes() works for POST", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 1, "created_at": "2020-06-18T06:24:55Z", "updated_at": "2020-06-24T04:30:30Z", "closed_at": "2020-06-18T16:22:02Z", "author_association": "OWNER", "pull_request": null, "body": "https://twitter.com/amjithr/status/1273496759684050944", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/853/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 644283211, "node_id": "MDU6SXNzdWU2NDQyODMyMTE=", "number": 863, "title": "{{ csrftoken() }} doesn't work with datasette.render_template()", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 0, "created_at": "2020-06-24T03:11:49Z", "updated_at": "2020-06-24T04:30:30Z", "closed_at": "2020-06-24T03:24:01Z", "author_association": "OWNER", "pull_request": null, "body": "The documentation here suggests that it will work:\r\n\r\nhttps://github.com/simonw/datasette/blob/eed116ac0599c7d21b7129af94d58ce03a923e4e/docs/internals.rst#L540-L546\r\n\r\nBut right now the `csrftoken` variable is set in BaseView.render, which means it's not visible to plugins that try to render templates using `datasette.render_template`:\r\n\r\nhttps://github.com/simonw/datasette/blob/799c5d53570d773203527f19530cf772dc2eeb24/datasette/views/base.py#L99-L106", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/863/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 572896293, "node_id": "MDU6SXNzdWU1NzI4OTYyOTM=", "number": 687, "title": "Expand plugins documentation to multiple pages", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 11, "created_at": "2020-02-28T17:26:21Z", "updated_at": "2020-06-22T03:55:20Z", "closed_at": "2020-06-22T03:53:54Z", "author_association": "OWNER", "pull_request": null, "body": "I think the plugins docs need to extend beyond a single page now. I want to add a whole section on writing tests for plugins, showing how `httpx` can be used as seen in https://github.com/simonw/datasette-atom/issues/3 and suchlike.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/687/reactions\", \"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 642127307, "node_id": "MDU6SXNzdWU2NDIxMjczMDc=", "number": 855, "title": "Add instructions for using cookiecutter plugin template to plugin docs", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 2, "created_at": "2020-06-19T17:33:25Z", "updated_at": "2020-06-22T02:51:38Z", "closed_at": "2020-06-22T02:51:38Z", "author_association": "OWNER", "pull_request": null, "body": "Once I ship the `datasette-plugin` template: https://github.com/simonw/datasette-plugin/issues/1", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/855/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 640917326, "node_id": "MDU6SXNzdWU2NDA5MTczMjY=", "number": 852, "title": "canned_queries() plugin hook", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 9, "created_at": "2020-06-18T05:24:35Z", "updated_at": "2020-06-20T03:08:40Z", "closed_at": "2020-06-20T03:08:40Z", "author_association": "OWNER", "pull_request": null, "body": "Canned queries are currently baked into `metadata.json` which is read once on startup.\r\n\r\nAllowing users to interactively create new canned queries - even if just through a plugin - would make a lot of sense.\r\n\r\nIs this a new plugin hook or some other mechanism? Lots to think about here.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/852/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 632843030, "node_id": "MDU6SXNzdWU2MzI4NDMwMzA=", "number": 807, "title": "Ability to ship alpha and beta releases", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 18, "created_at": "2020-06-07T00:12:55Z", "updated_at": "2020-06-18T21:41:16Z", "closed_at": "2020-06-18T21:41:16Z", "author_association": "OWNER", "pull_request": null, "body": "I'd like to be able to ship alphas and betas to PyPI so in-development plugins can depend on them and help test unreleased plugin hooks.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/807/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 641460179, "node_id": "MDU6SXNzdWU2NDE0NjAxNzk=", "number": 854, "title": "Respect default scope[\"actor\"] if one exists", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "comments": 0, "created_at": "2020-06-18T18:25:08Z", "updated_at": "2020-06-18T18:39:22Z", "closed_at": "2020-06-18T18:39:22Z", "author_association": "OWNER", "pull_request": null, "body": "ASGI wrapper plugins that themselves set the `actor` scope variable should be respected (though `actor_from_request` plugins should still execute and get the chance to replace that initial `actor` value).\r\n\r\nRelevant code: https://github.com/simonw/datasette/blob/09a3479a5402df96489ed6cab6cc9fd674bf3433/datasette/app.py#L910-L921", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/854/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"}