|
@@ -78,12 +78,29 @@ def normalize_query(query: FormsDict, allow: Iterable[str] = None) -> str:
|
|
(k, get_query_param(*param[k])) for k in sorted(param) if param[k]
|
|
(k, get_query_param(*param[k])) for k in sorted(param) if param[k]
|
|
])
|
|
])
|
|
|
|
|
|
|
|
+def _normalize_decorator(func, poison_on_reload=False):
|
|
|
|
+ def wrap(*args, **kwargs):
|
|
|
|
+ _, _, path, *_ = request.urlparts
|
|
|
|
+ normalized = normalize_query(request.query, allow=PARAMS)
|
|
|
|
+ if poison_on_reload and request.params.get('reload') == 'true':
|
|
|
|
+ CACHE.remove(normalized)
|
|
|
|
+ if request.query_string != normalized:
|
|
|
|
+ return redirect(f'{path}?{normalized}')
|
|
|
|
+ return func(*args, **kwargs)
|
|
|
|
+ return wrap
|
|
|
|
+
|
|
|
|
+def normalize(*args, **kwargs):
|
|
|
|
+ if not len(args):
|
|
|
|
+ return lambda f: _normalize_decorator(f, **kwargs)
|
|
|
|
+
|
|
|
|
+ return _normalize_decorator(*args)
|
|
|
|
|
|
@route('/grocery/static/<filename:path>')
|
|
@route('/grocery/static/<filename:path>')
|
|
def send_static(filename):
|
|
def send_static(filename):
|
|
return static_file(filename, root='app/rest/static')
|
|
return static_file(filename, root='app/rest/static')
|
|
|
|
|
|
@route('/grocery/trend')
|
|
@route('/grocery/trend')
|
|
|
|
+@normalize(poison_on_reload=True)
|
|
def trend():
|
|
def trend():
|
|
_, _, path, *_ = request.urlparts
|
|
_, _, path, *_ = request.urlparts
|
|
normalized = normalize_query(request.query, allow=PARAMS)
|
|
normalized = normalize_query(request.query, allow=PARAMS)
|
|
@@ -103,6 +120,7 @@ def trend():
|
|
))
|
|
))
|
|
|
|
|
|
@route('/grocery/groups')
|
|
@route('/grocery/groups')
|
|
|
|
+@normalize
|
|
def groups():
|
|
def groups():
|
|
filters = get_filter(request.query, allow=('group', 'category', 'product'))
|
|
filters = get_filter(request.query, allow=('group', 'category', 'product'))
|
|
form = template('form-nav', action='groups', method='get', params=[
|
|
form = template('form-nav', action='groups', method='get', params=[
|
|
@@ -129,6 +147,7 @@ FROM (
|
|
return template("query-to-xml", title="Groups", xml=xml, form=form)
|
|
return template("query-to-xml", title="Groups", xml=xml, form=form)
|
|
|
|
|
|
@route('/grocery/categories')
|
|
@route('/grocery/categories')
|
|
|
|
+@normalize
|
|
def categories():
|
|
def categories():
|
|
filters = get_filter(request.query, allow=('group', 'category', 'product'))
|
|
filters = get_filter(request.query, allow=('group', 'category', 'product'))
|
|
form = template('form-nav', action='categories', method='get', params=[
|
|
form = template('form-nav', action='categories', method='get', params=[
|
|
@@ -155,6 +174,7 @@ FROM (
|
|
return template("query-to-xml", title="Categories", xml=xml, form=form)
|
|
return template("query-to-xml", title="Categories", xml=xml, form=form)
|
|
|
|
|
|
@route('/grocery/products')
|
|
@route('/grocery/products')
|
|
|
|
+@normalize
|
|
def products():
|
|
def products():
|
|
filters = get_filter(request.query, allow=('group', 'category', 'product'))
|
|
filters = get_filter(request.query, allow=('group', 'category', 'product'))
|
|
form = template('form-nav', action='products', method='get', params=[
|
|
form = template('form-nav', action='products', method='get', params=[
|
|
@@ -182,6 +202,7 @@ FROM (
|
|
return template("query-to-xml", title="Products", xml=xml, form=form)
|
|
return template("query-to-xml", title="Products", xml=xml, form=form)
|
|
|
|
|
|
@route('/grocery/tags')
|
|
@route('/grocery/tags')
|
|
|
|
+@normalize
|
|
def tags():
|
|
def tags():
|
|
form = template('form-nav', action='tags', method='get', params=[
|
|
form = template('form-nav', action='tags', method='get', params=[
|
|
{'name': k, 'value': request.params[k]} for k in request.params if k in PARAMS
|
|
{'name': k, 'value': request.params[k]} for k in request.params if k in PARAMS
|