ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.71.2b0__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 (324) hide show
  1. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/RECORD +262 -248
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +35 -0
  5. fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
  6. fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
  7. fides/api/common_exceptions.py +4 -0
  8. fides/api/main.py +2 -2
  9. fides/api/models/attachment.py +1 -0
  10. fides/api/models/digest/__init__.py +2 -0
  11. fides/api/models/digest/digest_config.py +10 -1
  12. fides/api/models/digest/digest_execution.py +132 -0
  13. fides/api/models/event_audit.py +8 -0
  14. fides/api/models/privacy_request/privacy_request.py +1 -1
  15. fides/api/models/privacy_request/request_task.py +98 -1
  16. fides/api/models/worker_task.py +8 -0
  17. fides/api/schemas/saas/async_polling_configuration.py +81 -0
  18. fides/api/schemas/saas/saas_config.py +10 -3
  19. fides/api/schemas/saas/strategy_configuration.py +0 -12
  20. fides/api/service/async_dsr/handlers/__init__.py +0 -0
  21. fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
  22. fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
  23. fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
  24. fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
  25. fides/api/service/async_dsr/strategies/__init__.py +0 -0
  26. fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
  27. fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
  28. fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
  29. fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +678 -0
  30. fides/api/service/async_dsr/utils.py +130 -0
  31. fides/api/service/connectors/fides/fides_client.py +63 -1
  32. fides/api/service/connectors/query_configs/saas_query_config.py +20 -5
  33. fides/api/service/connectors/saas_connector.py +86 -70
  34. fides/api/service/privacy_request/attachment_handling.py +9 -2
  35. fides/api/service/privacy_request/request_runner_service.py +9 -83
  36. fides/api/service/privacy_request/request_service.py +47 -74
  37. fides/api/service/saas_request/saas_request_override_factory.py +66 -1
  38. fides/api/task/execute_request_tasks.py +5 -2
  39. fides/api/task/filter_results.py +35 -2
  40. fides/api/task/graph_task.py +34 -2
  41. fides/api/util/saas_util.py +1 -0
  42. fides/config/execution_settings.py +7 -3
  43. fides/data/language/languages.yml +2 -0
  44. fides/ui-build/static/admin/404.html +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/1099-27b2d4e59a569b38.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-8fb5000847f73ec7.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/1437-fb699e9d69c3e325.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/155-3d03f101c662c054.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/{1817-1ad037b7d6d2f6d2.js → 1817-10b392e1dd9c4673.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.50599b6774562644.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-01d5edb1802d3482.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/2397-40506a386a3a469a.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/{2921-66f65496c3a09316.js → 2921-edfdffa353a611e4.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/3377-4c129258b4c4ea28.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-259be222ea12392a.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/3700-42976bfaad3b91c9.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/3772-aa7beafe5df5e656.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-fa1d71afc7dc9e6e.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/{401-ffe4e8436e1eceb9.js → 401-5270e3e23b08ab2b.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/4817-5f9b9c9bafe888f1.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/{5185-51eaa78e3ed6bfb7.js → 5185-325e5435a0c7dcb7.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/5258-2d28b2c64acf5de3.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/{5279-12c9cbdc67ad7b14.js → 5279-21929b12c927b022.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/549-c3b4c51f45a84a52.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/{5643-10a36584c399526c.js → 5643-7583c1f8dbd83273.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-55c0387508e50f3e.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/{6277-182efc294d413f64.js → 6277-ca31d48a33202761.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/6315-2d4e86a32fc40458.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/6344-ca66a6e10d128179.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/{6853-7004a8c420b1ca02.js → 6853-cb15625a713b3ef9.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/{6954-4b24e1731c1cc3b3.js → 6954-08b59d28d7a2a43b.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/7245-895bb7c6a6c797bc.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-f25fce73eeb1f9c6.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/7488-df17b592fbeaa1eb.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/{7630-d0d3a0fe3f95e971.js → 7630-71582de0e818e28f.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/7773-98d34d188ae0a694.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-7944f684f8945506.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/8011-56031d82d5428981.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/8373-7f940f5ac9c38b1f.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/9046-31b16a7e872c22be.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/9070-13f237db78da586d.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/9330-cea1bf40f5d27e53.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.1ea49d4b6e0541f2.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/9682-2754256aeae141bb.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-e71887e2c4283249.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/9899-15530c468d5656a1.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/9965-54037b6c8f36d14b.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-2014144a1a0fa64f.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-9e869a44215709ed.js} +9 -9
  91. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4f3ba02774f27795.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2ca59996860a33c5.js → multiple-1c9cef80deccb15d.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-4adeec3bcec05f7b.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-f7bdc2da53137ffd.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-a27b220fe76bdc8e.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-542fd4a4322122f1.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-92182be6603c2842.js → privacy-experience-4254abef7bb52edd.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-d31d1c233e94dc1f.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-2ea057e6217993f9.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-ab54b19609bff325.js → privacy-notices-8e76cbfaf71fdcb9.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-eb557180eded0abd.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-93730a4316c0d980.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-c64589e53338e59a.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-d3d1841bc8105e56.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-8cd4d1d6ba000333.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-69b429a9d30ebaf1.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-791c522ad1d9a2ce.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-8c7103ebf01d6e6a.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-a53ef0161235ee47.js +1 -0
  110. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-f85f4f8fcf1bfbdb.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-3619e454763dba09.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-ace848575e688200.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-53ca31c50c43007f.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-f87e4a0f664f4cde.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-699762cb8a66237e.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-d970d0b82db36c88.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-a6343038a447699c.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-ce82ba79f9bf825c.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-ae7a4c1c4eabc0d4.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-179e5d09ccff50c1.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-59466e5e238c59d0.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-36d90c8c39fb0d1c.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-db54d01fd8f6df50.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-55d312af5228e098.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-488beba62e832660.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-4aad5495f9bf81ce.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-496ec7ecca8259dc.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-8a2ba955d92d52ee.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4580f70eb41b6a7d.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-f69b04d3b4cf43b1.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-e8d2140787045acd.js → [id]-d6eed2dc5d27f625.js} +1 -1
  132. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-e3f93462a08251bf.js → add-template-c7b43fa365f4be10.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-b5f7d6afdecd013d.js → messaging-c7ba755c2e0e2377.js} +1 -1
  134. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-248ad9f65a872442.js → ant-components-f14bfd5890a0e939.js} +1 -1
  135. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-aedb66a62042b10a.js → AntForm-e4274a4d5d23eea9.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-018df38b7cd77fdb.js → FormikAntFormItem-f5bce1ceb0502f04.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-6ca9099d03aab817.js → FormikControlled-90b4ea9f9deca6e2.js} +1 -1
  138. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-0f2c90786ea005a4.js → FormikField-d6043ae8dae6ef7d.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-200b51a725f8b2d1.js → forms-520ba5ae02f47bda.js} +1 -1
  140. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-b46f432b51421fae.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-fe4ed3ad75151e36.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-de681c2d022c9e0d.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-04ebf2fb6fc4358a.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-cd8ba2eef9085377.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-f75a407d78857ab3.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-975ff605e1dbc09c.js} +1 -1
  147. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-e7fdf3a9a3e8c267.js} +1 -1
  148. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-764b6ce8e030d4a1.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-f3e6e74e0efb005c.js → [purpose_id]-da78452b3c41b29e.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-4d658222ec800511.js → consent-6442e761ecb5c65a.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-ea9baf24de35d3b1.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-44d06e280990854d.js} +1 -1
  153. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-a3275554ffe8e640.js → domains-6f61d886aa6f5ce7.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-11148b182370fd83.js} +1 -1
  155. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-33448bf0a1d53870.js} +1 -1
  156. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-77239269acc2d31a.js → [key]-4a18d8135c0dbf2a.js} +1 -1
  157. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-8bf1821722b082e9.js → new-41957281b8ec26b1.js} +1 -1
  158. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-776258bad0941a7d.js +1 -0
  159. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-3c315036f1fc9f90.js} +1 -1
  160. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-00917525c9245a90.js +1 -0
  161. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-5d924b2f1f926b88.js} +1 -1
  162. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-2deb6becece69d46.js → test-datasets-8067e12227210f48.js} +1 -1
  163. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-1a902922759cae76.js} +1 -1
  164. fides/ui-build/static/admin/_next/static/chunks/pages/systems-277ea1f34c3714cf.js +1 -0
  165. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-cecea5832cb1f3b0.js +1 -0
  166. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-726fbc0a34ffba1f.js} +1 -1
  167. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-df9b75ab01c1a2ea.js} +1 -1
  168. fides/ui-build/static/admin/_next/static/chunks/{webpack-2766492c5dbceb0a.js → webpack-118fb4723d13c14f.js} +1 -1
  169. fides/ui-build/static/admin/_next/static/css/372d6a236c84613f.css +1 -0
  170. fides/ui-build/static/admin/_next/static/css/f38242c11f7fea64.css +1 -0
  171. fides/ui-build/static/admin/_next/static/zmEQMSpOBih8kmA1t-EWO/_buildManifest.js +1 -0
  172. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  173. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  174. fides/ui-build/static/admin/add-systems.html +1 -1
  175. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  176. fides/ui-build/static/admin/consent/configure.html +1 -1
  177. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  178. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  179. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  180. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  181. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  182. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  183. fides/ui-build/static/admin/consent/properties.html +1 -1
  184. fides/ui-build/static/admin/consent/reporting.html +1 -1
  185. fides/ui-build/static/admin/consent.html +1 -1
  186. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  187. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  188. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  189. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  190. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  191. fides/ui-build/static/admin/data-catalog.html +1 -1
  192. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  193. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/data-explorer.html +1 -0
  194. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  195. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  196. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  197. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  198. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  199. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  200. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  201. fides/ui-build/static/admin/datamap.html +1 -1
  202. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  203. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  204. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  205. fides/ui-build/static/admin/dataset/new.html +1 -1
  206. fides/ui-build/static/admin/dataset.html +1 -1
  207. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  208. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  209. fides/ui-build/static/admin/datastore-connection.html +1 -1
  210. fides/ui-build/static/admin/index.html +1 -1
  211. fides/ui-build/static/admin/integrations/[id].html +1 -1
  212. fides/ui-build/static/admin/integrations.html +1 -1
  213. fides/ui-build/static/admin/login/[provider].html +1 -1
  214. fides/ui-build/static/admin/login.html +1 -1
  215. fides/ui-build/static/admin/messaging/[id].html +1 -1
  216. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  217. fides/ui-build/static/admin/messaging.html +1 -1
  218. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  219. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  220. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  221. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  222. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  223. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  224. fides/ui-build/static/admin/poc/forms.html +1 -1
  225. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  226. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  227. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  228. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  229. fides/ui-build/static/admin/privacy-requests.html +1 -1
  230. fides/ui-build/static/admin/properties/[id].html +1 -1
  231. fides/ui-build/static/admin/properties/add-property.html +1 -1
  232. fides/ui-build/static/admin/properties.html +1 -1
  233. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  234. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  235. fides/ui-build/static/admin/settings/about.html +1 -1
  236. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  237. fides/ui-build/static/admin/settings/consent.html +1 -1
  238. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  239. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  240. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  241. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  242. fides/ui-build/static/admin/settings/domains.html +1 -1
  243. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  244. fides/ui-build/static/admin/settings/locations.html +1 -1
  245. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
  246. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
  247. fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
  248. fides/ui-build/static/admin/settings/organization.html +1 -1
  249. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  250. fides/ui-build/static/admin/settings/regulations.html +1 -1
  251. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  252. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  253. fides/ui-build/static/admin/systems.html +1 -1
  254. fides/ui-build/static/admin/taxonomy.html +1 -1
  255. fides/ui-build/static/admin/user-management/new.html +1 -1
  256. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  257. fides/ui-build/static/admin/user-management.html +1 -1
  258. fides/api/service/async_dsr/async_dsr_service.py +0 -195
  259. fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
  260. fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
  261. fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
  262. fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
  263. fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
  303. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
  304. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
  305. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
  306. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
  307. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
  308. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
  309. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
  310. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
  311. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
  312. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
  313. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
  314. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
  315. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
  316. fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
  317. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
  318. fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
  319. fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
  320. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/WHEEL +0 -0
  321. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/entry_points.txt +0 -0
  322. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/licenses/LICENSE +0 -0
  323. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/top_level.txt +0 -0
  324. /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → zmEQMSpOBih8kmA1t-EWO}/_ssgManifest.js +0 -0
