Support units in filters

pull/205/head
Russ Garrett 2018-04-14 11:41:27 +01:00
rodzic 8bfeb98478
commit ab85605c61
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 68880BB652AB0570
2 zmienionych plików z 23 dodań i 4 usunięć

Wyświetl plik

@ -647,7 +647,9 @@ class TableView(RowTableShared):
forward_querystring=False
)
filters = Filters(sorted(other_args.items()))
units = self.table_metadata(name, table).get('units', {})
filters = Filters(sorted(other_args.items()), units, ureg)
where_clauses, params = filters.build_where_clauses()
# _search support:
@ -891,7 +893,7 @@ class TableView(RowTableShared):
'filtered_table_rows_count': filtered_table_rows_count,
'columns': columns,
'primary_keys': pks,
'units': self.table_metadata(name, table).get('units', {}),
'units': units,
'query': {
'sql': sql,
'params': params,

Wyświetl plik

@ -10,6 +10,7 @@ import tempfile
import time
import shutil
import urllib
import numbers
# From https://www.sqlite.org/lang_keywords.html
@ -459,8 +460,10 @@ class Filters:
f.key: f for f in _filters
}
def __init__(self, pairs):
def __init__(self, pairs, units={}, ureg=None):
self.pairs = pairs
self.units = units
self.ureg = ureg
def lookups(self):
"Yields (lookup, display, no_argument) pairs"
@ -500,13 +503,27 @@ class Filters:
def has_selections(self):
return bool(self.pairs)
def convert_unit(self, column, value):
"If the user has provided a unit in the quey, convert it into the column unit, if present."
if column not in self.units:
return value
# Try to interpret the value as a unit
value = self.ureg(value)
if isinstance(value, numbers.Number):
# It's just a bare number, assume it's the column unit
return value
column_unit = self.ureg(self.units[column])
return value.to(column_unit).magnitude
def build_where_clauses(self):
sql_bits = []
params = {}
for i, (column, lookup, value) in enumerate(self.selections()):
filter = self._filters_by_key.get(lookup, None)
if filter:
sql_bit, param = filter.where_clause(column, value, i)
sql_bit, param = filter.where_clause(column, self.convert_unit(column, value), i)
sql_bits.append(sql_bit)
if param is not None:
param_id = 'p{}'.format(i)