diff --git a/superset/annotation_layers/annotations/commands/create.py b/superset/annotation_layers/annotations/commands/create.py index 26cd968c5a1..09746245611 100644 --- a/superset/annotation_layers/annotations/commands/create.py +++ b/superset/annotation_layers/annotations/commands/create.py @@ -73,6 +73,4 @@ class CreateAnnotationCommand(BaseCommand): exceptions.append(AnnotationDatesValidationError()) if exceptions: - exception = AnnotationInvalidError() - exception.add_list(exceptions) - raise exception + raise AnnotationInvalidError(exceptions=exceptions) diff --git a/superset/annotation_layers/annotations/commands/update.py b/superset/annotation_layers/annotations/commands/update.py index c55a1cdaf76..b644ddc3622 100644 --- a/superset/annotation_layers/annotations/commands/update.py +++ b/superset/annotation_layers/annotations/commands/update.py @@ -87,6 +87,4 @@ class UpdateAnnotationCommand(BaseCommand): exceptions.append(AnnotationDatesValidationError()) if exceptions: - exception = AnnotationInvalidError() - exception.add_list(exceptions) - raise exception + raise AnnotationInvalidError(exceptions=exceptions) diff --git a/superset/annotation_layers/commands/create.py b/superset/annotation_layers/commands/create.py index d5af6c24a29..97431568a9a 100644 --- a/superset/annotation_layers/commands/create.py +++ b/superset/annotation_layers/commands/create.py @@ -54,6 +54,4 @@ class CreateAnnotationLayerCommand(BaseCommand): exceptions.append(AnnotationLayerNameUniquenessValidationError()) if exceptions: - exception = AnnotationLayerInvalidError() - exception.add_list(exceptions) - raise exception + raise AnnotationLayerInvalidError(exceptions=exceptions) diff --git a/superset/annotation_layers/commands/update.py b/superset/annotation_layers/commands/update.py index f4a04cdeb70..4a9cc31be5f 100644 --- a/superset/annotation_layers/commands/update.py +++ b/superset/annotation_layers/commands/update.py @@ -63,6 +63,4 @@ class UpdateAnnotationLayerCommand(BaseCommand): exceptions.append(AnnotationLayerNameUniquenessValidationError()) if exceptions: - exception = AnnotationLayerInvalidError() - exception.add_list(exceptions) - raise exception + raise AnnotationLayerInvalidError(exceptions=exceptions) diff --git a/superset/charts/commands/create.py b/superset/charts/commands/create.py index 82383407944..38076fb9cde 100644 --- a/superset/charts/commands/create.py +++ b/superset/charts/commands/create.py @@ -77,6 +77,4 @@ class CreateChartCommand(CreateMixin, BaseCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = ChartInvalidError() - exception.add_list(exceptions) - raise exception + raise ChartInvalidError(exceptions=exceptions) diff --git a/superset/charts/commands/update.py b/superset/charts/commands/update.py index 042c85a930f..f5fc2616a5a 100644 --- a/superset/charts/commands/update.py +++ b/superset/charts/commands/update.py @@ -114,6 +114,4 @@ class UpdateChartCommand(UpdateMixin, BaseCommand): self._properties["dashboards"] = dashboards if exceptions: - exception = ChartInvalidError() - exception.add_list(exceptions) - raise exception + raise ChartInvalidError(exceptions=exceptions) diff --git a/superset/commands/exceptions.py b/superset/commands/exceptions.py index a661ef4d604..db9d1b6c639 100644 --- a/superset/commands/exceptions.py +++ b/superset/commands/exceptions.py @@ -56,22 +56,26 @@ class CommandInvalidError(CommandException): status = 422 - def __init__(self, message: str = "") -> None: - self._invalid_exceptions: List[ValidationError] = [] + def __init__( + self, + message: str = "", + exceptions: Optional[List[ValidationError]] = None, + ) -> None: + self._exceptions = exceptions or [] super().__init__(message) - def add(self, exception: ValidationError) -> None: - self._invalid_exceptions.append(exception) + def append(self, exception: ValidationError) -> None: + self._exceptions.append(exception) - def add_list(self, exceptions: List[ValidationError]) -> None: - self._invalid_exceptions.extend(exceptions) + def extend(self, exceptions: List[ValidationError]) -> None: + self._exceptions.extend(exceptions) def get_list_classnames(self) -> List[str]: - return list(sorted({ex.__class__.__name__ for ex in self._invalid_exceptions})) + return list(sorted({ex.__class__.__name__ for ex in self._exceptions})) def normalized_messages(self) -> Dict[Any, Any]: errors: Dict[Any, Any] = {} - for exception in self._invalid_exceptions: + for exception in self._exceptions: errors.update(exception.normalized_messages()) return errors diff --git a/superset/commands/importers/v1/__init__.py b/superset/commands/importers/v1/__init__.py index a4208ded415..a67828bdb28 100644 --- a/superset/commands/importers/v1/__init__.py +++ b/superset/commands/importers/v1/__init__.py @@ -108,9 +108,10 @@ class ImportModelsCommand(BaseCommand): self._prevent_overwrite_existing_model(exceptions) if exceptions: - exception = CommandInvalidError(f"Error importing {self.model_name}") - exception.add_list(exceptions) - raise exception + raise CommandInvalidError( + f"Error importing {self.model_name}", + exceptions, + ) def _prevent_overwrite_existing_model( # pylint: disable=invalid-name self, exceptions: List[ValidationError] diff --git a/superset/commands/importers/v1/assets.py b/superset/commands/importers/v1/assets.py index da4d7808d30..ce8b46c2a0c 100644 --- a/superset/commands/importers/v1/assets.py +++ b/superset/commands/importers/v1/assets.py @@ -172,6 +172,7 @@ class ImportAssetsCommand(BaseCommand): ) if exceptions: - exception = CommandInvalidError("Error importing assets") - exception.add_list(exceptions) - raise exception + raise CommandInvalidError( + "Error importing assets", + exceptions, + ) diff --git a/superset/dashboards/commands/create.py b/superset/dashboards/commands/create.py index 811508c2e78..0ad8ddee7c4 100644 --- a/superset/dashboards/commands/create.py +++ b/superset/dashboards/commands/create.py @@ -63,9 +63,7 @@ class CreateDashboardCommand(CreateMixin, BaseCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = DashboardInvalidError() - exception.add_list(exceptions) - raise exception + raise DashboardInvalidError(exceptions=exceptions) try: roles = populate_roles(role_ids) @@ -73,6 +71,4 @@ class CreateDashboardCommand(CreateMixin, BaseCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = DashboardInvalidError() - exception.add_list(exceptions) - raise exception + raise DashboardInvalidError(exceptions=exceptions) diff --git a/superset/dashboards/commands/update.py b/superset/dashboards/commands/update.py index 12ac241dccc..11833a64be1 100644 --- a/superset/dashboards/commands/update.py +++ b/superset/dashboards/commands/update.py @@ -92,9 +92,7 @@ class UpdateDashboardCommand(UpdateMixin, BaseCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = DashboardInvalidError() - exception.add_list(exceptions) - raise exception + raise DashboardInvalidError(exceptions=exceptions) # Validate/Populate role if roles_ids is None: @@ -105,6 +103,4 @@ class UpdateDashboardCommand(UpdateMixin, BaseCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = DashboardInvalidError() - exception.add_list(exceptions) - raise exception + raise DashboardInvalidError(exceptions=exceptions) diff --git a/superset/databases/commands/create.py b/superset/databases/commands/create.py index eb0582a980f..16d27835b37 100644 --- a/superset/databases/commands/create.py +++ b/superset/databases/commands/create.py @@ -141,7 +141,7 @@ class CreateDatabaseCommand(BaseCommand): exceptions.append(DatabaseExistsValidationError()) if exceptions: exception = DatabaseInvalidError() - exception.add_list(exceptions) + exception.extend(exceptions) event_logger.log_with_context( action="db_connection_failed.{}.{}".format( exception.__class__.__name__, diff --git a/superset/databases/commands/update.py b/superset/databases/commands/update.py index 03531803553..746f7a8152a 100644 --- a/superset/databases/commands/update.py +++ b/superset/databases/commands/update.py @@ -177,6 +177,4 @@ class UpdateDatabaseCommand(BaseCommand): ): exceptions.append(DatabaseExistsValidationError()) if exceptions: - exception = DatabaseInvalidError() - exception.add_list(exceptions) - raise exception + raise DatabaseInvalidError(exceptions=exceptions) diff --git a/superset/databases/ssh_tunnel/commands/create.py b/superset/databases/ssh_tunnel/commands/create.py index 9c17149ba3d..45e5af5f44e 100644 --- a/superset/databases/ssh_tunnel/commands/create.py +++ b/superset/databases/ssh_tunnel/commands/create.py @@ -82,7 +82,7 @@ class CreateSSHTunnelCommand(BaseCommand): exceptions.append(SSHTunnelRequiredFieldValidationError("private_key")) if exceptions: exception = SSHTunnelInvalidError() - exception.add_list(exceptions) + exception.extend(exceptions) event_logger.log_with_context( action="ssh_tunnel_creation_failed.{}.{}".format( exception.__class__.__name__, diff --git a/superset/databases/ssh_tunnel/commands/update.py b/superset/databases/ssh_tunnel/commands/update.py index 2ac78567054..42925d1caa3 100644 --- a/superset/databases/ssh_tunnel/commands/update.py +++ b/superset/databases/ssh_tunnel/commands/update.py @@ -58,6 +58,6 @@ class UpdateSSHTunnelCommand(BaseCommand): "private_key_password" ) if private_key_password and private_key is None: - exception = SSHTunnelInvalidError() - exception.add(SSHTunnelRequiredFieldValidationError("private_key")) - raise exception + raise SSHTunnelInvalidError( + exceptions=[SSHTunnelRequiredFieldValidationError("private_key")] + ) diff --git a/superset/datasets/commands/create.py b/superset/datasets/commands/create.py index 809eec7a115..04f54339d08 100644 --- a/superset/datasets/commands/create.py +++ b/superset/datasets/commands/create.py @@ -87,6 +87,4 @@ class CreateDatasetCommand(CreateMixin, BaseCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = DatasetInvalidError() - exception.add_list(exceptions) - raise exception + raise DatasetInvalidError(exceptions=exceptions) diff --git a/superset/datasets/commands/duplicate.py b/superset/datasets/commands/duplicate.py index c6b0bbea692..5fc642cbe3e 100644 --- a/superset/datasets/commands/duplicate.py +++ b/superset/datasets/commands/duplicate.py @@ -128,6 +128,4 @@ class DuplicateDatasetCommand(CreateMixin, BaseCommand): exceptions.append(ex) if exceptions: - exception = DatasetInvalidError() - exception.add_list(exceptions) - raise exception + raise DatasetInvalidError(exceptions=exceptions) diff --git a/superset/datasets/commands/update.py b/superset/datasets/commands/update.py index b6bf1256d19..cc9f480a41b 100644 --- a/superset/datasets/commands/update.py +++ b/superset/datasets/commands/update.py @@ -122,9 +122,7 @@ class UpdateDatasetCommand(UpdateMixin, BaseCommand): self._validate_metrics(metrics, exceptions) if exceptions: - exception = DatasetInvalidError() - exception.add_list(exceptions) - raise exception + raise DatasetInvalidError(exceptions=exceptions) def _validate_columns( self, columns: List[Dict[str, Any]], exceptions: List[ValidationError] diff --git a/superset/reports/commands/create.py b/superset/reports/commands/create.py index aac5f07856e..27626170d64 100644 --- a/superset/reports/commands/create.py +++ b/superset/reports/commands/create.py @@ -117,9 +117,7 @@ class CreateReportScheduleCommand(CreateMixin, BaseReportScheduleCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = ReportScheduleInvalidError() - exception.add_list(exceptions) - raise exception + raise ReportScheduleInvalidError(exceptions=exceptions) def _validate_report_extra(self, exceptions: List[ValidationError]) -> None: extra: Optional[ReportScheduleExtra] = self._properties.get("extra") diff --git a/superset/reports/commands/update.py b/superset/reports/commands/update.py index 3399eca7b72..0c4f18f1b84 100644 --- a/superset/reports/commands/update.py +++ b/superset/reports/commands/update.py @@ -124,6 +124,4 @@ class UpdateReportScheduleCommand(UpdateMixin, BaseReportScheduleCommand): except ValidationError as ex: exceptions.append(ex) if exceptions: - exception = ReportScheduleInvalidError() - exception.add_list(exceptions) - raise exception + raise ReportScheduleInvalidError(exceptions=exceptions) diff --git a/superset/tags/commands/create.py b/superset/tags/commands/create.py index e9afe4a38d4..1e886e2af65 100644 --- a/superset/tags/commands/create.py +++ b/superset/tags/commands/create.py @@ -60,6 +60,4 @@ class CreateCustomTagCommand(CreateMixin, BaseCommand): TagCreateFailedError(f"invalid object type {self._object_type}") ) if exceptions: - exception = TagInvalidError() - exception.add_list(exceptions) - raise exception + raise TagInvalidError(exceptions=exceptions) diff --git a/superset/tags/commands/delete.py b/superset/tags/commands/delete.py index 63a514e5996..acec0166193 100644 --- a/superset/tags/commands/delete.py +++ b/superset/tags/commands/delete.py @@ -86,9 +86,7 @@ class DeleteTaggedObjectCommand(DeleteMixin, BaseCommand): ) ) if exceptions: - exception = TagInvalidError() - exception.add_list(exceptions) - raise exception + raise TagInvalidError(exceptions=exceptions) class DeleteTagsCommand(DeleteMixin, BaseCommand): @@ -110,6 +108,4 @@ class DeleteTagsCommand(DeleteMixin, BaseCommand): if not TagDAO.find_by_name(tag): exceptions.append(TagNotFoundError(tag)) if exceptions: - exception = TagInvalidError() - exception.add_list(exceptions) - raise exception + raise TagInvalidError(exceptions=exceptions)