diff --git a/panoramix/data/__init__.py b/panoramix/data/__init__.py
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/panoramix/migrations/__init__.py b/panoramix/migrations/__init__.py
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/panoramix/static/servers.jpg b/panoramix/static/servers.jpg
new file mode 100644
index 0000000000000..2d4604b6bdb56
Binary files /dev/null and b/panoramix/static/servers.jpg differ
diff --git a/panoramix/templates/panoramix/models/database/add.html b/panoramix/templates/panoramix/models/database/add.html
new file mode 100644
index 0000000000000..eede9ae0ac6da
--- /dev/null
+++ b/panoramix/templates/panoramix/models/database/add.html
@@ -0,0 +1,7 @@
+{% extends "appbuilder/general/model/add.html" %}
+
+{% import "panoramix/models/database/macros.html" as macros %}
+{% block tail_js %}
+ {{ super() }}
+ {{ macros.testconn() }}
+{% endblock %}
diff --git a/panoramix/templates/panoramix/models/database/edit.html b/panoramix/templates/panoramix/models/database/edit.html
new file mode 100644
index 0000000000000..c32517bee7cb8
--- /dev/null
+++ b/panoramix/templates/panoramix/models/database/edit.html
@@ -0,0 +1,7 @@
+{% extends "appbuilder/general/model/edit.html" %}
+
+{% import "panoramix/models/database/macros.html" as macros %}
+{% block tail_js %}
+ {{ super() }}
+ {{ macros.testconn() }}
+{% endblock %}
diff --git a/panoramix/templates/panoramix/models/database/macros.html b/panoramix/templates/panoramix/models/database/macros.html
new file mode 100644
index 0000000000000..877b3188886bb
--- /dev/null
+++ b/panoramix/templates/panoramix/models/database/macros.html
@@ -0,0 +1,19 @@
+{% macro testconn() %}
+
+{% endmacro %}
diff --git a/panoramix/views.py b/panoramix/views.py
index f021d98389a67..217f7a8d21fc7 100644
--- a/panoramix/views.py
+++ b/panoramix/views.py
@@ -3,12 +3,13 @@
import logging
from flask import request, redirect, flash, Response
-from flask.ext.appbuilder.models.sqla.interface import SQLAInterface
from flask.ext.appbuilder import ModelView, CompactCRUDMixin, BaseView, expose
+from flask.ext.appbuilder.actions import action
+from flask.ext.appbuilder.models.sqla.interface import SQLAInterface
from flask.ext.appbuilder.security.decorators import has_access
from pydruid.client import doublesum
+from sqlalchemy import create_engine
from wtforms.validators import ValidationError
-from flask.ext.appbuilder.actions import action
from panoramix import appbuilder, db, models, viz, utils, app, config
@@ -91,6 +92,8 @@ class DatabaseView(ModelView, DeleteMixin):
list_columns = ['database_name']
add_columns = ['database_name', 'sqlalchemy_uri']
edit_columns = add_columns
+ add_template = "panoramix/models/database/add.html"
+ edit_template = "panoramix/models/database/edit.html"
appbuilder.add_view(
DatabaseView,
@@ -317,7 +320,19 @@ def save_dash(self, dashboard_id):
return "SUCCESS"
@has_access
- @expose("/save/")
+ @expose("/testconn/")
+ def testconn(self):
+ try:
+ db = create_engine(request.args.get('uri'))
+ for i in range(15):
+ request.args.get('uri')
+ db.connect()
+ return "SUCCESS"
+ except Exception as e:
+ return Response(
+ str(e),
+ status=500,
+ mimetype="application/json")
@has_access
@expose("/dashboard//")