Skip to content

Commit

Permalink
Updated ?_col= and ?_nocol= implementation, refs #615
Browse files Browse the repository at this point in the history
  • Loading branch information
simonw committed May 23, 2021
1 parent a443dba commit 65fe3e5
Showing 1 changed file with 36 additions and 6 deletions.
42 changes: 36 additions & 6 deletions datasette/views/table.py
Expand Up @@ -64,6 +64,36 @@ def __str__(self):


class RowTableShared(DataView):
async def columns_to_select(self, db, table, request):
table_columns = await db.table_columns(table)
if "_col" in request.args and "_nocol" in request.args:
raise DatasetteError("Cannot use _col and _nocol at the same time")
if "_col" in request.args:
new_columns = []
for column in request.args.getlist("_col"):
if column not in table_columns:
raise DatasetteError("_col={} is an invalid column".format(column))
new_columns.append(column)
return new_columns
elif "_nocol" in request.args:
# Return all columns EXCEPT these
bad_columns = [
column
for column in request.args.getlist("_nocol")
if column not in table_columns
]
if bad_columns:
raise DatasetteError(
"_nocol={} - invalid columns".format(", ".join(bad_columns))
)
return [
column
for column in table_columns
if column not in request.args.getlist("_nocol")
]
else:
return table_columns

async def sortable_columns_for_table(self, database, table, use_rowid):
db = self.ds.databases[database]
table_metadata = self.ds.table_metadata(database, table)
Expand Down Expand Up @@ -321,18 +351,16 @@ async def data(
)

pks = await db.primary_keys(table)
table_column_details = await db.table_column_details(table)
table_columns = [column.name for column in table_column_details]

select_columns = ", ".join(escape_sqlite(t) for t in table_columns)
table_columns = await self.columns_to_select(db, table, request)
select_clause = ", ".join(escape_sqlite(t) for t in table_columns)

use_rowid = not pks and not is_view
if use_rowid:
select = f"rowid, {select_columns}"
select = f"rowid, {select_clause}"
order_by = "rowid"
order_by_pks = "rowid"
else:
select = select_columns
select = select_clause
order_by_pks = ", ".join([escape_sqlite(pk) for pk in pks])
order_by = order_by_pks

Expand Down Expand Up @@ -715,6 +743,8 @@ async def data(
column = fk["column"]
if column not in columns_to_expand:
continue
if column not in columns:
continue
expanded_columns.append(column)
# Gather the values
column_index = columns.index(column)
Expand Down

0 comments on commit 65fe3e5

Please sign in to comment.