Exemple #1
0
    def dashboard(self, dashboard_id):
        """Server side rendering for a dashboard"""
        session = db.session()
        qry = session.query(models.Dashboard)
        if dashboard_id.isdigit():
            qry = qry.filter_by(id=int(dashboard_id))
        else:
            qry = qry.filter_by(slug=dashboard_id)

        templates = session.query(models.CssTemplate).all()

        dash = qry.first()

        # Hack to log the dashboard_id properly, even when getting a slug
        @log_this
        def dashboard(**kwargs):  # noqa
            pass
        dashboard(dashboard_id=dash.id)

        pos_dict = {}
        if dash.position_json:
            pos_dict = {
                int(o['slice_id']): o
                for o in json.loads(dash.position_json)}
        return self.render_template(
            "dashed/dashboard.html", dashboard=dash,
            templates=templates,
            pos_dict=pos_dict)
Exemple #2
0
 def runsql(self):
     """Runs arbitrary sql and returns and html table"""
     session = db.session()
     limit = 1000
     data = json.loads(request.form.get('data'))
     sql = data.get('sql')
     database_id = data.get('database_id')
     mydb = session.query(models.Database).filter_by(id=database_id).first()
     content = ""
     if mydb:
         eng = mydb.get_sqla_engine()
         if limit:
             sql = sql.strip().strip(';')
             qry = (
                 select('*')
                 .select_from(TextAsFrom(text(sql), ['*']).alias('inner_qry'))
                 .limit(limit)
             )
             sql = str(qry.compile(eng, compile_kwargs={"literal_binds": True}))
         try:
             df = pd.read_sql_query(sql=sql, con=eng)
             content = df.to_html(
                 index=False,
                 na_rep='',
                 classes=(
                     "dataframe table table-striped table-bordered "
                     "table-condensed sql_results"))
         except Exception as e:
             content = (
                 '<div class="alert alert-danger">'
                 "{}</div>"
             ).format(e.message)
     session.commit()
     return content
Exemple #3
0
 def runsql(self):
     session = db.session()
     limit = 1000
     data = json.loads(request.form.get('data'))
     sql = data.get('sql')
     database_id = data.get('database_id')
     mydb = session.query(models.Database).filter_by(id=database_id).first()
     content = ""
     if mydb:
         eng = mydb.get_sqla_engine()
         if limit:
             sql = sql.strip().strip(';')
             qry = (
                 select('*')
                 .select_from(TextAsFrom(text(sql), ['*']).alias('inner_qry'))
                 .limit(limit)
             )
             sql= str(qry.compile(eng, compile_kwargs={"literal_binds": True}))
         try:
             df = pd.read_sql_query(sql=sql, con=eng)
             content = df.to_html(
                 index=False,
                 na_rep='',
                 classes=(
                     "dataframe table table-striped table-bordered "
                     "table-condensed sql_results"))
         except Exception as e:
             content = (
                 '<div class="alert alert-danger">'
                 "{}</div>"
             ).format(e.message)
     session.commit()
     return content
Exemple #4
0
    def dashboard(self, dashboard_id):
        """Server side rendering for a dashboard"""
        session = db.session()
        qry = session.query(models.Dashboard)
        if dashboard_id.isdigit():
            qry = qry.filter_by(id=int(dashboard_id))
        else:
            qry = qry.filter_by(slug=dashboard_id)

        templates = session.query(models.CssTemplate).all()

        dash = qry.first()

        # Hack to log the dashboard_id properly, even when getting a slug
        @log_this
        def dashboard(**kwargs):  # noqa
            pass
        dashboard(dashboard_id=dash.id)

        pos_dict = {}
        if dash.position_json:
            pos_dict = {
                int(o['slice_id']):o
                for o in json.loads(dash.position_json)}
        return self.render_template(
            "dashed/dashboard.html", dashboard=dash,
            templates=templates,
            pos_dict=pos_dict)
