def create_report_notification( email_target: Optional[str] = None, slack_channel: Optional[str] = None, chart: Optional[Slice] = None, dashboard: Optional[Dashboard] = None, database: Optional[Database] = None, sql: Optional[str] = None, report_type: Optional[str] = None, validator_type: Optional[str] = None, validator_config_json: Optional[str] = None, grace_period: Optional[int] = None, report_format: Optional[ReportDataFormat] = None, ) -> ReportSchedule: report_type = report_type or ReportScheduleType.REPORT target = email_target or slack_channel config_json = {"target": target} owner = ( db.session.query(security_manager.user_model) .filter_by(email=OWNER_EMAIL) .one_or_none() ) if slack_channel: recipient = ReportRecipients( type=ReportRecipientType.SLACK, recipient_config_json=json.dumps(config_json), ) else: recipient = ReportRecipients( type=ReportRecipientType.EMAIL, recipient_config_json=json.dumps(config_json), ) report_schedule = insert_report_schedule( type=report_type, name=f"report_with_csv" if report_format else f"report", crontab=f"0 9 * * *", description=f"Daily report", sql=sql, chart=chart, dashboard=dashboard, database=database, recipients=[recipient], owners=[owner], validator_type=validator_type, validator_config_json=validator_config_json, grace_period=grace_period, report_format=report_format or ReportDataFormat.VISUALIZATION, ) return report_schedule
def update( cls, model: Model, properties: Dict[str, Any], commit: bool = True ) -> Model: """ create a report schedule and nested recipients :raises: DAOCreateFailedError """ try: for key, value in properties.items(): if key != "recipients": setattr(model, key, value) if "recipients" in properties: recipients = properties["recipients"] model.recipients = [ ReportRecipients( type=recipient["type"], recipient_config_json=json.dumps( recipient["recipient_config_json"] ), report_schedule=model, ) for recipient in recipients ] db.session.merge(model) if commit: db.session.commit() return model except SQLAlchemyError as ex: db.session.rollback() raise DAOCreateFailedError(str(ex)) from ex
def create(cls, properties: Dict[str, Any], commit: bool = True) -> Model: """ create a report schedule and nested recipients :raises: DAOCreateFailedError """ try: model = ReportSchedule() for key, value in properties.items(): if key != "recipients": setattr(model, key, value) recipients = properties.get("recipients", []) for recipient in recipients: model.recipients.append( # pylint: disable=no-member ReportRecipients( type=recipient["type"], recipient_config_json=json.dumps( recipient["recipient_config_json"] ), ) ) db.session.add(model) if commit: db.session.commit() return model except SQLAlchemyError as ex: db.session.rollback() raise DAOCreateFailedError(str(ex)) from ex
def create_report_notification( email_target: Optional[str] = None, slack_channel: Optional[str] = None, chart: Optional[Slice] = None, dashboard: Optional[Dashboard] = None, database: Optional[Database] = None, sql: Optional[str] = None, report_type: Optional[str] = None, validator_type: Optional[str] = None, validator_config_json: Optional[str] = None, grace_period: Optional[int] = None, ) -> ReportSchedule: report_type = report_type or ReportScheduleType.REPORT target = email_target or slack_channel config_json = {"target": target} if slack_channel: recipient = ReportRecipients( type=ReportRecipientType.SLACK, recipient_config_json=json.dumps(config_json), ) else: recipient = ReportRecipients( type=ReportRecipientType.EMAIL, recipient_config_json=json.dumps(config_json), ) report_schedule = insert_report_schedule( type=report_type, name=f"report", crontab=f"0 9 * * *", description=f"Daily report", sql=sql, chart=chart, dashboard=dashboard, database=database, recipients=[recipient], validator_type=validator_type, validator_config_json=validator_config_json, grace_period=grace_period, ) return report_schedule
def send_error(self, name: str, message: str) -> None: """ Creates and sends a notification for an error, to all recipients :raises: ReportScheduleNotificationError """ notification_content = NotificationContent(name=name, text=message) # filter recipients to recipients who are also owners owner_recipients = [ ReportRecipients( type=ReportRecipientType.EMAIL, recipient_config_json=json.dumps({"target": owner.email}), ) for owner in self._report_schedule.owners ] self._send(notification_content, owner_recipients)
def create_report_schedules(self): with self.create_app().app_context(): report_schedules = [] admin_user = self.get_user("admin") alpha_user = self.get_user("alpha") chart = db.session.query(Slice).first() example_db = get_example_database() for cx in range(REPORTS_COUNT): recipients = [] logs = [] for cy in range(cx): config_json = {"target": f"target{cy}@email.com"} recipients.append( ReportRecipients( type=ReportRecipientType.EMAIL, recipient_config_json=json.dumps(config_json), ) ) logs.append( ReportExecutionLog( scheduled_dttm=datetime(2020, 1, 1), state=ReportState.ERROR, error_message=f"Error {cy}", ) ) report_schedules.append( insert_report_schedule( type=ReportScheduleType.ALERT, name=f"name{cx}", crontab=f"*/{cx} * * * *", sql=f"SELECT value from table{cx}", description=f"Some description {cx}", chart=chart, database=example_db, owners=[admin_user, alpha_user], recipients=recipients, logs=logs, ) ) yield report_schedules report_schedules = db.session.query(ReportSchedule).all() # rollback changes (assuming cascade delete) for report_schedule in report_schedules: db.session.delete(report_schedule) db.session.commit()