Skip to content

Commit

Permalink
Fix: missing param fails for object values (like date range) (getreda…
Browse files Browse the repository at this point in the history
…sh#3218)

* fix: range params not recognized

* Handle parameters with unicode

* Remove debug prints

* DRY up missing_params
  • Loading branch information
Omer Lachish authored and arikfr committed Dec 26, 2018
1 parent 26965b4 commit 9e156c1
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 13 deletions.
8 changes: 3 additions & 5 deletions redash/handlers/embed.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
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

Expand All @@ -23,13 +23,11 @@
# 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
Expand Down
13 changes: 5 additions & 8 deletions redash/handlers/query_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
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


Expand Down Expand Up @@ -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)))

Expand Down Expand Up @@ -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:
Expand Down
17 changes: 17 additions & 0 deletions redash/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}

Expand Down

0 comments on commit 9e156c1

Please sign in to comment.