ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.74.0rc1__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.

Potentially problematic release.


This version of ethyca-fides might be problematic. Click here for more details.

Files changed (495) hide show
  1. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/METADATA +3 -2
  2. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/RECORD +377 -327
  3. fides/_version.py +3 -3
  4. fides/api/alembic/alembic.ini +5 -1
  5. fides/api/alembic/migrations/env.py +7 -1
  6. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
  7. fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
  8. fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
  9. fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
  10. fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
  11. fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
  12. fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
  13. fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
  14. fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
  15. fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
  16. fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
  17. fides/api/api/v1/endpoints/generic_overrides.py +75 -6
  18. fides/api/api/v1/endpoints/privacy_request_endpoints.py +60 -6
  19. fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
  20. fides/api/api/v1/endpoints/system.py +11 -43
  21. fides/api/api/v1/endpoints/user_endpoints.py +8 -1
  22. fides/api/app_setup.py +1 -3
  23. fides/api/common_exceptions.py +8 -0
  24. fides/api/db/base.py +2 -0
  25. fides/api/db/database.py +257 -2
  26. fides/api/email_templates/get_email_template.py +3 -0
  27. fides/api/email_templates/template_names.py +1 -0
  28. fides/api/email_templates/templates/manual_task_digest.html +316 -0
  29. fides/api/main.py +2 -2
  30. fides/api/models/attachment.py +1 -0
  31. fides/api/models/detection_discovery/__init__.py +2 -0
  32. fides/api/models/detection_discovery/core.py +10 -0
  33. fides/api/models/detection_discovery/monitor_task.py +1 -0
  34. fides/api/models/detection_discovery/staged_resource_error.py +25 -0
  35. fides/api/models/digest/__init__.py +2 -0
  36. fides/api/models/digest/digest_config.py +10 -1
  37. fides/api/models/digest/digest_execution.py +142 -0
  38. fides/api/models/event_audit.py +17 -0
  39. fides/api/models/identity_definition.py +65 -0
  40. fides/api/models/messaging_template.py +7 -0
  41. fides/api/models/privacy_experience.py +11 -0
  42. fides/api/models/privacy_preference.py +2 -0
  43. fides/api/models/privacy_request/duplicate_group.py +84 -0
  44. fides/api/models/privacy_request/privacy_request.py +56 -8
  45. fides/api/models/privacy_request/request_task.py +98 -1
  46. fides/api/models/sql_models.py +3 -0
  47. fides/api/models/taxonomy.py +14 -4
  48. fides/api/models/v3/__init__.py +0 -0
  49. fides/api/models/v3/privacy_preferences.py +85 -0
  50. fides/api/models/worker_task.py +8 -0
  51. fides/api/schemas/application_config.py +28 -0
  52. fides/api/schemas/connection_configuration/connection_config.py +1 -30
  53. fides/api/schemas/messaging/messaging.py +15 -0
  54. fides/api/schemas/privacy_request.py +17 -3
  55. fides/api/schemas/saas/async_polling_configuration.py +81 -0
  56. fides/api/schemas/saas/saas_config.py +10 -3
  57. fides/api/schemas/saas/strategy_configuration.py +0 -12
  58. fides/api/schemas/taxonomy_extensions.py +8 -0
  59. fides/api/service/async_dsr/handlers/__init__.py +0 -0
  60. fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
  61. fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
  62. fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
  63. fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
  64. fides/api/service/async_dsr/strategies/__init__.py +0 -0
  65. fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
  66. fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
  67. fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
  68. fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +686 -0
  69. fides/api/service/async_dsr/utils.py +130 -0
  70. fides/api/service/connectors/bigquery_connector.py +34 -16
  71. fides/api/service/connectors/fides/fides_client.py +63 -1
  72. fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
  73. fides/api/service/connectors/saas/connector_registry_service.py +1 -138
  74. fides/api/service/connectors/saas_connector.py +116 -94
  75. fides/api/service/connectors/sql_connector.py +14 -4
  76. fides/api/service/deps.py +8 -0
  77. fides/api/service/messaging/message_dispatch_service.py +38 -1
  78. fides/api/service/privacy_request/attachment_handling.py +9 -2
  79. fides/api/service/privacy_request/duplication_detection.py +424 -0
  80. fides/api/service/privacy_request/request_runner_service.py +46 -84
  81. fides/api/service/privacy_request/request_service.py +47 -74
  82. fides/api/service/saas_request/saas_request_override_factory.py +71 -1
  83. fides/api/task/execute_request_tasks.py +17 -9
  84. fides/api/task/filter_results.py +35 -2
  85. fides/api/task/graph_task.py +37 -8
  86. fides/api/tasks/__init__.py +0 -1
  87. fides/api/util/connection_util.py +99 -215
  88. fides/api/util/event_audit_util.py +230 -0
  89. fides/api/util/logger_context_utils.py +3 -1
  90. fides/api/util/masking_util.py +31 -0
  91. fides/api/util/memory_watchdog.py +118 -0
  92. fides/api/util/saas_config_updater.py +66 -0
  93. fides/api/util/saas_util.py +28 -1
  94. fides/common/api/scope_registry.py +0 -7
  95. fides/common/api/v1/urn_registry.py +2 -0
  96. fides/config/__init__.py +10 -1
  97. fides/config/celery_settings.py +42 -0
  98. fides/config/config_proxy.py +10 -0
  99. fides/config/duplicate_detection_settings.py +31 -0
  100. fides/config/execution_settings.py +7 -3
  101. fides/config/utils.py +5 -0
  102. fides/data/language/languages.yml +2 -0
  103. fides/service/connection/__init__.py +0 -0
  104. fides/service/connection/connection_service.py +651 -0
  105. fides/service/event_audit_service.py +16 -22
  106. fides/service/privacy_request/privacy_request_service.py +162 -43
  107. fides/service/taxonomy/handlers/legacy_handler.py +3 -3
  108. fides/service/taxonomy/taxonomy_service.py +15 -15
  109. fides/ui-build/static/admin/404.html +1 -1
  110. fides/ui-build/static/admin/_next/static/FZTEUgamBvOhgPWce135w/_buildManifest.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-0da062111df309bf.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/1817-508b16628e8eb225.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/1840-5bbe6d878ed73fb4.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.afe8cad52f904fcf.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-fe1a06d82c0413f1.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/2397-40b8db1cb2f23e2a.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/2921-b10bbc3a9104933b.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/3377-eb5cd82b3ee6ab0c.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/3655-93ecd09f1cb9dbef.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-6db05a35ae806825.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-44255a63d6d80ff5.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/401-fe8db8b5d8f600de.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/4277-13bcf4516326d474.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/4496-bed72bd5639075be.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/4817-d29f40d4ce729f37.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/5185-b2ac9fecc00b67e7.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/5258-4672eae0656430f9.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/5487-8dedd1ca94fbba54.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/549-6e2442db533a711e.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/5643-55d758444a8d7162.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/5724-1e40975cefa405f0.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-6055edba275155ca.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/6084-82e2df433fe5ba85.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/6344-3e21444374f8059f.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/6362-12e3fd23130ccf15.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/6372-a8d0f08dac1ebd0e.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/6780-3db5133c1f4c6f1e.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/6853-1adbdf6418ec3d62.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/6954-aa0c60ee1092be8e.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/7059-12be23a345a94c1e.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/7079-6e6efc3396ff1ebb.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/7218-d297a4a06f924b09.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/7245-686665c197b58e68.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-a43c046c24de37cc.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/7630-c654c61ba98d8c74.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/7654-716cf37a020b3d11.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-e83ace3c6ab99ac7.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/8212-b9e8295ca883c9f8.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/8939-4925751c57c51f87.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  157. fides/ui-build/static/admin/_next/static/chunks/9046-e4daf28840a69fd6.js +1 -0
  158. fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-550bd50d538c5f79.js} +3 -3
  159. fides/ui-build/static/admin/_next/static/chunks/9330-e519adec48222d45.js +1 -0
  160. fides/ui-build/static/admin/_next/static/chunks/9341-bfc0e59bcc56c604.js +1 -0
  161. fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
  162. fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.7d029a5383595b69.js} +1 -1
  163. fides/ui-build/static/admin/_next/static/chunks/9682-da69ac5d06f281da.js +1 -0
  164. fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-657652d55936a8c6.js} +1 -1
  165. fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
  166. fides/ui-build/static/admin/_next/static/chunks/9965-56c5e4fc9cd3b3a5.js +1 -0
  167. fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-d079b8bf35250874.js} +1 -1
  168. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-e64fd8510033a27c.js} +63 -63
  169. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ddd9d7d40847fc28.js +1 -0
  170. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-b4d18c1f4d414f5f.js +1 -0
  171. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d451bc8932330141.js +1 -0
  172. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-c24663cd5dec57db.js} +1 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-d93418688bd258eb.js} +1 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-9b1f2b1c06968166.js} +1 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-115a085e5d42de45.js} +1 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d9b7b311195df29e.js +1 -0
  177. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-3de34624829cbce8.js} +1 -1
  178. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-dc95e7ed278d1a29.js} +1 -1
  179. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cdfc9bb19f47c709.js +1 -0
  180. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-0b995b01dc4dbd1f.js} +1 -1
  181. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-e3ad3a55624e302a.js +1 -0
  182. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-b37ed76849330edd.js} +1 -1
  183. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-dd82729296dee5c5.js} +1 -1
  184. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-49e5477eb1a11b92.js +1 -0
  185. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-dfc1ead4a12c9ffa.js +1 -0
  186. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-8442eb219958ac7e.js} +1 -1
  187. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-feda358d1801c18d.js +1 -0
  188. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d16acb6fc07aad46.js +1 -0
  189. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-c51a1e98c45d231a.js +1 -0
  190. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
  191. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-bcfe38eebca30f8c.js +1 -0
  192. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-f66d0655897c4400.js +1 -0
  193. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
  194. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6f1e012cd641da19.js +1 -0
  195. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-581d6248fcf98d17.js +1 -0
  196. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-ddc1c1641e1e9430.js} +1 -1
  197. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-2b48f7e524743b2b.js} +1 -1
  198. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-862b67418600251e.js} +1 -1
  199. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-0ffec855f5df262c.js} +1 -1
  200. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a030ab8c2e2b0db.js +1 -0
  201. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-6cb66f649b8ca4bf.js +1 -0
  202. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-0b008dad90b00aaa.js +1 -0
  203. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-5566edf9a9d1be2d.js +1 -0
  204. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4ca1f485b6e9e02.js +1 -0
  205. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-85dee7e81dc4bafb.js +1 -0
  206. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-e905e018a2cab35d.js +1 -0
  207. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-912723bc86299b1a.js +1 -0
  208. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f1f0affc18327033.js +1 -0
  209. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-692d27dbe9392c9f.js} +1 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-1b94e2d769a182b2.js +1 -0
  212. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adfe6c5ac5b703d0.js +1 -0
  213. fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-f9be7080ebbb7445.js +1 -0
  214. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-caaa8602a1d449b1.js +1 -0
  215. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-9b106b1d2d93985b.js +1 -0
  216. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-6a1ded8cdde836c4.js +1 -0
  217. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-f94e3accf9507ebf.js +1 -0
  218. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-5e83220ff1f2a250.js +1 -0
  219. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-a03cbd698a23e5b3.js +1 -0
  220. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-3cde574b3c8447c0.js +1 -0
  221. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-0448bb4ae8536c58.js +1 -0
  222. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-1621a4b87c432117.js +1 -0
  223. fides/ui-build/static/admin/_next/static/chunks/pages/notifications-4ea28f6b1dd63642.js +1 -0
  224. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-e02516d9fd314528.js +1 -0
  225. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-fec08bea801b4918.js +1 -0
  226. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d911e5fbf5a4a888.js +1 -0
  227. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-91b1adcac6a57b2d.js +1 -0
  228. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-de309d8813b1ebfb.js +1 -0
  229. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-f2943c1309062284.js +1 -0
  230. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-03eda417711ae909.js} +1 -1
  231. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1fe486f3af832c80.js +1 -0
  232. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-ea6f78fa8b2d3f6c.js +1 -0
  233. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-bda7b474493e7128.js} +1 -1
  234. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-2c0ec8fed16c20ae.js +1 -0
  235. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-30d298a47e85709f.js} +1 -1
  236. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-438084cca0d0f10d.js} +1 -1
  237. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-17fd44d98f5bd5b6.js} +1 -1
  238. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-baf77d34a3b3bece.js +1 -0
  239. fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-8c80391025ca7339.js +1 -0
  240. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7c19810858b708cc.js +1 -0
  241. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee8820fe0fa14c77.js +1 -0
  242. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{[id]-bd1042a0e9be6aff.js → [id]-8eb862182f19a6c2.js} +1 -1
  243. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{new-469ad83c8cfa1290.js → new-37c29ef618e9fe3c.js} +1 -1
  244. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-1db425150dcb1b6b.js +1 -0
  245. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-e334b43fa5c5b1e6.js} +1 -1
  246. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-9d18eb5c38d85522.js +1 -0
  247. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-cb937ed7c4b1e5a8.js} +1 -1
  248. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-835281251f0785cd.js} +1 -1
  249. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-7fd050c92866938c.js} +1 -1
  250. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-59ea66130fca0d05.js +1 -0
  251. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-b0fe1051d908f366.js} +1 -1
  252. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f108bf5015144d2f.js +1 -0
  253. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-0e7c7228d01290ea.js} +1 -1
  254. fides/ui-build/static/admin/_next/static/chunks/pages/systems-adc13b542e10a37d.js +1 -0
  255. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-23dd250da26511c5.js +1 -0
  256. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-aed30fb22ae7c9ec.js} +1 -1
  257. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-6b88ca3e02ee67c9.js} +1 -1
  258. fides/ui-build/static/admin/_next/static/chunks/webpack-6f97ebe373e7ef6b.js +1 -0
  259. fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
  260. fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
  261. fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
  262. fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
  263. fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
  264. fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
  265. fides/ui-build/static/admin/_next/static/css/65ae906f224cd8ae.css +1 -0
  266. fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
  267. fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
  268. fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
  269. fides/ui-build/static/admin/_next/static/css/d5701118537cbdd2.css +1 -0
  270. fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
  271. fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
  272. fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
  273. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  274. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  275. fides/ui-build/static/admin/add-systems.html +1 -1
  276. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  277. fides/ui-build/static/admin/consent/configure.html +1 -1
  278. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  279. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  280. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  281. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  282. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  283. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  284. fides/ui-build/static/admin/consent/properties.html +1 -1
  285. fides/ui-build/static/admin/consent/reporting.html +1 -1
  286. fides/ui-build/static/admin/consent.html +1 -1
  287. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  288. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  289. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  290. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  291. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  292. fides/ui-build/static/admin/data-catalog.html +1 -1
  293. fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -0
  294. fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
  295. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
  296. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
  297. fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
  298. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  299. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  300. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  301. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  302. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  303. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  304. fides/ui-build/static/admin/datamap.html +1 -1
  305. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  306. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  307. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  308. fides/ui-build/static/admin/dataset/new.html +1 -1
  309. fides/ui-build/static/admin/dataset.html +1 -1
  310. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  311. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  312. fides/ui-build/static/admin/datastore-connection.html +1 -1
  313. fides/ui-build/static/admin/index.html +1 -1
  314. fides/ui-build/static/admin/integrations/[id].html +1 -1
  315. fides/ui-build/static/admin/integrations.html +1 -1
  316. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  317. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  318. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  319. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  320. fides/ui-build/static/admin/lib/fides.js +3 -3
  321. fides/ui-build/static/admin/login/[provider].html +1 -1
  322. fides/ui-build/static/admin/login.html +1 -1
  323. fides/ui-build/static/admin/new-privacy-requests.html +1 -0
  324. fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
  325. fides/ui-build/static/admin/notifications/digests/new.html +1 -0
  326. fides/ui-build/static/admin/notifications/digests.html +1 -0
  327. fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
  328. fides/ui-build/static/admin/notifications/providers/new.html +1 -0
  329. fides/ui-build/static/admin/notifications/providers.html +1 -0
  330. fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
  331. fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
  332. fides/ui-build/static/admin/notifications/templates.html +1 -0
  333. fides/ui-build/static/admin/notifications.html +1 -0
  334. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  335. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  336. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  337. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  338. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  339. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  340. fides/ui-build/static/admin/poc/forms.html +1 -1
  341. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  342. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  343. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  344. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  345. fides/ui-build/static/admin/privacy-requests.html +1 -1
  346. fides/ui-build/static/admin/properties/[id].html +1 -1
  347. fides/ui-build/static/admin/properties/add-property.html +1 -1
  348. fides/ui-build/static/admin/properties.html +1 -1
  349. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  350. fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -0
  351. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  352. fides/ui-build/static/admin/settings/about.html +1 -1
  353. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  354. fides/ui-build/static/admin/settings/consent.html +1 -1
  355. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  356. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  357. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  358. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  359. fides/ui-build/static/admin/settings/domains.html +1 -1
  360. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  361. fides/ui-build/static/admin/settings/locations.html +1 -1
  362. fides/ui-build/static/admin/settings/organization.html +1 -1
  363. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  364. fides/ui-build/static/admin/settings/regulations.html +1 -1
  365. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  366. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  367. fides/ui-build/static/admin/systems.html +1 -1
  368. fides/ui-build/static/admin/taxonomy.html +1 -1
  369. fides/ui-build/static/admin/user-management/new.html +1 -1
  370. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  371. fides/ui-build/static/admin/user-management.html +1 -1
  372. fides/api/service/async_dsr/async_dsr_service.py +0 -195
  373. fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
  374. fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
  375. fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
  376. fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
  377. fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
  378. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
  379. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
  380. fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
  381. fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +0 -1
  382. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +0 -1
  383. fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
  384. fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
  385. fides/ui-build/static/admin/_next/static/chunks/2921-66f65496c3a09316.js +0 -1
  386. fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +0 -1
  387. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
  388. fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +0 -1
  389. fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
  390. fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
  391. fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
  392. fides/ui-build/static/admin/_next/static/chunks/401-ffe4e8436e1eceb9.js +0 -1
  393. fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
  394. fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
  395. fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
  396. fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
  397. fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
  398. fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
  399. fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
  400. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
  401. fides/ui-build/static/admin/_next/static/chunks/5185-51eaa78e3ed6bfb7.js +0 -1
  402. fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +0 -1
  403. fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
  404. fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
  405. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
  406. fides/ui-build/static/admin/_next/static/chunks/5643-10a36584c399526c.js +0 -1
  407. fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +0 -1
  408. fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +0 -1
  409. fides/ui-build/static/admin/_next/static/chunks/6853-7004a8c420b1ca02.js +0 -1
  410. fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
  411. fides/ui-build/static/admin/_next/static/chunks/6954-4b24e1731c1cc3b3.js +0 -1
  412. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
  413. fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
  414. fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
  415. fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
  416. fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
  417. fides/ui-build/static/admin/_next/static/chunks/7630-d0d3a0fe3f95e971.js +0 -1
  418. fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
  419. fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
  420. fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
  421. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
  422. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
  423. fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
  424. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
  425. fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
  426. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
  427. fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
  428. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
  429. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-2ca59996860a33c5.js +0 -1
  430. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
  431. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-92182be6603c2842.js +0 -1
  432. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-ab54b19609bff325.js +0 -1
  433. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
  434. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
  435. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
  436. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
  437. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
  438. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
  439. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
  440. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
  441. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
  442. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
  443. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
  444. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
  445. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
  446. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
  447. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
  448. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
  449. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
  450. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
  451. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
  452. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
  453. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-e8d2140787045acd.js +0 -1
  454. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-e3f93462a08251bf.js +0 -1
  455. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-b5f7d6afdecd013d.js +0 -1
  456. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-248ad9f65a872442.js +0 -1
  457. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-aedb66a62042b10a.js +0 -1
  458. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-018df38b7cd77fdb.js +0 -1
  459. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6ca9099d03aab817.js +0 -1
  460. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0f2c90786ea005a4.js +0 -1
  461. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-200b51a725f8b2d1.js +0 -1
  462. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
  463. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
  464. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
  465. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
  466. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-f3e6e74e0efb005c.js +0 -1
  467. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +0 -1
  468. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
  469. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a3275554ffe8e640.js +0 -1
  470. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-77239269acc2d31a.js +0 -1
  471. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-8bf1821722b082e9.js +0 -1
  472. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
  473. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
  474. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-2deb6becece69d46.js +0 -1
  475. fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
  476. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
  477. fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +0 -1
  478. fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
  479. fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
  480. fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
  481. fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
  482. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
  483. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
  484. fides/ui-build/static/admin/messaging/[id].html +0 -1
  485. fides/ui-build/static/admin/messaging/add-template.html +0 -1
  486. fides/ui-build/static/admin/messaging.html +0 -1
  487. fides/ui-build/static/admin/settings/messaging-providers/[key].html +0 -1
  488. fides/ui-build/static/admin/settings/messaging-providers/new.html +0 -1
  489. fides/ui-build/static/admin/settings/messaging-providers.html +0 -1
  490. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/WHEEL +0 -0
  491. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/entry_points.txt +0 -0
  492. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/licenses/LICENSE +0 -0
  493. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/top_level.txt +0 -0
  494. /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → FZTEUgamBvOhgPWce135w}/_ssgManifest.js +0 -0
  495. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-7dce2916cc589c54.js} +0 -0
