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 cache_screenshot(self, pk: int, **kwargs: Dict[str, bool]) -> WerkzeugResponse: """ --- get: description: Compute and cache a screenshot. parameters: - in: path schema: type: integer name: pk - in: query name: q content: application/json: schema: $ref: '#/components/schemas/screenshot_query_schema' responses: 200: description: Chart async result content: application/json: schema: $ref: "#/components/schemas/ChartCacheScreenshotResponseSchema" 302: description: Redirects to the current digest 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' """ rison_dict = kwargs["rison"] window_size = rison_dict.get("window_size") or (800, 600) # Don't shrink the image if thumb_size is not specified thumb_size = rison_dict.get("thumb_size") or window_size chart = self.datamodel.get(pk, self._base_filters) if not chart: return self.response_404() chart_url = get_url_path("Superset.slice", slice_id=chart.id, standalone="true") screenshot_obj = ChartScreenshot(chart_url, chart.digest) cache_key = screenshot_obj.cache_key(window_size, thumb_size) image_url = get_url_path("ChartRestApi.screenshot", pk=chart.id, digest=cache_key) def trigger_celery() -> WerkzeugResponse: logger.info("Triggering screenshot ASYNC") kwargs = { "url": chart_url, "digest": chart.digest, "force": True, "window_size": window_size, "thumb_size": thumb_size, } cache_chart_thumbnail.delay(**kwargs) return self.response( 202, cache_key=cache_key, chart_url=chart_url, image_url=image_url, ) return trigger_celery()