From f22cac8868eb8cd8c7e1d176a659b09639d40cac Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 22 May 2018 12:29:33 -0700 Subject: [PATCH 1/3] New Querystring manipulator --- datasette/utils.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/datasette/utils.py b/datasette/utils.py index 033f2c22..0281a177 100644 --- a/datasette/utils.py +++ b/datasette/utils.py @@ -828,3 +828,56 @@ def value_as_boolean(value): class ValueAsBooleanError(ValueError): pass + + +class Querystring: + def __init__(self, qs=None): + self.prev = None + self.data = [] + if qs: + self.data = urllib.parse.parse_qsl(qs) + + def first(self, key): + for item in self.data: + if item[0] == key: + return item[1] + raise KeyError + + def last(self, key): + for item in reversed(self.data): + if item[0] == key: + return item[1] + raise KeyError + + def getlist(self, key): + result = [] + for item in self.data: + if item[0] == key: + result.append(item[1]) + if not result: + raise KeyError + return result + + def append(self, key, value): + self.data.append((key, value)) + + def remove(self, key): + self.data = [item for item in self.data if item[0] != key] + + def replace(self, **kwargs): + for key, values in kwargs.items(): + if not isinstance(values, list): + kwargs[key] = [values] + new_data = [] + for key, value in self.data: + if key in kwargs: + new_data.append((key, kwargs[key])) + else: + new_data.append((key, value)) + self.data = new_data + + def __str__(self): + return urllib.parse.urlencode(self.data) + + def __repr__(self): + return str(self) From 68302b6ca2fff79fd6d2a7296dead8dc1c59f04c Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sat, 16 Jun 2018 21:45:30 -0700 Subject: [PATCH 2/3] Refactored everything to use new qs instead of request I don't like this, I think I will go back to the request object but with my own custom request object that has a request.qs property. --- datasette/templates/_rows_and_columns.html | 4 +- datasette/templates/table.html | 2 +- datasette/utils.py | 56 ++++++++++++---------- datasette/views/base.py | 50 +++++++++---------- datasette/views/database.py | 12 ++--- datasette/views/table.py | 47 +++++++++--------- tests/test_utils.py | 45 +++++++++-------- 7 files changed, 113 insertions(+), 103 deletions(-) diff --git a/datasette/templates/_rows_and_columns.html b/datasette/templates/_rows_and_columns.html index c7a72253..06ac9bd5 100644 --- a/datasette/templates/_rows_and_columns.html +++ b/datasette/templates/_rows_and_columns.html @@ -7,9 +7,9 @@ {{ column.name }} {% else %} {% if column.name == sort %} - {{ column.name }} ▼ + {{ column.name }} ▼ {% else %} - {{ column.name }}{% if column.name == sort_desc %} ▲{% endif %} + {{ column.name }}{% if column.name == sort_desc %} ▲{% endif %} {% endif %} {% endif %} diff --git a/datasette/templates/table.html b/datasette/templates/table.html index eda37bc7..92684a71 100644 --- a/datasette/templates/table.html +++ b/datasette/templates/table.html @@ -111,7 +111,7 @@

{{ facet_info.name }} {% if facet_hideable(facet_info.name) %} - + {% endif %}