html_url,issue_url,id,node_id,user,user_label,created_at,updated_at,author_association,body,reactions,issue,issue_label,performed_via_github_app https://github.com/simonw/datasette/issues/473#issuecomment-496339819,https://api.github.com/repos/simonw/datasette/issues/473,496339819,MDEyOklzc3VlQ29tbWVudDQ5NjMzOTgxOQ==,9599,simonw,2019-05-28T02:13:44Z,2019-05-28T02:13:44Z,OWNER,I'm leaning towards supporting both hooks.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,Plugin hook: filters_from_request, https://github.com/simonw/datasette/issues/473#issuecomment-496339574,https://api.github.com/repos/simonw/datasette/issues/473,496339574,MDEyOklzc3VlQ29tbWVudDQ5NjMzOTU3NA==,9599,simonw,2019-05-28T02:12:13Z,2019-05-28T02:13:07Z,OWNER,"Here's an older version of what that custom table filtering plugin might look like: https://github.com/simonw/datasette/commit/5116c4ec8aed5091e1f75415424b80f613518dc6 ```python from datasette.utils import TableFilter @hookimpl def table_filter(): async def inner(view, name, table, request): extra_human_descriptions = [] where_clauses = [] params = {} # ... build those things here return TableFilter( human_description_extras=extra_human_descriptions, where_clauses=where_clauses, params=params, ) return inner ``` I built this for the https://github.com/simonw/russian-ira-facebook-ads-datasette project. It's pretty neat. Maybe I should go with that?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,Plugin hook: filters_from_request, https://github.com/simonw/datasette/issues/473#issuecomment-496338808,https://api.github.com/repos/simonw/datasette/issues/473,496338808,MDEyOklzc3VlQ29tbWVudDQ5NjMzODgwOA==,9599,simonw,2019-05-28T02:07:23Z,2019-05-28T02:07:23Z,OWNER,"Assuming I do go ahead with this plugin hook, the existing `InFilter` makes for a nice simple example that illustrates the two key methods: `.where_clause()` and `.human_clause()`: ```python class InFilter(Filter): key = ""in"" display = ""in"" def split_value(self, value): if value.startswith(""[""): return json.loads(value) else: return [v.strip() for v in value.split("","")] def where_clause(self, table, column, value, param_counter): values = self.split_value(value) params = ["":p{}"".format(param_counter + i) for i in range(len(values))] sql = ""{} in ({})"".format(escape_sqlite(column), "", "".join(params)) return sql, values def human_clause(self, column, value): return ""{} in {}"".format(column, json.dumps(self.split_value(value))) ```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,Plugin hook: filters_from_request, https://github.com/simonw/datasette/issues/473#issuecomment-496338666,https://api.github.com/repos/simonw/datasette/issues/473,496338666,MDEyOklzc3VlQ29tbWVudDQ5NjMzODY2Ng==,9599,simonw,2019-05-28T02:06:23Z,2019-05-28T02:06:23Z,OWNER,I'm having trouble coming up with interesting column-based filters which don't make sense to ship as default behaviour.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,Plugin hook: filters_from_request, https://github.com/simonw/datasette/issues/473#issuecomment-496338533,https://api.github.com/repos/simonw/datasette/issues/473,496338533,MDEyOklzc3VlQ29tbWVudDQ5NjMzODUzMw==,9599,simonw,2019-05-28T02:05:39Z,2019-05-28T02:05:39Z,OWNER,"I wonder if this is the right hook? The more likely case is that we need a hook that registers a new type of lookup entirely - `?_spatial_within={geojson}` for example. These aren't necessarily attached to a specific column and may have entirely custom syntax - but they still need to be able to influence the query (like the `_where=` clause does) and the human-readable description of the page. Is there a strong case for supporting both custom filter plugins AND custom table where plugins, or could those where plugins cover both bases?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,Plugin hook: filters_from_request, https://github.com/simonw/datasette/issues/473#issuecomment-496337533,https://api.github.com/repos/simonw/datasette/issues/473,496337533,MDEyOklzc3VlQ29tbWVudDQ5NjMzNzUzMw==,9599,simonw,2019-05-28T01:59:19Z,2019-05-28T01:59:19Z,OWNER,It would be nice if this plugin was passed the current database/table so it can decide to enable new filters only for specific tables. This will require a bit of refactoring because the filters list is static at the moment - it would instead have to be returned by a function that runs when the table view is rendered.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,Plugin hook: filters_from_request, https://github.com/simonw/datasette/issues/473#issuecomment-493781417,https://api.github.com/repos/simonw/datasette/issues/473,493781417,MDEyOklzc3VlQ29tbWVudDQ5Mzc4MTQxNw==,9599,simonw,2019-05-19T18:45:15Z,2019-05-19T18:45:15Z,OWNER,This expands on the refactoring work from https://github.com/simonw/datasette/commit/6da567dda953c7ac0e5500f17d8e220467a3499e,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",445850934,Plugin hook: filters_from_request,