{"html_url": "https://github.com/simonw/datasette/issues/870#issuecomment-650842381", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/870", "id": 650842381, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg0MjM4MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T00:12:07Z", "updated_at": "2020-06-29T00:12:07Z", "author_association": "OWNER", "body": "I've made enough progress on this to be able to solve the messages issue in #864. I may still complete this overall goal (registering internal views with `register_routes()`) as part of Datasette 0.45 but it would be OK if it slipped to a later release.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 646737558, "label": "Refactor default views to use register_routes"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/864#issuecomment-650842514", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/864", "id": 650842514, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg0MjUxNA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T00:12:59Z", "updated_at": "2020-06-29T00:12:59Z", "author_association": "OWNER", "body": "> I've made enough progress on this to be able to solve the messages issue in #864. I may still complete this overall goal (registering internal views with `register_routes()`) as part of Datasette 0.45 but it would be OK if it slipped to a later release.\r\nhttps://github.com/simonw/datasette/issues/870#issuecomment-650842381", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 644309017, "label": "datasette.add_message() doesn't work inside plugins"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/864#issuecomment-650846473", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/864", "id": 650846473, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg0NjQ3Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T00:39:04Z", "updated_at": "2020-06-29T00:39:04Z", "author_association": "OWNER", "body": "Re-opening: plugins may get to set messages but they don't display them, even if they render a template that extends `base.html`. For example, this code in a plugin:\r\n```python\r\n return Response.html(\r\n await datasette.render_template(\r\n \"write.html\",\r\n {\"databases\": databases, \"sql\": request.args.get(\"sql\") or \"\"},\r\n request=request,\r\n )\r\n )\r\n```\r\nThis won't display messages. The reason is that the messages are made available to the template context in the `BaseView.render()` method here:\r\nhttps://github.com/simonw/datasette/blob/7ac4936cec87f5a591e5d2680f0acefc3d35a705/datasette/views/base.py#L87-L95", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 644309017, "label": "datasette.add_message() doesn't work inside plugins"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/864#issuecomment-650846625", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/864", "id": 650846625, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg0NjYyNQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T00:39:47Z", "updated_at": "2020-06-29T00:39:47Z", "author_association": "OWNER", "body": "I think the fix is to move the `\"show_messages\"` variable to here:\r\n\r\nhttps://github.com/simonw/datasette/blob/7ac4936cec87f5a591e5d2680f0acefc3d35a705/datasette/app.py#L735-L748", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 644309017, "label": "datasette.add_message() doesn't work inside plugins"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/864#issuecomment-650847013", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/864", "id": 650847013, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg0NzAxMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T00:41:55Z", "updated_at": "2020-06-29T00:41:55Z", "author_association": "OWNER", "body": "To test this I'll need a plugin test that renders a custom template. Here's an example I can imitate: https://github.com/simonw/datasette/blob/7ac4936cec87f5a591e5d2680f0acefc3d35a705/tests/test_plugins.py#L588-L596", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 644309017, "label": "datasette.add_message() doesn't work inside plugins"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/805#issuecomment-650891257", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/805", "id": 650891257, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg5MTI1Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T03:56:48Z", "updated_at": "2020-06-29T03:56:48Z", "author_association": "OWNER", "body": "Using `datasette-glitch` and the new https://github.com/simonw/datasette-write - currently running on `datasette==0.45a4` - works on Glitch. The console shows a login link which gives you a cookie which allows you access to the `/-/write` interface.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 632724154, "label": "Writable canned queries live demo on Glitch"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/840#issuecomment-650891502", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/840", "id": 650891502, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg5MTUwMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T03:58:08Z", "updated_at": "2020-06-29T03:58:08Z", "author_association": "OWNER", "body": "Step one: a \"logout\" page at `/-/logout` - which shows you a single CSRF-protected \"logout\" button if you do a GET against it and logs you out if you do a POST against it.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 637966833, "label": "Log out mechanism for clearing ds_actor cookie"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/840#issuecomment-650895874", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/840", "id": 650895874, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg5NTg3NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T04:18:59Z", "updated_at": "2020-06-29T04:19:11Z", "author_association": "OWNER", "body": "Now just need the \"Logged in as: XXX <logout>\" navigation item.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 637966833, "label": "Log out mechanism for clearing ds_actor cookie"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/875#issuecomment-650898808", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/875", "id": 650898808, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg5ODgwOA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T04:32:31Z", "updated_at": "2020-06-29T04:33:30Z", "author_association": "OWNER", "body": "I could borrow the implementation for this from `datasette-auth-github`\r\nhttps://github.com/simonw/datasette-auth-github/blob/182298b034ecb647971b65057d1d3e7b7fbbb482/datasette_auth_github/templates/base.html\r\n```html+jinja\r\n{% extends \"default:base.html\" %}\r\n\r\n{% block extra_head %}\r\n\r\n{% endblock %}\r\n\r\n{% block nav %}\r\n {{ super() }}\r\n {% if auth and auth.username %}\r\n

\r\n {{ auth.username }} · Log out\r\n

\r\n {% endif %}\r\n{% endblock %}\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647103735, "label": "\"Logged in as: XXX - logout\" navigation item"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/875#issuecomment-650899265", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/875", "id": 650899265, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDg5OTI2NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T04:34:32Z", "updated_at": "2020-06-29T04:34:32Z", "author_association": "OWNER", "body": "From https://github.com/simonw/datasette/issues/840#issuecomment-643454625\r\n> Another problem: what to display in the \"you are logged in as\", since we don't dictate an actor design.\r\n> \r\n> I'm going to use a includes template for this that can easily be over-ridden by administrators or by plugins.\r\n> \r\n> The default will look for the first available of the following keys:\r\n> \r\n> * display\r\n> * name\r\n> * username\r\n> * login\r\n> * id", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647103735, "label": "\"Logged in as: XXX - logout\" navigation item"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650905399", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650905399, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwNTM5OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:01:03Z", "updated_at": "2020-06-29T05:01:03Z", "author_association": "OWNER", "body": "This is a bit tricky to fix. This change to uvicorn is relevant: https://github.com/encode/uvicorn/commit/a75fe1381f6b1f78901691c71894f3cf487b5d30", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650906318", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650906318, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwNjMxOA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:04:04Z", "updated_at": "2020-06-29T05:04:12Z", "author_association": "OWNER", "body": "Within uvicorn it does this:\r\n```python\r\n if port == 0:\r\n port = server.sockets[0].getsockname()[1]\r\n```\r\nThat `server` variable is later stashed here:\r\n```\r\nself.servers = [server]\r\n```\r\nWhere `self` is the instance of `class Server` - which is the class that Uvicorn instantiates and calls `.run()` on when we do `uvicorn.run()` here: https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/cli.py#L409", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650906533", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650906533, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwNjUzMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:04:44Z", "updated_at": "2020-06-29T05:04:44Z", "author_association": "OWNER", "body": "The challenge is... can we run our own custom code after that line has executed that has access to `server` and can hence access `server.servers[0].sockets[0].getsockname()[1]` to find the port?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650907323", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650907323, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwNzMyMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:07:16Z", "updated_at": "2020-06-29T05:07:16Z", "author_association": "OWNER", "body": "This line is interesting: is this a hook I can attach to somehow?\r\n```python\r\n await self.lifespan.startup()\r\n```\r\nFrom https://github.com/encode/uvicorn/blob/a75fe1381f6b1f78901691c71894f3cf487b5d30/uvicorn/main.py#L475", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650908534", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650908534, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwODUzNA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:11:06Z", "updated_at": "2020-06-29T05:11:06Z", "author_association": "OWNER", "body": "Uvicorn's lifespan stuff isn't easy to figure out, but this test suite holds some clues: https://github.com/encode/uvicorn/blob/master/tests/test_lifespan.py", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650908854", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650908854, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwODg1NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:12:04Z", "updated_at": "2020-06-29T05:12:04Z", "author_association": "OWNER", "body": "Can I detect the port the server is running on from within the regular Datasette ASGI code? If so I could use that ability and maybe output the magic `--root` link a second after the server starts up somehow.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650909136", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650909136, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwOTEzNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:12:58Z", "updated_at": "2020-06-29T05:12:58Z", "author_association": "OWNER", "body": "On startup Datasette currently outputs:\r\n```\r\nINFO: Waiting for application startup.\r\nINFO: ASGI 'lifespan' protocol appears unsupported.\r\nINFO: Application startup complete.\r\n```\r\nSo the ASGI lifespan protocol is almost certainly the right way to solve this.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650909476", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650909476, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkwOTQ3Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:14:08Z", "updated_at": "2020-06-29T05:14:08Z", "author_association": "OWNER", "body": "I already have a `AsgiLifespan` class:\r\nhttps://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/app.py#L896-L905\r\n\r\nIt runs this function: https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/app.py#L890-L894\r\n\r\nCould that startup function also output the `--root` login URL, if needed?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-650910137", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 650910137, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MDkxMDEzNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T05:16:32Z", "updated_at": "2020-06-29T05:16:32Z", "author_association": "OWNER", "body": "I'm not convinced that function is ever actually being called - I added a `print()` statement to it and it's not executing. I don't think the tests cover it.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-651193131", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 651193131, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MTE5MzEzMQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T15:27:00Z", "updated_at": "2020-06-29T15:27:00Z", "author_association": "OWNER", "body": "Aha! Yes it's not being called, and the reason is this: https://github.com/encode/starlette/issues/486\r\n\r\nShort version: by default an exception raised during that phase is silently swallowed! You can avoid the swallowing by adding `lifespan=\"on\"` to the call to `uvicorn.run()`.\r\n\r\nWhen I did that here:\r\n\r\n`uvicorn.run(ds.app(), host=host, port=port, log_level=\"info\", lifespan=\"on\")`\r\n\r\nThe server failed to start with this error:\r\n\r\n```\r\nINFO: Started server process [68849]\r\nINFO: Waiting for application startup.\r\nERROR: Exception in 'lifespan' protocol\r\nTraceback (most recent call last):\r\n File \".../uvicorn/lifespan/on.py\", line 48, in main\r\n await app(scope, self.receive, self.send)\r\n File \".../uvicorn/middleware/proxy_headers.py\", line 45, in __call__\r\n return await self.app(scope, receive, send)\r\n File \".../datasette_debug_asgi.py\", line 9, in wrapped_app\r\n if scope[\"path\"] == \"/-/asgi-scope\":\r\nKeyError: 'path'\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-651193594", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 651193594, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MTE5MzU5NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T15:27:46Z", "updated_at": "2020-06-29T15:27:46Z", "author_association": "OWNER", "body": "Uninstalling `datasette-debug-asgi` caused the server to startup correctly again.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/873#issuecomment-651203178", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/873", "id": 651203178, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MTIwMzE3OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T15:44:38Z", "updated_at": "2020-06-29T15:44:54Z", "author_association": "OWNER", "body": "I'm having real trouble figuring out how to gain access to the port that was used to start the server. I'm treating this as a very low priority - it only affects the exact `-p 0 --root` combination which isn't going to affect many people at all.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647095487, "label": "\"datasette -p 0 --root\" gives the wrong URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/875#issuecomment-651293559", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/875", "id": 651293559, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MTI5MzU1OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T18:43:50Z", "updated_at": "2020-06-29T18:43:50Z", "author_association": "OWNER", "body": "\"_memory_\"\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 647103735, "label": "\"Logged in as: XXX - logout\" navigation item"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/805#issuecomment-651301202", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/805", "id": 651301202, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MTMwMTIwMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T19:00:37Z", "updated_at": "2020-06-29T19:00:37Z", "author_association": "OWNER", "body": "How about a blog? Pre-configured canned queries that are only available to `\"root\"`, plus datasette-template-sql and default templates for the index page and blog entry pages.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 632724154, "label": "Writable canned queries live demo on Glitch"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/805#issuecomment-651302221", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/805", "id": 651302221, "node_id": "MDEyOklzc3VlQ29tbWVudDY1MTMwMjIyMQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-29T19:02:45Z", "updated_at": "2020-06-29T19:05:26Z", "author_association": "OWNER", "body": "No I prefer the idea that logged out users can still perform some writes, in a not-likely-to-attract-abuse way.\r\n\r\nSo a root-user-can-configure-polls, logged-out-users-can-vote-in-them demo would be good.\r\n\r\nOr... crazy idea: a collaborative drawing program? A grid of cells of emoji, anyone can add an emoji to a cell. Would involve a bit of JavaScript. I could use https://github.com/joeattardi/emoji-button for this.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 632724154, "label": "Writable canned queries live demo on Glitch"}, "performed_via_github_app": null}