@@ -0,0 +1,82 @@
1
+ """Create staged resource error table
2
+
3
+ Revision ID: f1a2b3c4d5e6
4
+ Revises: 80d28dea3b6b
5
+ Create Date: 2025-11-05 02:00:00.000000
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "f1a2b3c4d5e6"
14
+ down_revision = "80d28dea3b6b"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ # Create the stagedresourceerror table
21
+ op.create_table(
22
+ "stagedresourceerror",
23
+ sa.Column("id", sa.String(), nullable=False),
24
+ sa.Column(
25
+ "created_at",
26
+ sa.DateTime(timezone=True),
27
+ server_default=sa.text("now()"),
28
+ nullable=True,
29
+ ),
30
+ sa.Column(
31
+ "updated_at",
32
+ sa.DateTime(timezone=True),
33
+ server_default=sa.text("now()"),
34
+ nullable=True,
35
+ ),
36
+ sa.Column(
37
+ "staged_resource_urn",
38
+ sa.String(),
39
+ nullable=False,
40
+ ),
41
+ sa.Column("message", sa.String(), nullable=False),
42
+ sa.Column("timestamp", sa.DateTime(timezone=True), nullable=False),
43
+ sa.Column("error_type", sa.String(), nullable=False),
44
+ sa.Column("diff_status", sa.String(), nullable=False),
45
+ sa.Column("task_id", sa.String(), nullable=True),
46
+ sa.ForeignKeyConstraint(
47
+ ["staged_resource_urn"],
48
+ ["stagedresource.urn"],
49
+ name="stagedresourceerror_staged_resource_urn_fkey",
50
+ ondelete="CASCADE",
51
+ ),
52
+ sa.PrimaryKeyConstraint("id"),
53
+ )
54
+
55
+ op.create_index(
56
+ "ix_stagedresourceerror_staged_resource_urn",
57
+ "stagedresourceerror",
58
+ ["staged_resource_urn"],
59
+ unique=False,
60
+ )
61
+
62
+ op.create_index(
63
+ "ix_stagedresourceerror_task_id",
64
+ "stagedresourceerror",
65
+ ["task_id"],
66
+ unique=False,
67
+ )
68
+
69
+
70
+ def downgrade():
71
+ # Drop the indices
72
+ op.drop_index(
73
+ "ix_stagedresourceerror_task_id",
74
+ table_name="stagedresourceerror",
75
+ )
76
+ op.drop_index(
77
+ "ix_stagedresourceerror_staged_resource_urn",
78
+ table_name="stagedresourceerror",
79
+ )
80
+
81
+ # Drop the stagedresourceerror table
82
+ op.drop_table("stagedresourceerror")
@@ -24,6 +24,7 @@ from starlette.status import (
24
24
  from fides.api.api import deps
25
25
  from fides.api.models.connection_oauth_credentials import OAuthConfig
26
26
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
27
+ from fides.api.models.event_audit import EventAuditType
27
28
  from fides.api.oauth.utils import verify_oauth_client
28
29
  from fides.api.schemas.connection_configuration import connection_secrets_schemas
29
30
  from fides.api.schemas.connection_configuration.connection_config import (
@@ -40,13 +41,14 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
40
41
  )
41
42
  from fides.api.schemas.connection_configuration.enums.system_type import SystemType
42
43
  from fides.api.schemas.connection_configuration.enums.test_status import TestStatus
44
+ from fides.api.service.deps import get_connection_service
43
45
  from fides.api.util.api_router import APIRouter
44
46
  from fides.api.util.connection_util import (
45
47
  connection_status,
46
48
  delete_connection_config,
47
49
  get_connection_config_or_error,
48
50
  patch_connection_configs,
49
- validate_secrets,
51
+ update_connection_secrets,
50
52
  )
51
53
  from fides.common.api.scope_registry import (
52
54
  CONNECTION_CREATE_OR_UPDATE,
@@ -61,6 +63,8 @@ from fides.common.api.v1.urn_registry import (
61
63
  CONNECTIONS,
62
64
  V1_URL_PREFIX,
63
65
  )
66
+ from fides.service.connection.connection_service import ConnectionService
67
+ from fides.service.event_audit_service import EventAuditService
64
68
 
65
69
  router = APIRouter(tags=["Connections"], prefix=V1_URL_PREFIX)
66
70
 
@@ -220,28 +224,6 @@ def delete_connection(
220
224
  delete_connection_config(db, connection_key)
221
225
 
222
226
 
223
- def validate_and_update_secrets(
224
- connection_key: FidesKey,
225
- connection_config: ConnectionConfig,
226
- db: Session,
227
- unvalidated_secrets: connection_secrets_schemas,
228
- verify: Optional[bool],
229
- ) -> TestStatusMessage:
230
- connection_config.secrets = validate_secrets(
231
- db, unvalidated_secrets, connection_config
232
- ).model_dump(mode="json")
233
- # Save validated secrets, regardless of whether they've been verified.
234
- logger.info("Updating connection config secrets for '{}'", connection_key)
235
- connection_config.save(db=db)
236
-
237
- msg = f"Secrets updated for ConnectionConfig with key: {connection_key}."
238
-
239
- if verify:
240
- return connection_status(connection_config, msg, db)
241
-
242
- return TestStatusMessage(msg=msg, test_status=None)
243
-
244
-
245
227
  @router.put(
246
228
  CONNECTION_SECRETS,
247
229
  status_code=HTTP_200_OK,
@@ -251,7 +233,7 @@ def validate_and_update_secrets(
251
233
  def put_connection_config_secrets(
252
234
  connection_key: FidesKey,
253
235
  *,
254
- db: Session = Depends(deps.get_db),
236
+ connection_service: ConnectionService = Depends(get_connection_service),
255
237
  unvalidated_secrets: connection_secrets_schemas,
256
238
  verify: Optional[bool] = True,
257
239
  ) -> TestStatusMessage:
@@ -261,10 +243,8 @@ def put_connection_config_secrets(
261
243
  The specific secrets will be connection-dependent. For example, the components needed to connect to a Postgres DB
262
244
  will differ from Dynamo DB.
263
245
  """
