{"database": "docs", "table": "sections", "is_view": false, "human_description_en": "where breadcrumbs contains \"0.45 (2020-07-01)\"", "rows": [["changelog:better-plugin-documentation", "changelog", "better-plugin-documentation", "Better plugin documentation", "The plugin documentation has been re-arranged into four sections, including a brand new section on testing plugins. ( #687 ) \n                 \n                     \n                         Plugins  introduces Datasette's plugin system and describes how to install and configure plugins. \n                     \n                     \n                         Writing plugins  describes how to author plugins, from  one-off single file plugins to packaged plugins that can be published to PyPI. It also describes how to start a plugin using the new  datasette-plugin  cookiecutter template. \n                     \n                     \n                         Plugin hooks  is a full list of detailed documentation for every Datasette plugin hook. \n                     \n                     \n                         Testing plugins  describes how to write tests for Datasette plugins, using  pytest  and  HTTPX .", "[\"Changelog\", \"0.45 (2020-07-01)\"]", "[{\"href\": \"https://github.com/simonw/datasette/issues/687\", \"label\": \"#687\"}, {\"href\": \"https://github.com/simonw/datasette-plugin\", \"label\": \"datasette-plugin\"}, {\"href\": \"https://docs.pytest.org/\", \"label\": \"pytest\"}, {\"href\": \"https://www.python-httpx.org/\", \"label\": \"HTTPX\"}]"], ["changelog:id61", "changelog", "id61", "Smaller changes", "Cascading view permissions - so if a user has  view-table  they can view the table page even if they do not have  view-database  or  view-instance . ( #832 ) \n                     \n                     \n                         CSRF protection no longer applies to  Authentication: Bearer token  requests or requests without cookies. ( #835 ) \n                     \n                     \n                         datasette.add_message()  now works inside plugins. ( #864 ) \n                     \n                     \n                         Workaround for \"Too many open files\" error in test runs. ( #846 ) \n                     \n                     \n                         Respect existing  scope[\"actor\"]  if already set by ASGI middleware. ( #854 ) \n                     \n                     \n                         New process for shipping  Alpha and beta releases . ( #807 ) \n                     \n                     \n                         {{ csrftoken() }}  now works when plugins render a template using  datasette.render_template(..., request=request) . ( #863 ) \n                     \n                     \n                         Datasette now creates a single  Request object  and uses it throughout the lifetime of the current HTTP request. ( #870 )", "[\"Changelog\", \"0.45 (2020-07-01)\"]", "[{\"href\": \"https://github.com/simonw/datasette/issues/832\", \"label\": \"#832\"}, {\"href\": \"https://github.com/simonw/datasette/issues/835\", \"label\": \"#835\"}, {\"href\": \"https://github.com/simonw/datasette/issues/864\", \"label\": \"#864\"}, {\"href\": \"https://github.com/simonw/datasette/issues/846\", \"label\": \"#846\"}, {\"href\": \"https://github.com/simonw/datasette/issues/854\", \"label\": \"#854\"}, {\"href\": \"https://github.com/simonw/datasette/issues/807\", \"label\": \"#807\"}, {\"href\": \"https://github.com/simonw/datasette/issues/863\", \"label\": \"#863\"}, {\"href\": \"https://github.com/simonw/datasette/issues/870\", \"label\": \"#870\"}]"], ["changelog:log-out", "changelog", "log-out", "Log out", "The  ds_actor cookie  can be used by plugins (or by Datasette's  --root mechanism ) to authenticate users. The new  /-/logout  page provides a way to clear that cookie. \n                 A \"Log out\" button now shows in the global navigation provided the user is authenticated using the  ds_actor  cookie. ( #840 )", "[\"Changelog\", \"0.45 (2020-07-01)\"]", "[{\"href\": \"https://github.com/simonw/datasette/issues/840\", \"label\": \"#840\"}]"], ["changelog:magic-parameters-for-canned-queries", "changelog", "magic-parameters-for-canned-queries", "Magic parameters for canned queries", "Canned queries now support  Magic parameters , which can be used to insert or select automatically generated values. For example: \n                 insert into logs\n  (user_id, timestamp)\nvalues\n  (:_actor_id, :_now_datetime_utc) \n                 This inserts the currently authenticated actor ID and the current datetime. ( #842 )", "[\"Changelog\", \"0.45 (2020-07-01)\"]", "[{\"href\": \"https://github.com/simonw/datasette/issues/842\", \"label\": \"#842\"}]"], ["changelog:new-plugin-hooks", "changelog", "new-plugin-hooks", "New plugin hooks", "register_magic_parameters(datasette)  can be used to define new types of magic canned query parameters. \n                     \n                     \n                         startup(datasette)  can run custom code when Datasette first starts up.  datasette-init  is a new plugin that uses this hook to create database tables and views on startup if they have not yet been created. ( #834 ) \n                     \n                     \n                         canned_queries(datasette, database, actor)  lets plugins provide additional canned queries beyond those defined in Datasette's metadata. See  datasette-saved-queries  for an example of this hook in action. ( #852 ) \n                     \n                     \n                         forbidden(datasette, request, message)  is a hook for customizing how Datasette responds to 403 forbidden errors. ( #812 )", "[\"Changelog\", \"0.45 (2020-07-01)\"]", "[{\"href\": \"https://github.com/simonw/datasette-init\", \"label\": \"datasette-init\"}, {\"href\": \"https://github.com/simonw/datasette/issues/834\", \"label\": \"#834\"}, {\"href\": \"https://github.com/simonw/datasette-saved-queries\", \"label\": \"datasette-saved-queries\"}, {\"href\": \"https://github.com/simonw/datasette/issues/852\", \"label\": \"#852\"}, {\"href\": \"https://github.com/simonw/datasette/issues/812\", \"label\": \"#812\"}]"]], "truncated": false, "filtered_table_rows_count": 5, "expanded_columns": [], "expandable_columns": [], "columns": ["id", "page", "ref", "title", "content", "breadcrumbs", "references"], "primary_keys": ["id"], "units": {}, "query": {"sql": "select id, page, ref, title, content, breadcrumbs, [references] from sections where :p0 in (select value from json_each([sections].[breadcrumbs])) order by id limit 101", "params": {"p0": "0.45 (2020-07-01)"}}, "facet_results": {}, "suggested_facets": [{"name": "breadcrumbs", "type": "array", "toggle_url": "https://stable-docs.datasette.io/docs/sections.json?breadcrumbs__arraycontains=0.45+%282020-07-01%29&_facet_array=breadcrumbs"}], "next": null, "next_url": null, "private": false, "allow_execute_sql": true, "query_ms": 30.328107008244842}