ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.74.0rc1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (495) hide show
  1. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/METADATA +3 -2
  2. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/RECORD +377 -327
  3. fides/_version.py +3 -3
  4. fides/api/alembic/alembic.ini +5 -1
  5. fides/api/alembic/migrations/env.py +7 -1
  6. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
  7. fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
  8. fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
  9. fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
  10. fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
  11. fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
  12. fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
  13. fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
  14. fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
  15. fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
  16. fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
  17. fides/api/api/v1/endpoints/generic_overrides.py +75 -6
  18. fides/api/api/v1/endpoints/privacy_request_endpoints.py +60 -6
  19. fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
  20. fides/api/api/v1/endpoints/system.py +11 -43
  21. fides/api/api/v1/endpoints/user_endpoints.py +8 -1
  22. fides/api/app_setup.py +1 -3
  23. fides/api/common_exceptions.py +8 -0
  24. fides/api/db/base.py +2 -0
  25. fides/api/db/database.py +257 -2
  26. fides/api/email_templates/get_email_template.py +3 -0
  27. fides/api/email_templates/template_names.py +1 -0
  28. fides/api/email_templates/templates/manual_task_digest.html +316 -0
  29. fides/api/main.py +2 -2
  30. fides/api/models/attachment.py +1 -0
  31. fides/api/models/detection_discovery/__init__.py +2 -0
  32. fides/api/models/detection_discovery/core.py +10 -0
  33. fides/api/models/detection_discovery/monitor_task.py +1 -0
  34. fides/api/models/detection_discovery/staged_resource_error.py +25 -0
  35. fides/api/models/digest/__init__.py +2 -0
  36. fides/api/models/digest/digest_config.py +10 -1
  37. fides/api/models/digest/digest_execution.py +142 -0
  38. fides/api/models/event_audit.py +17 -0
  39. fides/api/models/identity_definition.py +65 -0
  40. fides/api/models/messaging_template.py +7 -0
  41. fides/api/models/privacy_experience.py +11 -0
  42. fides/api/models/privacy_preference.py +2 -0
  43. fides/api/models/privacy_request/duplicate_group.py +84 -0
  44. fides/api/models/privacy_request/privacy_request.py +56 -8
  45. fides/api/models/privacy_request/request_task.py +98 -1
  46. fides/api/models/sql_models.py +3 -0
  47. fides/api/models/taxonomy.py +14 -4
  48. fides/api/models/v3/__init__.py +0 -0
  49. fides/api/models/v3/privacy_preferences.py +85 -0
  50. fides/api/models/worker_task.py +8 -0
  51. fides/api/schemas/application_config.py +28 -0
  52. fides/api/schemas/connection_configuration/connection_config.py +1 -30
  53. fides/api/schemas/messaging/messaging.py +15 -0
  54. fides/api/schemas/privacy_request.py +17 -3
  55. fides/api/schemas/saas/async_polling_configuration.py +81 -0
  56. fides/api/schemas/saas/saas_config.py +10 -3
  57. fides/api/schemas/saas/strategy_configuration.py +0 -12
  58. fides/api/schemas/taxonomy_extensions.py +8 -0
  59. fides/api/service/async_dsr/handlers/__init__.py +0 -0
  60. fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
  61. fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
  62. fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
  63. fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
  64. fides/api/service/async_dsr/strategies/__init__.py +0 -0
  65. fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
  66. fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
  67. fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
  68. fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +686 -0
  69. fides/api/service/async_dsr/utils.py +130 -0
  70. fides/api/service/connectors/bigquery_connector.py +34 -16
  71. fides/api/service/connectors/fides/fides_client.py +63 -1
  72. fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
  73. fides/api/service/connectors/saas/connector_registry_service.py +1 -138
  74. fides/api/service/connectors/saas_connector.py +116 -94
  75. fides/api/service/connectors/sql_connector.py +14 -4
  76. fides/api/service/deps.py +8 -0
  77. fides/api/service/messaging/message_dispatch_service.py +38 -1
  78. fides/api/service/privacy_request/attachment_handling.py +9 -2
  79. fides/api/service/privacy_request/duplication_detection.py +424 -0
  80. fides/api/service/privacy_request/request_runner_service.py +46 -84
  81. fides/api/service/privacy_request/request_service.py +47 -74
  82. fides/api/service/saas_request/saas_request_override_factory.py +71 -1
  83. fides/api/task/execute_request_tasks.py +17 -9
  84. fides/api/task/filter_results.py +35 -2
  85. fides/api/task/graph_task.py +37 -8
  86. fides/api/tasks/__init__.py +0 -1
  87. fides/api/util/connection_util.py +99 -215
  88. fides/api/util/event_audit_util.py +230 -0
  89. fides/api/util/logger_context_utils.py +3 -1
  90. fides/api/util/masking_util.py +31 -0
  91. fides/api/util/memory_watchdog.py +118 -0
  92. fides/api/util/saas_config_updater.py +66 -0
  93. fides/api/util/saas_util.py +28 -1
  94. fides/common/api/scope_registry.py +0 -7
  95. fides/common/api/v1/urn_registry.py +2 -0
  96. fides/config/__init__.py +10 -1
  97. fides/config/celery_settings.py +42 -0
  98. fides/config/config_proxy.py +10 -0
  99. fides/config/duplicate_detection_settings.py +31 -0
  100. fides/config/execution_settings.py +7 -3
  101. fides/config/utils.py +5 -0
  102. fides/data/language/languages.yml +2 -0
  103. fides/service/connection/__init__.py +0 -0
  104. fides/service/connection/connection_service.py +651 -0
  105. fides/service/event_audit_service.py +16 -22
  106. fides/service/privacy_request/privacy_request_service.py +162 -43
  107. fides/service/taxonomy/handlers/legacy_handler.py +3 -3
  108. fides/service/taxonomy/taxonomy_service.py +15 -15
  109. fides/ui-build/static/admin/404.html +1 -1
  110. fides/ui-build/static/admin/_next/static/FZTEUgamBvOhgPWce135w/_buildManifest.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-0da062111df309bf.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/1817-508b16628e8eb225.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/1840-5bbe6d878ed73fb4.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.afe8cad52f904fcf.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-fe1a06d82c0413f1.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/2397-40b8db1cb2f23e2a.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/2921-b10bbc3a9104933b.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/3377-eb5cd82b3ee6ab0c.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/3655-93ecd09f1cb9dbef.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-6db05a35ae806825.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-44255a63d6d80ff5.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/401-fe8db8b5d8f600de.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/4277-13bcf4516326d474.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/4496-bed72bd5639075be.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/4817-d29f40d4ce729f37.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/5185-b2ac9fecc00b67e7.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/5258-4672eae0656430f9.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/5487-8dedd1ca94fbba54.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/549-6e2442db533a711e.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/5643-55d758444a8d7162.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/5724-1e40975cefa405f0.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-6055edba275155ca.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/6084-82e2df433fe5ba85.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/6344-3e21444374f8059f.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/6362-12e3fd23130ccf15.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/6372-a8d0f08dac1ebd0e.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/6780-3db5133c1f4c6f1e.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/6853-1adbdf6418ec3d62.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/6954-aa0c60ee1092be8e.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/7059-12be23a345a94c1e.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/7079-6e6efc3396ff1ebb.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/7218-d297a4a06f924b09.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/7245-686665c197b58e68.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-a43c046c24de37cc.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/7630-c654c61ba98d8c74.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/7654-716cf37a020b3d11.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-e83ace3c6ab99ac7.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/8212-b9e8295ca883c9f8.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/8939-4925751c57c51f87.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  157. fides/ui-build/static/admin/_next/static/chunks/9046-e4daf28840a69fd6.js +1 -0
  158. fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-550bd50d538c5f79.js} +3 -3
  159. fides/ui-build/static/admin/_next/static/chunks/9330-e519adec48222d45.js +1 -0
  160. fides/ui-build/static/admin/_next/static/chunks/9341-bfc0e59bcc56c604.js +1 -0
  161. fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
  162. fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.7d029a5383595b69.js} +1 -1
  163. fides/ui-build/static/admin/_next/static/chunks/9682-da69ac5d06f281da.js +1 -0
  164. fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-657652d55936a8c6.js} +1 -1
  165. fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
  166. fides/ui-build/static/admin/_next/static/chunks/9965-56c5e4fc9cd3b3a5.js +1 -0
  167. fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-d079b8bf35250874.js} +1 -1
  168. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-e64fd8510033a27c.js} +63 -63
  169. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ddd9d7d40847fc28.js +1 -0
  170. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-b4d18c1f4d414f5f.js +1 -0
  171. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d451bc8932330141.js +1 -0
  172. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-c24663cd5dec57db.js} +1 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-d93418688bd258eb.js} +1 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-9b1f2b1c06968166.js} +1 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-115a085e5d42de45.js} +1 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d9b7b311195df29e.js +1 -0
  177. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-3de34624829cbce8.js} +1 -1
  178. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-dc95e7ed278d1a29.js} +1 -1
  179. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cdfc9bb19f47c709.js +1 -0
  180. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-0b995b01dc4dbd1f.js} +1 -1
  181. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-e3ad3a55624e302a.js +1 -0
  182. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-b37ed76849330edd.js} +1 -1
  183. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-dd82729296dee5c5.js} +1 -1
  184. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-49e5477eb1a11b92.js +1 -0
  185. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-dfc1ead4a12c9ffa.js +1 -0
  186. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-8442eb219958ac7e.js} +1 -1
  187. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-feda358d1801c18d.js +1 -0
  188. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d16acb6fc07aad46.js +1 -0
  189. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-c51a1e98c45d231a.js +1 -0
  190. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
  191. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-bcfe38eebca30f8c.js +1 -0
  192. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-f66d0655897c4400.js +1 -0
  193. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
  194. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6f1e012cd641da19.js +1 -0
  195. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-581d6248fcf98d17.js +1 -0
  196. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-ddc1c1641e1e9430.js} +1 -1
  197. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-2b48f7e524743b2b.js} +1 -1
  198. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-862b67418600251e.js} +1 -1
  199. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-0ffec855f5df262c.js} +1 -1
  200. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a030ab8c2e2b0db.js +1 -0
  201. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-6cb66f649b8ca4bf.js +1 -0
  202. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-0b008dad90b00aaa.js +1 -0
  203. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-5566edf9a9d1be2d.js +1 -0
  204. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4ca1f485b6e9e02.js +1 -0
  205. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-85dee7e81dc4bafb.js +1 -0
  206. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-e905e018a2cab35d.js +1 -0
  207. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-912723bc86299b1a.js +1 -0
  208. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f1f0affc18327033.js +1 -0
  209. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-692d27dbe9392c9f.js} +1 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-1b94e2d769a182b2.js +1 -0
  212. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adfe6c5ac5b703d0.js +1 -0
  213. fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-f9be7080ebbb7445.js +1 -0
  214. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-caaa8602a1d449b1.js +1 -0
  215. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-9b106b1d2d93985b.js +1 -0
  216. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-6a1ded8cdde836c4.js +1 -0
  217. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-f94e3accf9507ebf.js +1 -0
  218. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-5e83220ff1f2a250.js +1 -0
  219. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-a03cbd698a23e5b3.js +1 -0
  220. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-3cde574b3c8447c0.js +1 -0
  221. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-0448bb4ae8536c58.js +1 -0
  222. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-1621a4b87c432117.js +1 -0
  223. fides/ui-build/static/admin/_next/static/chunks/pages/notifications-4ea28f6b1dd63642.js +1 -0
  224. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-e02516d9fd314528.js +1 -0
  225. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-fec08bea801b4918.js +1 -0
  226. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d911e5fbf5a4a888.js +1 -0
  227. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-91b1adcac6a57b2d.js +1 -0
  228. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-de309d8813b1ebfb.js +1 -0
  229. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-f2943c1309062284.js +1 -0
  230. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-03eda417711ae909.js} +1 -1
  231. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1fe486f3af832c80.js +1 -0
  232. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-ea6f78fa8b2d3f6c.js +1 -0
  233. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-bda7b474493e7128.js} +1 -1
  234. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-2c0ec8fed16c20ae.js +1 -0
  235. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-30d298a47e85709f.js} +1 -1
  236. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-438084cca0d0f10d.js} +1 -1
  237. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-17fd44d98f5bd5b6.js} +1 -1
  238. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-baf77d34a3b3bece.js +1 -0
  239. fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-8c80391025ca7339.js +1 -0
  240. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7c19810858b708cc.js +1 -0
  241. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee8820fe0fa14c77.js +1 -0
  242. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{[id]-bd1042a0e9be6aff.js → [id]-8eb862182f19a6c2.js} +1 -1
  243. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{new-469ad83c8cfa1290.js → new-37c29ef618e9fe3c.js} +1 -1
  244. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-1db425150dcb1b6b.js +1 -0
  245. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-e334b43fa5c5b1e6.js} +1 -1
  246. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-9d18eb5c38d85522.js +1 -0
  247. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-cb937ed7c4b1e5a8.js} +1 -1
  248. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-835281251f0785cd.js} +1 -1
  249. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-7fd050c92866938c.js} +1 -1
  250. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-59ea66130fca0d05.js +1 -0
  251. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-b0fe1051d908f366.js} +1 -1
  252. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f108bf5015144d2f.js +1 -0
  253. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-0e7c7228d01290ea.js} +1 -1
  254. fides/ui-build/static/admin/_next/static/chunks/pages/systems-adc13b542e10a37d.js +1 -0
  255. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-23dd250da26511c5.js +1 -0
  256. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-aed30fb22ae7c9ec.js} +1 -1
  257. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-6b88ca3e02ee67c9.js} +1 -1
  258. fides/ui-build/static/admin/_next/static/chunks/webpack-6f97ebe373e7ef6b.js +1 -0
  259. fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
  260. fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
  261. fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
  262. fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
  263. fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
  264. fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
  265. fides/ui-build/static/admin/_next/static/css/65ae906f224cd8ae.css +1 -0
  266. fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
  267. fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
  268. fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
  269. fides/ui-build/static/admin/_next/static/css/d5701118537cbdd2.css +1 -0
  270. fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
  271. fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
  272. fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
  273. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  274. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  275. fides/ui-build/static/admin/add-systems.html +1 -1
  276. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  277. fides/ui-build/static/admin/consent/configure.html +1 -1
  278. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  279. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  280. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  281. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  282. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  283. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  284. fides/ui-build/static/admin/consent/properties.html +1 -1
  285. fides/ui-build/static/admin/consent/reporting.html +1 -1
  286. fides/ui-build/static/admin/consent.html +1 -1
  287. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  288. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  289. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  290. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  291. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  292. fides/ui-build/static/admin/data-catalog.html +1 -1
  293. fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -0
  294. fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
  295. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
  296. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
  297. fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
  298. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  299. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  300. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  301. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  302. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  303. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  304. fides/ui-build/static/admin/datamap.html +1 -1
  305. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  306. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  307. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  308. fides/ui-build/static/admin/dataset/new.html +1 -1
  309. fides/ui-build/static/admin/dataset.html +1 -1
  310. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  311. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  312. fides/ui-build/static/admin/datastore-connection.html +1 -1
  313. fides/ui-build/static/admin/index.html +1 -1
  314. fides/ui-build/static/admin/integrations/[id].html +1 -1
  315. fides/ui-build/static/admin/integrations.html +1 -1
  316. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  317. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  318. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  319. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  320. fides/ui-build/static/admin/lib/fides.js +3 -3
  321. fides/ui-build/static/admin/login/[provider].html +1 -1
  322. fides/ui-build/static/admin/login.html +1 -1
  323. fides/ui-build/static/admin/new-privacy-requests.html +1 -0
  324. fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
  325. fides/ui-build/static/admin/notifications/digests/new.html +1 -0
  326. fides/ui-build/static/admin/notifications/digests.html +1 -0
  327. fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
  328. fides/ui-build/static/admin/notifications/providers/new.html +1 -0
  329. fides/ui-build/static/admin/notifications/providers.html +1 -0
  330. fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
  331. fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
  332. fides/ui-build/static/admin/notifications/templates.html +1 -0
  333. fides/ui-build/static/admin/notifications.html +1 -0
  334. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  335. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  336. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  337. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  338. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  339. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  340. fides/ui-build/static/admin/poc/forms.html +1 -1
  341. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  342. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  343. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  344. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  345. fides/ui-build/static/admin/privacy-requests.html +1 -1
  346. fides/ui-build/static/admin/properties/[id].html +1 -1
  347. fides/ui-build/static/admin/properties/add-property.html +1 -1
  348. fides/ui-build/static/admin/properties.html +1 -1
  349. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  350. fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -0
  351. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  352. fides/ui-build/static/admin/settings/about.html +1 -1
  353. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  354. fides/ui-build/static/admin/settings/consent.html +1 -1
  355. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  356. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  357. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  358. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  359. fides/ui-build/static/admin/settings/domains.html +1 -1
  360. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  361. fides/ui-build/static/admin/settings/locations.html +1 -1
  362. fides/ui-build/static/admin/settings/organization.html +1 -1
  363. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  364. fides/ui-build/static/admin/settings/regulations.html +1 -1
  365. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  366. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  367. fides/ui-build/static/admin/systems.html +1 -1
  368. fides/ui-build/static/admin/taxonomy.html +1 -1
  369. fides/ui-build/static/admin/user-management/new.html +1 -1
  370. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  371. fides/ui-build/static/admin/user-management.html +1 -1
  372. fides/api/service/async_dsr/async_dsr_service.py +0 -195
  373. fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
  374. fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
  375. fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
  376. fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
  377. fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
  378. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
  379. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
  380. fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
  381. fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +0 -1
  382. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +0 -1
  383. fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
  384. fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
  385. fides/ui-build/static/admin/_next/static/chunks/2921-66f65496c3a09316.js +0 -1
  386. fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +0 -1
  387. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
  388. fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +0 -1
  389. fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
  390. fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
  391. fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
  392. fides/ui-build/static/admin/_next/static/chunks/401-ffe4e8436e1eceb9.js +0 -1
  393. fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
  394. fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
  395. fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
  396. fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
  397. fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
  398. fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
  399. fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
  400. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
  401. fides/ui-build/static/admin/_next/static/chunks/5185-51eaa78e3ed6bfb7.js +0 -1
  402. fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +0 -1
  403. fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
  404. fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
  405. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
  406. fides/ui-build/static/admin/_next/static/chunks/5643-10a36584c399526c.js +0 -1
  407. fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +0 -1
  408. fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +0 -1
  409. fides/ui-build/static/admin/_next/static/chunks/6853-7004a8c420b1ca02.js +0 -1
  410. fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
  411. fides/ui-build/static/admin/_next/static/chunks/6954-4b24e1731c1cc3b3.js +0 -1
  412. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
  413. fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
  414. fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
  415. fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
  416. fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
  417. fides/ui-build/static/admin/_next/static/chunks/7630-d0d3a0fe3f95e971.js +0 -1
  418. fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
  419. fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
  420. fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
  421. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
  422. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
  423. fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
  424. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
  425. fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
  426. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
  427. fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
  428. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
  429. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-2ca59996860a33c5.js +0 -1
  430. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
  431. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-92182be6603c2842.js +0 -1
  432. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-ab54b19609bff325.js +0 -1
  433. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
  434. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
  435. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
  436. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
  437. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
  438. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
  439. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
  440. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
  441. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
  442. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
  443. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
  444. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
  445. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
  446. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
  447. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
  448. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
  449. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
  450. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
  451. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
  452. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
  453. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-e8d2140787045acd.js +0 -1
  454. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-e3f93462a08251bf.js +0 -1
  455. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-b5f7d6afdecd013d.js +0 -1
  456. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-248ad9f65a872442.js +0 -1
  457. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-aedb66a62042b10a.js +0 -1
  458. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-018df38b7cd77fdb.js +0 -1
  459. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6ca9099d03aab817.js +0 -1
  460. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0f2c90786ea005a4.js +0 -1
  461. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-200b51a725f8b2d1.js +0 -1
  462. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
  463. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
  464. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
  465. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
  466. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-f3e6e74e0efb005c.js +0 -1
  467. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +0 -1
  468. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
  469. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a3275554ffe8e640.js +0 -1
  470. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-77239269acc2d31a.js +0 -1
  471. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-8bf1821722b082e9.js +0 -1
  472. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
  473. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
  474. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-2deb6becece69d46.js +0 -1
  475. fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
  476. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
  477. fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +0 -1
  478. fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
  479. fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
  480. fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
  481. fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
  482. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
  483. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
  484. fides/ui-build/static/admin/messaging/[id].html +0 -1
  485. fides/ui-build/static/admin/messaging/add-template.html +0 -1
  486. fides/ui-build/static/admin/messaging.html +0 -1
  487. fides/ui-build/static/admin/settings/messaging-providers/[key].html +0 -1
  488. fides/ui-build/static/admin/settings/messaging-providers/new.html +0 -1
  489. fides/ui-build/static/admin/settings/messaging-providers.html +0 -1
  490. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/WHEEL +0 -0
  491. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/entry_points.txt +0 -0
  492. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/licenses/LICENSE +0 -0
  493. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/top_level.txt +0 -0
  494. /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → FZTEUgamBvOhgPWce135w}/_ssgManifest.js +0 -0
  495. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-7dce2916cc589c54.js} +0 -0
