Giter Site home page Giter Site logo

apache / superset Goto Github PK

View Code? Open in Web Editor NEW
58.8K 1.5K 12.5K 835.45 MB

Apache Superset is a Data Visualization and Data Exploration Platform

Home Page: https://superset.apache.org/

License: Apache License 2.0

Python 37.52% CSS 0.02% JavaScript 9.89% Shell 0.27% Mako 0.01% HTML 6.00% Smarty 0.02% Dockerfile 0.04% TypeScript 45.70% Makefile 0.02% Less 0.28% Pug 0.01% Jinja 0.03% Jupyter Notebook 0.19%
superset apache apache-superset data-visualization data-viz analytics business-intelligence data-science data-engineering asf

superset's Introduction

Superset

License GitHub release (latest SemVer) Build Status PyPI version Coverage Status PyPI Get on Slack Documentation

Superset logo (light)

A modern, enterprise-ready business intelligence web application.

Why Superset? | Supported Databases | Installation and Configuration | Release Notes | Get Involved | Contributor Guide | Resources | Organizations Using Superset

Why Superset?

Superset is a modern data exploration and data visualization platform. Superset can replace or augment proprietary business intelligence tools for many teams. Superset integrates well with a variety of data sources.

Superset provides:

  • A no-code interface for building charts quickly
  • A powerful, web-based SQL Editor for advanced querying
  • A lightweight semantic layer for quickly defining custom dimensions and metrics
  • Out of the box support for nearly any SQL database or data engine
  • A wide array of beautiful visualizations to showcase your data, ranging from simple bar charts to geospatial visualizations
  • Lightweight, configurable caching layer to help ease database load
  • Highly extensible security roles and authentication options
  • An API for programmatic customization
  • A cloud-native architecture designed from the ground up for scale

Screenshots & Gifs

Video Overview

Superset.Overview.Video.1080.mp4

Large Gallery of Visualizations


Craft Beautiful, Dynamic Dashboards


No-Code Chart Builder


Powerful SQL Editor


Supported Databases

Superset can query data from any SQL-speaking datastore or data engine (Presto, Trino, Athena, and more) that has a Python DB-API driver and a SQLAlchemy dialect.

Here are some of the major database solutions that are supported:

redshift google-biquery snowflake trino presto databricks druid firebolt timescale rockset postgresql mysql mssql-server db2 sqlite sybase mariadb vertica oracle firebird greenplum clickhouse exasol monet-db apache-kylin hologres netezza pinot teradata yugabyte databend starrocks doris

A more comprehensive list of supported databases along with the configuration instructions can be found here.

Want to add support for your datastore or data engine? Read more here about the technical requirements.

Installation and Configuration

Extended documentation for Superset

Get Involved

Contributor Guide

Interested in contributing? Check out our CONTRIBUTING.md to find resources around contributing along with a detailed guide on how to set up a development environment.

Resources

  • Superset "In the Wild" - open a PR to add your org to the list!
  • Feature Flags - the status of Superset's Feature Flags.
  • Standard Roles - How RBAC permissions map to roles.
  • Superset Wiki - Tons of additional community resources: best practices, community content and other information.
  • Superset SIPs - The status of Superset's SIPs (Superset Improvement Proposals) for both consensus and implementation status.

Understanding the Superset Points of View

Repo Activity

Performance Stats of apache/superset - Last 28 days

superset's People

Contributors

aafghahi avatar betodealmeida avatar bkyryliuk avatar dependabot-preview[bot] avatar dependabot[bot] avatar diegomedina248 avatar dpgaspar avatar eschutho avatar geido avatar hughhhh avatar john-bodley avatar justinpark avatar kgabryje avatar kristw avatar ktmud avatar lilykuang avatar lyndsiwilliams avatar michael-s-molina avatar michellethomas avatar mistercrunch avatar nytai avatar pkdotson avatar rusackas avatar stephenlyz avatar suddjian avatar timifasubaa avatar vera-liu avatar villebro avatar williaster avatar zhaoyongjie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

superset's Issues

Exception occurred when add json param to request.args

I read the source of Panoramix, it support get query json by add json to requests.args:

        if request.args.get("json"):
            return Response(
                json.dumps(obj.get_query(), indent=4),
                status=200,
                mimetype="application/json")

But when i using this, an exception occurred like this, the BaseViz class hasn't this method:

>>> request.args
werkzeug.datastructures.ImmutableMultiDict({..., 'json': u'1', ...  })

