def embedded(
        self,
        dashboard_id_or_slug: str,
        add_extra_log_payload: Callable[..., None] = lambda **kwargs: None,
    ) -> FlaskResponse:
        """
        Server side rendering for a dashboard
        :param dashboard_id_or_slug: identifier for dashboard. used in the decorators
        :param add_extra_log_payload: added by `log_this_with_manual_updates`, set a
            default value to appease pylint
        """
        if not is_feature_enabled("EMBEDDED_SUPERSET"):
            return Response(status=404)

        # Log in as an anonymous user, just for this view.
        # This view needs to be visible to all users,
        # and building the page fails if g.user and/or ctx.user aren't present.
        login_manager: LoginManager = security_manager.lm
        login_manager.reload_user(AnonymousUserMixin())

        add_extra_log_payload(
            dashboard_id=dashboard_id_or_slug, dashboard_version="v2",
        )

        bootstrap_data = {
            "common": common_bootstrap_payload(),
        }

        return self.render_template(
            "superset/spa.html",
            entry="embedded",
            bootstrap_data=json.dumps(
                bootstrap_data, default=utils.pessimistic_json_iso_dttm_ser
            ),
        )
Beispiel #2
0
 def add(self) -> FlaskResponse:
     payload = {
         "common": common_bootstrap_payload(),
         "user": bootstrap_user_data(g.user),
     }
     return self.render_template("superset/add_slice.html",
                                 bootstrap_data=json.dumps(payload))
Beispiel #3
0
 def add(self) -> FlaskResponse:
     datasources = [{
         "value": str(d.id) + "__" + d.type,
         "label": repr(d)
     } for d in ConnectorRegistry.get_all_datasources(db.session)]
     payload = {
         "datasources": sorted(datasources, key=lambda d: d["label"]),
         "common": common_bootstrap_payload(),
     }
     return self.render_template("superset/add_slice.html",
                                 bootstrap_data=json.dumps(payload))
Beispiel #4
0
    def embedded(
        self,
        uuid: str,
        add_extra_log_payload: Callable[..., None] = lambda **kwargs: None,
    ) -> FlaskResponse:
        """
        Server side rendering for the embedded dashboard page
        :param uuid: identifier for embedded dashboard
        :param add_extra_log_payload: added by `log_this_with_manual_updates`, set a
            default value to appease pylint
        """
        if not is_feature_enabled("EMBEDDED_SUPERSET"):
            abort(404)

        embedded = EmbeddedDAO.find_by_id(uuid)

        if not embedded:
            abort(404)

        # validate request referrer in allowed domains
        is_referrer_allowed = not embedded.allowed_domains
        for domain in embedded.allowed_domains:
            if same_origin(request.referrer, domain):
                is_referrer_allowed = True
                break

        if not is_referrer_allowed:
            abort(403)

        # Log in as an anonymous user, just for this view.
        # This view needs to be visible to all users,
        # and building the page fails if g.user and/or ctx.user aren't present.
        login_manager: LoginManager = security_manager.lm
        login_manager.reload_user(AnonymousUserMixin())

        add_extra_log_payload(
            embedded_dashboard_id=uuid,
            dashboard_version="v2",
        )

        bootstrap_data = {
            "common": common_bootstrap_payload(),
            "embedded": {
                "dashboard_id": embedded.dashboard_id,
            },
        }

        return self.render_template(
            "superset/spa.html",
            entry="embedded",
            bootstrap_data=json.dumps(
                bootstrap_data, default=utils.pessimistic_json_iso_dttm_ser),
        )
Beispiel #5
0
 def add(self) -> FlaskResponse:
     datasources = [{
         "value": str(d.id) + "__" + d.type,
         "label": repr(d)
     } for d in security_manager.get_user_datasources()]
     payload = {
         "datasources":
         sorted(
             datasources,
             key=lambda d: d["label"].lower()
             if isinstance(d["label"], str) else "",
         ),
         "common":
         common_bootstrap_payload(),
         "user":
         bootstrap_user_data(g.user),
     }
     return self.render_template("superset/add_slice.html",
                                 bootstrap_data=json.dumps(payload))
Beispiel #6
0
    def add(self) -> FlaskResponse:
        allowed_datasources = []
        datasources = []

        # only if gamma
        is_gamma = False
        logging.debug('-------------------------')
        for role in g.user.roles:
            if str(role) == 'Gamma':
                is_gamma = True
            logging.debug(role.permissions)
            for perm in role.permissions:
                if str(perm).startswith('datasource access on ['):
                    #'datasource access on [DB].[DATASOURCE](id:ID)')
                    data_search = re.search(
                        'datasource access on \[([^\]]+)\]\.\[([^\]]+)\]\(id:([^\)]+)\)',
                        str(perm))
                    if data_search:
                        allowed_datasources.append({
                            "connection":
                            data_search.group(1),
                            "name":
                            data_search.group(2),
                            "id":
                            data_search.group(3)
                        })
        for d in ConnectorRegistry.get_all_datasources(db.session):
            if (is_gamma):
                for a in allowed_datasources:
                    table_name = d.short_data.get("name").split('.')[-1]
                    if table_name == a.get("name") and d.short_data.get(
                            "connection") == a.get("connection") and str(
                                d.short_data.get("id")) == str(a.get("id")):
                        if hasattr(d, 'custom_label'):
                            datasources.append({
                                "value": str(d.id) + "__" + d.type,
                                "label": d.custom_label
                            })
                        else:
                            datasources.append({
                                "value": str(d.id) + "__" + d.type,
                                "label": repr(d)
                            })
            else:
                if hasattr(d, 'custom_label'):
                    datasources.append({
                        "value": str(d.id) + "__" + d.type,
                        "label": d.custom_label
                    })
                else:
                    datasources.append({
                        "value": str(d.id) + "__" + d.type,
                        "label": repr(d)
                    })
        payload = {
            "datasources": sorted(datasources, key=lambda d: d["label"]),
            "common": common_bootstrap_payload(),
            "user": bootstrap_user_data(g.user),
        }
        return self.render_template("superset/add_slice.html",
                                    bootstrap_data=json.dumps(payload))