|
@@ -44,7 +44,11 @@ def trend(queue: Queue, conn: Connection[TupleRow], path: str, query: FormsDict)
|
|
|
queue.put(None)
|
|
|
|
|
|
def trend_internal(conn: Connection[TupleRow], path: str, query: FormsDict):
|
|
|
- progress = []
|
|
|
+ progress = {
|
|
|
+ 'stage': None,
|
|
|
+ 'percent': None,
|
|
|
+ 'complete': False,
|
|
|
+ }
|
|
|
try:
|
|
|
with conn.cursor() as cur:
|
|
|
query_manager = QueryManager(cur, display_mapper)
|
|
@@ -59,12 +63,10 @@ def trend_internal(conn: Connection[TupleRow], path: str, query: FormsDict):
|
|
|
yield abort(400, f"Unsupported unit {unit}")
|
|
|
return
|
|
|
|
|
|
- progress.append({ "name": "Loading data", "status": ""})
|
|
|
+ progress.update({ "stage": "Querying database", "percent": "10"})
|
|
|
yield template("loading", progress=progress)
|
|
|
data = get_data(query_manager, **fields)
|
|
|
- progress[-1]["status"] = "done"
|
|
|
- yield template("loading", progress=progress)
|
|
|
-
|
|
|
+
|
|
|
if data.empty:
|
|
|
yield abort(404, f"No data for {fields}")
|
|
|
return
|
|
@@ -72,7 +74,7 @@ def trend_internal(conn: Connection[TupleRow], path: str, query: FormsDict):
|
|
|
in_chart = data['$/unit'].apply(lambda x: (x or False) and True)
|
|
|
data = data[in_chart]
|
|
|
|
|
|
- progress.append({ "name": "Loading chart", "status": ""})
|
|
|
+ progress.update({ "stage": "Preparing data", "percent": "30"})
|
|
|
yield template("loading", progress=progress)
|
|
|
|
|
|
pivot = data.pivot_table(index=['ts_raw',], columns=['product',], values=['$/unit'], aggfunc='mean')
|
|
@@ -115,21 +117,18 @@ def trend_internal(conn: Connection[TupleRow], path: str, query: FormsDict):
|
|
|
for _, spine in ax.spines.items():
|
|
|
spine.set_color('#ffffff')
|
|
|
|
|
|
- progress[-1]["status"] = "done"
|
|
|
+ progress.update({ "stage": "Rendering chart", "percent": "50"})
|
|
|
yield template("loading", progress=progress)
|
|
|
|
|
|
- progress.append({ "name": "Rendering chart", "status": ""})
|
|
|
- yield template("loading", progress=progress)
|
|
|
-
|
|
|
f = StringIO()
|
|
|
plt.savefig(f, format='svg')
|
|
|
+ progress.update({ "stage": "Done", "percent": "100", "complete": True})
|
|
|
+ yield template("loading", progress=progress)
|
|
|
+
|
|
|
organic = BOOLEAN.get(query.organic, None)
|
|
|
action = path.split('/')[-1]
|
|
|
form = get_form(action, 'post', _filter, organic, data)
|
|
|
|
|
|
- progress[-1]["status"] = "done"
|
|
|
- yield template("loading", progress=progress)
|
|
|
-
|
|
|
yield template("trend", form=form, svg=f.getvalue())
|
|
|
|
|
|
finally:
|