@@ -0,0 +1,130 @@
1
+ """
2
+ Pure utility functions for async DSR operations.
3
+
4
+ This module contains utility functions with no business logic dependencies.
5
+ These are helper functions that can be used across the async DSR system.
6
+ """
7
+
8
+ from enum import Enum
9
+
10
+ # Type checking imports
11
+ from typing import TYPE_CHECKING, List, cast
12
+
13
+ from loguru import logger
14
+ from sqlalchemy.orm import Session
15
+
16
+ from fides.api.common_exceptions import PrivacyRequestError
17
+ from fides.api.models.connectionconfig import ConnectionConfig
18
+ from fides.api.models.datasetconfig import DatasetConfig
19
+ from fides.api.models.privacy_request.request_task import AsyncTaskType, RequestTask
20
+ from fides.api.schemas.saas.saas_config import SaaSRequest
21
+
22
+ if TYPE_CHECKING:
23
+ from fides.api.service.connectors.query_configs.saas_query_config import (
24
+ SaaSQueryConfig,
25
+ )
26
+
27
+
28
+ def has_async_requests(query_config: "SaaSQueryConfig") -> bool:
29
+ """Check if any read/update/delete requests have async configuration"""
30
+ all_requests: List[SaaSRequest] = cast(
31
+ List[SaaSRequest], query_config.get_read_requests_by_identity()
32
+ )
33
+ masking_request = query_config.get_masking_request()
34
+ if masking_request:
35
+ all_requests.append(masking_request)
36
+ return any(request.async_config is not None for request in all_requests)
37
+
38
+
39
+ def is_polling_continuation(request_task: RequestTask) -> bool:
40
+ """Check if this is a polling continuation (not initial request)"""
41
+ async_type_check = request_task.async_type == AsyncTaskType.polling
42
+ sub_requests_count = len(request_task.sub_requests)
43
+
44
+ logger.warning(
45
+ f"is_polling_continuation for task {request_task.id}: "
46
+ f"async_type={request_task.async_type} (polling={async_type_check}), "
47
+ f"sub_requests_count={sub_requests_count}"
48
+ )
49
+
50
+ return async_type_check and sub_requests_count > 0
51
+
52
+
53
+ def is_callback_completion(request_task: RequestTask) -> bool:
54
+ """Check if this is a completed callback request"""
55
+ return bool(request_task.callback_succeeded)
56
+
57
+
58
+ def is_async_request(
59
+ request_task: RequestTask, query_config: "SaaSQueryConfig"
60
+ ) -> bool:
61
+ """
62
+ Check if this is an async request (callback, continuation, or initial async).
63
+
64
+ This is the main entry point for async detection.
65
+ """
66
+ return (
67
+ is_callback_completion(request_task)
68
+ or is_polling_continuation(request_task)
69
+ or has_async_requests(query_config)
70
+ )
71
+
72
+
73
+ class AsyncPhase(Enum):
74
+ """Enum representing different phases of async DSR processing."""
75
+
76
+ callback_completion = "callback_completion"
77
+ polling_continuation = "polling_continuation"
78
+ initial_async = "initial_async"
79
+ sync = "sync"
80
+
81
+
82
+ def get_async_phase(
83
+ request_task: RequestTask, query_config: "SaaSQueryConfig"
84
+ ) -> AsyncPhase:
85
+ """
86
+ Classify the phase of async request for routing purposes.
87
+
88
+ Returns:
89
+ AsyncPhase enum value representing the current phase:
90
+ - callback_completion: Callback has completed
91
+ - polling_continuation: Continuing an existing polling process
92
+ - initial_async: Initial async request setup
93
+ - sync: Not an async request
94
+ """
95
+ if is_callback_completion(request_task):
96
+ return AsyncPhase.callback_completion
97
+ if is_polling_continuation(request_task):
98
+ return AsyncPhase.polling_continuation
99
+ if has_async_requests(query_config):
100
+ return AsyncPhase.initial_async
101
+ return AsyncPhase.sync
102
+
103
+
104
+ def get_connection_config_from_task(
105
+ db: Session, request_task: RequestTask
106
+ ) -> ConnectionConfig:
107
+ """
108
+ Get ConnectionConfig from a RequestTask.
109
+
110
+ This utility function retrieves the connection configuration
111
+ associated with a request task by looking up the dataset configuration.
112
+ """
113
+ dataset_config = DatasetConfig.filter(
114
+ db=db,
115
+ conditions=(DatasetConfig.fides_key == request_task.dataset_name),
116
+ ).first()
117
+ if not dataset_config:
118
+ raise PrivacyRequestError(
119
+ f"DatasetConfig with fides_key {request_task.dataset_name} not found."
120
+ )
121
+
122
+ connection_config = ConnectionConfig.get(
123
+ db=db, object_id=dataset_config.connection_config_id
124
+ )
125
+ if not connection_config:
126
+ raise PrivacyRequestError(
127
+ f"ConnectionConfig with id {dataset_config.connection_config_id} not found."
128
+ )
129
+
130
+ return connection_config
@@ -7,7 +7,7 @@ from sqlalchemy.orm import Session
7
7
  from sqlalchemy.sql import Executable # type: ignore
