{"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 267707940, "label": "Datasette Plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 275082158, "label": "Build an \"export this data to google sheets\" plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 275087397, "label": "Plugin that adds an authentication layer of some sort"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 314471743, "label": "Load plugins from a `--plugins-dir=plugins/` directory"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 314506033, "label": "Documentation for plugins system"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 314506446, "label": "Ability for plugins to define extra JavaScript and CSS"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 314506669, "label": "Allow plugins to define additional URL routes and views"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 314725342, "label": "Plugin support for datasette publish"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 314847571, "label": "Investigate syntactic sugar for plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 315142414, "label": "Allow plugins to add new cli sub commands "}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 315327860, "label": "datasette publish --install=name-of-plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 315517578, "label": "Ability for plugins to bundle templates"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 315738696, "label": "Unit tests for installable plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 315960272, "label": "prepare_context() plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 316323336, "label": "metadata.json support for plugin configuration options"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 317714268, "label": "External metadata.json"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 323658641, "label": "Add ?_extra= mechanism for requesting extra properties in JSON"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 345821500, "label": "render_cell(value) plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 345821778, "label": "render_cell(value) plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 348043884, "label": "Plugin hook for loading metadata.json"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 440134714, "label": "Define mechanism for plugins to return structured data"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 445850934, "label": "Plugin hook: filters_from_request"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 459598080, "label": "asgi_wrapper plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 460095928, "label": "Establish a pattern for Datasette plugins built on top of Pandas"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 460540321, "label": "Extract codemirror SQL editor out into a plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 464779810, "label": "Plugin hook for adding extra template context variables"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 497162288, "label": "Plugin documentation should cover how to bundle static/templates in setup.py"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 497170355, "label": "Documented internals API for use in plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 497171390, "label": "Utility mechanism for plugins to render templates"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 502355384, "label": "Testing utilities should be available to plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 502993509, "label": "Redesign register_output_renderer callback"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 512218858, "label": "/-/plugins shows incorrect name for plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 529429214, "label": "Provide a cookiecutter template for creating new plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 530653633, "label": "Mechanism for register_output_renderer to suggest extension or not"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 531755959, "label": "Move hashed URL mode out to a plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 569253072, "label": "prepare_connection() plugin hook should accept optional datasette argument"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 569317377, "label": "Cashe-header missing in http-response"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 570301333, "label": "Add documentation on Database introspection methods to internals.rst"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 570309546, "label": "Document (and reconsider design of) Database.execute() and Database.execute_against_connection_in_thread()"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 572896293, "label": "Expand plugins documentation to multiple pages"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 573755726, "label": "Mechanism for plugins to add action menu items for various things"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 574035432, "label": "is_hidden_table context variable on table.html page"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 574043218, "label": "Variables from extra_template_vars() not exposed in _context=1"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 582526961, "label": "Authentication (and permissions) as a core concept"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 585633142, "label": "Documentation for the \"request\" object"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 587314002, "label": "Each plugin hook should link to example plugins built with it"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 594168758, "label": "extra_template_vars() sending wrong view_name for index"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 594237015, "label": "Plugin idea: datasette-redirects"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 608613033, "label": "Extract the hash-URL mechanism out into a plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 626001501, "label": "All plugin hooks should have unit tests"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 626131309, "label": "Move test plugins into datasette/tests/plugins/ directory"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 626163974, "label": "register_output_renderer render callback should be optionally awaitable"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 626582657, "label": "Make human_description_en explicitly available to output renderers"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 626593402, "label": "Internals documentation for datasette.metadata() method"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 629535669, "label": "Show hooks implemented by each plugin on /-/plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 632753851, "label": "Release Datasette 0.44"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 632918799, "label": "Permission check for every view in Datasette (plus docs)"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 634112607, "label": "Ability to customize what happens when a view permission fails"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 634783573, "label": "Come up with a new example for extra_template_vars plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 634844634, "label": "Drop resource_type from permission_allowed system"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 634917088, "label": "Example permissions plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 635037204, "label": "register_routes() plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 635049296, "label": "Idea: Plugin hook for registering canned queries"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 635076066, "label": "Add Response class to internals documentation"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 635077656, "label": "request.url_vars helper property"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 635107393, "label": "Documentation is inconsistent about \"id\" as required field on actor"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 635108074, "label": "Example authentication plugin"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 635696400, "label": "Document CSRF protection (for plugins)"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 636511683, "label": "Redesign register_facet_classes plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 637342551, "label": "startup() plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 637370652, "label": "Plugin $env secrets mechanism doesn't work inside lists"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 640917326, "label": "canned_queries() plugin hook"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 640943441, "label": "Ensure register_routes() works for POST"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 641460179, "label": "Respect default scope[\"actor\"] if one exists"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 642127307, "label": "Add instructions for using cookiecutter plugin template to plugin docs"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 642651572, "label": "Plugin hook for instance/database/table metadata"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 644283211, "label": "{{ csrftoken() }} doesn't work with datasette.render_template()"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 644309017, "label": "datasette.add_message() doesn't work inside plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 645975649, "label": "register_routes() should support non-async view functions too"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 646992096, "label": "Release non-alpha plugins when 0.45 is out"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 648435885, "label": "New pattern for views that return either JSON or HTML, available for plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 649907676, "label": "asgi_wrapper plugin hook is crashing at startup"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 659580487, "label": "Request method for retrieving the unparsed request body"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 659873662, "label": "datasette.utils.testing module"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 663145122, "label": "Add temporary plugin testing pattern to the testing docs"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 663228985, "label": "datasette.urls.table() / .instance() / .database() methods for constructing URLs, also exposed to templates"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 670209331, "label": "Mechanism for passing additional options to `datasette my.db` that affect plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 671763164, "label": "Refactor TableView class so things like datasette-graphql can reuse the logic"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 679700269, "label": "Pass columns to extra CSS/JS/etc plugin hooks"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 679779797, "label": "extra_ plugin hooks should take the same arguments"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 681375466, "label": "await datasette.client.get(path) mechanism for executing internal requests"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 685806511, "label": "Private/secret databases: database files that are only visible to plugins"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 687681018, "label": "register_output_renderer render function should be able to return a Response"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 687694947, "label": "Remove old register_output_renderer dict mechanism in Datasette 1.0"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 687711713, "label": "Release updated datasette-atom and datasette-ics"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 688622148, "label": "Simplify imports of common classes"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 691537426, "label": "Internals API idea: results.dicts in addition to results.rows"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 712260429, "label": "JavaScript plugin hooks mechanism similar to pluggy"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 712984738, "label": "Documented HTML hooks for JavaScript plugin authors"}} {"labels_id": {"value": 754269786, "label": "plugins"}, "issues_id": {"value": 713209404, "label": "Mechanism for plugins to construct URLs that respect base_url"}}