ethyca-fides 2.62.0rc0__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.
Files changed (102) hide show
  1. {ethyca_fides-2.62.0rc0.dist-info → ethyca_fides-2.62.1b0.dist-info}/METADATA +2 -1
  2. {ethyca_fides-2.62.0rc0.dist-info → ethyca_fides-2.62.1b0.dist-info}/RECORD +100 -102
  3. {ethyca_fides-2.62.0rc0.dist-info → ethyca_fides-2.62.1b0.dist-info}/WHEEL +1 -1
  4. fides/_version.py +3 -3
  5. fides/api/api/v1/endpoints/privacy_request_endpoints.py +2 -2
  6. fides/api/models/attachment.py +117 -10
  7. fides/api/models/privacy_request/privacy_request.py +40 -1
  8. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +4 -2
  9. fides/api/service/storage/s3.py +40 -15
  10. fides/api/tasks/storage.py +2 -2
  11. fides/api/util/storage_util.py +14 -8
  12. fides/ui-build/static/admin/404.html +1 -1
  13. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  14. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  15. fides/ui-build/static/admin/add-systems.html +1 -1
  16. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  17. fides/ui-build/static/admin/consent/configure.html +1 -1
  18. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  19. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  20. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  21. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  22. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  23. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  24. fides/ui-build/static/admin/consent/properties.html +1 -1
  25. fides/ui-build/static/admin/consent/reporting.html +1 -1
  26. fides/ui-build/static/admin/consent.html +1 -1
  27. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  28. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  29. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  30. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  31. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  32. fides/ui-build/static/admin/data-catalog.html +1 -1
  33. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  34. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  35. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  36. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  37. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  38. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  39. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  40. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  41. fides/ui-build/static/admin/datamap.html +1 -1
  42. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  43. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  44. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  45. fides/ui-build/static/admin/dataset/new.html +1 -1
  46. fides/ui-build/static/admin/dataset.html +1 -1
  47. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  48. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  49. fides/ui-build/static/admin/datastore-connection.html +1 -1
  50. fides/ui-build/static/admin/index.html +1 -1
  51. fides/ui-build/static/admin/integrations/[id].html +1 -1
  52. fides/ui-build/static/admin/integrations.html +1 -1
  53. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  54. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  55. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  56. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  57. fides/ui-build/static/admin/lib/fides.js +2 -2
  58. fides/ui-build/static/admin/login/[provider].html +1 -1
  59. fides/ui-build/static/admin/login.html +1 -1
  60. fides/ui-build/static/admin/messaging/[id].html +1 -1
  61. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  62. fides/ui-build/static/admin/messaging.html +1 -1
  63. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  64. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  65. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  66. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  67. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  68. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  69. fides/ui-build/static/admin/poc/forms.html +1 -1
  70. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  71. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  72. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  73. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  74. fides/ui-build/static/admin/privacy-requests.html +1 -1
  75. fides/ui-build/static/admin/properties/[id].html +1 -1
  76. fides/ui-build/static/admin/properties/add-property.html +1 -1
  77. fides/ui-build/static/admin/properties.html +1 -1
  78. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  79. fides/ui-build/static/admin/settings/about.html +1 -1
  80. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  81. fides/ui-build/static/admin/settings/consent.html +1 -1
  82. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  83. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  84. fides/ui-build/static/admin/settings/domains.html +1 -1
  85. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  86. fides/ui-build/static/admin/settings/locations.html +1 -1
  87. fides/ui-build/static/admin/settings/organization.html +1 -1
  88. fides/ui-build/static/admin/settings/regulations.html +1 -1
  89. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  90. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  91. fides/ui-build/static/admin/systems.html +1 -1
  92. fides/ui-build/static/admin/taxonomy.html +1 -1
  93. fides/ui-build/static/admin/user-management/new.html +1 -1
  94. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  95. fides/ui-build/static/admin/user-management.html +1 -1
  96. fides/service/error_handling/__init__.py +0 -0
  97. fides/service/error_handling/error_handler.py +0 -202
  98. {ethyca_fides-2.62.0rc0.dist-info → ethyca_fides-2.62.1b0.dist-info}/entry_points.txt +0 -0
  99. {ethyca_fides-2.62.0rc0.dist-info → ethyca_fides-2.62.1b0.dist-info}/licenses/LICENSE +0 -0
  100. {ethyca_fides-2.62.0rc0.dist-info → ethyca_fides-2.62.1b0.dist-info}/top_level.txt +0 -0
  101. /fides/ui-build/static/admin/_next/static/{4OMQ0x81J6D4ksHggHXOF → yjsK0CvslnuEmY5vNuxQ5}/_buildManifest.js +0 -0
  102. /fides/ui-build/static/admin/_next/static/{4OMQ0x81J6D4ksHggHXOF → 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/4OMQ0x81J6D4ksHggHXOF/_buildManifest.js" defer=""></script><script src="/_next/static/4OMQ0x81J6D4ksHggHXOF/_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":"4OMQ0x81J6D4ksHggHXOF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/4OMQ0x81J6D4ksHggHXOF/_buildManifest.js" defer=""></script><script src="/_next/static/4OMQ0x81J6D4ksHggHXOF/_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":"4OMQ0x81J6D4ksHggHXOF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/4OMQ0x81J6D4ksHggHXOF/_buildManifest.js" defer=""></script><script src="/_next/static/4OMQ0x81J6D4ksHggHXOF/_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":"4OMQ0x81J6D4ksHggHXOF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/4OMQ0x81J6D4ksHggHXOF/_buildManifest.js" defer=""></script><script src="/_next/static/4OMQ0x81J6D4ksHggHXOF/_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":"4OMQ0x81J6D4ksHggHXOF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/4OMQ0x81J6D4ksHggHXOF/_buildManifest.js" defer=""></script><script src="/_next/static/4OMQ0x81J6D4ksHggHXOF/_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":"4OMQ0x81J6D4ksHggHXOF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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