8
8
  from sqlalchemy.sql.elements import TextClause
9
9
 
10
- from fides.api.common_exceptions import ConnectionException
10
+ from fides.api.common_exceptions import ConnectionException, TableNotFound
11
11
  from fides.api.graph.execution import ExecutionNode
12
12
  from fides.api.models.connectionconfig import ConnectionTestStatus
13
13
  from fides.api.models.policy import Policy
@@ -194,23 +194,41 @@ class BigQueryConnector(SQLConnector):
194
194
  update_or_delete_ct = 0
195
195
  client = self.client()
196
196
 
197
- if query_config.uses_delete_masking_strategy():
198
- delete_stmts = query_config.generate_delete(client, input_data or {})
199
- logger.debug(f"Generated {len(delete_stmts)} DELETE statements")
200
- update_or_delete_ct += self._execute_statements_with_sql_dry_run(
201
- delete_stmts, self.should_dry_run(SqlDryRunMode.erasure), client
202
- )
203
- else:
204
- for row in rows:
205
- update_or_delete_stmts: List[Executable] = query_config.generate_update(
206
- row, policy, privacy_request, client
207
- )
208
- logger.debug(
209
- f"Generated {len(update_or_delete_stmts)} UPDATE statements"
210
- )
197
+ try:
198
+ if query_config.uses_delete_masking_strategy():
199
+ delete_stmts = query_config.generate_delete(client, input_data or {})
200
+ logger.debug(f"Generated {len(delete_stmts)} DELETE statements")
211
201
  update_or_delete_ct += self._execute_statements_with_sql_dry_run(
212
- update_or_delete_stmts,
202
+ delete_stmts,
213
203
  self.should_dry_run(SqlDryRunMode.erasure),
214
204
  client,
215
205
  )
