def cache_chart_thumbnail( url: str, digest: str, force: bool = False, window_size: Optional[WindowSize] = None, thumb_size: Optional[WindowSize] = None, ) -> None: with app.app_context(): # type: ignore if not thumbnail_cache: logger.warning("No cache set, refusing to compute") return None logger.info("Caching chart: %s", url) screenshot = ChartScreenshot(url, digest) with session_scope(nullpool=True) as session: user = security_manager.get_user_by_username( current_app.config["THUMBNAIL_SELENIUM_USER"], session=session ) screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=force, window_size=window_size, thumb_size=thumb_size, ) return None
def cache_chart_thumbnail(chart_id: int, force: bool = False) -> None: with app.app_context(): # type: ignore if not thumbnail_cache: logger.warning("No cache set, refusing to compute") return None logging.info(f"Caching chart {chart_id}") screenshot = ChartScreenshot(model_id=chart_id) user = security_manager.find_user(current_app.config["THUMBNAIL_SELENIUM_USER"]) screenshot.compute_and_cache(user=user, cache=thumbnail_cache, force=force)
def _get_screenshot(self) -> ScreenshotData: """ Get a chart or dashboard screenshot :raises: ReportScheduleScreenshotFailedError """ screenshot: Optional[BaseScreenshot] = None if self._report_schedule.chart: url = self._get_url(standalone="true") screenshot = ChartScreenshot( url, self._report_schedule.chart.digest, window_size=app.config["WEBDRIVER_WINDOW"]["slice"], thumb_size=app.config["WEBDRIVER_WINDOW"]["slice"], ) else: url = self._get_url() screenshot = DashboardScreenshot( url, self._report_schedule.dashboard.digest, window_size=app.config["WEBDRIVER_WINDOW"]["dashboard"], thumb_size=app.config["WEBDRIVER_WINDOW"]["dashboard"], ) image_url = self._get_url(user_friendly=True) user = self._get_screenshot_user() image_data = screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=True, ) if not image_data: raise ReportScheduleScreenshotFailedError() return ScreenshotData(url=image_url, image=image_data)
def deliver_alert(alert_id: int, recipients: Optional[str] = None) -> None: alert = db.session.query(Alert).get(alert_id) logging.info("Triggering alert: %s", alert) img_data = None images = {} recipients = recipients or alert.recipients if alert.slice: chart_url = get_url_path("Superset.slice", slice_id=alert.slice.id, standalone="true") screenshot = ChartScreenshot(chart_url, alert.slice.digest) image_url = _get_url_path( "Superset.slice", user_friendly=True, slice_id=alert.slice.id, standalone="true", ) standalone_index = image_url.find("/?standalone=true") if standalone_index != -1: image_url = image_url[:standalone_index] user = security_manager.find_user( current_app.config["THUMBNAIL_SELENIUM_USER"]) img_data = screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=True, ) else: # TODO: dashboard delivery! image_url = "https://media.giphy.com/media/dzaUX7CAG0Ihi/giphy.gif" # generate the email # TODO add sql query results to email subject = f"[Superset] Triggered alert: {alert.label}" deliver_as_group = False data = None if img_data: images = {"screenshot": img_data} body = render_template( "email/alert.txt", alert_url=_get_url_path("AlertModelView.show", user_friendly=True, pk=alert.id), label=alert.label, sql=alert.sql, image_url=image_url, ) _deliver_email(recipients, deliver_as_group, subject, body, data, images)
def cache_chart_thumbnail( url: str, digest: str, force: bool = False, window_size: Optional[WindowSize] = None, thumb_size: Optional[WindowSize] = None, ) -> None: with app.app_context(): # type: ignore if not thumbnail_cache: logger.warning("No cache set, refusing to compute") return None logging.info("Caching chart at {url}") screenshot = ChartScreenshot(url, digest) user = security_manager.find_user( current_app.config["THUMBNAIL_SELENIUM_USER"]) screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=force, window_size=window_size, thumb_size=thumb_size, ) return None
def _get_slice_screenshot(slice_id: int, session: Session) -> ScreenshotData: slice_obj = session.query(Slice).get(slice_id) chart_url = get_url_path("Superset.slice", slice_id=slice_obj.id, standalone="true") screenshot = ChartScreenshot(chart_url, slice_obj.digest) image_url = _get_url_path( "Superset.slice", user_friendly=True, slice_id=slice_obj.id, ) user = security_manager.find_user(current_app.config["THUMBNAIL_SELENIUM_USER"]) image_data = screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=True, ) session.commit() return ScreenshotData(image_url, image_data)
def deliver_alert(alert: Alert, recipients: Optional[str] = None) -> None: logging.info("Triggering alert: %s", alert) img_data = None images = {} recipients = recipients or alert.recipients if alert.slice: chart_url = get_url_path("Superset.slice", slice_id=alert.slice.id, standalone="true") screenshot = ChartScreenshot(chart_url, alert.slice.digest) cache_key = screenshot.cache_key() image_url = get_url_path("ChartRestApi.screenshot", pk=alert.slice.id, digest=cache_key) user = security_manager.find_user( current_app.config["THUMBNAIL_SELENIUM_USER"]) img_data = screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=True, ) else: # TODO: dashboard delivery! image_url = "https://media.giphy.com/media/dzaUX7CAG0Ihi/giphy.gif" # generate the email subject = f"[Superset] Triggered alert: {alert.label}" deliver_as_group = False data = None if img_data: images = {"screenshot": img_data} body = __( textwrap.dedent("""\ <h2>Alert: %(label)s</h2> <img src="cid:screenshot" alt="%(label)s" /> """), label=alert.label, image_url=image_url, ) _deliver_email(recipients, deliver_as_group, subject, body, data, images)
def _get_screenshot(self, report_schedule: ReportSchedule) -> ScreenshotData: """ Get a chart or dashboard screenshot :raises: ReportScheduleScreenshotFailedError """ url = self._get_url(report_schedule) screenshot: Optional[BaseScreenshot] = None if report_schedule.chart: screenshot = ChartScreenshot(url, report_schedule.chart.digest) else: screenshot = DashboardScreenshot(url, report_schedule.dashboard.digest) image_url = self._get_url(report_schedule, user_friendly=True) user = security_manager.find_user(app.config["THUMBNAIL_SELENIUM_USER"]) image_data = screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=True, ) if not image_data: raise ReportScheduleScreenshotFailedError() return ScreenshotData(url=image_url, image=image_data)
def _get_screenshot(self) -> ScreenshotData: """ Get a chart or dashboard screenshot :raises: ReportScheduleScreenshotFailedError """ url = self._get_url() screenshot: Optional[BaseScreenshot] = None if self._report_schedule.chart: screenshot = ChartScreenshot(url, self._report_schedule.chart.digest) else: screenshot = DashboardScreenshot( url, self._report_schedule.dashboard.digest ) image_url = self._get_url(user_friendly=True) user = self._get_screenshot_user() image_data = screenshot.compute_and_cache( user=user, cache=thumbnail_cache, force=True, ) if not image_data: raise ReportScheduleScreenshotFailedError() return ScreenshotData(url=image_url, image=image_data)