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 insert_report_schedule( type: str, name: str, crontab: str, timezone: Optional[str] = None, sql: Optional[str] = None, description: Optional[str] = None, chart: Optional[Slice] = None, dashboard: Optional[Dashboard] = None, database: Optional[Database] = None, owners: Optional[List[User]] = None, validator_type: Optional[str] = None, validator_config_json: Optional[str] = None, log_retention: Optional[int] = None, last_state: Optional[ReportState] = None, grace_period: Optional[int] = None, recipients: Optional[List[ReportRecipients]] = None, report_format: Optional[ReportDataFormat] = None, logs: Optional[List[ReportExecutionLog]] = None, extra: Optional[Dict[Any, Any]] = None, force_screenshot: bool = False, ) -> ReportSchedule: owners = owners or [] recipients = recipients or [] logs = logs or [] last_state = last_state or ReportState.NOOP report_schedule = ReportSchedule( type=type, name=name, crontab=crontab, timezone=timezone, sql=sql, description=description, chart=chart, dashboard=dashboard, database=database, owners=owners, validator_type=validator_type, validator_config_json=validator_config_json, log_retention=log_retention, grace_period=grace_period, recipients=recipients, logs=logs, last_state=last_state, report_format=report_format, extra=extra, force_screenshot=force_screenshot, ) db.session.add(report_schedule) db.session.commit() return report_schedule
def create_chart_with_report(self): with self.create_app().app_context(): admin = self.get_user("admin") chart = self.insert_chart(f"chart_report", [admin.id], 1) report_schedule = ReportSchedule( type=ReportScheduleType.REPORT, name="report_with_chart", crontab="* * * * *", chart=chart, ) db.session.commit() yield chart # rollback changes db.session.delete(report_schedule) db.session.delete(chart) db.session.commit()
def create_dashboard_with_report(self): with self.create_app().app_context(): admin = self.get_user("admin") dashboard = self.insert_dashboard(f"dashboard_report", "dashboard_report", [admin.id]) report_schedule = ReportSchedule( type=ReportScheduleType.REPORT, name="report_with_dashboard", crontab="* * * * *", dashboard=dashboard, ) db.session.commit() yield dashboard # rollback changes db.session.delete(report_schedule) db.session.delete(dashboard) db.session.commit()
def insert_report_schedule( self, type: str, name: str, crontab: str, sql: Optional[str] = None, description: Optional[str] = None, chart: Optional[Slice] = None, dashboard: Optional[Dashboard] = None, database: Optional[Database] = None, owners: Optional[List[User]] = None, validator_type: Optional[str] = None, validator_config_json: Optional[str] = None, log_retention: Optional[int] = None, grace_period: Optional[int] = None, recipients: Optional[List[ReportRecipients]] = None, logs: Optional[List[ReportExecutionLog]] = None, ) -> ReportSchedule: owners = owners or [] recipients = recipients or [] logs = logs or [] report_schedule = ReportSchedule( type=type, name=name, crontab=crontab, sql=sql, description=description, chart=chart, dashboard=dashboard, database=database, owners=owners, validator_type=validator_type, validator_config_json=validator_config_json, log_retention=log_retention, grace_period=grace_period, recipients=recipients, logs=logs, ) db.session.add(report_schedule) db.session.commit() return report_schedule
def create_database_with_report(self): with self.create_app().app_context(): example_db = get_example_database() database = self.insert_database( "database_with_report", example_db.sqlalchemy_uri_decrypted, expose_in_sqllab=True, ) report_schedule = ReportSchedule( type=ReportScheduleType.ALERT, name="report_with_database", crontab="* * * * *", database=database, ) db.session.add(report_schedule) db.session.commit() yield database # rollback changes db.session.delete(report_schedule) db.session.delete(database) db.session.commit()