206
+ else:
207
+ for row in rows:
208
+ update_or_delete_stmts: List[Executable] = (
209
+ query_config.generate_update(
210
+ row, policy, privacy_request, client
211
+ )
212
+ )
213
+ logger.debug(
214
+ f"Generated {len(update_or_delete_stmts)} UPDATE statements"
215
+ )
216
+ update_or_delete_ct += self._execute_statements_with_sql_dry_run(
217
+ update_or_delete_stmts,
218
+ self.should_dry_run(SqlDryRunMode.erasure),
219
+ client,
220
+ )
221
+ except Exception as exc:
222
+ # Check if table exists using qualified table name
223
+ qualified_table_name = self.get_qualified_table_name(node)
224
+ if not self.table_exists(qualified_table_name):
225
+ # For data erasure, we can always skip the collection since other collections
226
+ # don't depend on erasure results
227
+ skip_msg = (
228
+ f"Table '{qualified_table_name}' did not exist during data erasure."
229
+ )
230
+ raise TableNotFound(skip_msg) from exc
231
+ # Table exists or can't check - re-raise original exception
232
+ raise
233
+
216
234
  return update_or_delete_ct
@@ -1,11 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from asyncio import sleep
4
+ from datetime import datetime
3
5
  from typing import Any, Dict, List, Optional