Exception:
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python2.7/site-packages/flask_appbuilder/security/decorators.py", line 26, in wraps
return f(self, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/panoramix-0.2.1-py2.7.egg/panoramix/views.py", line 221, in datasource
json.dumps(obj.get_query(), indent=4),
AttributeError: 'TableViz' object has no attribute 'get_query'

The code may be json.dumps(obj.query_obj(), indent=4), is it right?

Error while registering a user from the panoramix UI

I am trying to register a new user from the panoramix UI by clicking on the register button on the Login Menu but i am getting the following error:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/views.py", line 107, in this_form_get
    appbuilder=self.appbuilder
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/baseviews.py", line 156, in render_template
    return render_template(template, dict(list(kwargs.items()) + list(self.extra_args.items())))
  File "/usr/local/lib/python2.7/dist-packages/flask/templating.py", line 128, in render_template
    context, ctx.app)
  File "/usr/local/lib/python2.7/dist-packages/flask/templating.py", line 110, in _render
    rv = template.render(context)
  File "/usr/share/pyshared/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/templates/appbuilder/general/model/edit.html", line 2, in top-level template code
    {% import 'appbuilder/general/lib.html' as lib %}
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/templates/appbuilder/base.html", line 1, in top-level template code
    {% extends base_template %}
  File "/home/sandeeps/panoramix/app/templates/panoramix/base.html", line 1, in top-level template code
    {% extends "appbuilder/baselayout.html" %}
  File "/home/sandeeps/panoramix/app/templates/appbuilder/baselayout.html", line 2, in top-level template code
    {% import 'appbuilder/baselib.html' as baselib %}
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/templates/appbuilder/init.html", line 46, in top-level template code
    {% block body %}
  File "/home/sandeeps/panoramix/app/templates/appbuilder/baselayout.html", line 19, in block "body"
    {% block content %}
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/templates/appbuilder/general/model/edit.html", line 23, in block "content"
    {% block edit_form %}
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/templates/appbuilder/general/model/edit.html", line 25, in block "edit_form"
    {{ widgets.get('edit')(form_action=form_action)|safe }}
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/widgets.py", line 34, in __call__
    return template.render(args)
  File "/usr/share/pyshared/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/templates/appbuilder/general/widgets/form.html", line 40, in top-level template code
    <tr>{{ lib.render_field(field, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }}</tr>
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/templates/appbuilder/general/lib.html", line 203, in template
    {{ field(**kwargs)|safe }}
  File "/usr/local/lib/python2.7/dist-packages/wtforms/fields/core.py", line 149, in __call__
    return self.meta.render_field(self, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/wtforms/meta.py", line 53, in render_field
    return field.widget(field, **render_kw)
  File "/usr/local/lib/python2.7/dist-packages/flask_wtf/recaptcha/widgets.py", line 40, in __call__
    raise RuntimeError("RECAPTCHA_PUBLIC_KEY config not set")
**RuntimeError: RECAPTCHA_PUBLIC_KEY config not set

I have checked out the latest code from the github and followed the steps mentioned in ReadMe file for server installation.

**Is it possible to disable authentication and also configure the druid endpoint in the config file instead of creating a admin role and than adding details there?

Getting "601:ERROR:flask_appbuilder.security.sqla.manager:DB Creation and initialization failed: (sqlite3.OperationalError) unable to open database file"

Hello, I am trying to install Panoramix on a Windows 7 with Python 2.7.11, followed the instructions to install, got following error:

2016-03-10 11:18:47,601:ERROR:flask_appbuilder.security.sqla.manager:DB Creation and initialization failed: (sqlite3.OperationalError) unable to open database file'

Installation Details:

c:\Python27\Scripts>pip install panoramix
Collecting panoramix
Downloading panoramix-0.7.0.tar.gz (22.9MB)
100% |################################| 22.9MB 40kB/s
Collecting alembic<0.9.0,>=0.8.2 (from panoramix)
Downloading alembic-0.8.5.tar.gz (959kB)
100% |################################| 962kB 696kB/s
Collecting cryptography<2.0.0,>=1.1.1 (from panoramix)
Downloading cryptography-1.2.3-cp27-none-win32.whl (882kB)
100% |################################| 890kB 769kB/s
Collecting flask-appbuilder<2.0.0,>=1.4.5 (from panoramix)
Downloading Flask-AppBuilder-1.6.0.tar.gz (1.1MB)
100% |################################| 1.1MB 613kB/s
Collecting flask-login==0.2.11 (from panoramix)
Downloading Flask-Login-0.2.11.tar.gz
Collecting flask-migrate<2.0.0,>=1.5.1 (from panoramix)
Downloading Flask-Migrate-1.8.0.tar.gz
Collecting flask-script<3.0.0,>=2.0.5 (from panoramix)
Downloading Flask-Script-2.0.5.tar.gz (42kB)
100% |################################| 51kB 1.2MB/s
Collecting flask-sqlalchemy==2.0 (from panoramix)
Downloading Flask-SQLAlchemy-2.0.tar.gz (93kB)
100% |################################| 102kB 1.4MB/s
Collecting flask-testing<0.5.0,>=0.4.2 (from panoramix)
Downloading Flask-Testing-0.4.2.tar.gz (40kB)
100% |################################| 51kB 1.4MB/s
Collecting flask<1.0.0,>=0.10.1 (from panoramix)
Downloading Flask-0.10.1.tar.gz (544kB)
100% |################################| 552kB 1.0MB/s
Collecting gunicorn<20.0.0,>=19.3.0 (from panoramix)
Downloading gunicorn-19.4.5-py2.py3-none-any.whl (112kB)
100% |################################| 122kB 1.3MB/s
Collecting markdown<3.0.0,>=2.6.2 (from panoramix)
Downloading Markdown-2.6.5.tar.gz (301kB)
100% |################################| 307kB 1.3MB/s
Collecting numpy<2,>=1.9 (from panoramix)
Downloading numpy-1.10.4-cp27-none-win32.whl (6.4MB)
100% |################################| 6.4MB 140kB/s
Collecting pandas<0.17,==0.16.2 (from panoramix)
Downloading pandas-0.16.2-cp27-none-win32.whl (3.6MB)
100% |################################| 3.6MB 224kB/s
Collecting parsedatetime<2.0.0,>=1.5 (from panoramix)
Downloading parsedatetime-1.5-py2-none-any.whl (50kB)
100% |################################| 51kB 1.2MB/s
Collecting pydruid<0.3,>=0.2.2 (from panoramix)
Downloading pydruid-0.2.3.tar.gz
Collecting python-dateutil<3.0.0,>=2.4.2 (from panoramix)
Downloading python_dateutil-2.5.0-py2.py3-none-any.whl (199kB)
100% |################################| 204kB 914kB/s
Collecting requests<3.0.0,>=2.7.0 (from panoramix)
Downloading requests-2.9.1-py2.py3-none-any.whl (501kB)
100% |################################| 501kB 906kB/s
Collecting sqlalchemy-utils<0.32.0,>=0.31.3 (from panoramix)
Downloading SQLAlchemy-Utils-0.31.6.tar.gz (112kB)
100% |################################| 112kB 1.5MB/s
Collecting sqlalchemy<2.0.0,>=1.0.8 (from panoramix)
Downloading SQLAlchemy-1.0.12.tar.gz (4.7MB)
100% |################################| 4.8MB 187kB/s
Collecting sqlparse<0.2.0,>=0.1.16 (from panoramix)
Downloading sqlparse-0.1.19.tar.gz (58kB)
100% |################################| 61kB 2.0MB/s
Collecting werkzeug<0.12.0,==0.11.2 (from panoramix)
Downloading Werkzeug-0.11.2-py2.py3-none-any.whl (304kB)
100% |################################| 307kB 1.3MB/s
Collecting Mako (from alembic<0.9.0,>=0.8.2->panoramix)
Downloading Mako-1.0.3.tar.gz (565kB)
100% |################################| 573kB 1.0MB/s
Collecting python-editor>=0.3 (from alembic<0.9.0,>=0.8.2->panoramix)
Downloading python-editor-0.5.tar.gz
Collecting enum34 (from cryptography<2.0.0,>=1.1.1->panoramix)
Downloading enum34-1.1.2.tar.gz (46kB)
100% |################################| 51kB 3.2MB/s
Collecting ipaddress (from cryptography<2.0.0,>=1.1.1->panoramix)
Downloading ipaddress-1.0.16-py27-none-any.whl
Collecting pyasn1>=0.1.8 (from cryptography<2.0.0,>=1.1.1->panoramix)
Downloading pyasn1-0.1.9-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): setuptools>=1.0 in c:\python27\lib\site-packages (from cryptography<2.0.0,>=1.1.1->panoramix)
Collecting six>=1.4.1 (from cryptography<2.0.0,>=1.1.1->panoramix)
Downloading six-1.10.0-py2.py3-none-any.whl
Collecting idna>=2.0 (from cryptography<2.0.0,>=1.1.1->panoramix)
Downloading idna-2.0-py2.py3-none-any.whl (61kB)
100% |################################| 61kB 3.2MB/s
Collecting cffi>=1.4.1 (from cryptography<2.0.0,>=1.1.1->panoramix)
Downloading cffi-1.5.2-cp27-none-win32.whl (141kB)
100% |################################| 143kB 1.2MB/s
Collecting colorama>=0.3 (from flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading colorama-0.3.7-py2.py3-none-any.whl
Collecting click>=3.0 (from flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading click-6.3-py2.py3-none-any.whl (70kB)
100% |################################| 71kB 1.6MB/s
Collecting Flask-BabelPkg>=0.9.4 (from flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading Flask-BabelPkg-0.9.6.tar.gz
Collecting Flask-OpenID>=1.1.0 (from flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading Flask-OpenID-1.2.5.tar.gz (43kB)
100% |################################| 51kB 1.8MB/s
Collecting Flask-WTF>=0.9.1 (from flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading Flask_WTF-0.12-py2-none-any.whl
Collecting Jinja2>=2.4 (from flask<1.0.0,>=0.10.1->panoramix)
Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB)
100% |################################| 266kB 293kB/s
Collecting itsdangerous>=0.21 (from flask<1.0.0,>=0.10.1->panoramix)
Downloading itsdangerous-0.24.tar.gz (46kB)
100% |################################| 51kB 1.4MB/s
Collecting pytz>=2011k (from pandas<0.17,==0.16.2->panoramix)
Downloading pytz-2015.7-py2.py3-none-any.whl (476kB)
100% |################################| 481kB 975kB/s
Collecting MarkupSafe>=0.9.2 (from Mako->alembic<0.9.0,>=0.8.2->panoramix)
Downloading MarkupSafe-0.23.tar.gz
Collecting pycparser (from cffi>=1.4.1->cryptography<2.0.0,>=1.1.1->panoramix)
Downloading pycparser-2.14.tar.gz (223kB)
100% |################################| 225kB 1.3MB/s
Collecting Babel>=1.0 (from Flask-BabelPkg>=0.9.4->flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading Babel-2.2.0-py2.py3-none-any.whl (6.5MB)
100% |################################| 6.5MB 139kB/s
Collecting speaklater>=1.2 (from Flask-BabelPkg>=0.9.4->flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading speaklater-1.3.tar.gz
Collecting python-openid>=2.0 (from Flask-OpenID>=1.1.0->flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading python-openid-2.2.5.tar.gz (301kB)
100% |################################| 307kB 1.3MB/s
Collecting WTForms (from Flask-WTF>=0.9.1->flask-appbuilder<2.0.0,>=1.4.5->panoramix)
Downloading WTForms-2.1.zip (553kB)
100% |################################| 563kB 966kB/s
Installing collected packages: sqlalchemy, MarkupSafe, Mako, python-editor, alembic, enum34, ipaddress, pyasn1, six, idna, pycparser, cffi, cryptography, colorama, click, werkzeug, Jinja2, itsdangerous, flask, pytz, Babel, speaklater, Flask-BabelPkg, flask-login, python-openid, Flask-OpenID, flask-sqlalchemy, WTForms, Flask-WTF, flask-appbuilder, flask-script, flask-migrate, flask-testing, gunicorn, markdown, numpy, python-dateutil, pandas, parsedatetime, pydruid, requests, sqlalchemy-utils, sqlparse, panoramix
Running setup.py install for sqlalchemy ... done
Running setup.py install for MarkupSafe ... done
Running setup.py install for Mako ... done
Running setup.py install for python-editor ... done
Running setup.py install for alembic ... done
Running setup.py install for enum34 ... done
Running setup.py install for pycparser ... done
Running setup.py install for itsdangerous ... done
Running setup.py install for flask ... done
Running setup.py install for speaklater ... done
Running setup.py install for Flask-BabelPkg ... done
Running setup.py install for flask-login ... done
Running setup.py install for python-openid ... done
Running setup.py install for Flask-OpenID ... done
Running setup.py install for flask-sqlalchemy ... done
Running setup.py install for WTForms ... done
Running setup.py install for flask-appbuilder ... done
Running setup.py install for flask-script ... done
Running setup.py install for flask-migrate ... done
Running setup.py install for flask-testing ... done
Running setup.py install for markdown ... done
Running setup.py install for pydruid ... done
Running setup.py install for sqlalchemy-utils ... done
Running setup.py install for sqlparse ... done
Running setup.py install for panoramix ... done
Successfully installed Babel-2.2.0 Flask-BabelPkg-0.9.6 Flask-OpenID-1.2.5 Flask-WTF-0.12 Jinja2-2.8 Mako-1.0.3 MarkupSafe-0.23 WTForms-2.1 alembic-0.8.5 cffi-1.5.2 click-6.3 colorama-0.3.7 cryptography-1.2.3 enum34-1.1.2 flask-0.10.1 flask-appbuilder-1.6.0 flask-login-0.2.11 flask-migrate-1.8.0 flask-script-2.0.5 flask-sqlalchemy-2.0 flask-testing-0.4.2 gunicorn-19.4.5 idna-2.0 ipaddress-1.0.16 itsdangerous-0.24 markdown-2.6.5 numpy-1.10.4 pandas-0.16.2 panoramix-0.7.0 parsedatetime-1.5 pyasn1-0.1.9 pycparser-2.14 pydruid-0.2.3 python-dateutil-2.5.0 python-editor-0.5 python-openid-2.2.5 pytz-2015.7 requests-2.9.1 six-1.10.0 speaklater-1.3 sqlalchemy-1.0.12 sqlalchemy-utils-0.31.6 sqlparse-0.1.19 werkzeug-0.11.2

c:\Python27\Scripts>fabmanager create-admin --app panoramix
Username [admin]: abcd
User first name [admin]: abcd
User last name [user]: abcd
Email [[email protected]]: [email protected]
Password:
Repeat for confirmation:
2016-03-10 11:18:47,601:ERROR:flask_appbuilder.security.sqla.manager:DB Creation and initialization failed: (sqlite3.OperationalError) unable to open database file

Data cache

Hi,

I'll need to cache some data to avoid querying DB continuously. Any preferred approach ?
Currently I'm thinking on adding basic caching. It will include an new attribute for the slice- "Time to live", "Cache time" or similar with 0 meaning no cache-. We'll need a way to invalidate cache as well ;)

What about something quite basic using https://pypi.python.org/pypi/pyfscache/ ?
We can use it at class method BaseViz::get_df level, don't you?

Thanks

Change port to default values

Hi,
If it's possible to change config with default port used by druid

Actual values :
ROW_LIMIT = 5000

DRUID_HOST = '0.0.0.0'
DRUID_PORT = 8080
DRUID_BASE_ENDPOINT = 'druid/v2'

COORDINATOR_HOST = '0.0.0.0'
COORDINATOR_PORT = '8080'
COORDINATOR_BASE_ENDPOINT = 'druid/coordinator/v1'

New values :

ROW_LIMIT = 5000

DRUID_HOST = '0.0.0.0'
DRUID_PORT = '8084'
DRUID_BASE_ENDPOINT = 'druid/v2'

COORDINATOR_HOST = '0.0.0.0'
COORDINATOR_PORT = '8081'
COORDINATOR_BASE_ENDPOINT = 'druid/coordinator/v1'

based on this documentation : http://druid.io/docs/0.8.0/tutorials/tutorial-the-druid-cluster.html

Random formatting feature requests

  • x-axis formatting option
  • Big Number formatting option
  • Better subheadings -- markup widget requires a โ€œnameโ€ which is strange if all I want is an h2
  • fix weird grid not drawing error in line charts please! :/

Wrong datetime formating when building the query

HI,

image

I've found that datetime is being custom formatted before sending to SQLAlchemy that causes incompatibility between Datetime and Datetime2 in SQLServer.

I'll check to use the SQLAlchemy dialect of the datasource to format instead.

Error on starting web server

Hi,
I'm trying to install Panoramix.
Server is Mac 10.9.5 and Phyton version is 2.7.5
After installation I've first start web server and meet with error as follows๏ผš

$ python run.py
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import app
  File "/Users/tianzhao/dev/apache/panoramix/app/__init__.py", line 2, in <module>
    from flask import Flask
ImportError: No module named flask

Initial selection for sunburst graph

Hi there,

I've added a few lines to sunburst to change the way it's initially painted, now it shows the first path.

image

Makes sense to add a new setting kind of "always show main path" ?
Thanks

PS: Just did this:

// Initial selection
      var mainpath = function(){
        var c = tree.children[0];
        while(c.hasOwnProperty('children') && c.children.length != 0)
            c = c.children[0];
        return c;
      }
      highlighpath(mainpath());

Slice.druid_datasource_id empty in older versions

I am using the sqlite file from an older version of panoramix (about v0.8.0 f0b2f98).
Even after I run caravel db upgrade,slices.druid_datasource_id are all empty.
The table druid_datasource is also empty.
Seems like I have to refresh the druid datasource to create new records in the table datasources. Is it the only way to fix this? Can it be fixed using the migration script?
Otherwise, it will make Slice.druid_datasource and Slice.datasource empty, causing other errors.
For example:

File "caravel/views.py", line 651, in dashboard
pos_dict=pos_dict)
...
File "caravel/templates/caravel/dashboard.html", line 80, in block "body"
class="widget {{ slice.viz.viz_type }}"
File "lib/python2.7/site-packages/Jinja2-2.8-py2.7.egg/jinja2/environment.py", line 408, in getattr
return getattr(obj, attribute)
UndefinedError: 'caravel.models.Slice object' has no attribute 'viz'

"Was unable to import panoramix Error: No module named markdown"

I got this error when running the fabmanager create-admin --app panoramix installation step, after typing in my user stuff.

Things worked the next time after doing a pip install markdown.

2015-10-06 18:24:27,393:INFO:flask_appbuilder.security.sqla.manager:Security DB not found Creating all Models from Base
2015-10-06 18:24:27,404:INFO:flask_appbuilder.security.sqla.manager:Security DB Created
2015-10-06 18:24:27,407:INFO:flask_appbuilder.security.sqla.manager:Inserted Role: Admin
2015-10-06 18:24:27,411:INFO:flask_appbuilder.security.sqla.manager:Inserted Role: Public
2015-10-06 18:24:27,412:WARNING:flask_appbuilder.security.manager:No user yet created, use fabmanager command to do it.
2015-10-06 18:24:27,414:INFO:flask_appbuilder.base:Registering class MyIndexView on menu
2015-10-06 18:24:27,420:INFO:flask_appbuilder.base:Registering class UtilView on menu
2015-10-06 18:24:27,425:INFO:flask_appbuilder.base:Registering class LocaleView on menu
2015-10-06 18:24:27,430:INFO:flask_appbuilder.base:Registering class ResetPasswordView on menu
2015-10-06 18:24:27,446:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can this form post on ResetPasswordView
2015-10-06 18:24:27,453:INFO:flask_appbuilder.security.sqla.manager:Added Permission can this form post on ResetPasswordView to role Admin
2015-10-06 18:24:27,462:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can this form get on ResetPasswordView
2015-10-06 18:24:27,476:INFO:flask_appbuilder.security.sqla.manager:Added Permission can this form get on ResetPasswordView to role Admin
2015-10-06 18:24:27,476:INFO:flask_appbuilder.base:Registering class ResetMyPasswordView on menu
2015-10-06 18:24:27,489:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can this form post on ResetMyPasswordView
2015-10-06 18:24:27,496:INFO:flask_appbuilder.security.sqla.manager:Added Permission can this form post on ResetMyPasswordView to role Admin
2015-10-06 18:24:27,502:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can this form get on ResetMyPasswordView
2015-10-06 18:24:27,508:INFO:flask_appbuilder.security.sqla.manager:Added Permission can this form get on ResetMyPasswordView to role Admin
2015-10-06 18:24:27,508:INFO:flask_appbuilder.base:Registering class AuthDBView on menu
2015-10-06 18:24:27,515:INFO:flask_appbuilder.base:Registering class UserDBModelView on menu List Users
2015-10-06 18:24:27,531:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can edit on UserDBModelView
2015-10-06 18:24:27,539:INFO:flask_appbuilder.security.sqla.manager:Added Permission can edit on UserDBModelView to role Admin
2015-10-06 18:24:27,549:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can userinfo on UserDBModelView
2015-10-06 18:24:27,557:INFO:flask_appbuilder.security.sqla.manager:Added Permission can userinfo on UserDBModelView to role Admin
2015-10-06 18:24:27,568:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can delete on UserDBModelView
2015-10-06 18:24:27,576:INFO:flask_appbuilder.security.sqla.manager:Added Permission can delete on UserDBModelView to role Admin
2015-10-06 18:24:27,586:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can download on UserDBModelView
2015-10-06 18:24:27,595:INFO:flask_appbuilder.security.sqla.manager:Added Permission can download on UserDBModelView to role Admin
2015-10-06 18:24:27,604:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can list on UserDBModelView
2015-10-06 18:24:27,612:INFO:flask_appbuilder.security.sqla.manager:Added Permission can list on UserDBModelView to role Admin
2015-10-06 18:24:27,623:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can add on UserDBModelView
2015-10-06 18:24:27,631:INFO:flask_appbuilder.security.sqla.manager:Added Permission can add on UserDBModelView to role Admin
2015-10-06 18:24:27,639:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can show on UserDBModelView
2015-10-06 18:24:27,647:INFO:flask_appbuilder.security.sqla.manager:Added Permission can show on UserDBModelView to role Admin
2015-10-06 18:24:27,656:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: resetmypassword on UserDBModelView
2015-10-06 18:24:27,663:INFO:flask_appbuilder.security.sqla.manager:Added Permission resetmypassword on UserDBModelView to role Admin
2015-10-06 18:24:27,672:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: resetpasswords on UserDBModelView
2015-10-06 18:24:27,679:INFO:flask_appbuilder.security.sqla.manager:Added Permission resetpasswords on UserDBModelView to role Admin
2015-10-06 18:24:27,696:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on List Users
2015-10-06 18:24:27,703:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on List Users to role Admin
2015-10-06 18:24:27,714:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on Security
2015-10-06 18:24:27,721:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on Security to role Admin
2015-10-06 18:24:27,722:INFO:flask_appbuilder.base:Registering class RoleModelView on menu List Roles
2015-10-06 18:24:27,737:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can edit on RoleModelView
2015-10-06 18:24:27,746:INFO:flask_appbuilder.security.sqla.manager:Added Permission can edit on RoleModelView to role Admin
2015-10-06 18:24:27,753:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can delete on RoleModelView
2015-10-06 18:24:27,760:INFO:flask_appbuilder.security.sqla.manager:Added Permission can delete on RoleModelView to role Admin
2015-10-06 18:24:27,765:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can download on RoleModelView
2015-10-06 18:24:27,773:INFO:flask_appbuilder.security.sqla.manager:Added Permission can download on RoleModelView to role Admin
2015-10-06 18:24:27,778:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can list on RoleModelView
2015-10-06 18:24:27,785:INFO:flask_appbuilder.security.sqla.manager:Added Permission can list on RoleModelView to role Admin
2015-10-06 18:24:27,792:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can add on RoleModelView
2015-10-06 18:24:27,801:INFO:flask_appbuilder.security.sqla.manager:Added Permission can add on RoleModelView to role Admin
2015-10-06 18:24:27,807:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can show on RoleModelView
2015-10-06 18:24:27,815:INFO:flask_appbuilder.security.sqla.manager:Added Permission can show on RoleModelView to role Admin
2015-10-06 18:24:27,826:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: Copy Role on RoleModelView
2015-10-06 18:24:27,836:INFO:flask_appbuilder.security.sqla.manager:Added Permission Copy Role on RoleModelView to role Admin
2015-10-06 18:24:27,849:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on List Roles
2015-10-06 18:24:27,857:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on List Roles to role Admin
2015-10-06 18:24:27,864:INFO:flask_appbuilder.base:Registering class UserStatsChartView on menu User's Statistics
2015-10-06 18:24:27,881:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can chart on UserStatsChartView
2015-10-06 18:24:27,889:INFO:flask_appbuilder.security.sqla.manager:Added Permission can chart on UserStatsChartView to role Admin
2015-10-06 18:24:27,902:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on User's Statistics
2015-10-06 18:24:27,910:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on User's Statistics to role Admin
2015-10-06 18:24:27,915:INFO:flask_appbuilder.base:Registering class PermissionModelView on menu Base Permissions
2015-10-06 18:24:27,928:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can list on PermissionModelView
2015-10-06 18:24:27,936:INFO:flask_appbuilder.security.sqla.manager:Added Permission can list on PermissionModelView to role Admin
2015-10-06 18:24:27,949:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on Base Permissions
2015-10-06 18:24:27,956:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on Base Permissions to role Admin
2015-10-06 18:24:27,961:INFO:flask_appbuilder.base:Registering class ViewMenuModelView on menu Views/Menus
2015-10-06 18:24:27,973:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can list on ViewMenuModelView
2015-10-06 18:24:27,981:INFO:flask_appbuilder.security.sqla.manager:Added Permission can list on ViewMenuModelView to role Admin
2015-10-06 18:24:27,993:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on Views/Menus
2015-10-06 18:24:28,002:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on Views/Menus to role Admin
2015-10-06 18:24:28,007:INFO:flask_appbuilder.base:Registering class PermissionViewModelView on menu Permission on Views/Menus
2015-10-06 18:24:28,021:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: can list on PermissionViewModelView
2015-10-06 18:24:28,030:INFO:flask_appbuilder.security.sqla.manager:Added Permission can list on PermissionViewModelView to role Admin
2015-10-06 18:24:28,041:INFO:flask_appbuilder.security.sqla.manager:Created Permission View: menu access on Permission on Views/Menus
2015-10-06 18:24:28,050:INFO:flask_appbuilder.security.sqla.manager:Added Permission menu access on Permission on Views/Menus to role Admin
Was unable to import panoramix Error: No module named markdown

Connect to Redshift (schema other than public)

Using Postgresql dialect uses psycopg2 postgresql+psycopg2://scott:tiger@localhost/mydatabase , I was able to connect to redshift, however, I was not able to fetch any tables in schema other than public! Is there any way we get fetch tables from schema other than public.

Error: make_declarative_base() takes exactly 1 argument (2 given)

I installed caravel on Windows 10 (Python 2.7) and got the following error message after following the installation steps:

C:\Anaconda2\Scripts>fabmanager create-admin --app caravel
Username [admin]: wizzz
User first name [admin]: Wiii
User last name [user]: Zzzz
Email [[email protected]]: [email protected]
Password:
Repeat for confirmation:
Was unable to import caravel Error: make_declarative_base() takes exactly 1 argument (2 given)

Thanks,

Docker for panoramix

We are trying using panoramix in docker, and I build a repo: https://github.com/wbchn/panoramix-docker .

But I found after fabmanager create-admin, the first admin could not login panoramix page, it told me password was wrong. Is there other way to auth, or setting a default user(could change password after login)?

Chrome javascript debugger fails setting breakpoints

Hi,

I'm having problems while debugging js code on chrome, looks like it fails detecting where to place the breakpoint.
I've found some posts related to webpack and line numbers error, did you have same issue?

Thanks

How can I specify the timezone in panoramix

Hi,
when I used the panoramix ,I have a trouble in the timezone.If the panoramix can support other timezones besides UTC?And How can I specify the timezone,such as "Asia/ShangHai"

And what's you advice here?Thanks!

Todo: New Viz

Hey there,

Thanks airbnb for making this open source. I am Product Designer from CS and ML background. I can see Caravel TODO and found New viz task which includes.

  • Maps that use geocodes
  • Time animated scatter plots
  • Horizon charts
  • Calendar heatmap
  • Chord diagram

I would love to contribute. It would be really great if I would get to know more about this so that i could create first draft of design.

Thanks,
Milap :)

Bug in Dashboard

In dashboard, if two of the slices are of Pivot view, only one slice displays the data and the other slice will be blank. When the blank slice is refreshed, it's data is being reflected in other slice.

'Circular dependency detected' with TableViz query

Hi,

Having this error (I can't explain why) while using Table visualization with simple queries like "SELECT field, count(*) from table".
For some reason json_iso_dttm_ser is called for integer values. This function returns same object if it's not a dttm ans this causes the error.

I can't understand why is considering an integer as a non serializable but by the way this function should be returning a serialized value or raising an error.

I changed implementation in this way at utils.py:

def json_iso_dttm_ser(obj):
    """
    json serializer that deals with dates

    >>> dttm = datetime(1970, 1, 1)
    >>> json.dumps({'dttm': dttm}, default=json_iso_dttm_ser)
    '{"dttm": "1970-01-01T00:00:00"}'
    """
    if hasattr(obj, 'isoformat'):
        return obj.isoformat()
    return str(obj)

Please let mw know if you have issued same problem.
Thanks

HTTP Error 404 when refresh Druid Metadata

capture

2016-03-24 08:22:51,694:INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): 10.196.11.19
2016-03-24 08:22:51,701:DEBUG:requests.packages.urllib3.connectionpool:"GET /druid/coordinator/v1/metadata/datasources HTTP/1.1" 200 None
2016-03-24 08:22:51,715:INFO:werkzeug:10.196.11.238 - - [24/Mar/2016 08:22:51] "GET /dashed/refresh_datasources/ HTTP/1.1" 302 -
2016-03-24 08:22:51,722:INFO:werkzeug:10.196.11.238 - - [24/Mar/2016 08:22:51] "GET /datasourcemodelview/list/ HTTP/1.1" 404 -

Static assets not resolving

Though I'm new to the Flask project setup, I think I have everything setup properly. When I run the app, I don't get the css theme due to being unable to reference the file: /static/assets/javascripts/dist/css-theme.entry.js. This file does exist in that location, but the browser can't seem to resolve it. Any help highly appreciated.

Error on creating user and starting

Hi,
I'm trying to install Panoramix.
Server is Centos 6.4 and Phyton version is 3.3

After installation I've first error on creating new user and than starting proccess.

Here the logs:

[root@132 panoramix]# fabmanager create-admin
Username [admin]: 
User first name [admin]: 
User last name [user]: 
Email [[email protected]]: 
Password: 
Repeat for confirmation: 
Repeat for confirmation: 
2015-07-27 11:20:36,073:WARNING:flask_appbuilder.security.manager:No user yet created, use fabmanager command to do it.
2015-07-27 11:20:36,075:INFO:flask_appbuilder.base:Registering class MyIndexView on menu 
2015-07-27 11:20:36,080:INFO:flask_appbuilder.base:Registering class UtilView on menu 
2015-07-27 11:20:36,083:INFO:flask_appbuilder.base:Registering class LocaleView on menu 
2015-07-27 11:20:36,087:INFO:flask_appbuilder.base:Registering class ResetPasswordView on menu 
2015-07-27 11:20:36,099:INFO:flask_appbuilder.base:Registering class ResetMyPasswordView on menu 
2015-07-27 11:20:36,110:INFO:flask_appbuilder.base:Registering class AuthDBView on menu 
2015-07-27 11:20:36,119:INFO:flask_appbuilder.base:Registering class UserDBModelView on menu List Users
2015-07-27 11:20:36,160:INFO:flask_appbuilder.base:Registering class RoleModelView on menu List Roles
2015-07-27 11:20:36,200:INFO:flask_appbuilder.base:Registering class UserStatsChartView on menu User's Statistics
2015-07-27 11:20:36,236:INFO:flask_appbuilder.base:Registering class PermissionModelView on menu Base Permissions
2015-07-27 11:20:36,268:INFO:flask_appbuilder.base:Registering class ViewMenuModelView on menu Views/Menus
2015-07-27 11:20:36,297:INFO:flask_appbuilder.base:Registering class PermissionViewModelView on menu Permission on Views/Menus
Was unable to import app Error: invalid syntax (models.py, line 49)

On start:

[root@132 panoramix]# python run.py 
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import app
  File "/usr/local/panoramix/app/__init__.py", line 2, in <module>
    from flask import Flask
ImportError: No module named flask

Thanks
Maurizio

run.py use port=8081

port used by run.py is the Coordinator default one.

If it's possible to change to another one in case if someone test this application in the same server to the coordinator

Run unit tests against sqlite and mysql, eventually postgres

$ panoramix db upgrade
...
INFO  [alembic.migration] Running upgrade 289ce07647b -> 1a48a5411020, adding slug to dash
Traceback (most recent call last):
  File "/home/james/.local/bin/panoramix", line 374, in <module>
    manager.run()
  File "/home/james/.local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/home/james/.local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/home/james/.local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "/home/james/.local/lib/python2.7/site-packages/flask_migrate/__init__.py", line 216, in upgrade
    command.upgrade(config, revision, sql=sql, tag=tag)
  File "/home/james/.local/lib/python2.7/site-packages/alembic/command.py", line 165, in upgrade
    script.run_env()
  File "/home/james/.local/lib/python2.7/site-packages/alembic/script.py", line 390, in run_env
    util.load_python_file(self.dir, 'env.py')
  File "/home/james/.local/lib/python2.7/site-packages/alembic/util.py", line 244, in load_python_file
    module = load_module_py(module_id, path)
  File "/home/james/.local/lib/python2.7/site-packages/alembic/compat.py", line 79, in load_module_py
    mod = imp.load_source(module_id, path, fp)
  File "/home/james/.local/lib/python2.7/site-packages/panoramix/migrations/env.py", line 89, in <module>
    run_migrations_online()
  File "/home/james/.local/lib/python2.7/site-packages/panoramix/migrations/env.py", line 82, in run_migrations_online
    context.run_migrations()
  File "<string>", line 7, in run_migrations
  File "/home/james/.local/lib/python2.7/site-packages/alembic/environment.py", line 738, in run_migrations
    self.get_context().run_migrations(**kw)
  File "/home/james/.local/lib/python2.7/site-packages/alembic/migration.py", line 311, in run_migrations
    step.migration_fn(**kw)
  File "/home/james/.local/lib/python2.7/site-packages/panoramix/migrations/versions/1a48a5411020_adding_slug_to_dash.py", line 18, in upgrade
    op.create_unique_constraint('idx_unique_slug', 'dashboards', ['slug'])
  File "<string>", line 7, in create_unique_constraint
  File "/home/james/.local/lib/python2.7/site-packages/alembic/operations.py", line 806, in create_unique_constraint
    schema=schema, **kw)
  File "/home/james/.local/lib/python2.7/site-packages/alembic/ddl/sqlite.py", line 34, in add_constraint
    "No support for ALTER of constraints in SQLite dialect")
NotImplementedError: No support for ALTER of constraints in SQLite dialect

HTTP Error 405: Method Not Allowed

Hi
I was trying to install panoramix, I installed it following installation guide, added my cluster and hit "Refresh Druid Metadata" button which ended up with IO error

2015-10-22 19:16:17,432:INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): 10.0.3.54
2015-10-22 19:16:17,437:DEBUG:requests.packages.urllib3.connectionpool:"GET /druid/coordinator/v1/datasources HTTP/1.1" 200 None
2015-10-22 19:16:17,467:INFO:werkzeug:10.0.0.100 - - [22/Oct/2015 19:16:17] "GET /panoramix/refresh_datasources/ HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/flask_appbuilder/security/decorators.py", line 26, in wraps
    return f(self, *args, **kwargs)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/panoramix/views.py", line 411, in refresh_datasources
    cluster.refresh_datasources()
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/panoramix/models.py", line 636, in refresh_datasources
    Datasource.sync_to_db(datasource, self)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/panoramix/models.py", line 718, in sync_to_db
    cols = datasource.latest_metadata()
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/panoramix/models.py", line 692, in latest_metadata
    results = client.time_boundary(datasource=self.datasource_name)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/pydruid/client.py", line 550, in time_boundary
    return self.__post(self.query_dict)
  File "/home/mvince/.virtualenvs/druid/lib/python2.7/site-packages/pydruid/client.py", line 137, in __post
    e, err,json.dumps(self.query_dict, indent=4)))
