|
@@ -13,7 +13,10 @@ from ..activities.Plot import (
|
|
|
get_data,
|
|
|
)
|
|
|
from ..data.QueryManager import QueryManager, display_mapper
|
|
|
-from ..data.util import get_include_exclude
|
|
|
+from ..data.util import(
|
|
|
+ get_include_exclude,
|
|
|
+ get_where_include_exclude
|
|
|
+)
|
|
|
|
|
|
def line(pivot, ylabel=None, xlabel=None):
|
|
|
ax = sns.lineplot(data=pivot, markers=True)
|
|
@@ -41,7 +44,6 @@ def trend():
|
|
|
unit = fields['unit'] = fields['unit'] if 'unit' in fields else None or 'kg'
|
|
|
if unit not in ALL_UNITS:
|
|
|
raise abort(400, f"Unsupported unit {unit}")
|
|
|
-
|
|
|
data = get_data(query_manager, **fields)
|
|
|
if data.empty:
|
|
|
raise abort(404, f"No data for {fields}")
|
|
@@ -144,29 +146,22 @@ ORDER BY 1', false, false, ''::text)
|
|
|
|
|
|
@route('/grocery/categories')
|
|
|
def categories():
|
|
|
- fields = { 'group': ([],[]) }
|
|
|
+ fields = { 'group': '' }
|
|
|
+ fields.update({
|
|
|
+ k: request.query[k] for k in request.query.keys() if k == 'group'
|
|
|
+ })
|
|
|
try:
|
|
|
with conn.cursor() as cur:
|
|
|
- fields.update({
|
|
|
- k: get_include_exclude(
|
|
|
- request.query[k]
|
|
|
- ) for k in request.query.keys() if k == 'group'
|
|
|
- })
|
|
|
- inner = SQL("""
|
|
|
-SELECT
|
|
|
- c.name AS "Category",
|
|
|
- g.name AS "Group"
|
|
|
+ inner = SQL('\n').join([SQL("""
|
|
|
+SELECT c.name AS "Category", g.name AS "Group"
|
|
|
FROM categories c
|
|
|
JOIN groups g ON c.group_id = g.id
|
|
|
WHERE
|
|
|
- (g.name = ANY({group}) OR array_length({group}::text[], 1) IS NULL)
|
|
|
-AND
|
|
|
- NOT g.name = ANY({ex_group})
|
|
|
+"""), get_where_include_exclude(
|
|
|
+ "g", "name", *get_include_exclude(fields['group'])
|
|
|
+), SQL("""
|
|
|
ORDER BY 1, 2
|
|
|
-""").format(
|
|
|
- **{ k: Literal(i) for k, (i, _) in fields.items() },
|
|
|
- **{ f'ex_{k}': Literal(e) for k, (_, e) in fields.items() }
|
|
|
-).as_string(cur)
|
|
|
+""")]).as_string(cur)
|
|
|
xml = cur.execute(SQL("""
|
|
|
SELECT query_to_xml_and_xmlschema({inner}, false, false, ''::text)
|
|
|
""").format(inner=Literal(inner))).fetchone()[0].splitlines()
|
|
@@ -178,39 +173,29 @@ SELECT query_to_xml_and_xmlschema({inner}, false, false, ''::text)
|
|
|
@route('/grocery/products')
|
|
|
def products():
|
|
|
fields = {
|
|
|
- 'group': ([],[]),
|
|
|
- 'category': ([],[]),
|
|
|
+ 'group': '',
|
|
|
+ 'category': ''
|
|
|
}
|
|
|
+ fields.update({
|
|
|
+ k: request.query[k] for k in request.query.keys() if k in (
|
|
|
+ 'group', 'category'
|
|
|
+ )
|
|
|
+ })
|
|
|
try:
|
|
|
with conn.cursor() as cur:
|
|
|
- fields.update({
|
|
|
- k: get_include_exclude(
|
|
|
- request.query[k]
|
|
|
- ) for k in request.query.keys() if k in (
|
|
|
- 'group', 'category'
|
|
|
- )
|
|
|
- })
|
|
|
- inner = SQL("""
|
|
|
-SELECT
|
|
|
- p.name AS "Product",
|
|
|
- c.name AS "Category",
|
|
|
- g.name AS "Group"
|
|
|
+ inner = SQL('\n').join([SQL("""
|
|
|
+SELECT p.name AS "Product", c.name AS "Category", g.name AS "Group"
|
|
|
FROM products p
|
|
|
JOIN categories c ON p.category_id = c.id
|
|
|
JOIN groups g ON c.group_id = g.id
|
|
|
WHERE
|
|
|
- (g.name = ANY({group}) OR array_length({group}::text[], 1) IS NULL)
|
|
|
-AND
|
|
|
- NOT g.name = ANY({ex_group})
|
|
|
-AND
|
|
|
- (c.name = ANY({category}) OR array_length({category}::text[], 1) IS NULL)
|
|
|
-AND
|
|
|
- NOT c.name = ANY({ex_category})
|
|
|
+"""), SQL('\nAND\n').join([get_where_include_exclude(
|
|
|
+ "g", "name", *get_include_exclude(fields['group'])
|
|
|
+), get_where_include_exclude(
|
|
|
+ "c", "name", *get_include_exclude(fields['category'])
|
|
|
+)]), SQL("""
|
|
|
ORDER BY 1, 2, 3
|
|
|
-""").format(
|
|
|
- **{ k: Literal(i) for k, (i, _) in fields.items() },
|
|
|
- **{ f'ex_{k}': Literal(e) for k, (_, e) in fields.items() }
|
|
|
-).as_string(cur)
|
|
|
+""")]).as_string(cur)
|
|
|
xml = cur.execute(SQL("""
|
|
|
SELECT query_to_xml_and_xmlschema({inner}, false, false, ''::text)
|
|
|
""").format(inner=Literal(inner))).fetchone()[0].splitlines()
|