Exemple #5
0
    def save(self, args, slc):
        """Saves (inserts or overwrite a slice) """
        session = db.session()
        slice_name = args.get('slice_name')
        action = args.get('action')

        # TODO use form processing form wtforms
        d = args.to_dict(flat=False)
        del d['action']
        del d['previous_viz_type']
        as_list = ('metrics', 'groupby', 'columns')
        for k in d:
            v = d.get(k)
            if k in as_list and not isinstance(v, list):
                d[k] = [v] if v else []
            if k not in as_list and isinstance(v, list):
                d[k] = v[0]

        table_id = druid_datasource_id = None
        datasource_type = args.get('datasource_type')
        if datasource_type in ('datasource', 'druid'):
            druid_datasource_id = args.get('datasource_id')
        elif datasource_type == 'table':
            table_id = args.get('datasource_id')

        if action == "save":
            slc = models.Slice()
            msg = "Slice [{}] has been saved".format(slice_name)
        elif action == "overwrite":
            msg = "Slice [{}] has been overwritten".format(slice_name)

        slc.params = json.dumps(d, indent=4, sort_keys=True)
        slc.datasource_name = args.get('datasource_name')
        slc.viz_type = args.get('viz_type')
        slc.druid_datasource_id = druid_datasource_id
        slc.table_id = table_id
        slc.datasource_type = datasource_type
        slc.slice_name = slice_name

        if action == "save":
            session.add(slc)
        elif action == "overwrite":
            session.merge(slc)
        session.commit()
        flash(msg, "info")
        return redirect(slc.slice_url)
Exemple #6
0
 def featured(self):
     session = db.session()
     datasets_sqla = (
         session.query(models.SqlaTable)
         .filter_by(is_featured=True)
         .all()
     )
     datasets_druid = (
         session.query(models.DruidDatasource)
         .filter_by(is_featured=True)
         .all()
     )
     featured_datasets = datasets_sqla + datasets_druid
     return self.render_template(
         'dashed/featured.html',
         featured_datasets=featured_datasets,
         utils=utils)
Exemple #7
0
 def refresh_datasources(self):
     session = db.session()
     for cluster in session.query(models.DruidCluster).all():
         try:
             cluster.refresh_datasources()
         except Exception as e:
             flash(
                 "Error while processing cluster '{}'\n{}".format(
                     cluster, str(e)),
                 "danger")
             logging.exception(e)
             return redirect('/druidclustermodelview/list/')
         cluster.metadata_last_refreshed = datetime.now()
         flash(
             "Refreshed metadata from cluster "
             "[" + cluster.cluster_name + "]",
             'info')
     session.commit()
     return redirect("/datasourcemodelview/list/")
Exemple #8
0
 def save_dash(self, dashboard_id):
     """Save a dashboard's metadata"""
     data = json.loads(request.form.get('data'))
     positions = data['positions']
     slice_ids = [int(d['slice_id']) for d in positions]
     session = db.session()
     Dash = models.Dashboard  # noqa
     dash = session.query(Dash).filter_by(id=dashboard_id).first()
     dash.slices = [o for o in dash.slices if o.id in slice_ids]
     dash.position_json = json.dumps(data['positions'], indent=4)
     md = dash.metadata_dejson
     if 'filter_immune_slices' not in md:
         md['filter_immune_slices'] = []
     md['expanded_slices'] = data['expanded_slices']
     dash.json_metadata = json.dumps(md, indent=4)
     dash.css = data['css']
     session.merge(dash)
     session.commit()
     session.close()
     return "SUCCESS"
Exemple #9
0
 def save_dash(self, dashboard_id):
     """Save a dashboard's metadata"""
     data = json.loads(request.form.get('data'))
     positions = data['positions']
     slice_ids = [int(d['slice_id']) for d in positions]
     session = db.session()
     Dash = models.Dashboard
     dash = session.query(Dash).filter_by(id=dashboard_id).first()
     dash.slices = [o for o in dash.slices if o.id in slice_ids]
     dash.position_json = json.dumps(data['positions'], indent=4)
     md = dash.metadata_dejson
     if 'filter_immune_slices' not in md:
         md['filter_immune_slices'] = []
     md['expanded_slices'] = data['expanded_slices']
     dash.json_metadata = json.dumps(md, indent=4)
     dash.css = data['css']
     session.merge(dash)
     session.commit()
     session.close()
     return "SUCCESS"