4
6
 
5
7
  import httpx
6
8
  from httpx import AsyncClient, Client, HTTPStatusError, Request, RequestError, Timeout
7
9
  from loguru import logger
8
10
 
11
+ from fides.api.common_exceptions import PrivacyRequestNotFound
9
12
  from fides.api.schemas.privacy_request import (
10
13
  PrivacyRequestCreate,
11
14
  PrivacyRequestResponse,
@@ -13,11 +16,11 @@ from fides.api.schemas.privacy_request import (
13
16
  )
14
17
  from fides.api.schemas.redis_cache import Identity
15
18
  from fides.api.schemas.user import UserLogin
16
- from fides.api.service.privacy_request.request_service import poll_server_for_completion
17
19
  from fides.api.util.collection_util import Row
18
20
  from fides.api.util.errors import FidesError
19
21
  from fides.api.util.wrappers import sync
20
22
  from fides.common.api.v1 import urn_registry as urls
23
+ from fides.common.api.v1.urn_registry import PRIVACY_REQUESTS
21
24
 
22
25
  COMPLETION_STATUSES = [
23
26
  PrivacyRequestStatus.complete,
@@ -27,6 +30,65 @@ COMPLETION_STATUSES = [
27
30
  ]
28
31
 
29
32
 
33
+ def get_async_client() -> AsyncClient:
34
+ """Return an async client used to make API requests"""
35
+ return AsyncClient()
36
+
37
+
38
+ async def poll_server_for_completion(
39
+ privacy_request_id: str,
40
+ server_url: str,
41
+ token: str,
42
+ *,
43
+ poll_interval_seconds: int = 30,
44
+ timeout_seconds: int = 1800, # 30 minutes
45
+ client: AsyncClient | None = None,
46
+ ) -> PrivacyRequestResponse:
47
+ """Poll a server for privacy request completion.
48
+
49
+ Requests will report complete with if they have a status of canceled, complete,
50
+ denied, or error. By default the polling will time out if not completed in 30
51
+ minutes, time can be overridden by setting the timeout_seconds.
52
+ """
53
+ url = f"{server_url}{urls.V1_URL_PREFIX}{PRIVACY_REQUESTS}?request_id={privacy_request_id}"
54
+ start_time = datetime.now()
55
+ elapsed_time = 0.0
56
+ while elapsed_time < timeout_seconds:
57
+ if client:
58
+ response = await client.get(
59
+ url, headers={"Authorization": f"Bearer {token}"}
60
+ )
61
+ else:
62
+ async_client = get_async_client()
63
+ response = await async_client.get(
64
+ url, headers={"Authorization": f"Bearer {token}"}
65
+ )
66
+ response.raise_for_status()
67
+
68
+ # Privacy requests are returned paginated. Since this is searching for a specific
69
+ # privacy request there should only be one value present in items.
70
+ items = response.json()["items"]
71
+ if not items:
72
+ raise PrivacyRequestNotFound(
73
+ f"No privacy request found with id '{privacy_request_id}'"
74
+ )
75
+ status = PrivacyRequestResponse(**items[0])
76
+ if status.status and status.status in (
77
+ PrivacyRequestStatus.complete,
78
+ PrivacyRequestStatus.canceled,
79
+ PrivacyRequestStatus.error,
80
+ PrivacyRequestStatus.denied,
81
+ ):
82
+ return status
83
+
84
+ await sleep(poll_interval_seconds)
85
+ time_delta = datetime.now() - start_time
86
+ elapsed_time = time_delta.seconds
87
+ raise TimeoutError(
88
+ f"Timeout of {timeout_seconds} seconds has been exceeded while waiting for privacy request {privacy_request_id}"
89
+ )
90
+
91
+
30
92
  class FidesClient:
31
93
  """
32
94
  A helper client to broker communications between Fides servers.
@@ -10,7 +10,6 @@ from uuid import uuid4
10
10
  import pydash
11
11
  from fideslang.models import FidesDatasetReference
12
12
  from loguru import logger
13
- from sqlalchemy.orm import Session
14
13
 
15
14
  from fides.api.common_exceptions import FidesopsException
16
15
  from fides.api.graph.execution import ExecutionNode
@@ -47,6 +46,7 @@ from fides.api.util.saas_util import (
47
46
  ISO_8601_DATETIME,
48
47
  MASKED_OBJECT_FIELDS,
49
48
  PRIVACY_REQUEST_ID,
49
+ PRIVACY_REQUEST_OBJECT,
50
50
  REPLY_TO,
51
51
  REPLY_TO_TOKEN,
52
52
  UUID,
@@ -83,12 +83,10 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
83
83
  """
84
84
  Returns the appropriate request configs based on the current collection and identity
85
85
  """
86
- collection_name = self.node.address.collection
87
-
88
86
  try:
89
- requests = self.endpoints[collection_name].requests
87
+ requests = self.endpoints[self.collection_name].requests
90
88
  except KeyError:
91
- logger.error("The '{}' endpoint is not defined", collection_name)
89
+ logger.error("The '{}' endpoint is not defined", self.collection_name)
92
90
  return []
93
91
 
94
92
  if not requests.read:
@@ -140,7 +138,7 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
140
138
  )
141
139
  return request
142
140
 
143
- def get_masking_request(self, db: Session) -> Optional[SaaSRequest]:
141
+ def get_masking_request(self) -> Optional[SaaSRequest]:
144
142
  """
145
143
  Returns a tuple of the preferred action and SaaSRequest to use for masking.
146
144
  An update request is preferred, but we can use a gdpr delete endpoint or
@@ -212,6 +210,7 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
212
210
  input_data: Dict[str, List[Any]],
213
211
  policy: Optional[Policy],
214
212
  read_request: SaaSRequest,
213
+ privacy_request: Optional[PrivacyRequest] = None,
215
214
  ) -> List[Tuple[SaaSRequestParams, Dict[str, Any]]]:
216
215
  """
217
216
  Takes the identity and reference values from input_data and combines them
@@ -224,6 +223,10 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
224
223
  self.current_request = read_request
225
224
 
226
225
  request_params = []
226
+
227
+ if privacy_request:
228
+ input_data[PRIVACY_REQUEST_OBJECT] = [privacy_request.to_safe_dict()]
229
+
227
230
  param_value_maps = self.generate_param_value_maps(input_data, read_request)
228
231
 
229
232
  for param_value_map in param_value_maps:
@@ -277,6 +280,114 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
277
280
  name: value for name, value in self.secrets.items() if name in param_names
278
281
  }
279
282
 
283
+ def _safe_extract_value(self, value_list: Optional[List[Any]]) -> Optional[Any]:
284
+ """
285
+ Safely extract the first value from a list
286
+ """
287
+ return value_list[0] if value_list else None
288
+
289
+ def _process_param_values_for_query(
290
+ self,
291
+ request: SaaSRequest,
292
+ input_data: Dict[str, List[Any]],
293
+ param_values: Dict[str, Any],
294
+ ) -> None:
295
+ """
296
+ Process param_values for query generation on access requests.
297
+ """
298
+ for param_value in request.param_values or []:
299
+ if param_value.references or param_value.identity:
300
+ input_list = input_data.get(param_value.name)
301
+ if input_list:
302
+ param_values[param_value.name] = self._safe_extract_value(
303
+ input_list
304
+ )
305
+ elif param_value.connector_param:
306
+ connector_value = pydash.get(input_data, param_value.connector_param)
307
+ param_values[param_value.name] = self._safe_extract_value(
308
+ connector_value
309
+ )
310
+
311
+ def _process_param_values_for_update(
312
+ self,
313
+ request: SaaSRequest,
314
+ collection_values: Dict[str, Row],
315
+ identity_data: Dict[str, Any],
316
+ input_data: Optional[Dict[str, List[Any]]] = None,
317
+ param_values: Optional[Dict[str, Any]] = None,
318
+ ) -> None:
319
+ """
320
+ Process param_values for update generation (erasure requests).
321
+ Modifies param_values in place.
322
+
323
+ Args:
324
+ request: The SaaS request configuration
325
+ collection_values: Collection data for reference resolution
326
+ identity_data: Identity data for parameter resolution
327
+ input_data: Optional upstream data from other collections
328
+ """
329
+ if param_values is None:
330
+ param_values = {}
331
+
332
+ for param_value in request.param_values or []:
333
+ if param_value.references:
334
+ # we resolve the param reference here for consistency,
335
+ # i.e. as if it may be a pointer to an `external_reference`.
336
+ # Cross-collection references are now supported by looking up data
337
+ # from upstream collections passed via input_data.
338
+ reference: FidesDatasetReference = SaaSConfig.resolve_param_reference(
339
+ param_value.references[0], self.secrets
340
+ )
341
+ param_values[param_value.name] = pydash.get(
342
+ collection_values, reference.field
343
+ )
344
+ if param_values[param_value.name] is None and input_data:
345
+ logger.info(
346
+ "Reference not found in collection, checking input data from upstream tasks"
347
+ )
348
+ # If the reference is not found in the collection (None), check the input data from upstream tasks
349
+ input_list = input_data.get(param_value.name)
350
+ if input_list:
351
+ param_values[param_value.name] = self._safe_extract_value(
352
+ input_list
353
+ )
354
+
355
+ elif param_value.identity:
356
+ param_values[param_value.name] = pydash.get(
357
+ identity_data, param_value.identity
358
+ )
359
+ elif param_value.connector_param:
360
+ param_values[param_value.name] = pydash.get(
361
+ self.secrets, param_value.connector_param
362
+ )
363
+
364
+ def _add_standard_parameters(
365
+ self,
366
+ param_values: Dict[str, Any],
367
+ ) -> None:
368
+ """
369
+ Add standard parameters that are common across query and update operations.
370
+ """
371
+
372
+ # common parameters for read and update
373
+ if self.privacy_request:
374
+ param_values[PRIVACY_REQUEST_ID] = self.privacy_request.id
375
+ param_values[UUID] = str(uuid4())
376
+ param_values[ISO_8601_DATETIME] = datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
377
+ param_values[FIELD_LIST] = ",".join(
378
+ [
379
+ field.name
380
+ for field in self.top_level_field_map().values()
381
+ if field.data_type() != "None"
382
+ ]
383
+ )
384
+
385
+ if self.request_task and self.request_task.id:
386
+ param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
387
+ self.request_task
388
+ )
389
+ param_values[REPLY_TO] = V1_URL_PREFIX + REQUEST_TASK_CALLBACK
390
+
280
391
  @staticmethod
281
392
  def _generate_product_list(*args: Dict[str, Any]) -> List[Dict[str, Any]]:
282
393
  """
@@ -326,22 +437,19 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
326
437
  f"The 'read' action is not defined for the '{self.collection_name}' "
327
438
  f"endpoint in {self.node.connection_key}"
328
439
  )