@@ -0,0 +1,123 @@
1
+ """Manager for polling sub-request operations and lifecycle management."""
2
+
3
+ from datetime import datetime, timedelta, timezone
4
+ from typing import Any, Dict
5
+
6
+ from loguru import logger
7
+ from sqlalchemy.orm import Session
8
+
9
+ from fides.api.common_exceptions import PrivacyRequestError
10
+ from fides.api.models.privacy_request.request_task import (
11
+ RequestTask,
12
+ RequestTaskSubRequest,
13
+ )
14
+ from fides.api.models.worker_task import ExecutionLogStatus
15
+
16
+
17
+ class PollingSubRequestHandler:
18
+ """Utility class for managing polling sub-request lifecycle and status checking."""
19
+
20
+ @staticmethod
21
+ def create_sub_request(
22
+ session: Session,
23
+ request_task: RequestTask,
24
+ param_values_map: Dict[str, Any],
25
+ ) -> RequestTaskSubRequest:
26
+ """
27
+ Create a new sub-request for tracking async polling operations.
28
+
29
+ Args:
30
+ session: Database session
31
+ request_task: The parent request task
32
+ param_values_map: Parameter values including correlation_id for polling
33
+
34
+ Returns:
35
+ RequestTaskSubRequest: The created sub-request
36
+ """
37
+ sub_request = RequestTaskSubRequest.create(
38
+ session,
39
+ data={
40
+ "request_task_id": request_task.id,
41
+ "param_values": param_values_map,
42
+ "status": ExecutionLogStatus.pending.value,
43
+ },
44
+ )
45
+ logger.info(
46
+ f"Created sub-request {sub_request.id} for task '{request_task.id}'"
47
+ )
48
+ return sub_request
49
+
50
+ @staticmethod
51
+ def check_completion(polling_task: RequestTask) -> bool:
52
+ """
53
+ Check if all sub-requests for a polling task are complete.
54
+
55
+ Args:
56
+ polling_task: The polling task to check
57
+
58
+ Returns:
59
+ bool: True if all sub-requests are complete, False if still in progress
60
+ """
61
+ # Get all sub-requests and categorize by status
62
+ all_sub_requests = polling_task.sub_requests
63
+ completed_sub_requests = [
64
+ sub_request
65
+ for sub_request in all_sub_requests
66
+ if sub_request.status == ExecutionLogStatus.complete.value
67
+ ]
68
+ failed_sub_requests = [
69
+ sub_request
70
+ for sub_request in all_sub_requests
71
+ if sub_request.status == ExecutionLogStatus.error.value
72
+ ]
73
+
74
+ if (
75
+ len(completed_sub_requests) == len(all_sub_requests)
76
+ and len(all_sub_requests) > 0
77
+ ):
78
+ # All sub-requests completed successfully - aggregate results
79
+ logger.info(
80
+ f"All sub-requests completed successfully for task {polling_task.id}"
81
+ )
82
+ return True
83
+
84
+ # Still polling - some sub-requests are pending
85
+ logger.info(
86
+ f"Polling task {polling_task.id}: {len(completed_sub_requests)}/{len(all_sub_requests)} sub-requests complete, {len(failed_sub_requests)} failed"
87
+ )
88
+ return False
89
+
90
+ @staticmethod
91
+ def check_timeout(polling_task: RequestTask, timeout_days: int) -> None:
92
+ """
93
+ Check if any sub-requests have exceeded the polling timeout.
94
+
95
+ Args:
96
+ polling_task: The polling task to check
97
+ timeout_days: Timeout threshold in days
98
+
99
+ Raises:
100
+ PrivacyRequestError: If any sub-request has timed out
101
+ """
102
+ timeout_seconds = timeout_days * 24 * 60 * 60 # Convert days to seconds
103
+
104
+ # Check timeout for incomplete sub-requests only
105
+ timed_out_sub_requests = []
106
+
107
+ for sub_request in polling_task.sub_requests:
108
+ if sub_request.status != ExecutionLogStatus.complete.value:
109
+ # Check if this sub-request has timed out
110
+ if sub_request.created_at:
111
+ timeout_threshold = sub_request.created_at + timedelta(
112
+ seconds=timeout_seconds
113
+ )
114
+ current_time = datetime.now(timezone.utc)
115
+ if current_time > timeout_threshold:
116
+ timed_out_sub_requests.append(sub_request)
117
+
118
+ if timed_out_sub_requests:
119
+ sub_request_ids = [sr.id for sr in timed_out_sub_requests]
120
+ raise PrivacyRequestError(
121
+ f"Polling timeout exceeded for sub-requests {sub_request_ids} "
122
+ f"in task {polling_task.id}. Timeout interval: {timeout_days} days"
123
+ )
File without changes
@@ -0,0 +1,52 @@
1
+ from abc import abstractmethod
2
+ from typing import Any, Dict, List
3
+
4
+ from sqlalchemy.orm import Session
5
+
6
+ from fides.api.models.privacy_request.request_task import AsyncTaskType, RequestTask
7
+ from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
8
+ from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
9
+ from fides.api.service.strategy import Strategy
10
+ from fides.api.util.collection_util import Row
11
+
12
+
13
+ class AsyncDSRStrategy(Strategy):
14
+ """Abstract base class for async DSR strategies"""
15
+
16
+ type: AsyncTaskType
17
+ session: Session
18
+
19
+ @abstractmethod
20
+ def async_retrieve_data(
21
+ self,
22
+ client: AuthenticatedClient,
23
+ request_task_id: str,
24
+ query_config: SaaSQueryConfig,
25
+ input_data: Dict[str, List[Any]],
26
+ ) -> List[Row]:
27
+ """
28
+ Execute async retrieve data.
29
+ """
30
+
31
+ @abstractmethod
32
+ def async_mask_data(
33
+ self,
34
+ client: AuthenticatedClient,
35
+ request_task_id: str,
36
+ query_config: SaaSQueryConfig,
37
+ rows: List[Row],
38
+ ) -> int:
39
+ """
40
+ Execute async mask data.
41
+ """
42
+
43
+ def _get_request_task(self, request_task_id: str) -> RequestTask:
44
+ """Get request task by ID or raise ValueError if not found."""
45
+ request_task = (
46
+ self.session.query(RequestTask)
47
+ .filter(RequestTask.id == request_task_id)
48
+ .first()
49
+ )
50
+ if not request_task:
51
+ raise ValueError(f"RequestTask with ID {request_task_id} not found")
52
+ return request_task
@@ -0,0 +1,199 @@
1
+ from typing import Any, Dict, List
2
+
3
+ from loguru import logger
4
+ from sqlalchemy.orm import Session
5
+
6
+ from fides.api.common_exceptions import AwaitingAsyncTask
7
+ from fides.api.models.privacy_request.request_task import AsyncTaskType, RequestTask
8
+ from fides.api.service.async_dsr.strategies.async_dsr_strategy import AsyncDSRStrategy
9
+ from fides.api.service.async_dsr.utils import AsyncPhase, get_async_phase
10
+ from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
11
+ from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
12
+ from fides.api.util.collection_util import Row
13
+
14
+
15
+ class AsyncCallbackStrategy(AsyncDSRStrategy):
16
+ """
17
+ Enhanced strategy for callback async DSR requests.
18
+ Works for both access and erasure operations with internal phase-based organization.
19
+ """
20
+
21
+ type = AsyncTaskType.callback
22
+
23
+ def __init__(self, session: Session):
24
+ self.session = session
25
+
26
+ def async_retrieve_data(
27
+ self,
28
+ client: AuthenticatedClient,
29
+ request_task_id: str,
30
+ query_config: SaaSQueryConfig,
31
+ input_data: Dict[str, List[Any]],
32
+ ) -> List[Row]:
33
+ """Execute async retrieve data with internal phase routing."""
34
+ request_task = self._get_request_task(request_task_id)
35
+ async_phase = get_async_phase(request_task, query_config)
36
+
37
+ if async_phase == AsyncPhase.initial_async:
38
+ return self._initial_request_access(
39
+ client, request_task, query_config, input_data
40
+ )
41
+ if async_phase == AsyncPhase.callback_completion:
42
+ return self._callback_completion_access(request_task)
43
+
44
+ logger.warning(
45
+ f"Unexpected async phase '{async_phase}' for callback access task {request_task.id}"
46
+ )
47
+ return []
48
+
49
+ def async_mask_data(
50
+ self,
51
+ client: AuthenticatedClient,
52
+ request_task_id: str,
53
+ query_config: SaaSQueryConfig,
54
+ rows: List[Row],
55
+ ) -> int:
56
+ """Execute async mask data with internal phase routing."""
57
+ request_task = self._get_request_task(request_task_id)
58
+ async_phase = get_async_phase(request_task, query_config)
59
+
60
+ if async_phase == AsyncPhase.initial_async:
61
+ return self._initial_request_erasure(
62
+ client, request_task, query_config, rows
63
+ )
64
+ if async_phase == AsyncPhase.callback_completion:
65
+ return self._callback_completion_erasure(request_task)
66
+
67
+ logger.warning(
68
+ f"Unexpected async phase '{async_phase}' for callback erasure task {request_task.id}"
69
+ )
70
+ return 0
71
+
72
+ # Private helper methods
73
+
74
+ def _initial_request_access(
75
+ self,
76
+ client: AuthenticatedClient,
77
+ request_task: RequestTask,
78
+ query_config: SaaSQueryConfig,
79
+ input_data: Dict[str, List[Any]],
80
+ ) -> List[Row]:
81
+ """Handle initial setup for access callback requests."""
82
+ logger.info(f"Initial callback request for access task {request_task.id}")
83
+
84
+ read_requests = query_config.get_read_requests_by_identity()
85
+
86
+ # Filter to get only the requests that need async processing
87
+ async_requests_to_process = [
88
+ req for req in read_requests if req.async_config and request_task.id
89
+ ]
90
+
91
+ # If there are no async requests, we shouldn't be in this handler.
92
+ if not async_requests_to_process:
93
+ logger.warning(
94
+ f"Async callback handler was called, but no async-configured read requests were found for task {request_task.id}."
95
+ )
96
+ return []
97
+
98
+ # Set async_type once for the request task
99
+ request_task.async_type = AsyncTaskType.callback
100
+ self.session.commit()
101
+
102
+ # For callback strategy, we execute the initial request to trigger the callback
103
+ # then wait for the external system to call us back via webhook.
104
+ # The callback endpoint logic will then queue the request task for it
105
+ # to be executed again with
106
+ # AsyncCallbackStrategy.async_retrieve_data -> _callback_completion_access
107
+
108
+ # Execute the initial callback request to trigger the async process
109
+ privacy_request = request_task.privacy_request
110
+ policy = privacy_request.policy
111
+
112
+ for read_request in async_requests_to_process:
113
+ if read_request.path: # Only execute if there's an actual request to make
114
+ try:
115
+ # Set the current request context
116
+ query_config.current_request = read_request
117
+ prepared_request = query_config.generate_query(input_data, policy)
118
+ # Execute the initial request to trigger the callback
119
+ client.send(prepared_request, read_request.ignore_errors)
120
+ logger.info(
121
+ f"Executed initial callback request for access task {request_task.id}"
122
+ )
123
+ except ValueError as exc:
124
+ if read_request.skip_missing_param_values:
125
+ logger.debug(
126
+ "Skipping optional access callback request: {}",
127
+ exc,
128
+ )
129
+ continue
130
+ raise exc
131
+
132
+ # Asynchronous callback access request detected in saas config.
133
+ # We raise AwaitingAsyncTask to put this task in an awaiting_processing state.
134
+ raise AwaitingAsyncTask(
135
+ f"Awaiting callback from {request_task.dataset_name} for access results"
136
+ )
137
+
138
+ def _initial_request_erasure(
139
+ self,
140
+ client: AuthenticatedClient,
141
+ request_task: RequestTask,
142
+ query_config: SaaSQueryConfig,
143
+ rows: List[Row],
144
+ ) -> int:
145
+ """Handle initial setup for erasure callback requests."""
146
+ logger.info(f"Initial callback request for erasure task {request_task.id}")
147
+
148
+ privacy_request = request_task.privacy_request
149
+ policy = privacy_request.policy
150
+
151
+ # For erasure, we only execute masking requests (delete/update requests)
152
+ masking_request = query_config.get_masking_request()
153
+
154
+ if not masking_request:
155
+ logger.warning(
156
+ f"No masking request found for erasure task {request_task.id}"
157
+ )
158
+ return 0
159
+
160
+ rows_updated = 0
161
+
162
+ # Check if the masking request has async_config and set async_type once
163
+ if masking_request.async_config and request_task.id:
164
+ request_task.async_type = AsyncTaskType.callback
165
+ self.session.commit()
166
+
167
+ if masking_request.path:
168
+ for row in rows:
169
+ try:
170
+ prepared_request = query_config.generate_update_stmt(
171
+ row, policy, privacy_request
172
+ )
173
+ client.send(prepared_request, masking_request.ignore_errors)
174
+ rows_updated += 1
175
+ except ValueError as exc:
176
+ if masking_request.skip_missing_param_values:
177
+ logger.debug(
178
+ "Skipping optional masking request: {}",
179
+ exc,
180
+ )
181
+ continue
182
+ raise exc
183
+
184
+ raise AwaitingAsyncTask("Awaiting erasure callback results")
185
+
186
+ logger.warning(
187
+ f"No async configuration found for erasure task {request_task.id}"
188
+ )
189
+ return rows_updated
190
+
191
+ def _callback_completion_access(self, request_task: RequestTask) -> List[Row]:
192
+ """Handle completion of access callback requests."""
193
+ logger.info(f"Access callback succeeded for request task '{request_task.id}'")
194
+ return request_task.get_access_data()
195
+
196
+ def _callback_completion_erasure(self, request_task: RequestTask) -> int:
197
+ """Handle completion of erasure callback requests."""
198
+ logger.info(f"Masking callback succeeded for request task '{request_task.id}'")
199
+ return request_task.rows_masked or 0
@@ -0,0 +1,72 @@
1
+ from enum import Enum
2
+ from typing import Any, Dict, List, Optional
3
+
4
+ from pydantic import ValidationError
5
+ from sqlalchemy.orm import Session
6
+
7
+ from fides.api.common_exceptions import NoSuchStrategyException
8
+ from fides.api.common_exceptions import ValidationError as FidesopsValidationError
9
+ from fides.api.schemas.saas.async_polling_configuration import AsyncPollingConfiguration
10
+ from fides.api.service.async_dsr.strategies.async_dsr_strategy import AsyncDSRStrategy
11
+ from fides.api.service.async_dsr.strategies.async_dsr_strategy_callback import (
12
+ AsyncCallbackStrategy,
13
+ )
14
+ from fides.api.service.async_dsr.strategies.async_dsr_strategy_polling import (
15
+ AsyncPollingStrategy,
16
+ )
17
+
18
+
19
+ class SupportedAsyncDSRStrategies(Enum):
20
+ """
21
+ The supported async DSR strategies for handling asynchronous data subject requests.
22
+ """
23
+
24
+ callback = AsyncCallbackStrategy
25
+ polling = AsyncPollingStrategy
26
+
27
+ @classmethod
28
+ def __contains__(cls, item: str) -> bool:
29
+ try:
30
+ cls[item]
31
+ except KeyError:
32
+ return False
33
+
34
+ return True
35
+
36
+
37
+ def get_strategy(
38
+ strategy_name: str,
39
+ session: Session,
40
+ configuration: Optional[Dict[str, Any]] = None,
41
+ ) -> AsyncDSRStrategy:
42
+ """
43
+ Returns the enhanced strategy given the name, session, and configuration.
44
+ Raises NoSuchStrategyException if the strategy does not exist
45
+ """
46
+ if not SupportedAsyncDSRStrategies.__contains__(strategy_name):
47
+ valid_strategies = ", ".join(get_strategy_names())
48
+ raise NoSuchStrategyException(
49
+ f"Strategy '{strategy_name}' does not exist. Valid strategies are [{valid_strategies}]"
50
+ )
51
+
52
+ strategy_class = SupportedAsyncDSRStrategies[strategy_name].value
53
+
54
+ if strategy_name == "polling":
55
+ # Polling strategy requires configuration
56
+ if not configuration:
57
+ raise FidesopsValidationError("Configuration required for polling strategy")
58
+ try:
59
+ strategy_config = AsyncPollingConfiguration(**configuration)
60
+ return strategy_class(session, strategy_config)
61
+ except ValidationError as e:
62
+ raise FidesopsValidationError(message=str(e))
63
+ elif strategy_name == "callback":
64
+ # Callback strategy only requires session
65
+ return strategy_class(session)
66
+
67
+ raise NoSuchStrategyException(f"Unsupported strategy: {strategy_name}")
68
+
69
+
70
+ def get_strategy_names() -> List[str]:
71
+ """Returns all supported async DSR strategies"""
72
+ return [s.name for s in SupportedAsyncDSRStrategies]