|
@@ -6,7 +6,8 @@
|
|
from bottle import request, template, FormsDict
|
|
from bottle import request, template, FormsDict
|
|
from pandas import DataFrame
|
|
from pandas import DataFrame
|
|
from psycopg import Cursor
|
|
from psycopg import Cursor
|
|
-from psycopg.sql import SQL, Literal
|
|
+from psycopg.sql import SQL, Literal, Identifier
|
|
|
|
+from typing import List
|
|
|
|
|
|
from ..data.filter import get_filter
|
|
from ..data.filter import get_filter
|
|
from ..data.util import get_where_include_exclude
|
|
from ..data.util import get_where_include_exclude
|
|
@@ -15,7 +16,7 @@ from .form import get_form
|
|
from . import BOOLEAN, PARAMS
|
|
from . import BOOLEAN, PARAMS
|
|
|
|
|
|
|
|
|
|
-def get_product_rollup_statement(filters) -> SQL:
|
|
+def get_product_rollup_statement(filters, orderby: List[str]) -> SQL:
|
|
_map = { k: k[0] for k in ('product', 'category', 'group') }
|
|
_map = { k: k[0] for k in ('product', 'category', 'group') }
|
|
where = [ get_where_include_exclude(
|
|
where = [ get_where_include_exclude(
|
|
_map[k], "name", list(include), list(exclude)
|
|
_map[k], "name", list(include), list(exclude)
|
|
@@ -33,12 +34,16 @@ JOIN categories c ON p.category_id = c.id
|
|
JOIN groups g ON c.group_id = g.id
|
|
JOIN groups g ON c.group_id = g.id
|
|
WHERE {where}
|
|
WHERE {where}
|
|
GROUP BY ROLLUP (g.name, c.name, p.name)
|
|
GROUP BY ROLLUP (g.name, c.name, p.name)
|
|
-""").format(where=SQL("\nAND").join(where))
|
|
+ORDER BY {orderby}
|
|
|
|
+""").format(
|
|
|
|
+ where=SQL("\nAND").join(where),
|
|
|
|
+ orderby=SQL(", ").join(map(Identifier,orderby)),
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
-def get_inner_query(query: FormsDict) -> SQL:
|
|
+def get_inner_query(query: FormsDict, orderby: List[str]) -> SQL:
|
|
filters = get_filter(query, allow=('group', 'category', 'product'))
|
|
filters = get_filter(query, allow=('group', 'category', 'product'))
|
|
- inner = get_product_rollup_statement(filters)
|
|
+ inner = get_product_rollup_statement(filters, orderby)
|
|
return inner
|
|
return inner
|
|
|
|
|
|
|
|
|
|
@@ -57,7 +62,7 @@ def get_xml(cur: Cursor, sql: str):
|
|
|
|
|
|
|
|
|
|
def get_products(cur: Cursor, query: FormsDict):
|
|
def get_products(cur: Cursor, query: FormsDict):
|
|
- inner = get_inner_query(query)
|
|
+ inner = get_inner_query(query, ['product', 'category', 'group'])
|
|
form = render_form(cur, inner, query)
|
|
form = render_form(cur, inner, query)
|
|
sql = SQL("""
|
|
sql = SQL("""
|
|
SELECT
|
|
SELECT
|
|
@@ -73,11 +78,11 @@ WHERE q.product IS NOT NULL OR q.group IS NULL
|
|
|
|
|
|
|
|
|
|
def get_categories(cur: Cursor, query: FormsDict):
|
|
def get_categories(cur: Cursor, query: FormsDict):
|
|
- inner = get_inner_query(query)
|
|
+ inner = get_inner_query(query, ['category', 'group'])
|
|
form = render_form(cur, inner, query)
|
|
form = render_form(cur, inner, query)
|
|
sql = SQL("""
|
|
sql = SQL("""
|
|
SELECT
|
|
SELECT
|
|
- "Products" "Product",
|
|
+ "Products",
|
|
COALESCE("category", "Categories"||'') "Category",
|
|
COALESCE("category", "Categories"||'') "Category",
|
|
COALESCE("group", "Groups"||'') "Group"
|
|
COALESCE("group", "Groups"||'') "Group"
|
|
FROM ({inner}) q
|
|
FROM ({inner}) q
|
|
@@ -88,7 +93,7 @@ WHERE q.product IS NULL AND (q.category IS NOT NULL OR q.group IS NULL)
|
|
|
|
|
|
|
|
|
|
def get_groups(cur: Cursor, query: FormsDict):
|
|
def get_groups(cur: Cursor, query: FormsDict):
|
|
- inner = get_inner_query(query)
|
|
+ inner = get_inner_query(query, ['group',])
|
|
form = render_form(cur, inner, query)
|
|
form = render_form(cur, inner, query)
|
|
sql = SQL("""
|
|
sql = SQL("""
|
|
SELECT
|
|
SELECT
|