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
@@ -1,24 +1,18 @@
1
1
  # pylint: disable=protected-access
2
2
  import os
3
3
  from abc import ABC, abstractmethod
4
- from typing import Dict, Iterable, List, Optional, Type
4
+ from typing import Dict, List, Optional, Type
5
5
  from zipfile import ZipFile
6
6
 
7
7
  from fideslang.models import Dataset
8
8
  from loguru import logger
9
- from packaging.version import Version
10
9
  from packaging.version import parse as parse_version
11
10
  from sqlalchemy.orm import Session
12
11
 
13
12
  from fides.api.api.deps import get_api_session
14
13
  from fides.api.common_exceptions import ValidationError
15
14
  from fides.api.cryptography.cryptographic_util import str_to_b64_str
16
- from fides.api.models.connectionconfig import ConnectionConfig
17
15
  from fides.api.models.custom_connector_template import CustomConnectorTemplate
18
- from fides.api.models.datasetconfig import DatasetConfig
19
- from fides.api.schemas.connection_configuration.saas_config_template_values import (
20
- SaasConnectionTemplateValues,
21
- )
22
16
  from fides.api.schemas.saas.connector_template import ConnectorTemplate
23
17
  from fides.api.schemas.saas.saas_config import SaaSConfig
24
18
  from fides.api.service.authentication.authentication_strategy_oauth2_authorization_code import (
@@ -31,8 +25,6 @@ from fides.api.util.saas_util import (
31
25
  load_config_from_string,
32
26
  load_dataset_from_string,
33
27
  load_yaml_as_string,
34
- replace_config_placeholders,
35
- replace_dataset_placeholders,
36
28
  replace_version,
37
29
  )
38
30
  from fides.api.util.unsafe_file_util import verify_svg, verify_zip
@@ -317,132 +309,3 @@ class ConnectorRegistry:
317
309
  Returns an object containing the various SaaS connector artifacts
318
310
  """
319
311
  return cls._get_combined_templates().get(connector_type)
320
-
321
-
322
- def create_connection_config_from_template_no_save(
323
- db: Session,
324
- template: ConnectorTemplate,
325
- template_values: SaasConnectionTemplateValues,
326
- system_id: Optional[str] = None,
327
- ) -> ConnectionConfig:
328
- """Creates a SaaS connection config from a template without saving it."""
329
- # Load SaaS config from template and replace every instance of "<instance_fides_key>" with the fides_key
330
- # the user has chosen
331
- config_from_template: Dict = replace_config_placeholders(
332
- template.config, "<instance_fides_key>", template_values.instance_key
333
- )
334
-
335
- data = template_values.generate_config_data_from_template(
336
- config_from_template=config_from_template
337
- )
338
-
339
- if system_id:
340
- data["system_id"] = system_id
341
-
342
- # Create SaaS ConnectionConfig
343
- connection_config = ConnectionConfig.create_without_saving(db, data=data)
344
-
345
- return connection_config
346
-
347
-
348
- def upsert_dataset_config_from_template(
349
- db: Session,
350
- connection_config: ConnectionConfig,
351
- template: ConnectorTemplate,
352
- template_values: SaasConnectionTemplateValues,
353
- ) -> DatasetConfig:
354
- """
355
- Creates a `DatasetConfig` from a template
356
- and associates it with a ConnectionConfig.
357
- If the `DatasetConfig` already exists in the db,
358
- then the existing record is updated.
359
- """
360
- # Load the dataset config from template and replace every instance of "<instance_fides_key>" with the fides_key
361
- # the user has chosen
362
- dataset_from_template: Dict = replace_dataset_placeholders(
363
- template.dataset, "<instance_fides_key>", template_values.instance_key
364
- )
365
- data = {
366
- "connection_config_id": connection_config.id,
367
- "fides_key": template_values.instance_key,
368
- "dataset": dataset_from_template, # Currently used for upserting a CTL Dataset
369
- }
370
- dataset_config = DatasetConfig.create_or_update(db, data=data)
371
- return dataset_config
372
-
373
-
374
- def update_saas_configs(db: Session) -> None:
375
- """
376
- Updates SaaS config instances currently in the DB if to the
377
- corresponding template in the registry are found.
378
-
379
- Effectively an "update script" for SaaS config instances,
380
- to be run on server bootstrap.
381
- """
382
- for connector_type in ConnectorRegistry.connector_types():
383
- logger.debug(
384
- "Determining if any updates are needed for connectors of type {} based on templates...",
385
- connector_type,
386
- )
387
- template: ConnectorTemplate = ConnectorRegistry.get_connector_template( # type: ignore
388
- connector_type
389
- )
390
- saas_config = SaaSConfig(**load_config_from_string(template.config))
391
- template_version: Version = parse_version(saas_config.version)
392
-
393
- connection_configs: Iterable[ConnectionConfig] = ConnectionConfig.filter(
394
- db=db,
395
- conditions=(ConnectionConfig.saas_config["type"].astext == connector_type),
396
- ).all()
397
- for connection_config in connection_configs:
398
- saas_config_instance = SaaSConfig.model_validate(
399
- connection_config.saas_config
400
- )
401
- if parse_version(saas_config_instance.version) < template_version:
402
- logger.info(
403
- "Updating SaaS config instance '{}' of type '{}' as its version, {}, was found to be lower than the template version {}",
404
- saas_config_instance.fides_key,
405
- connector_type,
406
- saas_config_instance.version,
407
- template_version,
408
- )
409
- try:
410
- update_saas_instance(
411
- db,
412
- connection_config,
413
- template,
414
- saas_config_instance,
415
- )
416
- except Exception:
417
- logger.exception(
418
- "Encountered error attempting to update SaaS config instance {}",
419
- saas_config_instance.fides_key,
420
- )
421
-
422
-
423
- def update_saas_instance(
424
- db: Session,
425
- connection_config: ConnectionConfig,
426
- template: ConnectorTemplate,
427
- saas_config_instance: SaaSConfig,
428
- ) -> None:
429
- """
430
- Replace in the DB the existing SaaS instance configuration data
431
- (SaaSConfig, DatasetConfig) associated with the given ConnectionConfig
432
- with new instance configuration data based on the given ConnectorTemplate
433
- """
434
- template_vals = SaasConnectionTemplateValues(
435
- name=connection_config.name,
436
- key=connection_config.key,
437
- description=connection_config.description,
438
- secrets=connection_config.secrets,
439
- instance_key=saas_config_instance.fides_key,
440
- )
441
-
442
- config_from_template: Dict = replace_config_placeholders(
443
- template.config, "<instance_fides_key>", template_vals.instance_key
444
- )
445
-
446
- connection_config.update_saas_config(db, SaaSConfig(**config_from_template))
447
-
448
- upsert_dataset_config_from_template(db, connection_config, template, template_vals)
@@ -10,18 +10,18 @@ from requests import Response
10
10
  from sqlalchemy.orm import Session
11
11
  from starlette.status import HTTP_204_NO_CONTENT
12
12
 
13
+ from fides.api.api.deps import get_autoclose_db_session as get_db
13
14
  from fides.api.common_exceptions import (
14
- AwaitingAsyncTask,
15
+ ClientUnsuccessfulException,
16
+ ConnectionException,
15
17
  FidesopsException,
16
18
  PostProcessingException,
17
- PrivacyRequestError,
18
19
  SkippingConsentPropagation,
19
20
  )
20
21
  from fides.api.graph.execution import ExecutionNode
21
22
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionTestStatus
22
23
  from fides.api.models.policy import Policy
23
24
  from fides.api.models.privacy_request import PrivacyRequest, RequestTask
24
- from fides.api.models.privacy_request.request_task import AsyncTaskType
25
25
  from fides.api.schemas.consentable_item import (
26
26
  ConsentableItem,
27
27
  build_consent_item_hierarchy,
@@ -39,6 +39,10 @@ from fides.api.schemas.saas.shared_schemas import (
39
39
  ConsentPropagationStatus,
40
40
  SaaSRequestParams,
41
41
  )
42
+ from fides.api.service.async_dsr.strategies.async_dsr_strategy import AsyncDSRStrategy
43
+ from fides.api.service.async_dsr.strategies.async_dsr_strategy_factory import (
44
+ get_strategy,
45
+ )
42
46
  from fides.api.service.connectors.base_connector import BaseConnector
43
47
  from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
44
48
  from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
@@ -65,7 +69,9 @@ from fides.api.util.logger_context_utils import (
65
69
  from fides.api.util.saas_util import (
66
70
  ALL_OBJECT_FIELDS,
67
71
  CUSTOM_PRIVACY_REQUEST_FIELDS,
72
+ PRIVACY_REQUEST_OBJECT,
68
73
  assign_placeholders,
74
+ check_dataset_missing_reference_values,
69
75
  map_param_values,
70
76
  )
71
77
 
@@ -216,17 +222,14 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
216
222
  request_task: RequestTask,
217
223
  input_data: Dict[str, List[Any]],
218
224
  ) -> List[Row]:
219
- """Retrieve data from SaaS APIs"""
225
+ """
226
+ Retrieve data from SaaS APIs.
227
+
228
+ Handles sync requests directly and delegates async requests to external handlers.
229
+ """
220
230
 
221
231
  # pylint: disable=too-many-branches
222
232
  self.set_privacy_request_state(privacy_request, node, request_task)
223
- if request_task.callback_succeeded:
224
- # If this is True, we assume we've received results from a third party
225
- # asynchronously and we can proceed to the next node.
226
- logger.info(
227
- "Access callback succeeded for request task '{}'", request_task.id
228
- )
229
- return request_task.get_access_data()
230
233
  query_config: SaaSQueryConfig = self.query_config(node)
231
234
 
232
235
  # generate initial set of requests if read request is defined, otherwise raise an exception
@@ -264,37 +267,32 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
264
267
  if custom_privacy_request_fields:
265
268
  input_data[CUSTOM_PRIVACY_REQUEST_FIELDS] = [custom_privacy_request_fields]
266
269
 
267
- rows: List[Row] = []
268
- awaiting_async_processing: bool = False
269
-
270
+ input_data[PRIVACY_REQUEST_OBJECT] = [privacy_request.to_safe_dict()]
271
+ # check all the values specified by param_values are provided in input_data
270
272
  for read_request in read_requests:
271
- self.set_saas_request_state(read_request)
272
- if (
273
- read_request.async_config is not None
274
- and request_task.id # Only supported in DSR 3.0
275
- ):
276
- # Asynchronous read request detected. We will exit below and put the
277
- # Request Task in an "awaiting_processing" status.
278
- awaiting_async_processing = True
279
-
280
- # Validate async strategy with proper enum value checking
281
- strategy_value = read_request.async_config.strategy
282
- valid_strategies = [task_type.value for task_type in AsyncTaskType]
283
-
284
- if strategy_value not in valid_strategies:
285
- raise PrivacyRequestError(
286
- f"Invalid async type '{strategy_value}' for request task {request_task.id}. "
287
- f"Valid types are: {valid_strategies}"
288
- )
289
-
290
- request_task.async_type = AsyncTaskType(strategy_value)
291
-
292
- # check all the values specified by param_values are provided in input_data
293
273
  if self._missing_dataset_reference_values(
294
274
  input_data, read_request.param_values
295
275
  ):
296
276
  return []
297
277
 
278
+ # Delegate async requests
279
+ with get_db() as db:
280
+ # Guard clause to ensure we only run async access requests for access requests
281
+ if self.guard_access_request(policy):
282
+ if async_dsr_strategy := _get_async_dsr_strategy(
283
+ db, request_task, query_config, ActionType.access
284
+ ):
285
+ return async_dsr_strategy.async_retrieve_data(
286
+ client=self.create_client(),
287
+ request_task_id=request_task.id,
288
+ query_config=query_config,
289
+ input_data=input_data,
290
+ )
291
+
292
+ rows: List[Row] = []
293
+ for read_request in read_requests:
294
+ self.set_saas_request_state(read_request)
295
+
298
296
  # hook for user-provided request override functions
299
297
  if read_request.request_override:
300
298
  return self._invoke_read_request_override(
@@ -310,7 +308,12 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
310
308
  # if a path is provided, it means we want to generate HTTP requests from the config
311
309
  if read_request.path:
312
310
  prepared_requests: List[Tuple[SaaSRequestParams, Dict[str, Any]]] = (
313
- query_config.generate_requests(input_data, policy, read_request)
311
+ query_config.generate_requests(
312
+ input_data,
313
+ policy,
314
+ read_request,
315
+ privacy_request=privacy_request,
316
+ )
314
317
  )
315
318
 
316
319
  # Iterates through initial list of prepared requests and through subsequent
@@ -334,7 +337,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
334
337
  # This allows us to build an output object even if we didn't generate and execute
335
338
  # any HTTP requests. This is useful if we just want to select specific input_data
336
339
  # values to provide as row data to the mask_data function
337
- elif read_request.output:
340
+ elif not read_request.path and read_request.output:
338
341
  rows.extend(
339
342
  self._apply_output_template(
340
343
  query_config.generate_param_value_maps(
@@ -345,19 +348,21 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
345
348
  )
346
349
 
347
350
  self.unset_connector_state()
348
- if awaiting_async_processing:
349
- # If a read request was marked to expect async results, original response data here is ignored.
350
- # We'll instead use the data received in the callback URL later.
351
- # However for polling async request we want to save the request data for ids that we will use on the pollings status
352
- if request_task.async_type == AsyncTaskType.polling:
353
- # Saving the request task access data to use it on the polling status request
354
- # TODO: Consider if we want to clean up the rows. Currently this is the concern of the GraphTask.
355
- request_task.access_data = rows
356
- # Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
357
- raise AwaitingAsyncTask()
358
-
359
351
  return rows
360
352
 
353
+ def guard_access_request(self, policy: Policy) -> bool:
354
+ """
355
+ Guard clause to ensure we only run async access requests
356
+ if the access request is enabled and we are in an Access Request
357
+ """
358
+ if (
359
+ self.configuration.enabled_actions is None
360
+ or ActionType.access in self.configuration.enabled_actions
361
+ ):
362
+ if policy.get_rules_for_action(ActionType.access):
363
+ return True
364
+ return False
365
+
361
366
  def _apply_output_template(
362
367
  self,
363
368
  param_value_maps: List[Dict[str, Any]],
@@ -387,29 +392,15 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
387
392
  return result
388
393
 
389
394
  def _missing_dataset_reference_values(
390
- self, input_data: Dict[str, Any], param_values: Optional[List[ParamValue]]
395
+ self, input_data: Dict[str, List[Any]], param_values: Optional[List[ParamValue]]
391
396
  ) -> List[str]:
392
397
  """Return a list of dataset reference values that are not found in the input_data map"""
393
-
394
- # get the list of param_value references
395
- required_param_value_references = [
396
- param_value.name
397
- for param_value in param_values or []
398
- if param_value.references
399
- ]
400
-
401
- # extract the keys from inside the fides_grouped_inputs and append them the other input_data keys
402
- provided_input_keys = (
403
- list(input_data.get("fidesops_grouped_inputs")[0].keys()) # type: ignore
404
- if input_data.get("fidesops_grouped_inputs")
405
- else []
406
- ) + list(input_data.keys())
407
-
408
- # find the missing values
409
- missing_dataset_reference_values = list(
410
- set(required_param_value_references) - set(provided_input_keys)
398
+ missing_dataset_reference_values = check_dataset_missing_reference_values(
399
+ input_data, param_values
400
+ )
401
+ logger.info(
402
+ f"Missing dataset reference values: {missing_dataset_reference_values}"
411
403
  )
412
-
413
404
  if missing_dataset_reference_values:
414
405
  logger.info(
415
406
  "The '{}' request of {} is missing the following dataset reference values [{}], skipping traversal",
@@ -536,22 +527,27 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
536
527
  rows: List[Row],
537
528
  input_data: Optional[Dict[str, List[Any]]] = None,
538
529
  ) -> int:
539
- """Execute a masking request. Return the number of rows that have been updated."""
540
- self.set_privacy_request_state(privacy_request, node, request_task)
541
- if request_task.callback_succeeded:
542
- # If this is True, we assume the data was masked
543
- # asynchronously and we can proceed to the next node.
544
- logger.info(
545
- "Masking callback succeeded for request task '{}'", request_task.id
546
- )
547
- # If we've received the callback for this node, return rows_masked directly
548
- return request_task.rows_masked or 0
530
+ """
531
+ Execute masking requests.
549
532
 
533
+ Handles synchronous requests directly and delegates async requests to external handlers.
534
+ """
550
535
  self.set_privacy_request_state(privacy_request, node, request_task)
536
+
551
537
  query_config = self.query_config(node)
552
538
 
553
- session = Session.object_session(privacy_request)
554
- masking_request = query_config.get_masking_request(session)
539
+ # Delegate async requests
540
+ with get_db() as db:
541
+ if async_dsr_strategy := _get_async_dsr_strategy(
542
+ db, request_task, query_config, ActionType.erasure
543
+ ):
544
+ return async_dsr_strategy.async_mask_data(
545
+ client=self.create_client(),
546
+ request_task_id=request_task.id,
547
+ query_config=query_config,
548
+ rows=rows,
549
+ )
550
+ masking_request = query_config.get_masking_request()
555
551
  rows_updated = 0
556
552
 
557
553
  if not masking_request:
@@ -596,7 +592,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
596
592
  for row in rows:
597
593
  try:
598
594
  prepared_request = query_config.generate_update_stmt(
599
- row, policy, privacy_request
595
+ row, policy, privacy_request, input_data
600
596
  )
601
597
  except ValueError as exc:
602
598
  if masking_request.skip_missing_param_values:
@@ -648,18 +644,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
648
644
  )
649
645
 
650
646
  self.unset_connector_state()
651
-
652
- awaiting_async_callback: bool = bool(
653
- masking_request.async_config
654
- and masking_request.async_config.strategy == AsyncTaskType.callback.value
655
- ) and bool(
656
- request_task.id
657
- ) # Only supported in DSR 3.0
658
- if awaiting_async_callback:
659
- # Asynchronous masking request detected in saas config.
660
- # If the masking request was marked to expect async results, original responses are ignored
661
- # and we raise an AwaitingAsyncTask to put this task in an awaiting_processing state.
662
- raise AwaitingAsyncTask()
663
647
  return rows_updated
664
648
 
665
649
  @staticmethod
@@ -967,6 +951,9 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
967
951
  client,
968
952
  secrets,
969
953
  ) # type: ignore
954
+ except (ConnectionException, ClientUnsuccessfulException):
955
+ # Re-raise these exceptions as-is so the connection service can handle them properly
956
+ raise
970
957
  except Exception as exc:
971
958
  logger.error(
972
959
  "Encountered error executing override test function '{}'",
@@ -1112,3 +1099,38 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
1112
1099
  return []
1113
1100
 
1114
1101
  return consent_requests.opt_in if opt_in else consent_requests.opt_out # type: ignore
1102
+
1103
+
1104
+ def _get_async_dsr_strategy(
1105
+ session: Session,
1106
+ request_task: RequestTask,
1107
+ query_config: SaaSQueryConfig,
1108
+ action_type: ActionType,
1109
+ ) -> Optional[AsyncDSRStrategy]:
1110
+ """
1111
+ Returns the async DSR strategy if any of the read or masking requests have an async_config.
1112
+ """
1113
+
1114
+ # Async processing is only supported for DSR 3.0.
1115
+ # A request task with an ID of None is an indicator that the request is not DSR 3.0.
1116
+ if request_task.id is None:
1117
+ return None
1118
+
1119
+ if action_type == ActionType.access:
1120
+ read_requests = query_config.get_read_requests_by_identity()
1121
+ for request in read_requests:
1122
+ if request.async_config is not None:
1123
+ return get_strategy(
1124
+ request.async_config.strategy,
1125
+ session,
1126
+ request.async_config.configuration,
1127
+ )
1128
+ elif action_type == ActionType.erasure:
1129
+ masking_request = query_config.get_masking_request()
1130
+ if masking_request is not None and masking_request.async_config is not None:
1131
+ return get_strategy(
1132
+ masking_request.async_config.strategy,
1133
+ session,
1134
+ masking_request.async_config.configuration,
1135
+ )
1136
+ return None
@@ -345,7 +345,7 @@ class SQLConnector(BaseConnector[Engine]):
345
345
 
346
346
  # For simple table names
347
347
  if "." not in qualified_table_name:
348
- return inspector.has_table(qualified_table_name)
348
+ return self._check_table_exists(inspector, qualified_table_name)
349
349
 
350
350
  # For qualified names like schema.table or database.schema.table
351
351
  parts = qualified_table_name.split(".")
@@ -353,15 +353,15 @@ class SQLConnector(BaseConnector[Engine]):
353
353
  if len(parts) == 2:
354
354
  # schema.table format
355
355
  schema_name, table_name = parts
356
- return inspector.has_table(table_name, schema=schema_name)
356
+ return self._check_table_exists(inspector, table_name, schema_name)
357
357
 
358
358
  if len(parts) >= 3:
359
359
  # database.schema.table format (use schema.table)
360
360
  schema_name, table_name = parts[-2], parts[-1]
361
- return inspector.has_table(table_name, schema=schema_name)
361
+ return self._check_table_exists(inspector, table_name, schema_name)
362
362
 
363
363
  # Fallback for unexpected format
364
- return inspector.has_table(qualified_table_name)
364
+ return self._check_table_exists(inspector, qualified_table_name)
365
365
 
366
366
  except Exception as exc:
367
367
  # Graceful fallback - if we can't check, assume table exists
@@ -369,6 +369,16 @@ class SQLConnector(BaseConnector[Engine]):
369
369
  logger.error("Unable to check if table exists, assuming it does: {}", exc)
370
370
  return True
371
371
 
372
+ def _check_table_exists(
373
+ self, inspector: Any, table_name: str, schema: Optional[str] = None
374
+ ) -> bool:
375
+ """Helper method to check table existence and log if not found."""
376
+ table_exists = inspector.has_table(table_name, schema=schema)
377
+ if not table_exists:
378
+ qualified_name = f"{schema}.{table_name}" if schema else table_name
379
+ logger.error("Table '{}' does not exist", qualified_name)
380
+ return table_exists
381
+
372
382
  def handle_table_not_found(
373
383
  self,
374
384
  node: ExecutionNode,
fides/api/service/deps.py CHANGED
@@ -6,6 +6,7 @@ from fides.api.api.deps import get_config, get_config_proxy, get_db
6
6
  from fides.api.db.ctl_session import get_async_db
7
7
  from fides.config import FidesConfig
8
8
  from fides.config.config_proxy import ConfigProxy
9
+ from fides.service.connection.connection_service import ConnectionService
9
10
  from fides.service.dataset.dataset_config_service import DatasetConfigService
10
11
  from fides.service.dataset.dataset_service import DatasetService
11
12
  from fides.service.event_audit_service import EventAuditService
@@ -59,5 +60,12 @@ def get_taxonomy_service(
59
60
  return TaxonomyService(db, event_audit_service)
60
61
 
61
62
 
63
+ def get_connection_service(
64
+ db: Session = Depends(get_db),
65
+ event_audit_service: EventAuditService = Depends(get_event_audit_service),
66
+ ) -> ConnectionService:
67
+ return ConnectionService(db, event_audit_service)
68
+
69
+
62
70
  def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
63
71
  return SystemService(db)
@@ -28,6 +28,7 @@ from fides.api.schemas.messaging.messaging import (
28
28
  ErrorNotificationBodyParams,
29
29
  ExternalUserWelcomeBodyParams,
30
30
  FidesopsMessage,
31
+ ManualTaskDigestBodyParams,
31
32
  MessagingActionType,
32
33
  MessagingMethod,
33
34
  MessagingServiceDetails,
@@ -177,6 +178,7 @@ def dispatch_message(
177
178
  UserInviteBodyParams,
178
179
  ErrorNotificationBodyParams,
179
180
  ExternalUserWelcomeBodyParams,
181
+ ManualTaskDigestBodyParams,
180
182
  ]
181
183
  ] = None,
182
184
  subject_override: Optional[str] = None,
@@ -352,7 +354,7 @@ def _render(template_str: str, variables: Optional[Dict] = None) -> str:
352
354
  return template_str
353
355
 
354
356
 
355
- def _build_email( # pylint: disable=too-many-return-statements, too-many-branches
357
+ def _build_email( # pylint: disable=too-many-return-statements, too-many-branches, too-many-statements
356
358
  config_proxy: ConfigProxy,
357
359
  action_type: MessagingActionType,
358
360
  body_params: Any,
@@ -494,6 +496,41 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
494
496
  template_variables=variables,
495
497
  )
496
498
 
499
+ if action_type == MessagingActionType.MANUAL_TASK_DIGEST:
500
+ variables = {
501
+ "vendor_contact_name": body_params.vendor_contact_name,
502
+ "organization_name": body_params.organization_name,
503
+ "portal_url": body_params.portal_url,
504
+ "imminent_task_count": body_params.imminent_task_count,
505
+ "upcoming_task_count": body_params.upcoming_task_count,
506
+ "total_task_count": body_params.total_task_count,
507
+ "company_logo_url": body_params.company_logo_url,
508
+ }
509
+
510
+ # Start with default subject
511
+ subject = f"Weekly DSR Summary from {body_params.organization_name}"
512
+
513
+ # If messaging template exists, extract customizable content
514
+ if messaging_template:
515
+ # Use custom subject if provided
516
+ if "subject" in messaging_template.content:
517
+ subject = _render(messaging_template.content["subject"], variables)
518
+
519
+ # Use custom body content to replace the intro text in HTML template
520
+ custom_body = messaging_template.content.get("body", "")
521
+ if custom_body.strip():
522
+ # Replace the default intro text with the custom body content
523
+ rendered_custom_body = _render(custom_body, variables)
524
+ variables["intro_text"] = rendered_custom_body
525
+
526
+ # Always use the HTML template
527
+ base_template = get_email_template(action_type)
528
+ return EmailForActionType(
529
+ subject=subject,
530
+ body=base_template.render(variables),
531
+ template_variables=variables,
532
+ )
533
+
497
534
  logger.error("Message action type {} is not implemented", action_type)
498
535
  raise MessageDispatchException(
499
536
  f"Message action type {action_type} is not implemented"
@@ -5,7 +5,7 @@ from typing import Any, Dict, Iterator, List, Optional, Tuple
5
5
  from loguru import logger
6
6
 
7
7
  from fides.api.models.attachment import Attachment, AttachmentType
8
- from fides.api.schemas.storage.storage import StorageDetails
8
+ from fides.api.schemas.storage.storage import StorageDetails, StorageType
9
9
 
10
10
 
11
11
  @dataclass
@@ -84,12 +84,19 @@ def get_attachments_content(
84
84
  continue
85
85
 
86
86
  processed_count += 1
87
+
88
+ # Handle bucket_name differently for different storage types
89
+ bucket_name = None
90
+ if attachment.config.type in [StorageType.s3, StorageType.gcs]:
91
+ bucket_name = attachment.config.details[StorageDetails.BUCKET.value]
92
+ # For local storage, bucket_name is not needed
93
+
87
94
  yield AttachmentData(
88
95
  file_name=attachment.file_name,
89
96
  file_size=size,
90
97
  download_url=str(url) if url else None,
91
98
  content_type=attachment.content_type,
92
- bucket_name=attachment.config.details[StorageDetails.BUCKET.value],
99
+ bucket_name=bucket_name or "", # Empty string for local storage
93
100
  file_key=attachment.file_key,
94
101
  storage_key=attachment.storage_key,
95
102
  )