329
-
330
- # create the source of param values to populate the various placeholders
331
- # in the path, headers, query_params, and body
332
440
  param_values: Dict[str, Any] = {}
333
- for param_value in self.current_request.param_values or []:
334
- if param_value.references or param_value.identity:
335
- input_list = input_data.get(param_value.name)
336
- if input_list:
337
- param_values[param_value.name] = input_list[0]
338
- elif param_value.connector_param:
339
- param_values[param_value.name] = pydash.get(
340
- input_data, param_value.connector_param
341
- )[0]
441
+ # Process param values using utility method
442
+ self._process_param_values_for_query(
443
+ self.current_request, input_data, param_values
444
+ )
342
445
 
343
- if self.privacy_request:
344
- param_values[PRIVACY_REQUEST_ID] = self.privacy_request.id
446
+ privacy_request_object = input_data.get(PRIVACY_REQUEST_OBJECT)
447
+ if (
448
+ isinstance(privacy_request_object, list)
449
+ and len(privacy_request_object) > 0
450
+ and isinstance(privacy_request_object[0], dict)
451
+ ):
452
+ param_values[PRIVACY_REQUEST_OBJECT] = privacy_request_object[0]
345
453
 
346
454
  custom_privacy_request_fields = input_data.get(CUSTOM_PRIVACY_REQUEST_FIELDS)
