Fix: missing param fails for object values (like date range) (#3218)

* fix: range params not recognized

* Handle parameters with unicode

* Remove debug prints

* DRY up missing_params
This commit is contained in:
Omer Lachish
2018-12-26 17:06:30 +02:00
committed by Arik Fraimovich
parent 26965b4948
commit 9e156c1c30
3 changed files with 25 additions and 13 deletions

View File

@@ -11,7 +11,7 @@ from redash import models, utils
from redash.handlers import routes
from redash.handlers.base import (get_object_or_404, org_scoped_rule,
record_event)
from redash.handlers.query_results import collect_query_parameters
from redash.utils import find_missing_params
from redash.handlers.static import render_index
from redash.utils import gen_query_hash, mustache_render
@@ -23,13 +23,11 @@ from redash.utils import gen_query_hash, mustache_render
# on the client side. Please don't reuse in other API handlers.
#
def run_query_sync(data_source, parameter_values, query_text, max_age=0):
query_parameters = set(collect_query_parameters(query_text))
missing_params = set(query_parameters) - set(parameter_values.keys())
missing_params = find_missing_params(query_text, parameter_values)
if missing_params:
raise Exception('Missing parameter value for: {}'.format(", ".join(missing_params)))
if query_parameters:
query_text = mustache_render(query_text, parameter_values)
query_text = mustache_render(query_text, parameter_values)
if max_age <= 0:
query_result = None

View File

@@ -10,9 +10,7 @@ from redash.permissions import (has_access, not_view_only, require_access,
require_permission, view_only)
from redash.tasks import QueryTask, record_event
from redash.tasks.queries import enqueue_query
from redash.utils import (collect_parameters_from_request,
collect_query_parameters, gen_query_hash, json_dumps,
utcnow)
from redash.utils import (collect_parameters_from_request, find_missing_params, gen_query_hash, json_dumps, utcnow)
from redash.utils.sql_query import SQLInjectionError, SQLQuery
@@ -50,8 +48,7 @@ def apply_parameters(template, parameters, data_source):
# on the client side. Please don't reuse in other API handlers.
#
def run_query_sync(data_source, parameter_values, query_text, max_age=0):
query_parameters = set(collect_query_parameters(query_text))
missing_params = set(query_parameters) - set(parameter_values.keys())
missing_params = find_missing_params(query_text, parameter_values)
if missing_params:
raise Exception('Missing parameter value for: {}'.format(", ".join(missing_params)))
@@ -91,11 +88,11 @@ def run_query_sync(data_source, parameter_values, query_text, max_age=0):
abort(503, message="Unable to get result from the database.")
return None
def run_query(data_source, parameter_values, query_text, query_id, max_age=0):
query_parameters = set(collect_query_parameters(query_text))
missing_params = set(query_parameters) - set(parameter_values.keys())
missing_params = find_missing_params(query_text, parameter_values)
if missing_params:
return error_response('Missing parameter value for: {}'.format(", ".join(missing_params)))
return error_response(u'Missing parameter value for: {}'.format(u", ".join(missing_params)))
if data_source.paused:
if data_source.pause_reason:

View File

@@ -171,6 +171,23 @@ def collect_query_parameters(query):
return keys
def parameter_names(parameter_values):
names = []
for key, value in parameter_values.iteritems():
if isinstance(value, dict):
for inner_key in value.keys():
names.append(u'{}.{}'.format(key, inner_key))
else:
names.append(key)
return names
def find_missing_params(query_text, parameter_values):
query_parameters = set(collect_query_parameters(query_text))
return set(query_parameters) - set(parameter_names(parameter_values))
def collect_parameters_from_request(args):
parameters = {}