IOError: HTTP Error 405: Method Not Allowed 
 Druid Error: None 
 Query is: {
    "queryType": "timeBoundary", 
    "dataSource": "DAU_v1"
}

Do I need to set some other permissions?

I`m using druid 0.8.1 and python 2.7.3
also curling coordinator endpoint works as expected

t 22 17:30:55 2015 from 92.240.230.58
$ curl -XGET '{coordinator_host}:8081/druid/coordinator/v1/datasources' 
["DAU_v1","registrations_v1"]

Not able to create user

I installed panoramix with python 2.6 and I am getting this error when I try to create user. There were some issues while installing the whole package and I install numpy, cryptography separately.
root@hostname:/home/user# fabmanager create-admin --app panoramix
Username [admin]: admin
User first name [admin]: admin
User last name [user]: admin
Email [[email protected]]: [email protected]
Password:
Repeat for confirmation:
2016-02-18 07:29:29,306:WARNING:flask_appbuilder.security.manager:No user yet created, use fabmanager command to do it.
2016-02-18 07:29:29,308:INFO:flask_appbuilder.base:Registering class MyIndexView on menu
2016-02-18 07:29:29,313:INFO:flask_appbuilder.base:Registering class UtilView on menu
2016-02-18 07:29:29,317:INFO:flask_appbuilder.base:Registering class LocaleView on menu
2016-02-18 07:29:29,321:INFO:flask_appbuilder.base:Registering class ResetPasswordView on menu
2016-02-18 07:29:29,334:INFO:flask_appbuilder.base:Registering class ResetMyPasswordView on menu
2016-02-18 07:29:29,343:INFO:flask_appbuilder.base:Registering class UserInfoEditView on menu
2016-02-18 07:29:29,355:INFO:flask_appbuilder.base:Registering class AuthDBView on menu
2016-02-18 07:29:29,363:INFO:flask_appbuilder.base:Registering class UserDBModelView on menu List Users
2016-02-18 07:29:29,401:INFO:flask_appbuilder.base:Registering class RoleModelView on menu List Roles
2016-02-18 07:29:29,435:INFO:flask_appbuilder.base:Registering class UserStatsChartView on menu User's Statistics
2016-02-18 07:29:29,455:INFO:flask_appbuilder.base:Registering class PermissionModelView on menu Base Permissions
2016-02-18 07:29:29,478:INFO:flask_appbuilder.base:Registering class ViewMenuModelView on menu Views/Menus
2016-02-18 07:29:29,499:INFO:flask_appbuilder.base:Registering class PermissionViewModelView on menu Permission on Views/Menus
Was unable to import panoramix Error: invalid syntax (views.py, line 547)

ValueError: No JSON object could be decoded

Hi,
When I added druid sources and then I refreshed druid metadata,I got the exceptions:

      File "/usr/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/lib/python2.7/site-packages/flask_appbuilder/security/decorators.py", line 26, in wraps
return f(self, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/panoramix/views.py", line 411, in refresh_datasources
cluster.refresh_datasources()
File "/usr/lib/python2.7/site-packages/panoramix/models.py", line 634, in refresh_datasources
datasources = json.loads(requests.get(endpoint).text)
File "/usr/lib64/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python2.7/json/decoder.py", line 384, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

And what's you advice here?Thanks!

Fix y axis on graphs with %s

When you have a graph with y axis between 0 and 1 it appears to show them in "m"

screen shot 2016-01-14 at 11 22 28 am

All of these should really be their "m" value / 10 and in percent. So the top line is in reality values of around 6%

Query Time Lookups for Dimensions in Druid

This feature comes from http://druid.io/docs/latest/querying/lookups.html

Use Case:
Have dimension -> values mapping at query time. In real world we can have small set of mappings approx 10 - 20 or large mappings > 1000. When we visualize the data in Caravel, then the current version just shows the dimension values as integers if the data in druid is coming from fact table (metrics and dimensions). As we don't have joins in druid, we want query time lookups to get actual value of the dimension in charts and graphs. I have been able to hack the code and test this feature with map lookup feature. The query generator creates query in this form:

{
    "queryType": "groupBy",
    "dataSource": "XXX",
    "intervals": [
        "2016-03-16/2016-03-17"
    ],
    "granularity": "day",
    "dimensions": [
        {
            "type": "extraction",
            "dimension": "ABC",
            "outputName": "ABC",
            "extractionFn": {
                "type": "lookup",
                "lookup": {
                    "type": "map",
                    "map": {
                        "1": "sid",
                        "2": "gupta"
                    }
                },
                "retainMissingValue": true,
                "injective": false
            }
        }
    ],
    "aggregations": [
        {
            "type": "doubleSum",
            "fieldName": "XYZ",
            "name": "XYZ"
        },
        {
            "type": "longSum",
            "fieldName": "PQR",
            "name": "PQR"
        }
    ]
}

I want to discuss the design of this feature before coding it out and making it available for PR.
I am currently thinking of having 2 types of lookups: static lookup (small key value pairs) and dynamic lookups (jdbc lookups). For static lookup we can either have a function to preload the data from json mapping in the code or let users input key value mappings from the UI http://hostname:port/druiddatasourcemodelview/edit/2

Any thoughts? I still have to make jdbc lookups to work

Can't create word cloud

Every try to draw word cloud ends up with this exception:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/local/lib/python2.7/dist-packages/flask_appbuilder/security/decorators.py", line 26, in wraps
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/panoramix/utils.py", line 202, in wrapper
    return f(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/panoramix/views.py", line 395, in explore
    payload = obj.get_json()
  File "/usr/local/lib/python2.7/dist-packages/panoramix/viz.py", line 204, in get_json
    'data': json.loads(self.get_json_data()),
  File "/usr/local/lib/python2.7/dist-packages/panoramix/viz.py", line 377, in get_json_data
    df.columns = ['text', 'size']
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 2161, in __setattr__
    return object.__setattr__(self, name, value)
  File "pandas/src/properties.pyx", line 65, in pandas.lib.AxisProperty.__set__ (pandas/lib.c:42548)

  File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 413, in _set_axis
    self._data.set_axis(axis, labels)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/internals.py", line 2219, in set_axis
    'new values have %d elements' % (old_len, new_len))
ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements

Fix documentation

Hi,

documentation ask to launch : python app.py
But it's
python run.py

Thank you,

panoramix on safari

Hi,
Nice application! Anybody tested the dashboard on safari? Dashboard slice/table goes in a infinite loop to load. Any idea/solution known for that
thanks

  • Chak

I could not install the application through pip

download and install as described, but the application installation fails:
pip install panoramix # Done well.
fabmanager create-admin --app panoramix # THIS COMMAND FAILS

Log result:

sqlalchemy.exc.CircularDependencyError: Circular dependency detected. Cycles: set([Table('tables', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('table_name', String(length=255), table=), Column('main_datetime_column_id', Integer(), ForeignKey('table_columns.id'), table=), Column('default_endpoint', Text(), table=), Column('database_id', Integer(), ForeignKey('dbs.id'), table=, nullable=False), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f5009b0>), default=ColumnDefault(<function at 0x7fde2f500cf8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f500d70>)), schema=None), Table('table_columns', MetaData(bind=None), Column('created_on', DateTime(), table=<table_columns>, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=<table_columns>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=<table_columns>, primary_key=True, nullable=False), Column('table_id', Integer(), ForeignKey('tables.id'), table=<table_columns>), Column('column_name', String(length=256), table=<table_columns>), Column('is_dttm', Boolean(), table=<table_columns>, default=ColumnDefault(True)), Column('is_active', Boolean(), table=<table_columns>, default=ColumnDefault(True)), Column('type', String(length=32), table=<table_columns>, default=ColumnDefault('')), Column('groupby', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('count_distinct', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('sum', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('max', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('min', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('filterable', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('description', Text(), table=<table_columns>, default=ColumnDefault('')), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<table_columns>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4aa9b0>), default=ColumnDefault(<function at 0x7fde2f4aa8c0>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<table_columns>, nullable=False, default=ColumnDefault(<function at 0x7fde2f4aaa28>)), schema=None)]) all edges: set([(Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('columns', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('datasource_name', String(length=256), ForeignKey('datasources.datasource_name'), table=), Column('column_name', String(length=256), table=), Column('is_active', Boolean(), table=, default=ColumnDefault(True)), Column('type', String(length=32), table=), Column('groupby', Boolean(), table=, default=ColumnDefault(False)), Column('count_distinct', Boolean(), table=, default=ColumnDefault(False)), Column('sum', Boolean(), table=, default=ColumnDefault(False)), Column('max', Boolean(), table=, default=ColumnDefault(False)), Column('min', Boolean(), table=, default=ColumnDefault(False)), Column('filterable', Boolean(), table=, default=ColumnDefault(False)), Column('description', Text(), table=), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f484c80>), default=ColumnDefault(<function at 0x7fde2f484668>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f484cf8>)), schema=None)), (Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('tables', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('table_name', String(length=255), table=), Column('main_datetime_column_id', Integer(), ForeignKey('table_columns.id'), table=), Column('default_endpoint', Text(), table=), Column('database_id', Integer(), ForeignKey('dbs.id'), table=, nullable=False), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f5009b0>), default=ColumnDefault(<function at 0x7fde2f500cf8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f500d70>)), schema=None)), (Table('datasources', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('datasource_name', String(length=255), table=), Column('is_featured', Boolean(), table=, default=ColumnDefault(False)), Column('is_hidden', Boolean(), table=, default=ColumnDefault(False)), Column('description', Text(), table=), Column('default_endpoint', Text(), table=), Column('user_id', Integer(), ForeignKey('ab_user.id'), table=), Column('cluster_name', String(length=255), ForeignKey('clusters.cluster_name'), table=), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4842a8>), default=ColumnDefault(<function at 0x7fde2f484410>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f484230>)), schema=None), Table('metrics', MetaData(bind=None), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('metric_name', String(length=512), table=), Column('verbose_name', String(length=1024), table=), Column('metric_type', String(length=32), table=), Column('datasource_name', String(length=256), ForeignKey('datasources.datasource_name'), table=), Column('json', Text(), table=), Column('description', Text(), table=), schema=None)), (Table('tables', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('table_name', String(length=255), table=), Column('main_datetime_column_id', Integer(), ForeignKey('table_columns.id'), table=), Column('default_endpoint', Text(), table=), Column('database_id', Integer(), ForeignKey('dbs.id'), table=, nullable=False), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f5009b0>), default=ColumnDefault(<function at 0x7fde2f500cf8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f500d70>)), schema=None), Table('table_columns', MetaData(bind=None), Column('created_on', DateTime(), table=<table_columns>, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=<table_columns>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=<table_columns>, primary_key=True, nullable=False), Column('table_id', Integer(), ForeignKey('tables.id'), table=<table_columns>), Column('column_name', String(length=256), table=<table_columns>), Column('is_dttm', Boolean(), table=<table_columns>, default=ColumnDefault(True)), Column('is_active', Boolean(), table=<table_columns>, default=ColumnDefault(True)), Column('type', String(length=32), table=<table_columns>, default=ColumnDefault('')), Column('groupby', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('count_distinct', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('sum', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('max', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('min', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('filterable', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('description', Text(), table=<table_columns>, default=ColumnDefault('')), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<table_columns>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4aa9b0>), default=ColumnDefault(<function at 0x7fde2f4aa8c0>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<table_columns>, nullable=False, default=ColumnDefault(<function at 0x7fde2f4aaa28>)), schema=None)), (Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('sql_metrics', MetaData(bind=None), Column('created_on', DateTime(), table=<sql_metrics>, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=<sql_metrics>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=<sql_metrics>, primary_key=True, nullable=False), Column('metric_name', String(length=512), table=<sql_metrics>), Column('verbose_name', String(length=1024), table=<sql_metrics>), Column('metric_type', String(length=32), table=<sql_metrics>), Column('table_id', Integer(), ForeignKey('tables.id'), table=<sql_metrics>), Column('expression', Text(), table=<sql_metrics>), Column('description', Text(), table=<sql_metrics>), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<sql_metrics>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4aa500>), default=ColumnDefault(<function at 0x7fde2f4aa488>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<sql_metrics>, nullable=False, default=ColumnDefault(<function at 0x7fde2f4aa578>)), schema=None)), (Table('ab_role', MetaData(bind=None), Column('id', Integer(), table=<ab_role>, primary_key=True, nullable=False, default=Sequence('ab_role_id_seq', metadata=MetaData(bind=None))), Column('name', String(length=64), table=<ab_role>, nullable=False), schema=None), Table('ab_user_role', MetaData(bind=None), Column('id', Integer(), table=<ab_user_role>, primary_key=True, nullable=False, default=Sequence('ab_user_role_id_seq', metadata=MetaData(bind=None))), Column('user_id', Integer(), ForeignKey('ab_user.id'), table=<ab_user_role>), Column('role_id', Integer(), ForeignKey('ab_role.id'), table=<ab_user_role>), schema=None)), (Table('ab_permission', MetaData(bind=None), Column('id', Integer(), table=<ab_permission>, primary_key=True, nullable=False, default=Sequence('ab_permission_id_seq', metadata=MetaData(bind=None))), Column('name', String(length=100), table=<ab_permission>, nullable=False), schema=None), Table('ab_permission_view', MetaData(bind=None), Column('id', Integer(), table=<ab_permission_view>, primary_key=True, nullable=False, default=Sequence('ab_permission_view_id_seq', metadata=MetaData(bind=None))), Column('permission_id', Integer(), ForeignKey('ab_permission.id'), table=<ab_permission_view>), Column('view_menu_id', Integer(), ForeignKey('ab_view_menu.id'), table=<ab_permission_view>), schema=None)), (Table('ab_role', MetaData(bind=None), Column('id', Integer(), table=<ab_role>, primary_key=True, nullable=False, default=Sequence('ab_role_id_seq', metadata=MetaData(bind=None))), Column('name', String(length=64), table=<ab_role>, nullable=False), schema=None), Table('ab_permission_view_role', MetaData(bind=None), Column('id', Integer(), table=<ab_permission_view_role>, primary_key=True, nullable=False, default=Sequence('ab_permission_view_role_id_seq', metadata=MetaData(bind=None))), Column('permission_view_id', Integer(), ForeignKey('ab_permission_view.id'), table=<ab_permission_view_role>), Column('role_id', Integer(), ForeignKey('ab_role.id'), table=<ab_permission_view_role>), schema=None)), (Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('table_columns', MetaData(bind=None), Column('created_on', DateTime(), table=<table_columns>, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=<table_columns>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=<table_columns>, primary_key=True, nullable=False), Column('table_id', Integer(), ForeignKey('tables.id'), table=<table_columns>), Column('column_name', String(length=256), table=<table_columns>), Column('is_dttm', Boolean(), table=<table_columns>, default=ColumnDefault(True)), Column('is_active', Boolean(), table=<table_columns>, default=ColumnDefault(True)), Column('type', String(length=32), table=<table_columns>, default=ColumnDefault('')), Column('groupby', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('count_distinct', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('sum', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('max', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('min', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('filterable', Boolean(), table=<table_columns>, default=ColumnDefault(False)), Column('description', Text(), table=<table_columns>, default=ColumnDefault('')), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<table_columns>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4aa9b0>), default=ColumnDefault(<function at 0x7fde2f4aa8c0>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<table_columns>, nullable=False, default=ColumnDefault(<function at 0x7fde2f4aaa28>)), schema=None)), (Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('dbs', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('database_name', String(length=255), table=), Column('sqlalchemy_uri', String(length=1024), table=), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f5006e0>), default=ColumnDefault(<function at 0x7fde2f50e938>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f500758>)), schema=None)), (Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('ab_user_role', MetaData(bind=None), Column('id', Integer(), table=<ab_user_role>, primary_key=True, nullable=False, default=Sequence('ab_user_role_id_seq', metadata=MetaData(bind=None))), Column('user_id', Integer(), ForeignKey('ab_user.id'), table=<ab_user_role>), Column('role_id', Integer(), ForeignKey('ab_role.id'), table=<ab_user_role>), schema=None)), (Table('ab_view_menu', MetaData(bind=None), Column('id', Integer(), table=<ab_view_menu>, primary_key=True, nullable=False, default=Sequence('ab_view_menu_id_seq', metadata=MetaData(bind=None))), Column('name', String(length=100), table=<ab_view_menu>, nullable=False), schema=None), Table('ab_permission_view', MetaData(bind=None), Column('id', Integer(), table=<ab_permission_view>, primary_key=True, nullable=False, default=Sequence('ab_permission_view_id_seq', metadata=MetaData(bind=None))), Column('permission_id', Integer(), ForeignKey('ab_permission.id'), table=<ab_permission_view>), Column('view_menu_id', Integer(), ForeignKey('ab_view_menu.id'), table=<ab_permission_view>), schema=None)), (Table('dbs', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('database_name', String(length=255), table=), Column('sqlalchemy_uri', String(length=1024), table=), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f5006e0>), default=ColumnDefault(<function at 0x7fde2f50e938>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f500758>)), schema=None), Table('tables', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('table_name', String(length=255), table=), Column('main_datetime_column_id', Integer(), ForeignKey('table_columns.id'), table=), Column('default_endpoint', Text(), table=), Column('database_id', Integer(), ForeignKey('dbs.id'), table=, nullable=False), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f5009b0>), default=ColumnDefault(<function at 0x7fde2f500cf8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f500d70>)), schema=None)), (Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('clusters', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('cluster_name', String(length=255), table=), Column('coordinator_host', String(length=256), table=), Column('coordinator_port', Integer(), table=), Column('coordinator_endpoint', String(length=256), table=), Column('broker_host', String(length=256), table=), Column('broker_port', Integer(), table=), Column('broker_endpoint', String(length=256), table=), Column('metadata_last_refreshed', DateTime(), table=), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4aab90>), default=ColumnDefault(<function at 0x7fde2f4aad70>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f4aab18>)), schema=None)), (Table('ab_permission_view', MetaData(bind=None), Column('id', Integer(), table=<ab_permission_view>, primary_key=True, nullable=False, default=Sequence('ab_permission_view_id_seq', metadata=MetaData(bind=None))), Column('permission_id', Integer(), ForeignKey('ab_permission.id'), table=<ab_permission_view>), Column('view_menu_id', Integer(), ForeignKey('ab_view_menu.id'), table=<ab_permission_view>), schema=None), Table('ab_permission_view_role', MetaData(bind=None), Column('id', Integer(), table=<ab_permission_view_role>, primary_key=True, nullable=False, default=Sequence('ab_permission_view_role_id_seq', metadata=MetaData(bind=None))), Column('permission_view_id', Integer(), ForeignKey('ab_permission_view.id'), table=<ab_permission_view_role>), Column('role_id', Integer(), ForeignKey('ab_role.id'), table=<ab_permission_view_role>), schema=None)), (Table('tables', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('table_name', String(length=255), table=), Column('main_datetime_column_id', Integer(), ForeignKey('table_columns.id'), table=), Column('default_endpoint', Text(), table=), Column('database_id', Integer(), ForeignKey('dbs.id'), table=, nullable=False), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f5009b0>), default=ColumnDefault(<function at 0x7fde2f500cf8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f500d70>)), schema=None), Table('sql_metrics', MetaData(bind=None), Column('created_on', DateTime(), table=<sql_metrics>, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=<sql_metrics>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=<sql_metrics>, primary_key=True, nullable=False), Column('metric_name', String(length=512), table=<sql_metrics>), Column('verbose_name', String(length=1024), table=<sql_metrics>), Column('metric_type', String(length=32), table=<sql_metrics>), Column('table_id', Integer(), ForeignKey('tables.id'), table=<sql_metrics>), Column('expression', Text(), table=<sql_metrics>), Column('description', Text(), table=<sql_metrics>), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<sql_metrics>, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4aa500>), default=ColumnDefault(<function at 0x7fde2f4aa488>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<sql_metrics>, nullable=False, default=ColumnDefault(<function at 0x7fde2f4aa578>)), schema=None)), (Table('ab_user', MetaData(bind=None), Column('id', Integer(), table=<ab_user>, primary_key=True, nullable=False, default=Sequence('ab_user_id_seq', metadata=MetaData(bind=None))), Column('first_name', String(length=64), table=<ab_user>, nullable=False), Column('last_name', String(length=64), table=<ab_user>, nullable=False), Column('username', String(length=64), table=<ab_user>, nullable=False), Column('password', String(length=256), table=<ab_user>), Column('active', Boolean(), table=<ab_user>), Column('email', String(length=64), table=<ab_user>, nullable=False), Column('last_login', DateTime(), table=<ab_user>), Column('login_count', Integer(), table=<ab_user>), Column('fail_login_count', Integer(), table=<ab_user>), Column('created_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71a28>)), Column('changed_on', DateTime(), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c71ed8>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c08>)), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=<ab_user>, default=ColumnDefault(<function at 0x7fde37c30c80>)), schema=None), Table('datasources', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('datasource_name', String(length=255), table=), Column('is_featured', Boolean(), table=, default=ColumnDefault(False)), Column('is_hidden', Boolean(), table=, default=ColumnDefault(False)), Column('description', Text(), table=), Column('default_endpoint', Text(), table=), Column('user_id', Integer(), ForeignKey('ab_user.id'), table=), Column('cluster_name', String(length=255), ForeignKey('clusters.cluster_name'), table=), Column('changed_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde2f4842a8>), default=ColumnDefault(<function at 0x7fde2f484410>)), Column('created_by_fk', Integer(), ForeignKey('ab_user.id'), table=, nullable=False, default=ColumnDefault(<function at 0x7fde2f484230>)), schema=None)), (Table('datasources', MetaData(bind=None), Column('created_on', DateTime(), table=, nullable=False, default=ColumnDefault(<function at 0x7fde37c62b18>)), Column('changed_on', DateTime(), table=, nullable=False, onupdate=ColumnDefault(<function at 0x7fde37c62c08>), default=ColumnDefault(<function at 0x7fde37c62b90>)), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('datasource_name', String(length=255), table=), Column('is_featured', Boolean(), table=

Dynamic Filter Issue

when I add 2 separate dynamic filters on the dashboard with the same data source. So lets say they are filters X and Y. When I select a dimension in X and a dimension in Y simultaneously - I notice that the labels/values of filter Y gets changed to filter X and filter X's labels/values disappears.

Exception occurred when pip install panoramix

when I pip install panoramix,I got some exceptions:

Installing collected packages: panoramix
Running setup.py install for panoramix
changing mode of build/scripts-2.6/panoramix from 644 to 755
SyntaxError: ('invalid syntax', ('/usr/lib/python2.6/site-packages/panoramix/forms.py', 206, 52, " field_css_classes = {k: ['form-control'] for k in px_form_fields.keys()}\n"))

SyntaxError: ('invalid syntax', ('/usr/lib/python2.6/site-packages/panoramix/viz.py', 57, 15, '            for k in form_data.keys()\n'))

SyntaxError: ('invalid syntax', ('/usr/lib/python2.6/site-packages/panoramix/models.py', 361, 40, '        cols = {col.column_name: col for col in self.columns}\n'))

SyntaxError: ('invalid syntax', ('/usr/lib/python2.6/site-packages/panoramix/views.py', 401, 40, "                int(o['slice_id']):o for o in json.loads(dashboard.position_json)}\n"))

changing mode of /usr/bin/panoramix to 755

And what's you advise here?Thanks

'DruidDatasource' object has no attribute 'database'

In http://localhost:8088/caravel/explore/druid/1/

Traceback (most recent call last):
  File "/projects/druid/panoramix_test/caravel/views.py", line 445, in explore
    payload = obj.get_json()
  File "/projects/druid/panoramix_test/caravel/viz.py", line 236, in get_json
    cache_timeout = self.cache_timeout
  File "/projects/druid/panoramix_test/caravel/viz.py", line 222, in cache_timeout
    self.datasource.database.cache_timeout or
AttributeError: 'DruidDatasource' object has no attribute 'database'

the search intervals time is not accuracy

hi. dear

the since text that I fill it with -1,but the intervals beginning time is 01:00:00,it must be 2015-11-06T17:27:51+00:00.is this something wrong with me?

"intervals": "2015-11-06T01:00:00+00:00/2015-11-06T18:27:51+00:00",

New feature: Dashboard override granularity

Hi there,

I'd like to start implementing granularity override.

My notes

Like in Grafana (http://grafana.org/) I'd like to have a time period control for the dashboard.
It will allow users to select the period (granularity) to visualize.

Todo:

  • server: Allow dashboard/id/ to receive optional parameters: since, until
  • server/client: Add granularity property to dashboard: {"granularity":{"since":"now-1d","until":"now"}}
  • client: Change slice.querystring to read granularity and send to the slice endpoint
    extra bonus:
  • client: Add granularity-picker to dashboard (https://github.com/grafana/grafana/tree/master/public/app/features/dashboard/timepicker)
    • Modify granularity-picker to allow "Default" that means the granularity setup on each slide
  • Add new property to dashboard definition: granularity that will override slice ones.

Comments? Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.