347
455
  if (
@@ -352,20 +460,9 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
352
460
  0
353
461
  ]
354
462
 
355
- param_values[UUID] = str(uuid4())
356
- param_values[ISO_8601_DATETIME] = datetime.now().date().isoformat()
357
- param_values[FIELD_LIST] = ",".join(
358
- [
359
- field.name
360
- for field in self.top_level_field_map().values()
361
- if field.data_type() != "None"
362
- ]
363
- )
364
- if self.request_task and self.request_task.id:
365
- param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
366
- self.request_task
367
- )
368
- param_values[REPLY_TO] = V1_URL_PREFIX + REQUEST_TASK_CALLBACK
463
+ # Add standard parameters
464
+ # For generate_query, we don't have a PrivacyRequest object, so we use self.privacy_request
465
+ self._add_standard_parameters(param_values)
369
466
 
370
467
  # map param values to placeholders in path, headers, and query params
371
468
  saas_request_params: SaaSRequestParams = saas_util.map_param_values(
@@ -377,17 +474,26 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
377
474
  return saas_request_params
378
475
 
379
476
  def generate_update_stmt(
380
- self, row: Row, policy: Policy, request: PrivacyRequest
477
+ self,
478
+ row: Row,
479
+ policy: Policy,
480
+ request: PrivacyRequest,
481
+ input_data: Optional[Dict[str, List[Any]]] = None,
381
482
  ) -> SaaSRequestParams:
382
483
  """
383
484
  This returns the method, path, header, query, and body params needed to make an API call.
384
485
  The fields in the row are masked according to the policy and added to the request body
385
486
  if specified by the body field of the masking request.
487
+
488
+ Args:
489
+ row: The current row data from this collection
490
+ policy: The privacy policy being applied
491
+ request: The privacy request being processed
492
+ input_data: Optional upstream data from other collections for cross-collection references
386
493
  """
387
- session = Session.object_session(request)
388
- current_request: SaaSRequest = self.get_masking_request(session) # type: ignore
494
+ current_request: SaaSRequest = self.get_masking_request() # type: ignore
389
495
  param_values: Dict[str, Any] = self.generate_update_param_values(
390
- row, policy, request, current_request
496
+ row, policy, request, current_request, input_data
391
497
  )
392
498
 
393
499
  return self.generate_update_request_params(param_values, current_request)
@@ -416,6 +522,7 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
416
522
  policy: Policy,
417
523
  privacy_request: PrivacyRequest,
418
524
  saas_request: SaaSRequest,
525
+ input_data: Optional[Dict[str, List[Any]]] = None,
419
526
  ) -> Dict[str, Any]:
