|
@@ -50,7 +50,7 @@ from io import StringIO
|
|
|
def get_filter(query: DictProperty, allow: Iterable[str] = None):
|
|
|
return {
|
|
|
k: get_include_exclude(
|
|
|
- query[k] if k in query else None
|
|
|
+ (query[k] or 'kg' if k == 'unit' else query[k]) if k in query else None
|
|
|
) for k in sorted(set(query.keys()) | set(allow)) if allow is None or k in allow
|
|
|
}
|
|
|
|
|
@@ -68,18 +68,40 @@ def get_query(**params):
|
|
|
def normalize_query(query: DictProperty, allow: Iterable[str] = None):
|
|
|
return get_query(**get_filter(query, allow=allow))
|
|
|
|
|
|
-def get_form(action, method, **data):
|
|
|
+def get_form(action, method, filter_data, data):
|
|
|
+ keys = sorted(filter_data, key=lambda x: {
|
|
|
+ 'product': 0,
|
|
|
+ 'category': 1,
|
|
|
+ 'group': 2,
|
|
|
+ 'unit': 3
|
|
|
+ }[x])
|
|
|
+ data = data.groupby([
|
|
|
+ k for k in keys if k != 'unit'
|
|
|
+ ]).size().reset_index()[[
|
|
|
+ k for k in keys if k != 'unit'
|
|
|
+ ]]
|
|
|
return template(
|
|
|
'app/rest/filter.tpl',
|
|
|
action=action,
|
|
|
method=method,
|
|
|
- header=[ template('app/rest/filter-heading', fname=k) for k in sorted(data) ],
|
|
|
+ header=[ template(
|
|
|
+ 'app/rest/filter-heading',
|
|
|
+ fname=k,
|
|
|
+ first=(idx == 0),
|
|
|
+ ) for idx, k in enumerate(keys) ],
|
|
|
items=[ template(
|
|
|
- 'app/rest/filter-item.tpl',
|
|
|
- fname=k,
|
|
|
- fvalue=get_query_param(*data[k]),
|
|
|
- size=36,
|
|
|
- ) for k in sorted(data) ]
|
|
|
+ 'app/rest/filter-item.tpl',
|
|
|
+ fname=k,
|
|
|
+ fvalue=get_query_param(*filter_data[k]),
|
|
|
+ size=36,
|
|
|
+ ) for k in keys ],
|
|
|
+ data=[ template(
|
|
|
+ 'app/rest/data-item.tpl',
|
|
|
+ product=row['product'],
|
|
|
+ category=row['category'],
|
|
|
+ group=row['group'],
|
|
|
+ size=36,
|
|
|
+ ) for _, row in data.iterrows() ]
|
|
|
)
|
|
|
|
|
|
|
|
@@ -109,7 +131,7 @@ def trend():
|
|
|
plt.savefig(f, format='svg')
|
|
|
finally:
|
|
|
conn.commit()
|
|
|
-
|
|
|
+
|
|
|
return f"""
|
|
|
<!DOCTYPE html>
|
|
|
<html>
|
|
@@ -121,7 +143,7 @@ def trend():
|
|
|
<link rel="stylesheet" href="https://shandan.one/css/responsive-visibility-collapse.css"/>
|
|
|
</head>
|
|
|
<body align="center">
|
|
|
-{get_form(path, 'get', **get_filter(request.query, allow=PARAMS))}
|
|
|
+{get_form(path, 'get', get_filter(request.query, allow=PARAMS), data)}
|
|
|
{f.getvalue()}
|
|
|
</body>
|
|
|
</html>
|