mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Experimental WIP for #620
Example URL: /fixtures/facetable?_fk.on_earth=facet_cities.id
This commit is contained in:
parent
a9909c29cc
commit
c2779e5af0
2 changed files with 29 additions and 8 deletions
|
|
@ -352,11 +352,11 @@ class Datasette:
|
||||||
log_sql_errors=log_sql_errors,
|
log_sql_errors=log_sql_errors,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def expand_foreign_keys(self, database, table, column, values):
|
async def expand_foreign_keys(self, database, table, column, values, fks=None):
|
||||||
"Returns dict mapping (column, value) -> label"
|
"Returns dict mapping (column, value) -> label"
|
||||||
labeled_fks = {}
|
labeled_fks = {}
|
||||||
db = self.databases[database]
|
db = self.databases[database]
|
||||||
foreign_keys = await db.foreign_keys_for_table(table)
|
foreign_keys = fks or await db.foreign_keys_for_table(table)
|
||||||
# Find the foreign_key for this column
|
# Find the foreign_key for this column
|
||||||
try:
|
try:
|
||||||
fk = [
|
fk = [
|
||||||
|
|
|
||||||
|
|
@ -74,17 +74,36 @@ class RowTableShared(DataView):
|
||||||
sortable_columns.add("rowid")
|
sortable_columns.add("rowid")
|
||||||
return sortable_columns
|
return sortable_columns
|
||||||
|
|
||||||
async def expandable_columns(self, database, table):
|
async def foreign_keys_for_table(self, request, database, table):
|
||||||
|
db = self.ds.databases[database]
|
||||||
|
fks = await db.foreign_keys_for_table(table)
|
||||||
|
# Handle ?_fk.article_id=articles.id querystring arguments
|
||||||
|
for key, value in request.args.items():
|
||||||
|
if key.startswith("_fk."):
|
||||||
|
value = value[0]
|
||||||
|
column = key.split("_fk.", 1)[1]
|
||||||
|
other_table, other_column = value.split(".", 1)
|
||||||
|
# {'other_table': '...', 'column': '...', 'other_column': 'id'}
|
||||||
|
expandable_fk = {
|
||||||
|
"other_table": other_table,
|
||||||
|
"column": column,
|
||||||
|
"other_column": other_column,
|
||||||
|
}
|
||||||
|
fks.append(expandable_fk)
|
||||||
|
return fks
|
||||||
|
|
||||||
|
|
||||||
|
async def expandable_columns(self, request, database, table):
|
||||||
# Returns list of (fk_dict, label_column-or-None) pairs for that table
|
# Returns list of (fk_dict, label_column-or-None) pairs for that table
|
||||||
expandables = []
|
expandables = []
|
||||||
db = self.ds.databases[database]
|
db = self.ds.databases[database]
|
||||||
for fk in await db.foreign_keys_for_table(table):
|
for fk in await self.foreign_keys_for_table(request, database, table):
|
||||||
label_column = await db.label_column_for_table(fk["other_table"])
|
label_column = await db.label_column_for_table(fk["other_table"])
|
||||||
expandables.append((fk, label_column))
|
expandables.append((fk, label_column))
|
||||||
return expandables
|
return expandables
|
||||||
|
|
||||||
async def display_columns_and_rows(
|
async def display_columns_and_rows(
|
||||||
self, database, table, description, rows, link_column=False, truncate_cells=0
|
self, request, database, table, description, rows, link_column=False, truncate_cells=0
|
||||||
):
|
):
|
||||||
"Returns columns, rows for specified table - including fancy foreign key treatment"
|
"Returns columns, rows for specified table - including fancy foreign key treatment"
|
||||||
db = self.ds.databases[database]
|
db = self.ds.databases[database]
|
||||||
|
|
@ -96,7 +115,7 @@ class RowTableShared(DataView):
|
||||||
pks = await db.primary_keys(table)
|
pks = await db.primary_keys(table)
|
||||||
column_to_foreign_key_table = {
|
column_to_foreign_key_table = {
|
||||||
fk["column"]: fk["other_table"]
|
fk["column"]: fk["other_table"]
|
||||||
for fk in await db.foreign_keys_for_table(table)
|
for fk in await self.foreign_keys_for_table(request, database, table)
|
||||||
}
|
}
|
||||||
|
|
||||||
cell_rows = []
|
cell_rows = []
|
||||||
|
|
@ -593,7 +612,7 @@ class TableView(RowTableShared):
|
||||||
|
|
||||||
# Expand labeled columns if requested
|
# Expand labeled columns if requested
|
||||||
expanded_columns = []
|
expanded_columns = []
|
||||||
expandable_columns = await self.expandable_columns(database, table)
|
expandable_columns = await self.expandable_columns(request, database, table)
|
||||||
columns_to_expand = None
|
columns_to_expand = None
|
||||||
try:
|
try:
|
||||||
all_labels = value_as_boolean(special_args.get("_labels", ""))
|
all_labels = value_as_boolean(special_args.get("_labels", ""))
|
||||||
|
|
@ -618,7 +637,7 @@ class TableView(RowTableShared):
|
||||||
values = [row[column_index] for row in rows]
|
values = [row[column_index] for row in rows]
|
||||||
# Expand them
|
# Expand them
|
||||||
expanded_labels.update(
|
expanded_labels.update(
|
||||||
await self.ds.expand_foreign_keys(database, table, column, values)
|
await self.ds.expand_foreign_keys(database, table, column, values, fks=[p[0] for p in expandable_columns])
|
||||||
)
|
)
|
||||||
if expanded_labels:
|
if expanded_labels:
|
||||||
# Rewrite the rows
|
# Rewrite the rows
|
||||||
|
|
@ -693,6 +712,7 @@ class TableView(RowTableShared):
|
||||||
|
|
||||||
async def extra_template():
|
async def extra_template():
|
||||||
display_columns, display_rows = await self.display_columns_and_rows(
|
display_columns, display_rows = await self.display_columns_and_rows(
|
||||||
|
request,
|
||||||
database,
|
database,
|
||||||
table,
|
table,
|
||||||
results.description,
|
results.description,
|
||||||
|
|
@ -807,6 +827,7 @@ class RowView(RowTableShared):
|
||||||
|
|
||||||
async def template_data():
|
async def template_data():
|
||||||
display_columns, display_rows = await self.display_columns_and_rows(
|
display_columns, display_rows = await self.display_columns_and_rows(
|
||||||
|
request,
|
||||||
database,
|
database,
|
||||||
table,
|
table,
|
||||||
results.description,
|
results.description,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue