Link to pages-per-row

Closes #1
magic-columns
Simon Willison 2017-10-24 07:10:58 -07:00
rodzic 6a9fdcc071
commit b46e370ee6
3 zmienionych plików z 32 dodań i 6 usunięć

33
app.py
Wyświetl plik

@ -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)

Wyświetl plik

@ -17,10 +17,14 @@ td {
</style>
<table>
<tr>
{% if primary_keys and row_link %}<th scope="col">Link</th>{% endif %}
{% for column in columns %}<th scope="col">{{ column }}</th>{% endfor %}
</tr>
{% for row in rows %}
<tr>
{% if primary_keys and row_link %}
<td><a href="/{{ database }}-{{ database_hash }}/{{ table }}/{{ row_link(row) }}">{{ row_link(row) }}</a></td>
{% endif %}
{% for td in row %}
<td>{{ td }}</td>
{% endfor %}

Wyświetl plik

@ -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)