264
- connection_config = get_connection_config_or_error(db, connection_key)
265
-
266
- return validate_and_update_secrets(
267
- connection_key, connection_config, db, unvalidated_secrets, verify
246
+ return update_connection_secrets(
247
+ connection_service, connection_key, unvalidated_secrets, verify
268
248
  )
269
249
 
270
250
 
@@ -277,7 +257,7 @@ def put_connection_config_secrets(
277
257
  def patch_connection_config_secrets(
278
258
  connection_key: FidesKey,
279
259
  *,
280
- db: Session = Depends(deps.get_db),
260
+ connection_service: ConnectionService = Depends(get_connection_service),
281
261
  unvalidated_secrets: connection_secrets_schemas,
282
262
  verify: Optional[bool] = True,
283
263
  ) -> TestStatusMessage:
@@ -287,22 +267,12 @@ def patch_connection_config_secrets(
287
267
  The specific secrets will be connection-dependent. For example, the components needed to connect to a Postgres DB
288
268
  will differ from Dynamo DB.
289
269
  """
290
- connection_config = get_connection_config_or_error(db, connection_key)
291
-
292
- existing_secrets: Optional[Dict[str, Any]] = connection_config.secrets
293
-
294
- # We create the new secrets object by combining the existing secrets with the new secrets.
295
- patched_secrets = {}
296
- if existing_secrets:
297
- patched_secrets = {**existing_secrets}
298
-
299
- patched_secrets = {
300
- **patched_secrets,
301
- **unvalidated_secrets, # type: ignore[dict-item]
302
- }
303
-
304
- return validate_and_update_secrets(
305
- connection_key, connection_config, db, patched_secrets, verify # type: ignore[arg-type]
270
+ return update_connection_secrets(
271
+ connection_service,
272
+ connection_key,
273
+ unvalidated_secrets,
274
+ verify,
275
+ merge_with_existing=True,
306
276
  )
307
277
 
308
278
 
@@ -354,6 +324,16 @@ def put_connection_oauth_config(
354
324
  )
355
325
  connection_config.save(db=db)
356
326
 
327
+ event_audit_service = EventAuditService(db)
328
+ connection_service = ConnectionService(db, event_audit_service)
329
+
330
+ # Create secrets audit event for OAuth credential changes
331
+ connection_service.create_secrets_audit_event(
332
+ EventAuditType.connection_secrets_updated,
333
+ connection_config,
334
+ oauth_config.model_dump(exclude_unset=True), # The OAuth secrets being updated
335
+ )
336
+
357
337
  msg = (
358
338
  f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
359
339
  )
@@ -455,6 +435,19 @@ def patch_connection_oauth_config(
455
435
  detail="Invalid OAuth2 configuration.",
456
436
  ) from exc
457
437
 
438
+ # Create audit event for OAuth config update (OAuth credentials are secrets)
439
+ event_audit_service = EventAuditService(db)
440
+ connection_service = ConnectionService(db, event_audit_service)
441
+
442
+ # Create secrets audit event for OAuth credential changes
443
+ connection_service.create_secrets_audit_event(
444
+ EventAuditType.connection_secrets_updated,
445
+ connection_config,
446
+ validated_config.model_dump(
447
+ exclude_unset=True
448
+ ), # The OAuth secrets being updated
449
+ )
450
+
458
451
  msg = (
459
452
  f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
460
453
  )
@@ -1,7 +1,7 @@
1
1
  from functools import partial
2
2
  from typing import Dict, List, Optional, Union
3
3
 
4
- from fastapi import Depends, HTTPException, Query, Response, Security
4
+ from fastapi import Body, Depends, HTTPException, Query, Response, Security
5
5
  from fastapi.concurrency import run_in_threadpool
6
6
  from fastapi.encoders import jsonable_encoder
7
7
  from fastapi.responses import JSONResponse
@@ -368,7 +368,7 @@ async def create_data_use(
368
368
  """
369
369
  try:
370
370
  return taxonomy_service.create_or_update_element(
371
- "data_uses", data_use.model_dump()
371
+ "data_use", data_use.model_dump()
372
372
  )
373
373
  except KeyOrNameAlreadyExists:
374
374
  raise HTTPException(
@@ -399,7 +399,7 @@ async def create_data_category(
399
399
 
400
400
  try:
401
401
  return taxonomy_service.create_or_update_element(
402
- "data_categories", data_category.model_dump()
402
+ "data_category", data_category.model_dump()
403
403
  )
404
404
  except KeyOrNameAlreadyExists:
405
405
  raise HTTPException(
@@ -430,7 +430,7 @@ async def create_data_subject(
430
430
 
431
431
  try:
432
432
  return taxonomy_service.create_or_update_element(
433
- "data_subjects", data_subject.model_dump()
433
+ "data_subject", data_subject.model_dump()
434
434
  )
435
435
  except KeyOrNameAlreadyExists:
436
436
  raise HTTPException(
@@ -465,7 +465,7 @@ async def update_data_use(
465
465
  )
466
466
  try:
467
467
  result = taxonomy_service.update_element(
468
- "data_uses", data_use.fides_key, data_use.model_dump()
468
+ "data_use", data_use.fides_key, data_use.model_dump()
469
469
  )
470
470
  if not result:
471
471
  raise HTTPException(
@@ -501,7 +501,7 @@ async def update_data_category(
501
501
  )
502
502
  try:
503
503
  result = taxonomy_service.update_element(
504
- "data_categories", data_category.fides_key, data_category.model_dump()
504
+ "data_category", data_category.fides_key, data_category.model_dump()
505
505
  )
506
506
  if not result:
507
507
  raise HTTPException(
@@ -516,6 +516,75 @@ async def update_data_category(
516
516
  )
517
517
 
518
518
 
519
+ @data_category_router.patch(
520
+ "/data_category/{fides_key}/tagging_instructions",
521
+ dependencies=[Security(verify_oauth_client, scopes=[DATA_CATEGORY_UPDATE])],
522
+ response_model=DataCategory,
523
+ status_code=status.HTTP_200_OK,
524
+ name="Update tagging instructions",
525
+ )
526
+ async def update_data_category_tagging_instructions(
527
+ fides_key: str,
528
+ tagging_instructions: str = Body(..., embed=True),
529
+ taxonomy_service: TaxonomyService = Depends(get_taxonomy_service),
530
+ ) -> Dict:
531
+ """
532
+ Update or add tagging_instructions for a data category.
533
+ This is used by LLM-based classification to provide custom instructions for tagging.
534
+ """
535
+ try:
536
+ result = taxonomy_service.update_element(
537
+ "data_category",
538
+ fides_key,
539
+ {"tagging_instructions": tagging_instructions},
540
+ )
541
+ if not result:
542
+ raise HTTPException(
543
+ status_code=HTTP_404_NOT_FOUND,
544
+ detail=f"Data category not found with key: {fides_key}",
545
+ )
546
+ return result
547
+ except (ValidationError, PydanticValidationError) as e:
548
+ raise HTTPException(
549
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
550
+ detail=str(e),
551
+ )
552
+
553
+
554
+ @data_category_router.delete(
555
+ "/data_category/{fides_key}/tagging_instructions",
556
+ dependencies=[Security(verify_oauth_client, scopes=[DATA_CATEGORY_UPDATE])],
557
+ response_model=DataCategory,
558
+ status_code=status.HTTP_200_OK,
559
+ name="Delete tagging instructions",
560
+ )
561
+ async def delete_data_category_tagging_instructions(
562
+ fides_key: str,
563
+ taxonomy_service: TaxonomyService = Depends(get_taxonomy_service),
564
+ ) -> Dict:
565
+ """
566
+ Remove tagging_instructions from a data category.
567
+ Sets the tagging_instructions field to None.
568
+ """
569
+ try:
570
+ result = taxonomy_service.update_element(
571
+ "data_category",
572
+ fides_key,
573
+ {"tagging_instructions": None},
574
+ )
575
+ if not result:
576
+ raise HTTPException(
577
+ status_code=HTTP_404_NOT_FOUND,
578
+ detail=f"Data category not found with key: {fides_key}",
579
+ )
580
+ return result
581
+ except (ValidationError, PydanticValidationError) as e:
582
+ raise HTTPException(
583
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
584
+ detail=str(e),
585
+ )
586
+
587
+
519
588
  GENERIC_OVERRIDES_ROUTER = APIRouter()
520
589
  GENERIC_OVERRIDES_ROUTER.include_router(dataset_router)
521
590
  GENERIC_OVERRIDES_ROUTER.include_router(data_use_router)
@@ -91,6 +91,7 @@ from fides.api.schemas.privacy_request import (
91
91
  BulkPostPrivacyRequests,
92
92
  BulkReviewResponse,
93
93
  BulkSoftDeletePrivacyRequests,
94
+ CancelPrivacyRequests,
94
95
  CheckpointActionRequired,
95
96
  DenyPrivacyRequests,
96
97
  ExecutionLogDetailResponse,
@@ -144,8 +145,10 @@ from fides.common.api.v1.urn_registry import (
144
145
  PRIVACY_REQUEST_APPROVE,
145
146
  PRIVACY_REQUEST_AUTHENTICATED,
146
147
  PRIVACY_REQUEST_BATCH_EMAIL_SEND,
148
+ PRIVACY_REQUEST_BULK_FINALIZE,
147
149
  PRIVACY_REQUEST_BULK_RETRY,
148
150
  PRIVACY_REQUEST_BULK_SOFT_DELETE,
151
+ PRIVACY_REQUEST_CANCEL,
149
152
  PRIVACY_REQUEST_DENY,
150
153
  PRIVACY_REQUEST_FILTERED_RESULTS,
151
154
  PRIVACY_REQUEST_FINALIZE,
@@ -485,7 +488,7 @@ def _filter_privacy_request_queryset(
485
488
  errored_gt: Optional[datetime] = None,
486
489
  external_id: Optional[str] = None,
487
490
  location: Optional[str] = None,
488
- action_type: Optional[ActionType] = None,
491
+ action_type: Optional[Union[ActionType, List[ActionType]]] = None,
489
492
  include_consent_webhook_requests: Optional[bool] = False,
490
493
  include_deleted_requests: Optional[bool] = False,
491
494
  ) -> Query:
@@ -675,9 +678,11 @@ def _filter_privacy_request_queryset(
675
678
  PrivacyRequest.finished_processing_at > errored_gt,
676
679
  )
677
680
  if action_type:
681
+ if isinstance(action_type, ActionType):
682
+ action_type = [action_type]
678
683
  policy_ids_for_action_type = (
679
684
  db.query(Rule)
680
- .filter(Rule.action_type == action_type)
685
+ .filter(Rule.action_type.in_(action_type))
681
686
  .with_entities(Rule.policy_id)
682
687
  .distinct()
683
688
  )
@@ -791,7 +796,7 @@ def _shared_privacy_request_search(
791
796
  errored_gt: Optional[datetime] = None,
792
797
  external_id: Optional[str] = None,
793
798
  location: Optional[str] = None,
794
- action_type: Optional[ActionType] = None,
799
+ action_type: Optional[Union[ActionType, List[ActionType]]] = None,
795
800
  verbose: Optional[bool] = False,
796
801
  include_identities: Optional[bool] = False,
797
802
  include_custom_privacy_request_fields: Optional[bool] = False,
@@ -1356,10 +1361,10 @@ def restart_privacy_request_from_failure(
1356
1361
  )
1357
1362
 
1358
1363
  # Automatically resubmit the request if the cache has expired
1364
+
1359
1365
  if (
1360
- not privacy_request.get_cached_identity_data()
1361
- and privacy_request.status
1362
- not in [PrivacyRequestStatus.complete, PrivacyRequestStatus.pending]
1366
+ not privacy_request.verify_cache_for_identity_data()
1367
+ and privacy_request.status != PrivacyRequestStatus.complete
1363
1368
  ):
1364
1369
  logger.info(
1365
1370
  f"Cached data for privacy request {privacy_request.id} has expired, automatically resubmitting request"
@@ -1476,6 +1481,29 @@ def deny_privacy_request(
1476
1481
  )
1477
1482
 
1478
1483
 
1484
+ @router.patch(
1485
+ PRIVACY_REQUEST_CANCEL,
1486
+ status_code=HTTP_200_OK,
1487
+ response_model=BulkReviewResponse,
1488
+ )
1489
+ def cancel_privacy_request(
1490
+ *,
1491
+ client: ClientDetail = Security(
1492
+ verify_oauth_client,
1493
+ scopes=[PRIVACY_REQUEST_REVIEW],
1494
+ ),
1495
+ privacy_request_service: PrivacyRequestService = Depends(
1496
+ get_privacy_request_service
1497
+ ),
1498
+ privacy_requests: CancelPrivacyRequests,
1499
+ ) -> BulkReviewResponse:
1500
+ """Cancel a list of privacy requests and/or report failure"""
1501
+
1502
+ return privacy_request_service.cancel_privacy_requests(
1503
+ privacy_requests.request_ids, privacy_requests.reason, user_id=client.user_id
1504
+ )
1505
+
1506
+
1479
1507
  def _validate_privacy_request_pending_or_error(
1480
1508
  db: Session, privacy_request_id: str
1481
1509
  ) -> None:
@@ -1971,6 +1999,32 @@ def resume_privacy_request_from_requires_input(
1971
1999
  return privacy_request # type: ignore[return-value]
1972
2000
 
1973
2001
 
2002
+ @router.post(
2003
+ PRIVACY_REQUEST_BULK_FINALIZE,
2004
+ status_code=HTTP_200_OK,
2005
+ response_model=BulkReviewResponse,
2006
+ )
2007
+ def bulk_finalize_privacy_requests(
2008
+ *,
2009
+ client: ClientDetail = Security(
2010
+ verify_oauth_client,
2011
+ scopes=[PRIVACY_REQUEST_REVIEW],
2012
+ ),
2013
+ privacy_request_service: PrivacyRequestService = Depends(
2014
+ get_privacy_request_service
2015
+ ),
2016
+ privacy_requests: ReviewPrivacyRequestIds,
2017
+ ) -> BulkReviewResponse:
2018
+ """
2019
+ Bulk finalize privacy requests that are in requires_manual_finalization status.
2020
+ Each request will be moved from the 'requires_finalization' state to 'complete'.
2021
+ Returns an object with the list of successfully finalized privacy requests and the list of failed finalizations.
2022
+ """
2023
+ return privacy_request_service.finalize_privacy_requests(
2024
+ privacy_requests.request_ids, user_id=client.user_id
2025
+ )
2026
+
2027
+
1974
2028
  @router.post(
1975
2029
  PRIVACY_REQUEST_FINALIZE,
1976
2030
  status_code=HTTP_200_OK,
@@ -3,10 +3,12 @@ from typing import Optional
3
3
  from zipfile import BadZipFile, ZipFile
4
4
 
5
5
  from fastapi import Body, Depends, HTTPException, Request
6
+ from fastapi.encoders import jsonable_encoder
6
7
  from fastapi.params import Security
7
8
  from fastapi.responses import JSONResponse
8
9
  from fideslang.validation import FidesKey
9
10
  from loguru import logger
11
+ from pydantic import ValidationError
10
12
  from sqlalchemy.orm import Session
11
13
  from starlette.status import (
12
14
  HTTP_200_OK,
@@ -18,9 +20,15 @@ from starlette.status import (
18
20
  )
19
21
 
20
22
  from fides.api.api import deps
21
- from fides.api.common_exceptions import FidesopsException, KeyOrNameAlreadyExists
23
+ from fides.api.common_exceptions import (
24
+ FidesopsException,
25
+ KeyOrNameAlreadyExists,
26
+ SaaSConfigNotFoundException,
27
+ )
28
+ from fides.api.common_exceptions import ValidationError as FidesValidationError
22
29
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
23
30
  from fides.api.models.datasetconfig import DatasetConfig
31
+ from fides.api.models.event_audit import EventAuditStatus, EventAuditType
24
32
  from fides.api.models.sql_models import System # type: ignore
25
33
  from fides.api.oauth.utils import verify_oauth_client
26
34
  from fides.api.schemas.connection_configuration.connection_config import (
@@ -29,7 +37,6 @@ from fides.api.schemas.connection_configuration.connection_config import (
29
37
  from fides.api.schemas.connection_configuration.saas_config_template_values import (
30
38
  SaasConnectionTemplateValues,
31
39
  )
32
- from fides.api.schemas.saas.connector_template import ConnectorTemplate
33
40
  from fides.api.schemas.saas.saas_config import (
34
41
  SaaSConfig,
35
42
  SaaSConfigValidationDetails,
@@ -42,13 +49,11 @@ from fides.api.service.authentication.authentication_strategy_oauth2_authorizati
42
49
  OAuth2AuthorizationCodeAuthenticationStrategy,
43
50
  )
44
51
  from fides.api.service.connectors.saas.connector_registry_service import (
45
- ConnectorRegistry,
46
52
  CustomConnectorTemplateLoader,
47
- create_connection_config_from_template_no_save,
48
- upsert_dataset_config_from_template,
49
53
  )
50
54
  from fides.api.util.api_router import APIRouter
51
- from fides.api.util.connection_util import validate_secrets
55
+ from fides.api.util.connection_util import validate_secrets_error_message
56
+ from fides.api.util.event_audit_util import generate_connection_audit_event_details
52
57
  from fides.common.api.scope_registry import (
53
58
  CONNECTION_AUTHORIZE,
54
59
  CONNECTOR_TEMPLATE_REGISTER,
@@ -59,13 +64,17 @@ from fides.common.api.scope_registry import (
59
64
  )
60
65
  from fides.common.api.v1.urn_registry import (
61
66
  AUTHORIZE,
62
- CONNECTION_TYPES,
63
67
  REGISTER_CONNECTOR_TEMPLATE,
64
68
  SAAS_CONFIG,
65
69
  SAAS_CONFIG_VALIDATE,
66
70
  SAAS_CONNECTOR_FROM_TEMPLATE,
67
71
  V1_URL_PREFIX,
68
72
  )
73
+ from fides.service.connection.connection_service import (
74
+ ConnectionService,
75
+ ConnectorTemplateNotFound,
76
+ )
77
+ from fides.service.event_audit_service import EventAuditService
69
78
 
70
79
  router = APIRouter(tags=["SaaS Configs"], prefix=V1_URL_PREFIX)
71
80
 
@@ -168,12 +177,29 @@ def patch_saas_config(
168
177
  Given a SaaS config element, update the corresponding ConnectionConfig object
169
178
  or report failure
170
179
  """
180
+
171
181
  logger.info(
172
182
  "Updating SaaS config '{}' on connection config '{}'",
173
183
  saas_config.fides_key,
174
184
  connection_config.key,
175
185
  )
176
186
  connection_config.update_saas_config(db, saas_config=saas_config)
187
+
188
+ # Create audit event for SaaS config update
189
+ event_audit_service = EventAuditService(db)
190
+ event_details, description = generate_connection_audit_event_details(
191
+ EventAuditType.connection_updated,
192
+ connection_config=connection_config,
193
+ )
194
+ event_audit_service.create_event_audit(
195
+ event_type=EventAuditType.connection_updated,
196
+ status=EventAuditStatus.succeeded,
197
+ resource_type="connection_config",
198
+ resource_identifier=connection_config.key,
199
+ description=description,
200
+ event_details=event_details,
201
+ )
202
+
177
203
  return connection_config.saas_config # type: ignore
178
204
 
179
205
 
@@ -305,59 +331,45 @@ def instantiate_connection(
305
331
  Looks up the connector type in the SaaS connector registry and, if all required
306
332
  fields are provided, persists the associated connection config and dataset to the database.
307
333
  """
308
- connector_template: Optional[ConnectorTemplate] = (
309
- ConnectorRegistry.get_connector_template(saas_connector_type)
310
- )
311
- if not connector_template:
312
- raise HTTPException(
313
- status_code=HTTP_404_NOT_FOUND,
314
- detail=f"SaaS connector type '{saas_connector_type}' is not yet available in Fidesops. For a list of available SaaS connectors, refer to {CONNECTION_TYPES}.",
334
+ event_audit_service = EventAuditService(db)
335
+ connection_service = ConnectionService(db, event_audit_service)
336
+ try:
337
+ connection_config, dataset_config = connection_service.instantiate_connection(
338
+ saas_connector_type, template_values, system
315
339
  )
316
-
317
- if DatasetConfig.filter(
318
- db=db,
319
- conditions=(DatasetConfig.fides_key == template_values.instance_key), # type: ignore[arg-type]
320
- ).count():
340
+ except ConnectorTemplateNotFound as exc:
321
341
  raise HTTPException(
322
- status_code=HTTP_400_BAD_REQUEST,
323
- detail=f"SaaS connector instance key '{template_values.instance_key}' already exists.",
324
- )
325
-
326
- try:
327
- connection_config: ConnectionConfig = (
328
- create_connection_config_from_template_no_save(
329
- db, connector_template, template_values
330
- )
342
+ status_code=HTTP_404_NOT_FOUND,
343
+ detail=f"{exc.args[0]}",
331
344
  )
332
345
  except KeyOrNameAlreadyExists as exc:
333
346
  raise HTTPException(
334
347
  status_code=HTTP_400_BAD_REQUEST,
335
348
  detail=exc.args[0],
336
349
  )
337
-
338
- connection_config.secrets = validate_secrets(
339
- db, template_values.secrets, connection_config
340
- ).model_dump(mode="json")
341
- if system:
342
- connection_config.system_id = system.id
343
- connection_config.save(db=db) # Not persisted to db until secrets are validated
344
-
345
- try:
346
- dataset_config: DatasetConfig = upsert_dataset_config_from_template(
347
- db, connection_config, connector_template, template_values
350
+ except SaaSConfigNotFoundException:
351
+ raise HTTPException(
352
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
353
+ detail=validate_secrets_error_message(),
348
354
  )
349
- except Exception:
350
- connection_config.delete(db)
355
+ except FidesValidationError as e:
356
+ # Check if the exception has the original pydantic errors attached
357
+ raise HTTPException(status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message)
358
+ except ValidationError as e:
359
+ errors = e.errors(include_url=False, include_input=False)
360
+ for err in errors:
361
+ # Additionally, manually remove the context from the error message -
362
+ # this may contain sensitive information
363
+ err.pop("ctx", None)
364
+ raise HTTPException(
365
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
366
+ detail=jsonable_encoder(errors),
367
+ )
368
+ except Exception as exc:
351
369
  raise HTTPException(
352
370
  status_code=HTTP_500_INTERNAL_SERVER_ERROR,
353
- detail=f"SaaS Connector could not be created from the '{saas_connector_type}' template at this time.",
371
+ detail=f"{exc.args[0]}",
354
372
  )
355
- logger.info(
356
- "SaaS Connector and Dataset {} successfully created from '{}' template.",
357
- template_values.instance_key,
358
- saas_connector_type,
359
- )
360
-
361
373
  return SaasConnectionTemplateResponse(
362
374
  connection=connection_config, dataset=dataset_config.ctl_dataset
363
375
  )