ethyca-fides 2.69.1rc0__py2.py3-none-any.whl → 2.76.0rc2__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/METADATA +9 -6
  2. {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/RECORD +488 -361
  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/0eef0016cf06_adding_oauth2_config_for_.py +69 -0
  7. fides/api/alembic/migrations/versions/303287c70600_migrate_resource_type_from_enum_to_.py +99 -0
  8. fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
  9. fides/api/alembic/migrations/versions/3efe14d4469a_adds_new_experience_configs_for_vendor_.py +79 -0
  10. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
  11. fides/api/alembic/migrations/versions/4d8c0fcc5771_adding_default_system_groups.py +78 -0
  12. fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
  13. fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
  14. fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
  15. fides/api/alembic/migrations/versions/795f46f656c0_migrate_field_type_from_enum_to_string.py +61 -0
  16. fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
  17. fides/api/alembic/migrations/versions/918aefc950c9_create_digest_conditional_dependencies.py +125 -0
  18. fides/api/alembic/migrations/versions/9caf76161e55_make_user_assigned_data_uses_nullable_.py +64 -0
  19. fides/api/alembic/migrations/versions/9e0dcbf67b9f_add_digest_config.py +84 -0
  20. fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
  21. fides/api/alembic/migrations/versions/a8e0c016afd_add_classification_benchmark_table.py +126 -0
  22. fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
  23. fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
  24. fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
  25. fides/api/alembic/migrations/versions/cd8649be3a2b_add_classifications_and_user_assigned_.py +74 -0
  26. fides/api/alembic/migrations/versions/e2cda8d6abc3_add_dismissed_in_activity_view_to_.py +29 -0
  27. fides/api/alembic/migrations/versions/f108fa05c579_adds_optional_duration_field_to_assets.py +28 -0
  28. fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
  29. fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
  30. fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
  31. fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
  32. fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
  33. fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
  34. fides/api/alembic/migrations/versions/xx_2025_11_07_1709_56fe6fad2d89_add_notice_display_order.py +47 -0
  35. fides/api/alembic/migrations/versions/xx_2025_11_10_1200_a1b2c3d4e5f6_add_test_datastore_to_connectiontype.py +53 -0
  36. fides/api/alembic/migrations/versions/xx_2025_11_11_1317_7d82c8fc4c34_store_saas_template_datasets.py +68 -0
  37. fides/api/alembic/migrations/versions/xx_2025_11_12_1430_b2c3d4e5f6a7_add_default_identity_definitions.py +81 -0
  38. fides/api/alembic/migrations/versions/xx_2025_11_25_1854_3ff6449c099e_add_index_on_providedidentity_privacy_.py +50 -0
  39. fides/api/api/v1/api.py +2 -0
  40. fides/api/api/v1/endpoints/admin.py +39 -0
  41. fides/api/api/v1/endpoints/connection_endpoints.py +191 -47
  42. fides/api/api/v1/endpoints/connector_template_endpoints.py +167 -0
  43. fides/api/api/v1/endpoints/generic_overrides.py +90 -15
  44. fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
  45. fides/api/api/v1/endpoints/pre_approval_webhook_endpoints.py +5 -5
  46. fides/api/api/v1/endpoints/privacy_request_endpoints.py +231 -46
  47. fides/api/api/v1/endpoints/saas_config_endpoints.py +63 -92
  48. fides/api/api/v1/endpoints/storage_endpoints.py +5 -1
  49. fides/api/api/v1/endpoints/system.py +157 -100
  50. fides/api/api/v1/endpoints/user_endpoints.py +17 -4
  51. fides/api/app_setup.py +1 -3
  52. fides/api/common_exceptions.py +8 -0
  53. fides/api/db/base.py +8 -0
  54. fides/api/db/crud.py +30 -2
  55. fides/api/db/database.py +261 -4
  56. fides/api/db/safe_crud.py +377 -0
  57. fides/api/db/seed.py +35 -1
  58. fides/api/email_templates/get_email_template.py +3 -0
  59. fides/api/email_templates/template_names.py +1 -0
  60. fides/api/email_templates/templates/external_user_welcome.html +9 -5
  61. fides/api/email_templates/templates/manual_task_digest.html +316 -0
  62. fides/api/main.py +2 -0
  63. fides/api/migrations/post_upgrade_index_creation.py +20 -0
  64. fides/api/models/asset.py +17 -1
  65. fides/api/models/attachment.py +1 -0
  66. fides/api/models/conditional_dependency/__init__.py +0 -0
  67. fides/api/models/conditional_dependency/conditional_dependency_base.py +311 -0
  68. fides/api/models/connection_oauth_credentials.py +57 -0
  69. fides/api/models/connectionconfig.py +11 -1
  70. fides/api/models/detection_discovery/__init__.py +4 -0
  71. fides/api/models/detection_discovery/classification_benchmark.py +140 -0
  72. fides/api/models/detection_discovery/core.py +78 -3
  73. fides/api/models/detection_discovery/monitor_task.py +3 -1
  74. fides/api/models/detection_discovery/staged_resource_error.py +25 -0
  75. fides/api/models/detection_discovery/web_monitor.py +61 -0
  76. fides/api/models/digest/__init__.py +16 -0
  77. fides/api/models/digest/conditional_dependencies.py +275 -0
  78. fides/api/models/digest/digest_config.py +110 -0
  79. fides/api/models/digest/digest_execution.py +142 -0
  80. fides/api/models/event_audit.py +85 -0
  81. fides/api/models/experience_notices.py +6 -1
  82. fides/api/models/fides_user.py +9 -0
  83. fides/api/models/identity_definition.py +66 -0
  84. fides/api/models/location_regulation_selections.py +22 -0
  85. fides/api/models/manual_task/conditional_dependency.py +29 -87
  86. fides/api/models/manual_webhook.py +17 -6
  87. fides/api/models/messaging.py +30 -10
  88. fides/api/models/messaging_template.py +14 -0
  89. fides/api/models/policy.py +27 -0
  90. fides/api/models/privacy_experience.py +41 -0
  91. fides/api/models/privacy_notice.py +196 -13
  92. fides/api/models/privacy_preference.py +2 -0
  93. fides/api/models/privacy_request/duplicate_group.py +84 -0
  94. fides/api/models/privacy_request/privacy_request.py +154 -8
  95. fides/api/models/privacy_request/provided_identity.py +22 -1
  96. fides/api/models/privacy_request/request_task.py +98 -1
  97. fides/api/models/privacy_request/webhook.py +3 -1
  98. fides/api/models/saas_template_dataset.py +63 -0
  99. fides/api/models/sql_models.py +161 -7
  100. fides/api/models/system_group.py +85 -0
  101. fides/api/models/taxonomy.py +91 -9
  102. fides/api/models/v3/__init__.py +0 -0
  103. fides/api/models/v3/privacy_preferences.py +85 -0
  104. fides/api/models/worker_task.py +8 -0
  105. fides/api/oauth/roles.py +4 -0
  106. fides/api/schemas/application_config.py +32 -1
  107. fides/api/schemas/connection_configuration/connection_config.py +1 -30
  108. fides/api/schemas/connection_configuration/connection_oauth_config.py +42 -0
  109. fides/api/schemas/connection_configuration/connection_secrets_mongodb.py +15 -3
  110. fides/api/schemas/connection_configuration/connection_secrets_mssql.py +5 -0
  111. fides/api/schemas/messaging/messaging.py +49 -66
  112. fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
  113. fides/api/schemas/messaging/shared_schemas.py +102 -0
  114. fides/api/schemas/oauth.py +2 -1
  115. fides/api/schemas/privacy_center_config.py +29 -5
  116. fides/api/schemas/privacy_request.py +44 -7
  117. fides/api/schemas/saas/async_polling_configuration.py +81 -0
  118. fides/api/schemas/saas/connector_template.py +14 -0
  119. fides/api/schemas/saas/saas_config.py +12 -20
  120. fides/api/schemas/system.py +8 -0
  121. fides/api/schemas/taxonomy_extensions.py +8 -0
  122. fides/api/schemas/user.py +2 -2
  123. fides/api/service/async_dsr/handlers/__init__.py +0 -0
  124. fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
  125. fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
  126. fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
  127. fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
  128. fides/api/service/async_dsr/strategies/__init__.py +0 -0
  129. fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
  130. fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
  131. fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
  132. fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +691 -0
  133. fides/api/service/async_dsr/utils.py +130 -0
  134. fides/api/service/connectors/base_erasure_email_connector.py +7 -0
  135. fides/api/service/connectors/bigquery_connector.py +34 -16
  136. fides/api/service/connectors/fides/fides_client.py +63 -1
  137. fides/api/service/connectors/http_connector.py +48 -12
  138. fides/api/service/connectors/microsoft_sql_server_connector.py +6 -1
  139. fides/api/service/connectors/mongodb_connector.py +74 -9
  140. fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
  141. fides/api/service/connectors/saas/connector_registry_service.py +42 -135
  142. fides/api/service/connectors/saas_connector.py +116 -76
  143. fides/api/service/connectors/sql_connector.py +14 -4
  144. fides/api/service/deps.py +25 -2
  145. fides/api/service/messaging/message_dispatch_service.py +98 -20
  146. fides/api/service/messaging/messaging_crud_service.py +5 -9
  147. fides/api/service/privacy_request/attachment_handling.py +9 -2
  148. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +17 -9
  149. fides/api/service/privacy_request/dsr_package/templates/attachments_index.html +41 -30
  150. fides/api/service/privacy_request/dsr_package/templates/clickme.html +68 -0
  151. fides/api/service/privacy_request/dsr_package/templates/dataset_index.html +30 -27
  152. fides/api/service/privacy_request/duplication_detection.py +439 -0
  153. fides/api/service/privacy_request/email_batch_service.py +2 -1
  154. fides/api/service/privacy_request/request_runner_service.py +92 -91
  155. fides/api/service/privacy_request/request_service.py +74 -90
  156. fides/api/service/saas_request/saas_request_override_factory.py +71 -1
  157. fides/api/service/storage/streaming/schemas.py +27 -19
  158. fides/api/service/storage/streaming/smart_open_client.py +2 -2
  159. fides/api/service/storage/streaming/smart_open_streaming_storage.py +238 -147
  160. fides/api/service/storage/util.py +20 -106
  161. fides/api/service/strategy.py +6 -3
  162. fides/api/task/conditional_dependencies/privacy_request/__init__.py +0 -0
  163. fides/api/task/conditional_dependencies/privacy_request/convenience_fields.py +155 -0
  164. fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py +140 -0
  165. fides/api/task/conditional_dependencies/privacy_request/schemas.py +212 -0
  166. fides/api/task/conditional_dependencies/sql_schemas.py +301 -0
  167. fides/api/task/conditional_dependencies/sql_translator.py +757 -0
  168. fides/api/task/conditional_dependencies/util.py +111 -0
  169. fides/api/task/execute_request_tasks.py +34 -13
  170. fides/api/task/filter_results.py +35 -2
  171. fides/api/task/graph_runners.py +2 -32
  172. fides/api/task/graph_task.py +42 -12
  173. fides/api/task/manual/manual_task_conditional_evaluation.py +33 -28
  174. fides/api/task/manual/manual_task_graph_task.py +4 -1
  175. fides/api/task/manual/manual_task_utils.py +68 -26
  176. fides/api/task/scheduler_utils.py +39 -0
  177. fides/api/tasks/__init__.py +15 -1
  178. fides/api/util/cache.py +5 -1
  179. fides/api/util/connection_util.py +101 -218
  180. fides/api/util/event_audit_util.py +230 -0
  181. fides/api/util/filter_utils.py +0 -3
  182. fides/api/util/fuzzy_search_utils.py +7 -1
  183. fides/api/util/lock.py +13 -3
  184. fides/api/util/logger.py +58 -4
  185. fides/api/util/logger_context_utils.py +3 -1
  186. fides/api/util/masking_util.py +31 -0
  187. fides/api/util/memory_watchdog.py +118 -0
  188. fides/api/util/rate_limit.py +25 -7
  189. fides/api/util/saas_config_updater.py +76 -0
  190. fides/api/util/saas_util.py +28 -1
  191. fides/api/worker/__init__.py +6 -0
  192. fides/common/api/scope_registry.py +6 -7
  193. fides/common/api/v1/urn_registry.py +15 -3
  194. fides/config/__init__.py +11 -2
  195. fides/config/celery_settings.py +42 -0
  196. fides/config/config_proxy.py +10 -0
  197. fides/config/duplicate_detection_settings.py +31 -0
  198. fides/config/execution_settings.py +6 -6
  199. fides/config/security_settings.py +4 -1
  200. fides/config/utils.py +5 -0
  201. fides/data/language/languages.yml +2 -0
  202. fides/service/connection/__init__.py +0 -0
  203. fides/service/connection/connection_service.py +651 -0
  204. fides/service/dataset/dataset_service.py +39 -0
  205. fides/service/event_audit_service.py +109 -0
  206. fides/service/messaging/aws_ses_service.py +2 -4
  207. fides/service/messaging/messaging_service.py +75 -74
  208. fides/service/privacy_request/privacy_request_service.py +345 -100
  209. fides/service/system/__init__.py +0 -0
  210. fides/service/system/system_service.py +153 -0
  211. fides/service/taxonomy/handlers/legacy_handler.py +3 -3
  212. fides/service/taxonomy/taxonomy_service.py +64 -18
  213. fides/ui-build/static/admin/404.html +1 -1
  214. fides/ui-build/static/admin/_next/static/chunks/1099-688fa865621531cc.js +1 -0
  215. fides/ui-build/static/admin/_next/static/chunks/1115-7fd171dac1eb0e51.js +1 -0
  216. fides/ui-build/static/admin/_next/static/chunks/1276.deb10ae2643f8463.js +1 -0
  217. fides/ui-build/static/admin/_next/static/chunks/1438-8a33b3834d6e43f3.js +1 -0
  218. fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
  219. fides/ui-build/static/admin/_next/static/chunks/1821-c1daa160f492aacf.js +1 -0
  220. fides/ui-build/static/admin/_next/static/chunks/1840-359ee056e4cf6629.js +1 -0
  221. fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.bef017bc80e2012c.js} +1 -1
  222. fides/ui-build/static/admin/_next/static/chunks/2040-70972e15960d9afe.js +1 -0
  223. fides/ui-build/static/admin/_next/static/chunks/2121.321b0fd3932164d4.js +1 -0
  224. fides/ui-build/static/admin/_next/static/chunks/2397-3434603a97f3f5d6.js +1 -0
  225. fides/ui-build/static/admin/_next/static/chunks/2921-49ed0ed897832958.js +1 -0
  226. fides/ui-build/static/admin/_next/static/chunks/3150-da5406b80d25fe6d.js +1 -0
  227. fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
  228. fides/ui-build/static/admin/_next/static/chunks/3377-02bf9780fd383d94.js +1 -0
  229. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  230. fides/ui-build/static/admin/_next/static/chunks/3655-5e1ba5dd68b5ec48.js +1 -0
  231. fides/ui-build/static/admin/_next/static/chunks/3729-31ff8ba51491bf21.js +1 -0
  232. fides/ui-build/static/admin/_next/static/chunks/3872-cff30ca0844fe2b1.js +1 -0
  233. fides/ui-build/static/admin/_next/static/chunks/3931-8bedde156fe83564.js +1 -0
  234. fides/ui-build/static/admin/_next/static/chunks/401-582d9970d89deefe.js +1 -0
  235. fides/ui-build/static/admin/_next/static/chunks/4093-7e47408c28de5375.js +1 -0
  236. fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
  237. fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
  238. fides/ui-build/static/admin/_next/static/chunks/4322-f6aeff6880726c83.js +1 -0
  239. fides/ui-build/static/admin/_next/static/chunks/4339-04a715ab07122744.js +1 -0
  240. fides/ui-build/static/admin/_next/static/chunks/4496-ccbce2459174e0d6.js +1 -0
  241. fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
  242. fides/ui-build/static/admin/_next/static/chunks/4589-c1d83c6a8dab4d30.js +1 -0
  243. fides/ui-build/static/admin/_next/static/chunks/4809-a8f4a108a42f53ed.js +1 -0
  244. fides/ui-build/static/admin/_next/static/chunks/4903-19c0bc07a956dfa8.js +1 -0
  245. fides/ui-build/static/admin/_next/static/chunks/4910-d990773601f794c1.js +1 -0
  246. fides/ui-build/static/admin/_next/static/chunks/5185-96423702fba70ced.js +1 -0
  247. fides/ui-build/static/admin/_next/static/chunks/5258-4e308cca01d59367.js +1 -0
  248. fides/ui-build/static/admin/_next/static/chunks/5487-5c3501754bf027ba.js +1 -0
  249. fides/ui-build/static/admin/_next/static/chunks/549-1bdc3e6f3264c020.js +1 -0
  250. fides/ui-build/static/admin/_next/static/chunks/5505-43b9c39491b88e08.js +1 -0
  251. fides/ui-build/static/admin/_next/static/chunks/5698.2135391a128cc373.js +164 -0
  252. fides/ui-build/static/admin/_next/static/chunks/5783-016dfcee8e49bf61.js +1 -0
  253. fides/ui-build/static/admin/_next/static/chunks/5826-4db99ea4e5077911.js +1 -0
  254. fides/ui-build/static/admin/_next/static/chunks/590-be447cacf12419dd.js +1 -0
  255. fides/ui-build/static/admin/_next/static/chunks/6084-91badbc6569a0efb.js +1 -0
  256. fides/ui-build/static/admin/_next/static/chunks/6344-026cb323c1d49926.js +1 -0
  257. fides/ui-build/static/admin/_next/static/chunks/6362-ba0e12f2fc4cad94.js +1 -0
  258. fides/ui-build/static/admin/_next/static/chunks/6853-882889659769d7b4.js +1 -0
  259. fides/ui-build/static/admin/_next/static/chunks/6882-bb1b469d7d7f5335.js +1 -0
  260. fides/ui-build/static/admin/_next/static/chunks/6954-0dcf22a9aabe39c5.js +1 -0
  261. fides/ui-build/static/admin/_next/static/chunks/7170-46db82bb5b55e856.js +1 -0
  262. fides/ui-build/static/admin/_next/static/chunks/7218-2ace8c82e3e7eb74.js +1 -0
  263. fides/ui-build/static/admin/_next/static/chunks/7245-1cdafb35f289861b.js +1 -0
  264. fides/ui-build/static/admin/_next/static/chunks/7630-7f75ab7b8df42eb3.js +1 -0
  265. fides/ui-build/static/admin/_next/static/chunks/7654-2e9a8be02e41769a.js +1 -0
  266. fides/ui-build/static/admin/_next/static/chunks/8212-348ddd2b6933db70.js +1 -0
  267. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  268. fides/ui-build/static/admin/_next/static/chunks/{5596-bb601cbf40e47a0f.js → 9195-da717d324917b049.js} +3 -3
  269. fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
  270. fides/ui-build/static/admin/_next/static/chunks/{9676.9fd9552ef744c717.js → 9676.1f395eeb9cc34968.js} +1 -1
  271. fides/ui-build/static/admin/_next/static/chunks/9826-1078e46f3ac0b688.js +1 -0
  272. fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
  273. fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-800be6996aaa999c.js} +1 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-de4b578c904df772.js} +57 -220
  275. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-f12020b82dd4bd1a.js +1 -0
  276. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-a911b7990371704d.js +1 -0
  277. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-ad585b79953c2753.js +1 -0
  278. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-bb263d394ca1c8fa.js} +1 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-6907c368d8611c44.js +1 -0
  280. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-c32f381af358149b.js} +1 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-e74cb5ea87f15b40.js → new-6efb3c069d8b47dd.js} +1 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-1975c529905eea9b.js +1 -0
  283. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-b05331178928ab52.js} +1 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-516834e930bb0d0d.js} +1 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-985717f2565f9d9d.js +1 -0
  286. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-2be773e08498e40c.js} +1 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-850afb74f4192e87.js +1 -0
  288. fides/ui-build/static/admin/_next/static/chunks/pages/consent-b63d1e395d879b86.js +1 -0
  289. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-5b28f0f674ea87bd.js +1 -0
  290. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-676177e2f3c9c2a2.js} +1 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-794906929efb8e1d.js +1 -0
  292. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-3ccbf7c0d06507b9.js +1 -0
  293. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-1ea0b24d306b1e67.js +1 -0
  294. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-d4861a4a218bb65a.js +1 -0
  295. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
  296. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/infrastructure/[monitorId]-66bd265044daf97d.js +1 -0
  297. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/infrastructure-c9c79fa8576a4f77.js +1 -0
  298. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-60cacc3232c2eead.js +1 -0
  299. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-437bd64a3016de36.js +1 -0
  300. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
  301. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-8349248c2da970a6.js +1 -0
  302. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-6919a1d6cadaa46b.js +1 -0
  303. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-1a50d421897d3da1.js} +1 -1
  304. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-49509414a15e8393.js} +1 -1
  305. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-1a1bb80b586d0c0f.js} +1 -1
  306. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-49de61df1e8e7fba.js} +1 -1
  307. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c2719f5cff20c0f8.js +1 -0
  308. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-dfd71c1e9c458b89.js → [...subfieldNames]-415015aebab60436.js} +1 -1
  309. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-7cdc42ec5493b83d.js → [collectionName]-5accb09715b5122d.js} +1 -1
  310. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-aebecca1d8ec5f98.js +1 -0
  311. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-9551a82ddec9f909.js +1 -0
  312. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-72f8fe47beef0f09.js +1 -0
  313. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-3a8aa3f633528e88.js +1 -0
  314. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-87512616f35ec6da.js +1 -0
  315. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-2f1bf4eac7aa55fd.js +1 -0
  316. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
  317. fides/ui-build/static/admin/_next/static/chunks/pages/index-8d67cd2872cb682a.js +1 -0
  318. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-7a631df29cd0e31a.js +1 -0
  319. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-ea3bc43cdaf273de.js +1 -0
  320. fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-5d8632bba1b81cd4.js +1 -0
  321. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-92e01822ecde8fb8.js +1 -0
  322. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-1256cf6d3f6794e0.js +1 -0
  323. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-0daac00911d27617.js +1 -0
  324. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-2d976fe5e8ba0a3a.js +1 -0
  325. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-7766ba497b863740.js +1 -0
  326. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-f2880d2ed4734270.js +1 -0
  327. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-669f585c3458faff.js +1 -0
  328. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-c79e7724e4bc3899.js +1 -0
  329. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-891654e8dc13965c.js +1 -0
  330. fides/ui-build/static/admin/_next/static/chunks/pages/notifications-40c8148244c5d347.js +1 -0
  331. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-1e86f3e28bd23ed6.js +1 -0
  332. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-9b7bd8c38f02c091.js +1 -0
  333. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-b18a53a940cf9e19.js +1 -0
  334. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6d028d7450e77578.js +1 -0
  335. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-8399083ee2cd8cc2.js +1 -0
  336. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-0a910125cdb2b3b8.js +1 -0
  337. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-acc90b6f7fe915cb.js +1 -0
  338. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-bbc42026f2685438.js +1 -0
  339. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-c08ca6ad21c99799.js +1 -0
  340. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-77c2db582f8823bc.js +1 -0
  341. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-74ccea4868408e3d.js} +1 -1
  342. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-7d9f09bfe9d44dfc.js} +1 -1
  343. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-cd77bc30672bb1fa.js} +1 -1
  344. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-cc3bd9540132d5ed.js +1 -0
  345. fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-7ce7d720107ab4b5.js +1 -0
  346. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
  347. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
  348. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-ae789892343c24f5.js +1 -0
  349. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-13ee1b331ced0846.js +1 -0
  350. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-ee4e43692336a330.js +1 -0
  351. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-ca51d794abfcbf25.js +1 -0
  352. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-ecd1dc5db8e81409.js +1 -0
  353. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-df06f7e2f668c540.js +1 -0
  354. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-da0c77bd510c6c51.js +1 -0
  355. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-950b0c115bf673d8.js +1 -0
  356. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-7e36cb4756973a9d.js} +1 -1
  357. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-a0e5ed486d24ccf3.js +1 -0
  358. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-3cdebafb6870d3ad.js +1 -0
  359. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-159aad34f1021320.js} +1 -1
  360. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-dbd1a64090ad0946.js +1 -0
  361. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-7d042497a57a3788.js +1 -0
  362. fides/ui-build/static/admin/_next/static/chunks/pages/systems-21f1172e73dfc9f0.js +1 -0
  363. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-e553161e6338ee48.js +1 -0
  364. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-efc4af017723e57a.js} +1 -1
  365. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-b152319d67372ee4.js} +1 -1
  366. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-dba8692491f7935e.js +1 -0
  367. fides/ui-build/static/admin/_next/static/chunks/webpack-09ca52bc7beb0b43.js +1 -0
  368. fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
  369. fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
  370. fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
  371. fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
  372. fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
  373. fides/ui-build/static/admin/_next/static/css/3d66bb57ddcb0978.css +1 -0
  374. fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
  375. fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
  376. fides/ui-build/static/admin/_next/static/css/a1e4be9466578ef1.css +1 -0
  377. fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
  378. fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
  379. fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
  380. fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
  381. fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
  382. fides/ui-build/static/admin/_next/static/l2vgGUHB04Fi4oEVlVMrc/_buildManifest.js +1 -0
  383. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  384. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  385. fides/ui-build/static/admin/add-systems.html +1 -1
  386. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  387. fides/ui-build/static/admin/consent/configure.html +1 -1
  388. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  389. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  390. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  391. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  392. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  393. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  394. fides/ui-build/static/admin/consent/properties.html +1 -1
  395. fides/ui-build/static/admin/consent/reporting.html +1 -1
  396. fides/ui-build/static/admin/consent.html +1 -1
  397. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  398. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  399. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  400. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  401. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  402. fides/ui-build/static/admin/data-catalog.html +1 -1
  403. fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -0
  404. fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
  405. fides/ui-build/static/admin/data-discovery/action-center/infrastructure/[monitorId].html +1 -0
  406. fides/ui-build/static/admin/data-discovery/action-center/infrastructure.html +1 -0
  407. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
  408. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
  409. fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
  410. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  411. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  412. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  413. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  414. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  415. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  416. fides/ui-build/static/admin/datamap.html +1 -1
  417. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  418. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  419. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  420. fides/ui-build/static/admin/dataset/new.html +1 -1
  421. fides/ui-build/static/admin/dataset.html +1 -1
  422. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  423. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  424. fides/ui-build/static/admin/datastore-connection.html +1 -1
  425. fides/ui-build/static/admin/index.html +1 -1
  426. fides/ui-build/static/admin/integrations/[id].html +1 -1
  427. fides/ui-build/static/admin/integrations.html +1 -1
  428. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  429. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  430. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  431. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  432. fides/ui-build/static/admin/lib/fides.js +3 -3
  433. fides/ui-build/static/admin/login/[provider].html +1 -1
  434. fides/ui-build/static/admin/login.html +1 -1
  435. fides/ui-build/static/admin/new-privacy-requests.html +1 -0
  436. fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
  437. fides/ui-build/static/admin/notifications/digests/new.html +1 -0
  438. fides/ui-build/static/admin/notifications/digests.html +1 -0
  439. fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
  440. fides/ui-build/static/admin/notifications/providers/new.html +1 -0
  441. fides/ui-build/static/admin/notifications/providers.html +1 -0
  442. fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
  443. fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
  444. fides/ui-build/static/admin/notifications/templates.html +1 -0
  445. fides/ui-build/static/admin/notifications.html +1 -0
  446. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  447. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  448. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  449. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  450. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  451. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  452. fides/ui-build/static/admin/poc/forms.html +1 -1
  453. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  454. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  455. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  456. fides/ui-build/static/admin/privacy-requests.html +1 -1
  457. fides/ui-build/static/admin/properties/[id].html +1 -1
  458. fides/ui-build/static/admin/properties/add-property.html +1 -1
  459. fides/ui-build/static/admin/properties.html +1 -1
  460. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  461. fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -0
  462. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  463. fides/ui-build/static/admin/settings/about.html +1 -1
  464. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  465. fides/ui-build/static/admin/settings/consent.html +1 -1
  466. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -0
  467. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -0
  468. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  469. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  470. fides/ui-build/static/admin/settings/domains.html +1 -1
  471. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  472. fides/ui-build/static/admin/settings/locations.html +1 -1
  473. fides/ui-build/static/admin/settings/organization.html +1 -1
  474. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  475. fides/ui-build/static/admin/settings/regulations.html +1 -1
  476. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  477. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  478. fides/ui-build/static/admin/systems.html +1 -1
  479. fides/ui-build/static/admin/taxonomy.html +1 -1
  480. fides/ui-build/static/admin/user-management/new.html +1 -1
  481. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  482. fides/ui-build/static/admin/user-management.html +1 -1
  483. fides/api/service/async_dsr/async_dsr_service.py +0 -75
  484. fides/api/service/privacy_request/dsr_package/templates/welcome.html +0 -66
  485. fides/ui-build/static/admin/_next/static/OmXHlY9MvjoZH9jDkAytl/_buildManifest.js +0 -1
  486. fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
  487. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
  488. fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
  489. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
  490. fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.js +0 -1
  491. fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
  492. fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
  493. fides/ui-build/static/admin/_next/static/chunks/2921-52328140bc420d0f.js +0 -1
  494. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
  495. fides/ui-build/static/admin/_next/static/chunks/3550-d04125c828d591a1.js +0 -1
  496. fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
  497. fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
  498. fides/ui-build/static/admin/_next/static/chunks/3847-230bf61b053bc706.js +0 -1
  499. fides/ui-build/static/admin/_next/static/chunks/3855-ef5194cdb228beb6.js +0 -1
  500. fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
  501. fides/ui-build/static/admin/_next/static/chunks/3923-bb2417b8dcade7a4.js +0 -1
  502. fides/ui-build/static/admin/_next/static/chunks/401-4af0a912e249d30f.js +0 -1
  503. fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
  504. fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +0 -1
  505. fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
  506. fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
  507. fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
  508. fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
  509. fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
  510. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
  511. fides/ui-build/static/admin/_next/static/chunks/5258-b0de22a8521686ab.js +0 -1
  512. fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
  513. fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
  514. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
  515. fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
  516. fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +0 -1
  517. fides/ui-build/static/admin/_next/static/chunks/6853-b17673391117c976.js +0 -1
  518. fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
  519. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
  520. fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
  521. fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
  522. fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
  523. fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
  524. fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
  525. fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
  526. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
  527. fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
  528. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
  529. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
  530. fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
  531. fides/ui-build/static/admin/_next/static/chunks/9826-dbae8dee941a7fac.js +0 -1
  532. fides/ui-build/static/admin/_next/static/chunks/9951-a88367a129b724ba.js +0 -1
  533. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ace203dfacacbdc4.js +0 -1
  534. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-920fb469e0dda1d2.js +0 -1
  535. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
  536. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
  537. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-9dda4de5ec580279.js +0 -1
  538. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-0d4844d0b808e6e4.js +0 -1
  539. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-28b192e2c074b0f3.js +0 -1
  540. fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
  541. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-2c29ff7a01198f30.js +0 -1
  542. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
  543. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-8eb581024bc0172f.js +0 -1
  544. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
  545. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-e1ba213fb666b3f4.js +0 -1
  546. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-6d133580045abdda.js +0 -1
  547. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
  548. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
  549. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
  550. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
  551. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
  552. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
  553. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-927b7e476c4b47d0.js +0 -1
  554. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-cbe100d50df34285.js +0 -1
  555. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
  556. fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
  557. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4c3c413a2668df53.js +0 -1
  558. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-95402b5001c07ef2.js +0 -1
  559. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-3c6dc2f6e6bae960.js +0 -1
  560. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-4a6d4023a7791be8.js +0 -1
  561. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-76b204c9b98d656f.js +0 -1
  562. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-bc0e2adf6e0d3ac7.js +0 -1
  563. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-86ffcc1ad3fa912e.js +0 -1
  564. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-ec04f595465bdf69.js +0 -1
  565. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-41d309754ff0c1de.js +0 -1
  566. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-cab1f78cec7808f9.js +0 -1
  567. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-eb6058221403b156.js +0 -1
  568. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-48500551fd6a7602.js +0 -1
  569. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
  570. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
  571. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
  572. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
  573. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
  574. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-6903f42a0412bfa6.js +0 -1
  575. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
  576. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
  577. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-9495e2eb506606c7.js +0 -1
  578. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
  579. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
  580. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
  581. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
  582. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
  583. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
  584. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
  585. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
  586. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-6e15332935f6b538.js +0 -1
  587. fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
  588. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
  589. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-9cec020f89544426.js +0 -1
  590. fides/ui-build/static/admin/_next/static/chunks/webpack-678e89d68dbcd94f.js +0 -1
  591. fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
  592. fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
  593. fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
  594. fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
  595. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
  596. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
  597. fides/ui-build/static/admin/messaging/[id].html +0 -1
  598. fides/ui-build/static/admin/messaging/add-template.html +0 -1
  599. fides/ui-build/static/admin/messaging.html +0 -1
  600. fides/ui-build/static/admin/poc/table-migration.html +0 -1
  601. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
  602. {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/WHEEL +0 -0
  603. {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/entry_points.txt +0 -0
  604. {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/licenses/LICENSE +0 -0
  605. {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/top_level.txt +0 -0
  606. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-81d1b50585468fb0.js} +0 -0
  607. /fides/ui-build/static/admin/_next/static/{OmXHlY9MvjoZH9jDkAytl → l2vgGUHB04Fi4oEVlVMrc}/_ssgManifest.js +0 -0
@@ -10,8 +10,10 @@ 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
19
  SkippingConsentPropagation,
@@ -27,7 +29,6 @@ from fides.api.schemas.consentable_item import (
27
29
  from fides.api.schemas.limiter.rate_limit_config import RateLimitConfig
28
30
  from fides.api.schemas.policy import ActionType
29
31
  from fides.api.schemas.saas.saas_config import (
30
- AsyncStrategy,
31
32
  ClientConfig,
32
33
  ConsentRequestMap,
33
34
  ParamValue,
@@ -38,6 +39,10 @@ from fides.api.schemas.saas.shared_schemas import (
38
39
  ConsentPropagationStatus,
39
40
  SaaSRequestParams,
40
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
+ )
41
46
  from fides.api.service.connectors.base_connector import BaseConnector
42
47
  from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
43
48
  from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
@@ -64,7 +69,9 @@ from fides.api.util.logger_context_utils import (
64
69
  from fides.api.util.saas_util import (
65
70
  ALL_OBJECT_FIELDS,
66
71
  CUSTOM_PRIVACY_REQUEST_FIELDS,
72
+ PRIVACY_REQUEST_OBJECT,
67
73
  assign_placeholders,
74
+ check_dataset_missing_reference_values,
68
75
  map_param_values,
69
76
  )
70
77
 
@@ -215,17 +222,14 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
215
222
  request_task: RequestTask,
216
223
  input_data: Dict[str, List[Any]],
217
224
  ) -> List[Row]:
218
- """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
+ """
219
230
 
220
231
  # pylint: disable=too-many-branches
221
232
  self.set_privacy_request_state(privacy_request, node, request_task)
222
- if request_task.callback_succeeded:
223
- # If this is True, we assume we've received results from a third party
224
- # asynchronously and we can proceed to the next node.
225
- logger.info(
226
- "Access callback succeeded for request task '{}'", request_task.id
227
- )
228
- return request_task.get_access_data()
229
233
  query_config: SaaSQueryConfig = self.query_config(node)
230
234
 
231
235
  # generate initial set of requests if read request is defined, otherwise raise an exception
@@ -263,25 +267,32 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
263
267
  if custom_privacy_request_fields:
264
268
  input_data[CUSTOM_PRIVACY_REQUEST_FIELDS] = [custom_privacy_request_fields]
265
269
 
266
- rows: List[Row] = []
267
- awaiting_async_callback: bool = False
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
268
272
  for read_request in read_requests:
269
- self.set_saas_request_state(read_request)
270
- if (
271
- read_request.async_config
272
- and read_request.async_config.strategy == AsyncStrategy.callback
273
- and request_task.id # Only supported in DSR 3.0
274
- ):
275
- # Asynchronous read request detected. We will exit below and put the
276
- # Request Task in an "awaiting_processing" status.
277
- awaiting_async_callback = True
278
-
279
- # check all the values specified by param_values are provided in input_data
280
273
  if self._missing_dataset_reference_values(
281
274
  input_data, read_request.param_values
282
275
  ):
283
276
  return []
284
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
+
285
296
  # hook for user-provided request override functions
286
297
  if read_request.request_override:
287
298
  return self._invoke_read_request_override(
@@ -297,7 +308,12 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
297
308
  # if a path is provided, it means we want to generate HTTP requests from the config
298
309
  if read_request.path:
299
310
  prepared_requests: List[Tuple[SaaSRequestParams, Dict[str, Any]]] = (
300
- 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
+ )
301
317
  )
302
318
 
303
319
  # Iterates through initial list of prepared requests and through subsequent
@@ -321,7 +337,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
321
337
  # This allows us to build an output object even if we didn't generate and execute
322
338
  # any HTTP requests. This is useful if we just want to select specific input_data
323
339
  # values to provide as row data to the mask_data function
324
- elif read_request.output:
340
+ elif not read_request.path and read_request.output:
325
341
  rows.extend(
326
342
  self._apply_output_template(
327
343
  query_config.generate_param_value_maps(
@@ -332,14 +348,21 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
332
348
  )
333
349
 
334
350
  self.unset_connector_state()
335
- if awaiting_async_callback:
336
- # If a read request was marked to expect async results, original response data here is ignored.
337
- # We'll instead use the data received in the callback URL later.
338
- # Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
339
- raise AwaitingAsyncTask()
340
-
341
351
  return rows
342
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
+
343
366
  def _apply_output_template(
344
367
  self,
345
368
  param_value_maps: List[Dict[str, Any]],
@@ -369,29 +392,15 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
369
392
  return result
370
393
 
371
394
  def _missing_dataset_reference_values(
372
- self, input_data: Dict[str, Any], param_values: Optional[List[ParamValue]]
395
+ self, input_data: Dict[str, List[Any]], param_values: Optional[List[ParamValue]]
373
396
  ) -> List[str]:
374
397
  """Return a list of dataset reference values that are not found in the input_data map"""
375
-
376
- # get the list of param_value references
377
- required_param_value_references = [
378
- param_value.name
379
- for param_value in param_values or []
380
- if param_value.references
381
- ]
382
-
383
- # extract the keys from inside the fides_grouped_inputs and append them the other input_data keys
384
- provided_input_keys = (
385
- list(input_data.get("fidesops_grouped_inputs")[0].keys()) # type: ignore
386
- if input_data.get("fidesops_grouped_inputs")
387
- else []
388
- ) + list(input_data.keys())
389
-
390
- # find the missing values
391
- missing_dataset_reference_values = list(
392
- 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}"
393
403
  )
394
-
395
404
  if missing_dataset_reference_values:
396
405
  logger.info(
397
406
  "The '{}' request of {} is missing the following dataset reference values [{}], skipping traversal",
@@ -518,22 +527,27 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
518
527
  rows: List[Row],
519
528
  input_data: Optional[Dict[str, List[Any]]] = None,
520
529
  ) -> int:
521
- """Execute a masking request. Return the number of rows that have been updated."""
522
- self.set_privacy_request_state(privacy_request, node, request_task)
523
- if request_task.callback_succeeded:
524
- # If this is True, we assume the data was masked
525
- # asynchronously and we can proceed to the next node.
526
- logger.info(
527
- "Masking callback succeeded for request task '{}'", request_task.id
528
- )
529
- # If we've received the callback for this node, return rows_masked directly
530
- return request_task.rows_masked or 0
530
+ """
531
+ Execute masking requests.
531
532
 
533
+ Handles synchronous requests directly and delegates async requests to external handlers.
534
+ """
532
535
  self.set_privacy_request_state(privacy_request, node, request_task)
536
+
533
537
  query_config = self.query_config(node)
534
538
 
535
- session = Session.object_session(privacy_request)
536
- 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()
537
551
  rows_updated = 0
538
552
 
539
553
  if not masking_request:
@@ -578,7 +592,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
578
592
  for row in rows:
579
593
  try:
580
594
  prepared_request = query_config.generate_update_stmt(
581
- row, policy, privacy_request
595
+ row, policy, privacy_request, input_data
582
596
  )
583
597
  except ValueError as exc:
584
598
  if masking_request.skip_missing_param_values:
@@ -630,18 +644,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
630
644
  )
631
645
 
632
646
  self.unset_connector_state()
633
-
634
- awaiting_async_callback: bool = bool(
635
- masking_request.async_config
636
- and masking_request.async_config.strategy == AsyncStrategy.callback
637
- ) and bool(
638
- request_task.id
639
- ) # Only supported in DSR 3.0
640
- if awaiting_async_callback:
641
- # Asynchronous masking request detected in saas config.
642
- # If the masking request was marked to expect async results, original responses are ignored
643
- # and we raise an AwaitingAsyncTask to put this task in an awaiting_processing state.
644
- raise AwaitingAsyncTask()
645
647
  return rows_updated
646
648
 
647
649
  @staticmethod
@@ -949,6 +951,9 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
949
951
  client,
950
952
  secrets,
951
953
  ) # type: ignore
954
+ except (ConnectionException, ClientUnsuccessfulException):
955
+ # Re-raise these exceptions as-is so the connection service can handle them properly
956
+ raise
952
957
  except Exception as exc:
953
958
  logger.error(
954
959
  "Encountered error executing override test function '{}'",
@@ -1094,3 +1099,38 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
1094
1099
  return []
1095
1100
 
1096
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
@@ -1,13 +1,18 @@
1
1
  from fastapi import Depends
2
+ from sqlalchemy.ext.asyncio import AsyncSession
2
3
  from sqlalchemy.orm import Session
3
4
 
4
5
  from fides.api.api.deps import get_config, get_config_proxy, get_db
6
+ from fides.api.db.ctl_session import get_async_db
5
7
  from fides.config import FidesConfig
6
8
  from fides.config.config_proxy import ConfigProxy
9
+ from fides.service.connection.connection_service import ConnectionService
7
10
  from fides.service.dataset.dataset_config_service import DatasetConfigService
8
11
  from fides.service.dataset.dataset_service import DatasetService
12
+ from fides.service.event_audit_service import EventAuditService
9
13
  from fides.service.messaging.messaging_service import MessagingService
10
14
  from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
15
+ from fides.service.system.system_service import SystemService
11
16
  from fides.service.taxonomy.taxonomy_service import TaxonomyService
12
17
  from fides.service.user.user_service import UserService
13
18
 
@@ -44,5 +49,23 @@ def get_user_service(
44
49
  return UserService(db, config, config_proxy)
45
50
 
46
51
 
47
- def get_taxonomy_service(db: Session = Depends(get_db)) -> TaxonomyService:
48
- return TaxonomyService(db)
52
+ def get_event_audit_service(db: Session = Depends(get_db)) -> EventAuditService:
53
+ return EventAuditService(db)
54
+
55
+
56
+ def get_taxonomy_service(
57
+ db: Session = Depends(get_db),
58
+ event_audit_service: EventAuditService = Depends(get_event_audit_service),
59
+ ) -> TaxonomyService:
60
+ return TaxonomyService(db, event_audit_service)
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
+
70
+ def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
71
+ return SystemService(db)
@@ -6,6 +6,7 @@ from typing import Any, Callable, Dict, List, Optional, Union
6
6
  import requests
7
7
  import sendgrid
8
8
  from loguru import logger
9
+ from requests.exceptions import RequestException, Timeout
9
10
  from sendgrid.helpers.mail import Content, Email, Mail, Personalization, TemplateId, To
10
11
  from sqlalchemy.orm import Session
11
12
  from twilio.base.exceptions import TwilioRestException
@@ -28,6 +29,7 @@ from fides.api.schemas.messaging.messaging import (
28
29
  ErrorNotificationBodyParams,
29
30
  ExternalUserWelcomeBodyParams,
30
31
  FidesopsMessage,
32
+ ManualTaskDigestBodyParams,
31
33
  MessagingActionType,
32
34
  MessagingMethod,
33
35
  MessagingServiceDetails,
@@ -44,7 +46,6 @@ from fides.api.service.messaging.messaging_crud_service import (
44
46
  get_enabled_messaging_template_by_type_and_property,
45
47
  )
46
48
  from fides.api.tasks import DatabaseTask, celery_app
47
- from fides.api.util.logger import Pii
48
49
  from fides.config import CONFIG
49
50
  from fides.config.config_proxy import ConfigProxy
50
51
  from fides.service.messaging.aws_ses_service import AWS_SES_Service
@@ -53,7 +54,18 @@ EMAIL_JOIN_STRING = ", "
53
54
  EMAIL_TEMPLATE_NAME = "fides"
54
55
 
55
56
 
56
- @celery_app.task(base=DatabaseTask, bind=True)
57
+ @celery_app.task(
58
+ base=DatabaseTask,
59
+ bind=True,
60
+ autoretry_for=(
61
+ Timeout,
62
+ RequestException,
63
+ TwilioRestException,
64
+ ),
65
+ retry_kwargs={"max_retries": 3},
66
+ retry_backoff=2,
67
+ retry_jitter=True,
68
+ )
57
69
  def dispatch_message_task(
58
70
  self: DatabaseTask,
59
71
  message_meta: Dict[str, Any],
@@ -62,7 +74,14 @@ def dispatch_message_task(
62
74
  property_id: Optional[str],
63
75
  ) -> None:
64
76
  """
65
- A wrapper function to dispatch a message task into the Celery queues
77
+ A wrapper function to dispatch a message task into the Celery queues.
78
+
79
+ This task will automatically retry up to 3 times on transient network failures
80
+ (timeouts, connection errors, temporary service unavailability) with exponential
81
+ backoff (2s, 4s, 8s) and jitter to prevent thundering herd issues.
82
+
83
+ Permanent errors (missing config, invalid identities, etc.) will fail immediately
84
+ without retry to provide fast feedback and avoid wasting worker resources.
66
85
  """
67
86
  schema = FidesopsMessage.model_validate(message_meta)
68
87
  with self.get_new_session() as db:
@@ -178,6 +197,7 @@ def dispatch_message(
178
197
  UserInviteBodyParams,
179
198
  ErrorNotificationBodyParams,
180
199
  ExternalUserWelcomeBodyParams,
200
+ ManualTaskDigestBodyParams,
181
201
  ]
182
202
  ] = None,
183
203
  subject_override: Optional[str] = None,
@@ -353,7 +373,7 @@ def _render(template_str: str, variables: Optional[Dict] = None) -> str:
353
373
  return template_str
354
374
 
355
375
 
356
- def _build_email( # pylint: disable=too-many-return-statements, too-many-branches
376
+ def _build_email( # pylint: disable=too-many-return-statements, too-many-branches, too-many-statements
357
377
  config_proxy: ConfigProxy,
358
378
  action_type: MessagingActionType,
359
379
  body_params: Any,
@@ -466,7 +486,6 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
466
486
  ),
467
487
  )
468
488
  if action_type == MessagingActionType.EXTERNAL_USER_WELCOME:
469
- base_template = get_email_template(action_type)
470
489
  # Generate display name for personalization
471
490
  display_name = body_params.username
472
491
  if body_params.first_name:
@@ -489,8 +508,61 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
489
508
  "access_token": body_params.access_token,
490
509
  }
491
510
 
511
+ # Start with default subject
512
+ subject = "Welcome to our Privacy Center"
513
+
514
+ # If messaging template exists, extract customizable content
515
+ if messaging_template:
516
+ # Use custom subject if provided
517
+ if "subject" in messaging_template.content:
518
+ subject = _render(messaging_template.content["subject"], variables)
519
+
520
+ # Use custom body content to replace the intro text in HTML template
521
+ custom_body = messaging_template.content.get("body", "")
522
+ if custom_body.strip():
523
+ # Replace the default intro text with the custom body content
524
+ rendered_custom_body = _render(custom_body, variables)
525
+ variables["custom_intro"] = rendered_custom_body
526
+
527
+ # Always use the HTML template
528
+ base_template = get_email_template(action_type)
529
+ return EmailForActionType(
530
+ subject=subject,
531
+ body=base_template.render(variables),
532
+ template_variables=variables,
533
+ )
534
+
535
+ if action_type == MessagingActionType.MANUAL_TASK_DIGEST:
536
+ variables = {
537
+ "vendor_contact_name": body_params.vendor_contact_name,
538
+ "organization_name": body_params.organization_name,
539
+ "portal_url": body_params.portal_url,
540
+ "imminent_task_count": body_params.imminent_task_count,
541
+ "upcoming_task_count": body_params.upcoming_task_count,
542
+ "total_task_count": body_params.total_task_count,
543
+ "company_logo_url": body_params.company_logo_url,
544
+ }
545
+
546
+ # Start with default subject
547
+ subject = f"Weekly DSR Summary from {body_params.organization_name}"
548
+
549
+ # If messaging template exists, extract customizable content
550
+ if messaging_template:
551
+ # Use custom subject if provided
552
+ if "subject" in messaging_template.content:
553
+ subject = _render(messaging_template.content["subject"], variables)
554
+
555
+ # Use custom body content to replace the intro text in HTML template
556
+ custom_body = messaging_template.content.get("body", "")
557
+ if custom_body.strip():
558
+ # Replace the default intro text with the custom body content
559
+ rendered_custom_body = _render(custom_body, variables)
560
+ variables["intro_text"] = rendered_custom_body
561
+
562
+ # Always use the HTML template
563
+ base_template = get_email_template(action_type)
492
564
  return EmailForActionType(
493
- subject="Welcome to our Privacy Center",
565
+ subject=subject,
494
566
  body=base_template.render(variables),
495
567
  template_variables=variables,
496
568
  )
@@ -564,6 +636,7 @@ def _mailchimp_transactional_dispatcher(
564
636
  "https://mandrillapp.com/api/1.0/messages/send",
565
637
  headers={"Content-Type": "application/json"},
566
638
  data=data,
639
+ timeout=10,
567
640
  )
568
641
  if not response.ok:
569
642
  logger.error("Email failed to send with status code: %s", response.status_code)
@@ -611,6 +684,7 @@ def _mailgun_dispatcher(
611
684
  "api",
612
685
  messaging_config.secrets[MessagingServiceSecrets.MAILGUN_API_KEY.value],
613
686
  ),
687
+ timeout=10,
614
688
  )
615
689
 
616
690
  data = {
@@ -635,6 +709,7 @@ def _mailgun_dispatcher(
635
709
  ],
636
710
  ),
637
711
  data=data,
712
+ timeout=10,
638
713
  )
639
714
 
640
715
  if not response.ok:
@@ -655,6 +730,7 @@ def _mailgun_dispatcher(
655
730
  ],
656
731
  ),
657
732
  data=data,
733
+ timeout=10,
658
734
  )
659
735
  if not response.ok:
660
736
  logger.error(
@@ -663,9 +739,9 @@ def _mailgun_dispatcher(
663
739
  raise MessageDispatchException(
664
740
  f"Email failed to send with status code {response.status_code}"
665
741
  )
666
- except Exception as e:
667
- logger.error("Email failed to send: {}", Pii(str(e)))
668
- raise MessageDispatchException(f"Email failed to send due to: {Pii(e)}")
742
+ except Exception as exc:
743
+ logger.error("Email failed to send: {}", str(exc))
744
+ raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
669
745
 
670
746
 
671
747
  def _twilio_email_dispatcher(
@@ -707,14 +783,14 @@ def _twilio_email_dispatcher(
707
783
  logger.error(
708
784
  "Email failed to send: %s: %s",
709
785
  response.status_code,
710
- Pii(str(response.body)),
786
+ str(response.body),
711
787
  )
712
788
  raise MessageDispatchException(
713
- f"Email failed to send: {response.status_code}, {Pii(str(response.body))}"
789
+ f"Email failed to send: {response.status_code}, {str(response.body)}"
714
790
  )
715
- except Exception as e:
716
- logger.error("Email failed to send: {}", Pii(str(e)))
717
- raise MessageDispatchException(f"Email failed to send due to: {Pii(e)}")
791
+ except Exception as exc:
792
+ logger.error("Email failed to send: {}", str(exc))
793
+ raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
718
794
 
719
795
 
720
796
  def _twilio_sms_dispatcher(
@@ -753,9 +829,9 @@ def _twilio_sms_dispatcher(
753
829
  raise MessageDispatchException(
754
830
  "Message failed to send. Either sender phone number or messaging service sid must be provided."
755
831
  )
756
- except TwilioRestException as e:
757
- logger.error("Twilio SMS failed to send: {}", Pii(str(e)))
758
- raise MessageDispatchException(f"Twilio SMS failed to send due to: {Pii(e)}")
832
+ except TwilioRestException as exc:
833
+ logger.error("Twilio SMS failed to send: {}", str(exc))
834
+ raise MessageDispatchException(f"Twilio SMS failed to send due to: {str(exc)}")
759
835
 
760
836
 
761
837
  def _aws_ses_dispatcher(
@@ -769,9 +845,11 @@ def _aws_ses_dispatcher(
769
845
 
770
846
  try:
771
847
  aws_ses_serivce.send_email(to, message.subject, message.body)
772
- except Exception as e:
773
- logger.error("Email failed to send: {}", Pii(str(e)))
774
- raise MessageDispatchException(f"AWS SES email failed to send due to: {Pii(e)}")
848
+ except Exception as exc:
849
+ logger.error("Email failed to send: {}", str(exc))
850
+ raise MessageDispatchException(
851
+ f"AWS SES email failed to send due to: {str(exc)}"
852
+ )
775
853
 
776
854
 
777
855
  def _get_template_id_if_exists(
@@ -25,7 +25,7 @@ from fides.api.schemas.messaging.messaging import (
25
25
 
26
26
  def update_messaging_config(
27
27
  db: Session, key: FidesKey, config: MessagingConfigRequest
28
- ) -> MessagingConfigResponse:
28
+ ) -> MessagingConfig:
29
29
  existing_config_with_key: Optional[MessagingConfig] = MessagingConfig.get_by(
30
30
  db=db, field="key", value=key
31
31
  )
@@ -38,7 +38,7 @@ def update_messaging_config(
38
38
 
39
39
  def create_or_update_messaging_config(
40
40
  db: Session, config: MessagingConfigRequest
41
- ) -> MessagingConfigResponse:
41
+ ) -> MessagingConfig:
42
42
  data = {
43
43
  "key": config.key,
44
44
  "name": config.name,
@@ -46,16 +46,10 @@ def create_or_update_messaging_config(
46
46
  }
47
47
  if config.details:
48
48
  data["details"] = config.details.__dict__ # type: ignore
49
- messaging_config: MessagingConfig = MessagingConfig.create_or_update(
49
+ return MessagingConfig.create_or_update(
50
50
  db=db,
51
51
  data=data,
52
52
  )
53
- return MessagingConfigResponse(
54
- name=messaging_config.name,
55
- key=messaging_config.key,
56
- service_type=messaging_config.service_type.value, # type: ignore
57
- details=messaging_config.details,
58
- )
59
53
 
60
54
 
61
55
  def delete_messaging_config(db: Session, key: FidesKey) -> None:
@@ -84,6 +78,8 @@ def get_messaging_config_by_key(db: Session, key: FidesKey) -> MessagingConfigRe
84
78
  key=config.key,
85
79
  service_type=config.service_type.value, # type: ignore[attr-defined]
86
80
  details=config.details,
81
+ last_test_timestamp=config.last_test_timestamp,
82
+ last_test_succeeded=config.last_test_succeeded,
87
83
  )
88
84
 
89
85