Exemple #10
0
 def favstar(self, class_name, obj_id, action):
     session = db.session()
     FavStar = models.FavStar
     count = 0
     favs = session.query(FavStar).filter_by(
         class_name=class_name, obj_id=obj_id, user_id=g.user.id).all()
     if action == 'select':
         if not favs:
             session.add(
                 FavStar(
                     class_name=class_name, obj_id=obj_id, user_id=g.user.id,
                     dttm=datetime.now()))
         count = 1
     elif action == 'unselect':
         for fav in favs:
             session.delete(fav)
     else:
         count = len(favs)
     session.commit()
     return Response(
         json.dumps({'count': count}),
         mimetype="application/json")
Exemple #11
0
    def explore(self, datasource_type, datasource_id):
        if datasource_type == "table":
            datasource = (
                db.session
                .query(models.SqlaTable)
                .filter_by(id=datasource_id)
                .first()
            )
        else:
            datasource = (
                db.session
                .query(models.DruidDatasource)
                .filter_by(id=datasource_id)
                .first()
            )

            all_datasource_access = self.appbuilder.sm.has_access(
                'all_datasource_access', 'all_datasource_access')
            datasource_access = self.appbuilder.sm.has_access(
                'datasource_access', datasource.perm)
            if not (all_datasource_access or datasource_access):
                flash(
                    "You don't seem to have access to this datasource",
                    "danger")
                return redirect('/slicemodelview/list/')
        action = request.args.get('action')
        if action in ('save', 'overwrite'):
            session = db.session()

            # TODO use form processing form wtforms
            d = request.args.to_dict(flat=False)
            del d['action']
            del d['previous_viz_type']
            as_list = ('metrics', 'groupby', 'columns')
            for k in d:
                v = d.get(k)
                if k in as_list and not isinstance(v, list):
                    d[k] = [v] if v else []
                if k not in as_list and isinstance(v, list):
                    d[k] = v[0]

            table_id = druid_datasource_id = None
            datasource_type = request.args.get('datasource_type')
            if datasource_type in ('datasource', 'druid'):
                druid_datasource_id = request.args.get('datasource_id')
            elif datasource_type == 'table':
                table_id = request.args.get('datasource_id')

            slice_name = request.args.get('slice_name')

            if action == "save":
                slc = models.Slice()
                msg = "Slice [{}] has been saved".format(slice_name)
            elif action == "overwrite":
                slc = (
                    session.query(models.Slice)
                    .filter_by(id=request.args.get("slice_id"))
                    .first()
                )
                msg = "Slice [{}] has been overwritten".format(slice_name)

            slc.params = json.dumps(d, indent=4, sort_keys=True)
            slc.datasource_name = request.args.get('datasource_name')
            slc.viz_type = request.args.get('viz_type')
            slc.druid_datasource_id = druid_datasource_id
            slc.table_id = table_id
            slc.datasource_type = datasource_type
            slc.slice_name = slice_name

            session.merge(slc)
            session.commit()
            flash(msg, "info")
            return redirect(slc.slice_url)


        if not datasource:
            flash("The datasource seem to have been deleted", "alert")
        viz_type = request.args.get("viz_type")
        if not viz_type and datasource.default_endpoint:
            return redirect(datasource.default_endpoint)
        if not viz_type:
            viz_type = "table"
        obj = viz.viz_types[viz_type](
            datasource,
            form_data=request.args)
        if request.args.get("csv") == "true":
            status = 200
            payload = obj.get_csv()
            return Response(
                payload,
                status=status,
                mimetype="application/csv")

        slice_id = request.args.get("slice_id")
        slc = None
        if slice_id:
            slc = (
                db.session.query(models.Slice)
                .filter_by(id=request.args.get("slice_id"))
                .first()
            )
        if request.args.get("json") == "true":
            status = 200
            if config.get("DEBUG"):
                payload = obj.get_json()
            else:
                try:
                    payload = obj.get_json()
                except Exception as e:
                    logging.exception(e)
                    payload = str(e)
                    status = 500
            return Response(
                payload,
                status=status,
                mimetype="application/json")
        else:
            if config.get("DEBUG"):
                resp = self.render_template(
                    "dashed/viz.html", viz=obj, slice=slc)
            try:
                resp = self.render_template(
                    "dashed/viz.html", viz=obj, slice=slc)
            except Exception as e:
                if config.get("DEBUG"):
                    raise(e)
                return Response(
                    str(e),
                    status=500,
                    mimetype="application/json")
            return resp