ethyca-fides 2.62.0__py2.py3-none-any.whl → 2.62.1b0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ethyca_fides-2.62.0.dist-info → ethyca_fides-2.62.1b0.dist-info}/METADATA +2 -1
- {ethyca_fides-2.62.0.dist-info → ethyca_fides-2.62.1b0.dist-info}/RECORD +100 -102
- fides/_version.py +3 -3
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +2 -2
- fides/api/models/attachment.py +117 -10
- fides/api/models/privacy_request/privacy_request.py +40 -1
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +4 -2
- fides/api/service/storage/s3.py +40 -15
- fides/api/tasks/storage.py +2 -2
- fides/api/util/storage_util.py +14 -8
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
- fides/ui-build/static/admin/lib/fides.js +2 -2
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/service/error_handling/__init__.py +0 -0
- fides/service/error_handling/error_handler.py +0 -202
- {ethyca_fides-2.62.0.dist-info → ethyca_fides-2.62.1b0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.62.0.dist-info → ethyca_fides-2.62.1b0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.62.0.dist-info → ethyca_fides-2.62.1b0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.62.0.dist-info → ethyca_fides-2.62.1b0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{HjKGzeR8dVp9pFhcBuU9r → yjsK0CvslnuEmY5vNuxQ5}/_buildManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/{HjKGzeR8dVp9pFhcBuU9r → yjsK0CvslnuEmY5vNuxQ5}/_ssgManifest.js +0 -0
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/4481-8398edf74aabb8ea.js" defer=""></script><script src="/_next/static/chunks/pages/systems-ae591953b24e2fc9.js" defer=""></script><script src="/_next/static/
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/4481-8398edf74aabb8ea.js" defer=""></script><script src="/_next/static/chunks/pages/systems-ae591953b24e2fc9.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_buildManifest.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/systems","query":{},"buildId":"yjsK0CvslnuEmY5vNuxQ5","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><link rel="preload" href="/_next/static/css/34a7eb08b86ddb57.css" as="style"/><link rel="stylesheet" href="/_next/static/css/34a7eb08b86ddb57.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/678d4732-50255cc09048e643.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/4294-5b3aa9d605217915.js" defer=""></script><script src="/_next/static/chunks/570-c99f07161bd339cd.js" defer=""></script><script src="/_next/static/chunks/7980-e17dda2f50ec76b8.js" defer=""></script><script src="/_next/static/chunks/pages/taxonomy-913efe5371344de6.js" defer=""></script><script src="/_next/static/
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><link rel="preload" href="/_next/static/css/34a7eb08b86ddb57.css" as="style"/><link rel="stylesheet" href="/_next/static/css/34a7eb08b86ddb57.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/678d4732-50255cc09048e643.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/4294-5b3aa9d605217915.js" defer=""></script><script src="/_next/static/chunks/570-c99f07161bd339cd.js" defer=""></script><script src="/_next/static/chunks/7980-e17dda2f50ec76b8.js" defer=""></script><script src="/_next/static/chunks/pages/taxonomy-913efe5371344de6.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_buildManifest.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/taxonomy","query":{},"buildId":"yjsK0CvslnuEmY5vNuxQ5","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/3513-87b54d931698986f.js" defer=""></script><script src="/_next/static/chunks/4121-5c3af879cdd8b3be.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/new-69176abe09cf9b52.js" defer=""></script><script src="/_next/static/
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/3513-87b54d931698986f.js" defer=""></script><script src="/_next/static/chunks/4121-5c3af879cdd8b3be.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/new-69176abe09cf9b52.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_buildManifest.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/user-management/new","query":{},"buildId":"yjsK0CvslnuEmY5vNuxQ5","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/3513-87b54d931698986f.js" defer=""></script><script src="/_next/static/chunks/4121-5c3af879cdd8b3be.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/profile/%5Bid%5D-dc11ba29dbd4708b.js" defer=""></script><script src="/_next/static/
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/3513-87b54d931698986f.js" defer=""></script><script src="/_next/static/chunks/4121-5c3af879cdd8b3be.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/profile/%5Bid%5D-dc11ba29dbd4708b.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_buildManifest.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/user-management/profile/[id]","query":{},"buildId":"yjsK0CvslnuEmY5vNuxQ5","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/3513-87b54d931698986f.js" defer=""></script><script src="/_next/static/chunks/pages/user-management-c0b2113b44f46112.js" defer=""></script><script src="/_next/static/
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c0c2eb63ad3e7390.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c0c2eb63ad3e7390.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-abd3efcb23c0bb03.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-371b155655c83a1e.js" defer=""></script><script src="/_next/static/chunks/3513-87b54d931698986f.js" defer=""></script><script src="/_next/static/chunks/pages/user-management-c0b2113b44f46112.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_buildManifest.js" defer=""></script><script src="/_next/static/yjsK0CvslnuEmY5vNuxQ5/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/user-management","query":{},"buildId":"yjsK0CvslnuEmY5vNuxQ5","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
File without changes
|
@@ -1,202 +0,0 @@
|
|
1
|
-
from functools import wraps
|
2
|
-
from typing import Any, Callable, Optional, TypeVar
|
3
|
-
|
4
|
-
from fastapi import HTTPException
|
5
|
-
from loguru import logger
|
6
|
-
from starlette.status import HTTP_400_BAD_REQUEST, HTTP_422_UNPROCESSABLE_ENTITY
|
7
|
-
|
8
|
-
T = TypeVar("T")
|
9
|
-
|
10
|
-
|
11
|
-
class ErrorHandler:
|
12
|
-
"""Utility class for handling errors consistently throughout the application.
|
13
|
-
|
14
|
-
Usage Examples:
|
15
|
-
-----------------------------------------------------------------------------
|
16
|
-
|
17
|
-
1. Basic Validation:
|
18
|
-
```python
|
19
|
-
from fastapi import FastAPI
|
20
|
-
from fides.service.error_handling.error_handler import ErrorHandler
|
21
|
-
|
22
|
-
app = FastAPI()
|
23
|
-
|
24
|
-
@app.post("/users")
|
25
|
-
def create_user(age: int):
|
26
|
-
# Simple validation
|
27
|
-
ErrorHandler.validate(age >= 18, "User must be 18 or older")
|
28
|
-
return {"message": "User created"}
|
29
|
-
|
30
|
-
@app.get("/items/{item_id}")
|
31
|
-
def get_item(item_id: str):
|
32
|
-
# Direct error raising
|
33
|
-
if not item_id:
|
34
|
-
ErrorHandler.raise_error("Item ID is required", status_code=400)
|
35
|
-
return {"item_id": item_id}
|
36
|
-
```
|
37
|
-
|
38
|
-
2. Exception Handling Decorator:
|
39
|
-
```python
|
40
|
-
@app.post("/orders")
|
41
|
-
@ErrorHandler.handle_exceptions("Failed to create order")
|
42
|
-
def create_order(order_data: dict):
|
43
|
-
if not order_data.get("items"):
|
44
|
-
raise ValueError("Order must contain items")
|
45
|
-
# Process order...
|
46
|
-
return {"message": "Order created"}
|
47
|
-
|
48
|
-
@app.get("/products/{product_id}")
|
49
|
-
@ErrorHandler.handle_exceptions("Failed to fetch product", status_code=404)
|
50
|
-
def get_product(product_id: str):
|
51
|
-
product = database.get_product(product_id)
|
52
|
-
if not product:
|
53
|
-
raise ValueError("Product not found")
|
54
|
-
return product
|
55
|
-
```
|
56
|
-
|
57
|
-
3. Complex Validation:
|
58
|
-
```python
|
59
|
-
@app.post("/payments")
|
60
|
-
@ErrorHandler.handle_exceptions("Payment processing failed")
|
61
|
-
def process_payment(payment: dict):
|
62
|
-
# Validate amount
|
63
|
-
ErrorHandler.validate(
|
64
|
-
payment.get("amount", 0) > 0,
|
65
|
-
"Payment amount must be positive",
|
66
|
-
HTTP_400_BAD_REQUEST
|
67
|
-
)
|
68
|
-
|
69
|
-
# Validate currency
|
70
|
-
ErrorHandler.validate(
|
71
|
-
payment.get("currency") in ["USD", "EUR"],
|
72
|
-
"Invalid currency",
|
73
|
-
HTTP_400_BAD_REQUEST,
|
74
|
-
"Unsupported currency provided" # Optional log message
|
75
|
-
)
|
76
|
-
|
77
|
-
# Custom error for insufficient funds
|
78
|
-
if payment.get("amount", 0) > get_balance():
|
79
|
-
ErrorHandler.raise_error(
|
80
|
-
"Insufficient funds",
|
81
|
-
status_code=HTTP_400_BAD_REQUEST,
|
82
|
-
log_message="User attempted payment exceeding balance"
|
83
|
-
)
|
84
|
-
|
85
|
-
return {"status": "payment processed"}
|
86
|
-
```
|
87
|
-
|
88
|
-
4. Error Logging:
|
89
|
-
```python
|
90
|
-
@app.post("/imports")
|
91
|
-
@ErrorHandler.handle_exceptions("Import failed")
|
92
|
-
def import_data(data: dict):
|
93
|
-
try:
|
94
|
-
process_import(data)
|
95
|
-
except Exception as e:
|
96
|
-
# Log error with custom message before raising
|
97
|
-
ErrorHandler.raise_error(
|
98
|
-
"Import failed: invalid format",
|
99
|
-
status_code=400,
|
100
|
-
log_message=f"Import failed with error: {str(e)}"
|
101
|
-
)
|
102
|
-
return {"status": "import complete"}
|
103
|
-
```
|
104
|
-
|
105
|
-
Key Features:
|
106
|
-
- Simple validation with custom error messages
|
107
|
-
- Consistent error handling across endpoints
|
108
|
-
- Built-in error logging
|
109
|
-
- HTTP status code customization
|
110
|
-
- Exception handling decorator for common patterns
|
111
|
-
"""
|
112
|
-
|
113
|
-
@staticmethod
|
114
|
-
def raise_error(
|
115
|
-
detail: str,
|
116
|
-
status_code: int = HTTP_422_UNPROCESSABLE_ENTITY,
|
117
|
-
log_message: Optional[str] = None,
|
118
|
-
) -> None:
|
119
|
-
"""Raise an HTTPException with consistent logging.
|
120
|
-
|
121
|
-
Args:
|
122
|
-
detail: Error message to include in the HTTPException
|
123
|
-
status_code: HTTP status code to use (default: 422)
|
124
|
-
log_message: Optional message to log before raising the exception
|
125
|
-
|
126
|
-
Raises:
|
127
|
-
HTTPException: Always raised with the provided details
|
128
|
-
"""
|
129
|
-
if log_message:
|
130
|
-
logger.error(log_message)
|
131
|
-
raise HTTPException(status_code=status_code, detail=detail)
|
132
|
-
|
133
|
-
@staticmethod
|
134
|
-
def validate(
|
135
|
-
condition: bool,
|
136
|
-
detail: str,
|
137
|
-
status_code: int = HTTP_400_BAD_REQUEST,
|
138
|
-
log_message: Optional[str] = None,
|
139
|
-
) -> None:
|
140
|
-
"""Validate a condition and raise an error if it's False.
|
141
|
-
|
142
|
-
Args:
|
143
|
-
condition: The condition to check
|
144
|
-
detail: Error message if condition is False
|
145
|
-
status_code: HTTP status code to use if condition is False
|
146
|
-
log_message: Optional message to log before raising the exception
|
147
|
-
|
148
|
-
Raises:
|
149
|
-
HTTPException: If the condition is False
|
150
|
-
"""
|
151
|
-
if not condition:
|
152
|
-
ErrorHandler.raise_error(detail, status_code, log_message)
|
153
|
-
|
154
|
-
@classmethod
|
155
|
-
def handle_exceptions(
|
156
|
-
cls, error_message: str, status_code: int = HTTP_422_UNPROCESSABLE_ENTITY
|
157
|
-
) -> Callable[[Callable[..., T]], Callable[..., T]]:
|
158
|
-
"""Decorator to handle exceptions consistently.
|
159
|
-
|
160
|
-
Args:
|
161
|
-
error_message: Base error message to use
|
162
|
-
status_code: HTTP status code to use for unexpected errors
|
163
|
-
|
164
|
-
Returns:
|
165
|
-
Callable: The decorated function that handles exceptions
|
166
|
-
|
167
|
-
Note:
|
168
|
-
This decorator will catch specific exceptions and convert them to HTTPExceptions.
|
169
|
-
HTTPExceptions are re-raised as is, while other exceptions are wrapped with
|
170
|
-
additional context.
|
171
|
-
"""
|
172
|
-
|
173
|
-
def decorator(func: Callable[..., T]) -> Callable[..., T]:
|
174
|
-
@wraps(func)
|
175
|
-
def wrapper(*args: Any, **kwargs: Any) -> Optional[T]:
|
176
|
-
try:
|
177
|
-
return func(*args, **kwargs)
|
178
|
-
except HTTPException:
|
179
|
-
# Re-raise HTTP exceptions without modification
|
180
|
-
raise
|
181
|
-
except (ValueError, TypeError, AttributeError, KeyError) as e:
|
182
|
-
# Handle common validation and data access errors
|
183
|
-
cls.raise_error(
|
184
|
-
f"{error_message}: {str(e)}",
|
185
|
-
status_code,
|
186
|
-
f"{error_message}: {e}",
|
187
|
-
)
|
188
|
-
except Exception as e: # pylint: disable=broad-except
|
189
|
-
# Log unexpected errors with full context but present a sanitized message
|
190
|
-
logger.error(
|
191
|
-
f"Unexpected error in {func.__name__}: {str(e)}", exc_info=True
|
192
|
-
)
|
193
|
-
cls.raise_error(
|
194
|
-
f"{error_message}: An unexpected error occurred",
|
195
|
-
status_code,
|
196
|
-
f"{error_message}: Unexpected {type(e).__name__}",
|
197
|
-
)
|
198
|
-
return None # This line is never reached but satisfies the return type checker
|
199
|
-
|
200
|
-
return wrapper # type: ignore[return-value]
|
201
|
-
|
202
|
-
return decorator
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|