feat: implement SearchMethods enum and enhance data export functionality

1 parent dc7ed464
...@@ -30,9 +30,24 @@ from ..widgets import widget_os ...@@ -30,9 +30,24 @@ from ..widgets import widget_os
from ..scripts.initializedb import append_csv from ..scripts.initializedb import append_csv
from ..tools import obj2json from ..tools import obj2json
from ...detable import DeTable from ...detable import DeTable
import enum
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class SearchMethods(enum.Enum):
none = 0
string_contains = 1
ilike = 2
like = 3
numeric = 4
date = 5
yadcf_text = 6
yadcf_autocomplete = 7
yadcf_select = 8
yadcf_multi_select = 9
yadcf_range_number = 10
yadcf_range_number_slider = 11
yadcf_range_date = 12
# SEARCH_METHODS = { # SEARCH_METHODS = {
# 'none': lambda expr, value: None, # 'none': lambda expr, value: None,
# 'string_contains': lambda expr, value: expr.ilike('%' + value + '%'), # 'string_contains': lambda expr, value: expr.ilike('%' + value + '%'),
...@@ -724,25 +739,62 @@ class BaseView(object): ...@@ -724,25 +739,62 @@ class BaseView(object):
data = resp.get("data", []) data = resp.get("data", [])
if not data: if not data:
raise HTTPNotFound("No data to export") raise HTTPNotFound("No data to export")
header = list(data[0].keys()) selects = {}
list_schema = self.list_schema() list_schema = self.list_schema()
# schema = self.list_schema()
if "bindings" in kwargs and kwargs["bindings"]:
bindings = kwargs["bindings"]
elif self.bindings:
bindings = self.bindings
else:
bindings = self.get_bindings()
list_schema = list_schema.bind(request=self.req, **bindings)
for d in list_schema:
title = hasattr(d, "title") and d.title or d.name
values = hasattr(d, "widget") \
and isinstance(d.widget, (widget.SelectWidget, widget.Select2Widget)) \
and d.widget.values or None
selects[d.name] = {"title": title,
"values": values,
"visible": hasattr(d, "visible") and d.visible or None}
header = list(data[0].keys())
for i, h in enumerate(header): for i, h in enumerate(header):
for d in list_schema: header[i] = selects[h]["title"]
if d.name == h and hasattr(d, "title"):
header[i] = d.title rows = []
rows = [list(item.values()) for item in data] for d in data:
for row in rows: for k, v in d.items():
for i, value in enumerate(row): if selects[k]["values"]:
if isinstance(value, str): select = isinstance(selects[k]["values"], dict) \
row[i] = self.remove_tags(value) and selects[k]["values"].items() or dict(selects[k]["values"])
elif isinstance(value, datetime): d[k] = select.get(v, v)
is_aware_utc = value.tzinfo is not None \
and value.tzinfo.utcoffset(value) is not None row = list(d.values())
if is_aware_utc: rows.append(row)
value = value.astimezone().replace(tzinfo=None)
row[i] = value # for i, h in enumerate(header):
# for d in list_schema:
# if d.name == h and hasattr(d, "title"):
# header[i] = d.title
# if hasattr(d, "widget") and isinstance(d.widget , (widget.SelectWidget, widget.Select2Widget)):
# selects[d.name] = d.widget.values
# rows = [list(item.values()) for item in data]
# for row in rows:
# for i, value in enumerate(row):
# if isinstance(value, str):
# row[i] = self.remove_tags(value)
# elif isinstance(value, datetime):
# is_aware_utc = value.tzinfo is not None \
# and value.tzinfo.utcoffset(value) is not None
# if is_aware_utc:
# value = value.astimezone().replace(tzinfo=None)
# row[i] = value
value = { value = {
'header': header, 'header': header,
'rows': rows, 'rows': rows,
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!