diff --git a/panoramix/forms.py b/panoramix/forms.py index df077ad77e845..874cf529630c0 100644 --- a/panoramix/forms.py +++ b/panoramix/forms.py @@ -1,4 +1,5 @@ from wtforms import Field, Form, SelectMultipleField, SelectField, TextField +from copy import copy class OmgWtForm(Form): @@ -24,7 +25,8 @@ def field_css_classes(self, fieldname): return "" -def form_factory(datasource, viz, form_args=None): +def form_factory(viz): + datasource = viz.datasource from panoramix.viz import viz_types row_limits = [10, 50, 100, 500, 1000, 5000, 10000] series_limits = [0, 5, 10, 25, 50, 100, 500] @@ -57,6 +59,7 @@ def form_factory(datasource, viz, form_args=None): 'x': SelectField('X Axis', choices=datasource.metrics_combo), 'y': SelectField('Y Axis', choices=datasource.metrics_combo), 'size': SelectField('Bubble Size', choices=datasource.metrics_combo), + 'where': TextField('Custom WHERE clause'), } field_css_classes = {k: ['form-control'] for k in px_form_fields.keys()} select2 = [ @@ -70,7 +73,7 @@ def form_factory(datasource, viz, form_args=None): field_css_classes[field] += ['select2'] class QueryForm(OmgWtForm): - field_order = viz.form_fields + field_order = copy(viz.form_fields) css_classes = field_css_classes for i in range(10): @@ -85,4 +88,9 @@ class QueryForm(OmgWtForm): ff = [ff] for s in ff: setattr(QueryForm, s, px_form_fields[s]) + + # datasource type specific form elements + if datasource.__class__.__name__ == 'Table': + QueryForm.field_order += ['where'] + setattr(QueryForm, 'where', px_form_fields['where']) return QueryForm diff --git a/panoramix/models.py b/panoramix/models.py index 23ffbf0e986be..7b154314cf601 100644 --- a/panoramix/models.py +++ b/panoramix/models.py @@ -11,7 +11,7 @@ from sqlalchemy import Table as sqlaTable from sqlalchemy import create_engine, MetaData, desc, select, and_ from sqlalchemy.orm import relationship -from sqlalchemy.sql import table, literal_column +from sqlalchemy.sql import table, literal_column, text from copy import deepcopy, copy from collections import namedtuple @@ -99,7 +99,9 @@ def query_bkp( limit_spec=None, filter=None, is_timeseries=True, - timeseries_limit=15, row_limit=None): + timeseries_limit=15, + row_limit=None, + extras=None): """ Unused, legacy way of querying by building a SQL string without using the sqlalchemy expression API (new approach which supports @@ -192,7 +194,8 @@ def query( limit_spec=None, filter=None, is_timeseries=True, - timeseries_limit=15, row_limit=None): + timeseries_limit=15, row_limit=None, + extras=None): qry_start_dttm = datetime.now() timestamp = literal_column( @@ -236,6 +239,8 @@ def query( if op == 'not in': cond = ~cond where_clause_and.append(cond) + if extras and 'where' in extras: + where_clause_and += [text(extras['where'])] qry = qry.where(and_(*where_clause_and)) qry = qry.order_by(desc(main_metric_expr)) qry = qry.limit(row_limit) @@ -530,7 +535,8 @@ def query( filter=None, is_timeseries=True, timeseries_limit=None, - row_limit=None): + row_limit=None, + extras=None): qry_start_dttm = datetime.now() # add tzinfo to native datetime with config diff --git a/panoramix/templates/panoramix/datasource.html b/panoramix/templates/panoramix/datasource.html index 2a23e41abd572..2104ce3dcbe8d 100644 --- a/panoramix/templates/panoramix/datasource.html +++ b/panoramix/templates/panoramix/datasource.html @@ -1,6 +1,7 @@ {% extends "panoramix/base.html" %} {% block head_css %} {{super()}} +{% set datasource = viz.datasource %}