From b46e370ee6126aa2fa85cf789a31da38aed98496 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 24 Oct 2017 07:10:58 -0700 Subject: [PATCH] Link to pages-per-row Closes #1 --- app.py | 33 +++++++++++++++++++++++++++------ templates/table.html | 4 ++++ test_helpers.py | 1 + 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index dd8edb25..afb5216d 100644 --- a/app.py +++ b/app.py @@ -88,8 +88,11 @@ class BaseView(HTTPMethodView): as_json = kwargs.pop('as_json') except KeyError: as_json = False + extra_template_data = {} try: - data = self.data(request, name, hash, **kwargs) + data, extra_template_data = self.data( + request, name, hash, **kwargs + ) except sqlite3.OperationalError as e: data = { 'ok': False, @@ -99,10 +102,15 @@ class BaseView(HTTPMethodView): r = response.json(data) r.headers['Access-Control-Allow-Origin'] = '*' else: + context = {**data, **dict( + extra_template_data() + if callable(extra_template_data) + else extra_template_data + )} r = jinja.render( self.template, request, - **data, + **context, ) # Set far-future cache expiry r.headers['Cache-Control'] = 'max-age={}'.format( @@ -136,9 +144,10 @@ class DatabaseView(BaseView): columns = [r[0] for r in rows.description] return { 'database': name, - 'database_hash': hash, 'rows': rows, 'columns': columns, + }, { + 'database_hash': hash, } @@ -149,12 +158,16 @@ class TableView(BaseView): conn = get_conn(name) rows = conn.execute('select * from {} limit 20'.format(table)) columns = [r[0] for r in rows.description] + pks = pks_for_table(conn, table) return { 'database': name, - 'database_hash': hash, 'table': table, 'rows': rows, 'columns': columns, + 'primary_keys': pks, + }, lambda: { + 'database_hash': hash, + 'row_link': lambda row: path_from_row_pks(row, pks), } @@ -174,15 +187,19 @@ class RowView(BaseView): ) rows = conn.execute(sql, pk_values) columns = [r[0] for r in rows.description] + pks = pks_for_table(conn, table) rows = list(rows) if not rows: raise NotFound('Record not found: {}'.format(pk_values)) return { 'database': name, - 'database_hash': hash, 'table': table, 'rows': rows, 'columns': columns, + 'primary_keys': pks, + }, { + 'database_hash': hash, + 'row_link': None, } @@ -239,9 +256,13 @@ def pks_for_table(conn, table): def path_from_row_pks(row, pks): + if not pks: + return '' bits = [] for pk in pks: - bits.append(urllib.parse.quote_plus(row[pk])) + bits.append( + urllib.parse.quote_plus(str(row[pk])) + ) return ','.join(bits) diff --git a/templates/table.html b/templates/table.html index 3eb7c83f..fda692f7 100644 --- a/templates/table.html +++ b/templates/table.html @@ -17,10 +17,14 @@ td { + {% if primary_keys and row_link %}{% endif %} {% for column in columns %}{% endfor %} {% for row in rows %} + {% if primary_keys and row_link %} + + {% endif %} {% for td in row %} {% endfor %} diff --git a/test_helpers.py b/test_helpers.py index 74e0a043..2149dadc 100644 --- a/test_helpers.py +++ b/test_helpers.py @@ -40,6 +40,7 @@ def test_pks_for_table(sql, table, expected_keys): @pytest.mark.parametrize('row,pks,expected_path', [ ({'A': 'foo', 'B': 'bar'}, ['A', 'B'], 'foo,bar'), ({'A': 'f,o', 'B': 'bar'}, ['A', 'B'], 'f%2Co,bar'), + ({'A': 123}, ['A'], '123'), ]) def test_path_from_row_pks(row, pks, expected_path): actual_path = app.path_from_row_pks(row, pks)
Link{{ column }}
{{ row_link(row) }}{{ td }}