420
527
  """
421
528
  A utility that generates the update request param values
@@ -426,10 +533,16 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
426
533
  the fields in the provided row that have been masked according
427
534
  to provided policy. The `all_object_fields` key maps to a JSON structure
428
535
  that holds all values, including those that have not been masked.
536
+
537
+ Args:
538
+ row: The current row data from this collection
539
+ policy: The privacy policy being applied
540
+ privacy_request: The privacy request being processed
541
+ saas_request: The SaaS request configuration
542
+ input_data: Optional upstream data from other collections for cross-collection references
429
543
  """
430
544
 
431
- collection_name: str = self.node.address.collection
432
- collection_values: Dict[str, Row] = {collection_name: row}
545
+ collection_values: Dict[str, Row] = {self.collection_name: row}
433
546
  identity_data: Dict[str, Any] = privacy_request.get_cached_identity_data()
434
547
  custom_privacy_request_fields: Dict[str, Any] = (
435
548
  privacy_request.get_cached_custom_privacy_request_fields()
@@ -438,46 +551,15 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
438
551
  # create the source of param values to populate the various placeholders
439
552
  # in the path, headers, query_params, and body
440
553
  param_values: Dict[str, Any] = {}
441
- for param_value in saas_request.param_values or []:
442
- if param_value.references:
443
- # we resolve the param reference here for consistency,
444
- # i.e. as if it may be a pointer to an `external_reference`.
445
- # however, `references` in update requests can, currently, only reference
446
- # the same collection the same collection, and so it is highly unlikely
447
- # that this would be an external reference at this point.
448
- reference: FidesDatasetReference = SaaSConfig.resolve_param_reference(
449
- param_value.references[0], self.secrets
450
- )
451
- param_values[param_value.name] = pydash.get(
452
- collection_values, reference.field
453
- )
454
- elif param_value.identity:
455
- param_values[param_value.name] = pydash.get(
456
- identity_data, param_value.identity
457
- )
458
- elif param_value.connector_param:
459
- param_values[param_value.name] = pydash.get(
460
- self.secrets, param_value.connector_param
461
- )
462
-
463
- if self.privacy_request:
464
- param_values[PRIVACY_REQUEST_ID] = self.privacy_request.id
554
+ # Process param values using utility method
555
+ self._process_param_values_for_update(
556
+ saas_request, collection_values, identity_data, input_data, param_values
557
+ )
465
558
 
559
+ param_values[PRIVACY_REQUEST_OBJECT] = privacy_request.to_safe_dict()
466
560
  param_values[CUSTOM_PRIVACY_REQUEST_FIELDS] = custom_privacy_request_fields
467
- param_values[UUID] = str(uuid4())
468
- param_values[ISO_8601_DATETIME] = datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
469
- param_values[FIELD_LIST] = ",".join(
470
- [
471
- field.name
472
- for field in self.top_level_field_map().values()
473
- if field.data_type() != "None"
474
- ]
475
- )
476
- if self.request_task and self.request_task.id:
477
- param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
478
- self.request_task
479
- )
480
- param_values[REPLY_TO] = V1_URL_PREFIX + REQUEST_TASK_CALLBACK
561
+ # Add standard parameters
562
+ self._add_standard_parameters(param_values)
481
563
  # remove any row values for fields marked as read-only, these will be omitted from all update maps
482
564
  for field_path, field in self.field_map().items():
483
565
  if field.read_only:
@@ -503,7 +585,6 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
503
585
 
504
586
  param_values[MASKED_OBJECT_FIELDS] = masked_object
505
587
  param_values[ALL_OBJECT_FIELDS] = complete_object
506
-
507
588
  return param_values
508
589
 
509
590
  def generate_update_request_params(