diff --git a/pyproject.toml b/pyproject.toml index 042c4b048..8dcf0b030 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,6 +91,7 @@ src_paths = ["src", "tests"] disable=[ "bad-option-value", "broad-except", + "consider-using-f-string", "dangerous-default-value", "duplicate-code", "fixme", diff --git a/src/fidesops/main.py b/src/fidesops/main.py index 4ef275e03..7edcac065 100644 --- a/src/fidesops/main.py +++ b/src/fidesops/main.py @@ -65,39 +65,46 @@ ) -@app.middleware("http") -async def dispatch_log_request(request: Request, call_next: Callable) -> Response: - """ - HTTP Middleware that logs analytics events for each call to Fidesops endpoints. - :param request: Request to fidesops api - :param call_next: Callable api endpoint - :return: Response - """ - fides_source: Optional[str] = request.headers.get("X-Fides-Source") - now: datetime = datetime.now(tz=timezone.utc) - endpoint = f"{request.method}: {request.url}" - - try: - response = await call_next(request) - # HTTPExceptions are considered a handled err by default so are not thrown here. - # Accepted workaround is to inspect status code of response. - # More context- https://github.com/tiangolo/fastapi/issues/1840 - response.background = BackgroundTask( - prepare_and_log_request, - endpoint, - request.url.hostname, - response.status_code, - now, - fides_source, - "HTTPException" if response.status_code >= 400 else None, - ) - return response +if not config.root_user.analytics_opt_out: + + @app.middleware("http") + async def dispatch_log_request(request: Request, call_next: Callable) -> Response: + """ + HTTP Middleware that logs analytics events for each call to Fidesops endpoints. + :param request: Request to fidesops api + :param call_next: Callable api endpoint + :return: Response + """ + fides_source: Optional[str] = request.headers.get("X-Fides-Source") + now: datetime = datetime.now(tz=timezone.utc) + endpoint = f"{request.method}: {request.url}" - except Exception as e: - await prepare_and_log_request( - endpoint, request.url.hostname, 500, now, fides_source, e.__class__.__name__ - ) - raise + try: + response = await call_next(request) + # HTTPExceptions are considered a handled err by default so are not thrown here. + # Accepted workaround is to inspect status code of response. + # More context- https://github.com/tiangolo/fastapi/issues/1840 + response.background = BackgroundTask( + prepare_and_log_request, + endpoint, + request.url.hostname, + response.status_code, + now, + fides_source, + "HTTPException" if response.status_code >= 400 else None, + ) + return response + + except Exception as e: + await prepare_and_log_request( + endpoint, + request.url.hostname, + 500, + now, + fides_source, + e.__class__.__name__, + ) + raise async def prepare_and_log_request( diff --git a/src/fidesops/ops/api/v1/endpoints/dataset_endpoints.py b/src/fidesops/ops/api/v1/endpoints/dataset_endpoints.py index f14cfef4a..3edb022ac 100644 --- a/src/fidesops/ops/api/v1/endpoints/dataset_endpoints.py +++ b/src/fidesops/ops/api/v1/endpoints/dataset_endpoints.py @@ -8,6 +8,7 @@ from fastapi_pagination.bases import AbstractPage from fastapi_pagination.ext.sqlalchemy import paginate from pydantic import conlist +from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session from starlette.status import ( HTTP_200_OK, @@ -251,7 +252,10 @@ def create_or_update_dataset( # Try to find an existing DatasetConfig matching the given connection & key dataset_config = DatasetConfig.create_or_update(db, data=data) created_or_updated.append(dataset_config.dataset) - except (SaaSConfigNotFoundException, ValidationError) as exception: + except ( + SaaSConfigNotFoundException, + ValidationError, + ) as exception: logger.warning(exception.message) failed.append( BulkUpdateFailed( @@ -259,6 +263,15 @@ def create_or_update_dataset( data=data, ) ) + except IntegrityError: + message = "Dataset with key '%s' already exists." % data["fides_key"] + logger.warning(message) + failed.append( + BulkUpdateFailed( + message=message, + data=data, + ) + ) except Exception: logger.warning("Create/update failed for dataset '%s'.", data["fides_key"]) failed.append(