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,686 @@
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Tuple, cast
2
+ from uuid import uuid4
3
+
4
+ import pydash
5
+ from loguru import logger
6
+ from sqlalchemy.orm import Session
7
+
8
+ from fides.api.common_exceptions import (
9
+ AwaitingAsyncProcessing,
10
+ FidesopsException,
11
+ PrivacyRequestError,
12
+ )
13
+ from fides.api.models.policy import Policy
14
+ from fides.api.models.privacy_request.request_task import (
15
+ AsyncTaskType,
16
+ RequestTask,
17
+ RequestTaskSubRequest,
18
+ )
19
+ from fides.api.models.worker_task import ExecutionLogStatus
20
+ from fides.api.schemas.policy import ActionType
21
+ from fides.api.schemas.saas.async_polling_configuration import (
22
+ AsyncPollingConfiguration,
23
+ PollingResult,
24
+ PollingResultType,
25
+ )
26
+ from fides.api.schemas.saas.saas_config import ReadSaaSRequest, SaaSRequest
27
+ from fides.api.schemas.saas.shared_schemas import SaaSRequestParams
28
+ from fides.api.service.async_dsr.handlers.polling_attachment_handler import (
29
+ PollingAttachmentHandler,
30
+ )
31
+ from fides.api.service.async_dsr.handlers.polling_request_handler import (
32
+ PollingRequestHandler,
33
+ )
34
+ from fides.api.service.async_dsr.handlers.polling_response_handler import (
35
+ PollingResponseProcessor,
36
+ )
37
+ from fides.api.service.async_dsr.handlers.polling_sub_request_handler import (
38
+ PollingSubRequestHandler,
39
+ )
40
+ from fides.api.service.async_dsr.strategies.async_dsr_strategy import AsyncDSRStrategy
41
+ from fides.api.service.async_dsr.utils import AsyncPhase, get_async_phase
42
+ from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
43
+ from fides.api.service.saas_request.saas_request_override_factory import (
44
+ SaaSRequestOverrideFactory,
45
+ SaaSRequestType,
46
+ )
47
+ from fides.api.util.collection_util import Row
48
+ from fides.api.util.saas_util import map_param_values
49
+ from fides.config import CONFIG
50
+
51
+ if TYPE_CHECKING:
52
+ from fides.api.models.privacy_request.privacy_request import PrivacyRequest
53
+ from fides.api.service.connectors.query_configs.saas_query_config import (
54
+ SaaSQueryConfig,
55
+ )
56
+
57
+
58
+ class AsyncPollingStrategy(AsyncDSRStrategy):
59
+ """
60
+ Enhanced strategy for polling async DSR requests.
61
+ Works for both access and erasure operations with internal phase-based organization.
62
+ """
63
+
64
+ type = AsyncTaskType.polling
65
+ configuration_model = AsyncPollingConfiguration
66
+
67
+ def __init__(self, session: Session, configuration: AsyncPollingConfiguration):
68
+ self.session = session
69
+ self.status_request = configuration.status_request
70
+ self.result_request = configuration.result_request
71
+
72
+ def async_retrieve_data(
73
+ self,
74
+ client: AuthenticatedClient,
75
+ request_task_id: str,
76
+ query_config: "SaaSQueryConfig",
77
+ input_data: Dict[str, List[Any]],
78
+ ) -> List[Row]:
79
+ """
80
+ Execute async retrieve data with internal phase routing.
81
+ """
82
+ request_task = self._get_request_task(request_task_id)
83
+ async_phase = get_async_phase(request_task, query_config)
84
+
85
+ if async_phase == AsyncPhase.initial_async:
86
+ return self._initial_request_access(
87
+ client, request_task, query_config, input_data
88
+ )
89
+
90
+ if async_phase == AsyncPhase.polling_continuation:
91
+ return self._polling_continuation_access(client, request_task, query_config)
92
+
93
+ logger.warning(
94
+ f"Unexpected async phase '{async_phase}' for polling access task {request_task.id}"
95
+ )
96
+ return []
97
+
98
+ def async_mask_data(
99
+ self,
100
+ client: AuthenticatedClient,
101
+ request_task_id: str,
102
+ query_config: "SaaSQueryConfig",
103
+ rows: List[Row],
104
+ ) -> int:
105
+ """
106
+ Execute async mask data with internal phase routing.
107
+ """
108
+ request_task = self._get_request_task(request_task_id)
109
+ async_phase = get_async_phase(request_task, query_config)
110
+
111
+ if async_phase == AsyncPhase.initial_async:
112
+ return self._initial_request_erasure(
113
+ client, request_task, query_config, rows
114
+ )
115
+
116
+ if async_phase == AsyncPhase.polling_continuation:
117
+ return self._polling_continuation_erasure(
118
+ client, request_task, query_config
119
+ )
120
+
121
+ logger.warning(
122
+ f"Unexpected async phase '{async_phase}' for polling erasure task {request_task.id}"
123
+ )
124
+ return 0
125
+
126
+ # Private helper methods
127
+
128
+ def _initial_request_access(
129
+ self,
130
+ client: AuthenticatedClient,
131
+ request_task: RequestTask,
132
+ query_config: "SaaSQueryConfig",
133
+ input_data: Dict[str, List[Any]],
134
+ ) -> List[Row]:
135
+ """Handle initial setup for access polling requests."""
136
+ logger.info(f"Initial polling request for access task {request_task.id}")
137
+
138
+ policy = request_task.privacy_request.policy
139
+
140
+ async_requests_to_process = [
141
+ req
142
+ for req in query_config.get_read_requests_by_identity()
143
+ if req.async_config
144
+ ]
145
+
146
+ if not async_requests_to_process:
147
+ logger.warning(
148
+ f"No async-configured read requests found for task {request_task.id}"
149
+ )
150
+ return []
151
+
152
+ request_task.async_type = AsyncTaskType.polling
153
+ self.session.add(request_task)
154
+ self.session.commit()
155
+
156
+ for read_request in async_requests_to_process:
157
+ logger.info(
158
+ f"Creating initial polling sub-requests for task {request_task.id}"
159
+ )
160
+
161
+ self._handle_polling_initial_request(
162
+ request_task,
163
+ query_config,
164
+ read_request,
165
+ input_data,
166
+ policy,
167
+ client,
168
+ )
169
+
170
+ self.session.refresh(request_task)
171
+ raise AwaitingAsyncProcessing(
172
+ f"Waiting for next scheduled check of {request_task.dataset_name} access results."
173
+ )
174
+
175
+ def _initial_request_erasure(
176
+ self,
177
+ client: AuthenticatedClient,
178
+ request_task: RequestTask,
179
+ query_config: "SaaSQueryConfig",
180
+ rows: List[Row],
181
+ ) -> int:
182
+ """Handle initial setup for erasure polling requests."""
183
+ logger.info(f"Initial polling request for erasure task {request_task.id}")
184
+
185
+ privacy_request = request_task.privacy_request
186
+ policy = privacy_request.policy
187
+
188
+ all_requests = []
189
+ masking_request = query_config.get_masking_request()
190
+ if masking_request:
191
+ all_requests.append(masking_request)
192
+
193
+ # Set async type once for the task
194
+ request_task.async_type = AsyncTaskType.polling
195
+ self.session.add(request_task)
196
+ self.session.commit()
197
+
198
+ for request in all_requests:
199
+ if not (request.async_config and request_task.id):
200
+ continue
201
+
202
+ if request.path:
203
+ logger.info(
204
+ f"Executing initial masking request for polling task {request_task.id}"
205
+ )
206
+ self._handle_polling_initial_erasure_request(
207
+ request_task,
208
+ query_config,
209
+ request,
210
+ rows,
211
+ policy,
212
+ privacy_request,
213
+ client,
214
+ )
215
+
216
+ # After processing all requests, raise AwaitingAsyncProcessing (like access flow)
217
+ # But only if we actually created any sub-requests
218
+ self.session.refresh(request_task)
219
+ if request_task.sub_requests:
220
+ raise AwaitingAsyncProcessing(
221
+ f"Waiting for next scheduled check of {request_task.dataset_name} erasure results."
222
+ )
223
+ # If no sub-requests were created (no rows to process), the task is already complete
224
+ return 0
225
+
226
+ def _polling_continuation_access(
227
+ self,
228
+ client: AuthenticatedClient,
229
+ request_task: RequestTask,
230
+ query_config: "SaaSQueryConfig",
231
+ ) -> List[Row]:
232
+ """Handle polling continuation for access requests."""
233
+ logger.info(f"Continuing polling for access task {request_task.id}")
234
+
235
+ polling_complete = self._execute_polling_requests(
236
+ client, request_task, query_config
237
+ )
238
+
239
+ if not polling_complete:
240
+ raise AwaitingAsyncProcessing(
241
+ f"Waiting for next scheduled check of {request_task.dataset_name} access results."
242
+ )
243
+
244
+ # Aggregate all sub-request results, merging attachments
245
+ aggregated_results: List[Row] = []
246
+ merged_attachments = []
247
+
248
+ for sub_request in request_task.sub_requests:
249
+ if sub_request.access_data:
250
+ for row in sub_request.access_data:
251
+ # Check if this row has retrieved_attachments
252
+ if "retrieved_attachments" in row:
253
+ # Collect attachments for merging
254
+ merged_attachments.extend(row["retrieved_attachments"])
255
+ # Remove retrieved_attachments from the row to avoid duplication
256
+ row_without_attachments = {
257
+ k: v for k, v in row.items() if k != "retrieved_attachments"
258
+ }
259
+ # Only add the row if it's not empty or if it's the first row
260
+ if row_without_attachments or not aggregated_results:
261
+ aggregated_results.append(row_without_attachments)
262
+ else:
263
+ # Regular row without attachments
264
+ aggregated_results.append(row)
265
+
266
+ # If we have merged attachments, add them to the first aggregated result
267
+ if merged_attachments and aggregated_results:
268
+ aggregated_results[0]["retrieved_attachments"] = merged_attachments
269
+
270
+ return aggregated_results
271
+
272
+ def _polling_continuation_erasure(
273
+ self,
274
+ client: AuthenticatedClient,
275
+ request_task: RequestTask,
276
+ query_config: "SaaSQueryConfig",
277
+ ) -> int:
278
+ """Handle polling continuation for erasure requests."""
279
+ logger.info(f"Continuing polling for erasure task {request_task.id}")
280
+
281
+ polling_complete = self._execute_polling_requests(
282
+ client, request_task, query_config
283
+ )
284
+
285
+ if not polling_complete:
286
+ raise AwaitingAsyncProcessing(
287
+ f"Waiting for next scheduled check of {request_task.dataset_name} erasure results."
288
+ )
289
+
290
+ # Aggregate rows_masked from all sub-requests
291
+ total_rows_masked = sum(
292
+ sub_request.rows_masked or 0 for sub_request in request_task.sub_requests
293
+ )
294
+ return total_rows_masked
295
+
296
+ def _handle_polling_initial_request(
297
+ self,
298
+ request_task: RequestTask,
299
+ query_config: "SaaSQueryConfig",
300
+ read_request: ReadSaaSRequest,
301
+ input_data: Dict[str, Any],
302
+ policy: Policy,
303
+ client: "AuthenticatedClient",
304
+ ) -> None:
305
+ """Handles the setup for asynchronous initial requests."""
306
+ query_config.action = "Polling - start"
307
+ prepared_requests: List[Tuple[SaaSRequestParams, Dict[str, Any]]] = (
308
+ query_config.generate_requests(input_data, policy, read_request)
309
+ )
310
+ logger.info(f"Prepared requests: {len(prepared_requests)}")
311
+
312
+ for next_request, param_value_map in prepared_requests:
313
+ response = client.send(next_request)
314
+
315
+ if not response.ok:
316
+ raise FidesopsException(
317
+ f"Initial async request failed with status code {response.status_code}: {response.text}"
318
+ )
319
+
320
+ try:
321
+ response_data = response.json()
322
+ correlation_id = pydash.get(
323
+ response_data, read_request.correlation_id_path
324
+ )
325
+ if not correlation_id:
326
+ raise FidesopsException(
327
+ f"Could not extract correlation ID from response using path: {read_request.correlation_id_path}"
328
+ )
329
+ except ValueError as exc:
330
+ raise FidesopsException(
331
+ f"Invalid JSON response from initial request: {exc}"
332
+ )
333
+
334
+ param_value_map["correlation_id"] = str(correlation_id)
335
+ PollingSubRequestHandler.create_sub_request(
336
+ self.session, request_task, param_value_map
337
+ )
338
+
339
+ def _handle_polling_initial_erasure_request(
340
+ self,
341
+ request_task: RequestTask,
342
+ query_config: "SaaSQueryConfig",
343
+ request: SaaSRequest,
344
+ rows: List[Row],
345
+ policy: Policy,
346
+ privacy_request: "PrivacyRequest",
347
+ client: "AuthenticatedClient",
348
+ ) -> None:
349
+ """Handles the setup for asynchronous initial erasure requests."""
350
+ logger.info(
351
+ f"Processing {len(rows)} rows for erasure request in task {request_task.id}"
352
+ )
353
+
354
+ # Create sub-requests for erasure operations (similar to access operations)
355
+ for row in rows or [{}]:
356
+ try:
357
+ # Generate parameter values first (like access requests)
358
+ param_value_map = query_config.generate_update_param_values(
359
+ row, policy, privacy_request, request
360
+ )
361
+
362
+ # Generate the update request using the param_values
363
+ prepared_request = query_config.generate_update_stmt(
364
+ row, policy, privacy_request
365
+ )
366
+ response = client.send(prepared_request, request.ignore_errors)
367
+
368
+ # Extract correlation ID from response (required, like access requests)
369
+ try:
370
+ response_data = response.json()
371
+ correlation_id = pydash.get(
372
+ response_data, request.correlation_id_path
373
+ )
374
+ if not correlation_id:
375
+ raise FidesopsException(
376
+ f"Could not extract correlation ID from response using path: {request.correlation_id_path}"
377
+ )
378
+ except ValueError as exc:
379
+ raise FidesopsException(
380
+ f"Invalid JSON response from initial erasure request: {exc}"
381
+ )
382
+
383
+ # Add correlation_id to the existing param_value_map (like access requests)
384
+ param_value_map["correlation_id"] = str(correlation_id)
385
+ PollingSubRequestHandler.create_sub_request(
386
+ self.session, request_task, param_value_map
387
+ )
388
+
389
+ except ValueError as exc:
390
+ if request.skip_missing_param_values:
391
+ logger.debug("Skipping optional masking request: {}", exc)
392
+ continue
393
+ raise exc
394
+
395
+ def _get_requests_for_action(
396
+ self, polling_task: RequestTask, query_config: "SaaSQueryConfig"
397
+ ) -> List[ReadSaaSRequest]:
398
+ """
399
+ Get the appropriate requests based on the action type.
400
+
401
+ Args:
402
+ polling_task: The polling task to get requests for
403
+ query_config: The SaaS query configuration
404
+
405
+ Returns:
406
+ List of ReadSaaSRequest objects for the given action type
407
+
408
+ Raises:
409
+ PrivacyRequestError: If action type is unsupported or masking request not found
410
+ """
411
+ # Validate result_request is provided for access operations
412
+ if polling_task.action_type == ActionType.access and not self.result_request:
413
+ raise PrivacyRequestError(
414
+ f"result_request is required for access operations but was not provided in polling configuration for task {polling_task.id}"
415
+ )
416
+
417
+ if polling_task.action_type == ActionType.access:
418
+ return list(query_config.get_read_requests_by_identity())
419
+ if polling_task.action_type == ActionType.erasure:
420
+ masking_request = query_config.get_masking_request()
421
+ if not masking_request:
422
+ raise PrivacyRequestError(
423
+ f"No masking request found for erasure task {polling_task.id}"
424
+ )
425
+ return [cast(ReadSaaSRequest, masking_request)]
426
+ raise PrivacyRequestError(
427
+ f"Unsupported action type: {polling_task.action_type}"
428
+ )
429
+
430
+ def _check_sub_request_status(
431
+ self, client: AuthenticatedClient, param_values: Dict[str, Any]
432
+ ) -> bool:
433
+ """
434
+ Check the status of a sub-request using either override function or HTTP request.
435
+
436
+ Args:
437
+ client: The authenticated client
438
+ param_values: The parameter values for the request
439
+
440
+ Returns:
441
+ bool: True if the request is complete, False if still in progress
442
+
443
+ Raises:
444
+ PrivacyRequestError: If status_path is required but not provided
445
+ """
446
+ # Check for status override vs standard HTTP request
447
+ if self.status_request.request_override:
448
+ # Handle status override function directly
449
+ override_function = SaaSRequestOverrideFactory.get_override(
450
+ self.status_request.request_override,
451
+ SaaSRequestType.POLLING_STATUS,
452
+ )
453
+
454
+ # Override functions return boolean status directly
455
+ return cast(
456
+ bool,
457
+ override_function(
458
+ client=client,
459
+ param_values=param_values,
460
+ request_config=self.status_request,
461
+ secrets=client.configuration.secrets,
462
+ ),
463
+ )
464
+
465
+ # Standard HTTP status request - create handler only when needed
466
+ polling_handler = PollingRequestHandler(
467
+ self.status_request, self.result_request
468
+ )
469
+ response = polling_handler.get_status_response(client, param_values)
470
+
471
+ # Process status response
472
+ status_path = self.status_request.status_path
473
+
474
+ if status_path is None:
475
+ raise PrivacyRequestError(
476
+ "status_path is required when request_override is not provided"
477
+ )
478
+
479
+ return PollingResponseProcessor.evaluate_status_response(
480
+ response,
481
+ status_path,
482
+ self.status_request.status_completed_value,
483
+ )
484
+
485
+ def _process_completed_sub_request(
486
+ self,
487
+ client: AuthenticatedClient,
488
+ param_values: Dict[str, Any],
489
+ sub_request: RequestTaskSubRequest,
490
+ polling_task: RequestTask,
491
+ ) -> None:
492
+ """
493
+ Process a completed sub-request by getting results and handling them appropriately.
494
+
495
+ Args:
496
+ client: The authenticated client
497
+ param_values: The parameter values for the request
498
+ sub_request: The completed sub-request
499
+ polling_task: The parent polling task
500
+
501
+ Raises:
502
+ PrivacyRequestError: If polling result is not the expected type
503
+ """
504
+ # Handle erasure operations differently - they don't need result_request
505
+ if polling_task.action_type == ActionType.erasure:
506
+ # For erasure operations, just mark as complete and increment counter
507
+ sub_request.rows_masked = 1
508
+ sub_request.update_status(self.session, ExecutionLogStatus.complete.value)
509
+ logger.info(
510
+ f"Sub-request {sub_request.id} for {polling_task.action_type} task {polling_task.id} completed"
511
+ )
512
+ return
513
+
514
+ # For access operations, we need result_request to get the data
515
+ if not self.result_request:
516
+ raise PrivacyRequestError(
517
+ f"result_request is required for processing completed sub-request {sub_request.id} but was not provided"
518
+ )
519
+
520
+ if self.result_request.request_override:
521
+ # Handle override function directly
522
+ override_function = SaaSRequestOverrideFactory.get_override(
523
+ self.result_request.request_override,
524
+ SaaSRequestType.POLLING_RESULT,
525
+ )
526
+
527
+ polling_result = override_function(
528
+ client=client,
529
+ param_values=param_values,
530
+ request_config=self.result_request,
531
+ secrets=client.configuration.secrets,
532
+ )
533
+ else:
534
+ # Standard HTTP request processing
535
+ polling_handler = PollingRequestHandler(
536
+ self.status_request, self.result_request
537
+ )
538
+ response = polling_handler.get_result_response(client, param_values)
539
+
540
+ # We need to reconstruct the request path for processing
541
+ prepared_result_request = map_param_values(
542
+ action="result",
543
+ context="polling request",
544
+ current_request=self.result_request,
545
+ param_values=param_values,
546
+ )
547
+
548
+ polling_result = PollingResponseProcessor.process_result_response(
549
+ prepared_result_request.path,
550
+ response,
551
+ self.result_request.result_path,
552
+ )
553
+
554
+ # Checks if we have a polling result, response could be empty in case there was no data to access
555
+ if polling_result:
556
+ # Ensure we have the expected polling result type
557
+ if not isinstance(polling_result, PollingResult):
558
+ raise PrivacyRequestError(
559
+ "Polling result must be PollingResult instance"
560
+ )
561
+
562
+ # Store results on the sub-request
563
+ self._store_sub_request_result(polling_result, sub_request, polling_task)
564
+ else:
565
+ logger.info(
566
+ f"No result response for sub-request {sub_request.id} for task {polling_task.id}"
567
+ )
568
+ # Mark as complete using existing method
569
+ sub_request.update_status(self.session, ExecutionLogStatus.complete.value)
570
+
571
+ logger.info(
572
+ f"Sub-request {sub_request.id} for task {polling_task.id} completed successfully"
573
+ )
574
+
575
+ def _process_sub_requests_for_request(
576
+ self,
577
+ client: AuthenticatedClient,
578
+ request: ReadSaaSRequest,
579
+ polling_task: RequestTask,
580
+ ) -> None:
581
+ """
582
+ Process all sub-requests for a given request.
583
+
584
+ Args:
585
+ client: The authenticated client
586
+ request: The SaaS request being processed
587
+ polling_task: The parent polling task
588
+ """
589
+ sub_requests: List[RequestTaskSubRequest] = polling_task.sub_requests
590
+
591
+ for sub_request in sub_requests:
592
+ # Skip already completed sub-requests
593
+ if sub_request.status == ExecutionLogStatus.complete.value:
594
+ continue
595
+
596
+ param_values = sub_request.param_values
597
+
598
+ try:
599
+ # Check status of the sub-request
600
+ status = self._check_sub_request_status(client, param_values)
601
+
602
+ if status:
603
+ self._process_completed_sub_request(
604
+ client, param_values, sub_request, polling_task
605
+ )
606
+ else:
607
+ logger.debug(
608
+ f"Sub-request {sub_request.id} for task {polling_task.id} still not ready"
609
+ )
610
+
611
+ except Exception as exc:
612
+ logger.error(
613
+ f"Error processing sub-request {sub_request.id} for task {polling_task.id}: {exc}"
614
+ )
615
+ sub_request.update_status(self.session, ExecutionLogStatus.error.value)
616
+ raise exc
617
+
618
+ def _execute_polling_requests(
619
+ self,
620
+ client: AuthenticatedClient,
621
+ polling_task: RequestTask,
622
+ query_config: "SaaSQueryConfig",
623
+ ) -> bool:
624
+ """
625
+ Internal polling execution orchestrator with proper error handling and timeout management.
626
+
627
+ Stores results on individual sub-requests and only aggregates when ALL are successful.
628
+ Implements timeout checking and raises exceptions for errors and timeouts.
629
+
630
+ Returns:
631
+ bool: True if all polling is complete (success or failure), False if still in progress
632
+ """
633
+ # Check for timeout before processing requests
634
+ timeout_days = CONFIG.execution.async_polling_request_timeout_days
635
+ PollingSubRequestHandler.check_timeout(polling_task, timeout_days)
636
+
637
+ # Get appropriate requests based on action type
638
+ requests = self._get_requests_for_action(polling_task, query_config)
639
+
640
+ # Process each request and its sub-requests
641
+ for request in requests:
642
+ if request.async_config:
643
+ self._process_sub_requests_for_request(client, request, polling_task)
644
+
645
+ # Check final status and return completion status
646
+ return PollingSubRequestHandler.check_completion(polling_task)
647
+
648
+ def _store_sub_request_result(
649
+ self,
650
+ polling_result: PollingResult,
651
+ sub_request: RequestTaskSubRequest,
652
+ polling_task: RequestTask,
653
+ ) -> None:
654
+ """Store result data on the individual sub-request."""
655
+ if polling_result.result_type == PollingResultType.rows:
656
+ # Store rows directly on the sub-request (data is always a list for rows)
657
+ sub_request.access_data = polling_result.data
658
+ sub_request.save(self.session)
659
+
660
+ elif polling_result.result_type == PollingResultType.attachment:
661
+ try:
662
+ attachment_bytes = PollingAttachmentHandler.ensure_attachment_bytes(
663
+ polling_result.data
664
+ )
665
+ attachment_id = PollingAttachmentHandler.store_attachment(
666
+ self.session,
667
+ polling_task,
668
+ attachment_data=attachment_bytes,
669
+ filename=polling_result.metadata.get(
670
+ "filename", f"attachment_{str(uuid4())[:8]}"
671
+ ),
672
+ )
673
+
674
+ # Store attachment metadata on sub-request
675
+ attachment_metadata: List[Row] = [{"retrieved_attachments": []}]
676
+ PollingAttachmentHandler.add_metadata_to_rows(
677
+ self.session, attachment_id, attachment_metadata
678
+ )
679
+ sub_request.access_data = attachment_metadata
680
+ sub_request.save(self.session)
681
+ except Exception as exc:
682
+ raise PrivacyRequestError(f"Attachment storage failed: {exc}")
683
+ else:
684
+ raise PrivacyRequestError(
685
+ f"Unsupported result type: {polling_result.result_type}"
686
+ )