diff --git a/panoramix/__init__.py b/panoramix/__init__.py
index d90c5507711..e23539f692c 100644
--- a/panoramix/__init__.py
+++ b/panoramix/__init__.py
@@ -4,7 +4,6 @@ from flask import Flask, redirect
from flask.ext.appbuilder import SQLA, AppBuilder, IndexView
from flask.ext.appbuilder.baseviews import expose
from flask.ext.migrate import Migrate
-from panoramix import config, views
APP_DIR = os.path.dirname(__file__)
@@ -34,3 +33,4 @@ appbuilder = AppBuilder(
sm = appbuilder.sm
get_session = appbuilder.get_session
+from panoramix import config, views
diff --git a/panoramix/config.py b/panoramix/config.py
index 27699b05737..031b025ed4a 100644
--- a/panoramix/config.py
+++ b/panoramix/config.py
@@ -1,3 +1,9 @@
+"""
+All configuration in this file can be overridden by providing a local_config
+in your PYTHONPATH.
+
+There' a ``from local_config import *`` at the end of this file.
+"""
import os
from flask_appbuilder.security.manager import AUTH_DB
# from flask_appbuilder.security.manager import (
@@ -5,12 +11,6 @@ from flask_appbuilder.security.manager import AUTH_DB
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
from dateutil import tz
-"""
-All configuration in this file can be overridden by providing a local_config
-in your PYTHONPATH.
-
-There' a ``from local_config import *`` at the end of this file.
-"""
# ---------------------------------------------------------
# Panoramix specifix config
@@ -133,5 +133,5 @@ CSS_THEME = '/static/assets/stylesheets/themes/panoramix-bootstrap-theme.css'
try:
from panoramix_config import *
-except:
+except Exception:
pass
diff --git a/panoramix/migrations/versions/1e2841a4128_.py b/panoramix/migrations/versions/1e2841a4128_.py
index 887ee38647d..330b3b217c0 100644
--- a/panoramix/migrations/versions/1e2841a4128_.py
+++ b/panoramix/migrations/versions/1e2841a4128_.py
@@ -12,15 +12,10 @@ down_revision = '5a7bad26f2a7'
from alembic import op
import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
def upgrade():
- ### commands auto generated by Alembic - please adjust! ###
op.add_column('table_columns', sa.Column('expression', sa.Text(), nullable=True))
- ### end Alembic commands ###
def downgrade():
- ### commands auto generated by Alembic - please adjust! ###
op.drop_column('table_columns', 'expression')
- ### end Alembic commands ###
diff --git a/panoramix/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py b/panoramix/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py
index 784657753f5..85b54bc5cc3 100644
--- a/panoramix/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py
+++ b/panoramix/migrations/versions/2929af7925ed_tz_offsets_in_data_sources.py
@@ -12,7 +12,6 @@ down_revision = '1e2841a4128'
from alembic import op
import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
def upgrade():
op.add_column('datasources', sa.Column('offset', sa.Integer(), nullable=True))
diff --git a/panoramix/migrations/versions/430039611635_log_more.py b/panoramix/migrations/versions/430039611635_log_more.py
index 8bb7cb7cc80..aec2b32ed95 100644
--- a/panoramix/migrations/versions/430039611635_log_more.py
+++ b/panoramix/migrations/versions/430039611635_log_more.py
@@ -12,7 +12,6 @@ down_revision = 'd827694c7555'
from alembic import op
import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
def upgrade():
op.add_column('logs', sa.Column('dashboard_id', sa.Integer(), nullable=True))
diff --git a/panoramix/migrations/versions/43df8de3a5f4_dash_json.py b/panoramix/migrations/versions/43df8de3a5f4_dash_json.py
index 410fc380b75..c56ddc8f5fb 100644
--- a/panoramix/migrations/versions/43df8de3a5f4_dash_json.py
+++ b/panoramix/migrations/versions/43df8de3a5f4_dash_json.py
@@ -12,10 +12,11 @@ down_revision = '7dbf98566af7'
from alembic import op
import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
+
def upgrade():
op.add_column('dashboards', sa.Column('json_metadata', sa.Text(), nullable=True))
+
def downgrade():
op.drop_column('dashboards', 'json_metadata')
diff --git a/panoramix/migrations/versions/5a7bad26f2a7_.py b/panoramix/migrations/versions/5a7bad26f2a7_.py
index ced2d6e0d14..66dc20aae35 100644
--- a/panoramix/migrations/versions/5a7bad26f2a7_.py
+++ b/panoramix/migrations/versions/5a7bad26f2a7_.py
@@ -12,7 +12,7 @@ down_revision = '4e6a06bad7a8'
from alembic import op
import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
+
def upgrade():
op.add_column('dashboards', sa.Column('css', sa.Text(), nullable=True))
diff --git a/panoramix/migrations/versions/7dbf98566af7_slice_description.py b/panoramix/migrations/versions/7dbf98566af7_slice_description.py
index b29e70d3d4d..329af9ef2d7 100644
--- a/panoramix/migrations/versions/7dbf98566af7_slice_description.py
+++ b/panoramix/migrations/versions/7dbf98566af7_slice_description.py
@@ -12,7 +12,6 @@ down_revision = '8e80a26a31db'
from alembic import op
import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
def upgrade():
op.add_column('slices', sa.Column('description', sa.Text(), nullable=True))
diff --git a/panoramix/migrations/versions/d827694c7555_css_templates.py b/panoramix/migrations/versions/d827694c7555_css_templates.py
index 523bedebcef..3b20e440559 100644
--- a/panoramix/migrations/versions/d827694c7555_css_templates.py
+++ b/panoramix/migrations/versions/d827694c7555_css_templates.py
@@ -12,7 +12,6 @@ down_revision = '43df8de3a5f4'
from alembic import op
import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
def upgrade():
diff --git a/panoramix/models.py b/panoramix/models.py
index e5785f7a683..93371a25369 100644
--- a/panoramix/models.py
+++ b/panoramix/models.py
@@ -2,10 +2,10 @@ from copy import deepcopy, copy
from collections import namedtuple
from datetime import timedelta, datetime
import json
+import logging
from six import string_types
import sqlparse
import requests
-import textwrap
from dateutil.parser import parse
from flask import flash
@@ -134,6 +134,7 @@ class Slice(Model, AuditMixinNullable):
try:
slice_params = json.loads(self.params)
except Exception as e:
+ logging.exception(e)
slice_params = {}
slice_params['slice_id'] = self.id
slice_params['slice_name'] = self.slice_name
@@ -150,7 +151,8 @@ class Slice(Model, AuditMixinNullable):
@property
def slice_link(self):
url = self.slice_url
- return '{self.slice_name}'.format(**locals())
+ return '{self.slice_name}'.format(
+ url=url, self=self)
@property
def js_files(self):
@@ -350,7 +352,8 @@ class SqlaTable(Model, Queryable, AuditMixinNullable):
@property
def table_link(self):
url = "/panoramix/explore/{self.type}/{self.id}/".format(self=self)
- return '{self.table_name}'.format(**locals())
+ return '{self.table_name}'.format(
+ url=url, self=self)
@property
def metrics_combo(self):
@@ -732,7 +735,8 @@ class DruidDatasource(Model, AuditMixinNullable, Queryable):
@property
def datasource_link(self):
url = "/panoramix/explore/{self.type}/{self.id}/".format(self=self)
- return '{self.datasource_name}'.format(**locals())
+ return '{self.datasource_name}'.format(
+ url=url, self=self)
def get_metric_obj(self, metric_name):
return [
diff --git a/panoramix/utils.py b/panoramix/utils.py
index feac0504418..38d6f8bda62 100644
--- a/panoramix/utils.py
+++ b/panoramix/utils.py
@@ -44,6 +44,7 @@ def parse_human_datetime(s):
Use the parsedatetime lib to return ``datetime.datetime`` from human
generated strings
+ >>> from datetime import date, timedelta
>>> parse_human_datetime('2015-04-03')
datetime.datetime(2015, 4, 3, 0, 0)
>>> parse_human_datetime('2/3/1969')
diff --git a/panoramix/views.py b/panoramix/views.py
index dcfb163dadc..dc22cd97f3b 100644
--- a/panoramix/views.py
+++ b/panoramix/views.py
@@ -167,6 +167,7 @@ class TableModelView(PanoramixModelView, DeleteMixin):
try:
table.fetch_metadata()
except Exception as e:
+ logging.exception(e)
flash(
"Table [{}] doesn't seem to exist, "
"couldn't fetch metadata".format(table.table_name),
@@ -215,7 +216,11 @@ class SliceModelView(PanoramixModelView, DeleteMixin):
'table', 'dashboards', 'params']
base_order = ('changed_on','desc')
description_columns = {
- 'description': Markup("The content here can be displayed as widget headers in the dashboard view. Supports markdown"),
+ 'description': Markup(
+ "The content here can be displayed as widget headers in the "
+ "dashboard view. Supports "
+ ""
+ "markdown"),
}
@@ -528,7 +533,7 @@ class Panoramix(BaseView):
engine = create_engine(uri)
engine.connect()
return json.dumps(engine.table_names(), indent=4)
- except Exception as e:
+ except Exception:
return Response(
traceback.format_exc(),
status=500,
@@ -607,7 +612,7 @@ class Panoramix(BaseView):
t = mydb.get_table(table_name)
fields = ", ".join(
[c.name for c in t.columns] or "*")
- s = "SELECT\n{fields}\nFROM {table_name}".format(**locals())
+ s = "SELECT\n{}\nFROM {}".format(fields, table_name)
return self.render_template(
"panoramix/ajah.html",
content=s