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
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-10-01T18:54:14+0200",
11
+ "date": "2025-10-03T09:34:20-0700",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "ed0d3226e0f8af1ecab0ac2d2dabff1ee209680d",
15
- "version": "2.71.1b1"
14
+ "full-revisionid": "521a48a9c7dbc813d08cf2053f318328912e86b6",
15
+ "version": "2.71.2b0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,35 @@
1
+ """add polling status
2
+
3
+ Revision ID: 4bfbeff34611
4
+ Revises: 7db29f9cd77b
5
+ Create Date: 2025-09-20 23:02:45.550170
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "4bfbeff34611"
14
+ down_revision = "7db29f9cd77b"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ # Check if value already exists
21
+ connection = op.get_bind()
22
+ result = connection.execute(
23
+ sa.text(
24
+ "SELECT 1 FROM pg_enum WHERE enumlabel = 'polling' "
25
+ "AND enumtypid = (SELECT oid FROM pg_type WHERE typname = 'executionlogstatus')"
26
+ )
27
+ )
28
+
29
+ if not result.fetchone():
30
+ op.execute("ALTER TYPE executionlogstatus ADD VALUE 'polling'")
31
+
32
+
33
+ def downgrade():
34
+ # The 'polling' value will remain in the enum but won't be used by older app versions
35
+ pass
@@ -0,0 +1,95 @@
1
+ """Create new Sub Request Table
2
+
3
+ Revision ID: 7db29f9cd77b
4
+ Revises: b97e92b038d2
5
+ Create Date: 2025-09-16 14:00:16.282996
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy_utils.types.encrypted.encrypted_type import (
12
+ AesGcmEngine,
13
+ StringEncryptedType,
14
+ )
15
+
16
+ from fides.api.db.base_class import JSONTypeOverride
17
+ from fides.config import CONFIG
18
+
19
+ # revision identifiers, used by Alembic.
20
+ revision = "7db29f9cd77b"
21
+ down_revision = "b97e92b038d2"
22
+ branch_labels = None
23
+ depends_on = None
24
+
25
+
26
+ def upgrade():
27
+ op.create_table(
28
+ "request_task_sub_request",
29
+ sa.Column("id", sa.String(length=255), nullable=False),
30
+ sa.Column(
31
+ "created_at",
32
+ sa.DateTime(timezone=True),
33
+ server_default=sa.text("now()"),
34
+ nullable=True,
35
+ ),
36
+ sa.Column(
37
+ "updated_at",
38
+ sa.DateTime(timezone=True),
39
+ server_default=sa.text("now()"),
40
+ nullable=True,
41
+ ),
42
+ sa.Column("request_task_id", sa.String(length=255), nullable=False),
43
+ sa.Column(
44
+ "param_values",
45
+ StringEncryptedType(
46
+ type_in=JSONTypeOverride,
47
+ key=CONFIG.security.app_encryption_key,
48
+ engine=AesGcmEngine,
49
+ padding="pkcs5",
50
+ ),
51
+ nullable=False,
52
+ ),
53
+ sa.Column("status", sa.String(), nullable=False),
54
+ sa.Column(
55
+ "access_data",
56
+ StringEncryptedType(
57
+ type_in=JSONTypeOverride,
58
+ key=CONFIG.security.app_encryption_key,
59
+ engine=AesGcmEngine,
60
+ padding="pkcs5",
61
+ ),
62
+ nullable=True,
63
+ ),
64
+ sa.Column("rows_masked", sa.Integer(), nullable=True),
65
+ sa.ForeignKeyConstraint(
66
+ ["request_task_id"],
67
+ ["requesttask.id"],
68
+ name="request_task_sub_request_request_task_id_fkey",
69
+ ondelete="CASCADE",
70
+ ),
71
+ sa.PrimaryKeyConstraint("id"),
72
+ )
73
+ op.create_index(
74
+ op.f("ix_request_task_sub_request_id"),
75
+ "request_task_sub_request",
76
+ ["id"],
77
+ unique=False,
78
+ )
79
+ op.create_index(
80
+ op.f("ix_request_task_sub_request_request_task_id"),
81
+ "request_task_sub_request",
82
+ ["request_task_id"],
83
+ unique=False,
84
+ )
85
+
86
+
87
+ def downgrade():
88
+ op.drop_index(
89
+ op.f("ix_request_task_sub_request_request_task_id"),
90
+ table_name="request_task_sub_request",
91
+ )
92
+ op.drop_index(
93
+ op.f("ix_request_task_sub_request_id"), table_name="request_task_sub_request"
94
+ )
95
+ op.drop_table("request_task_sub_request")
@@ -0,0 +1,117 @@
1
+ """add digest execution model
2
+
3
+ Revision ID: b97e92b038d2
4
+ Revises: 3efe14d4469a
5
+ Create Date: 2025-10-01 16:42:41.900651
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy.dialects import postgresql
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "b97e92b038d2"
15
+ down_revision = "3efe14d4469a"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ op.create_table(
23
+ "digest_task_execution",
24
+ sa.Column("id", sa.String(length=255), nullable=False),
25
+ sa.Column(
26
+ "created_at",
27
+ sa.DateTime(timezone=True),
28
+ server_default=sa.text("now()"),
29
+ nullable=True,
30
+ ),
31
+ sa.Column(
32
+ "updated_at",
33
+ sa.DateTime(timezone=True),
34
+ server_default=sa.text("now()"),
35
+ nullable=True,
36
+ ),
37
+ sa.Column("action_type", sa.String(), nullable=False),
38
+ sa.Column("digest_config_id", sa.String(), nullable=False),
39
+ sa.Column("celery_task_id", sa.String(), nullable=True),
40
+ sa.Column(
41
+ "status",
42
+ postgresql.ENUM(name="executionlogstatus", create_type=False),
43
+ nullable=False,
44
+ ),
45
+ sa.Column("total_recipients", sa.Integer(), nullable=True),
46
+ sa.Column("processed_recipients", sa.Integer(), nullable=False),
47
+ sa.Column("successful_communications", sa.Integer(), nullable=False),
48
+ sa.Column("failed_communications", sa.Integer(), nullable=False),
49
+ sa.Column(
50
+ "execution_state", postgresql.JSONB(astext_type=sa.Text()), nullable=True
51
+ ),
52
+ sa.Column(
53
+ "processed_user_ids", postgresql.JSONB(astext_type=sa.Text()), nullable=True
54
+ ),
55
+ sa.Column("started_at", sa.DateTime(timezone=True), nullable=True),
56
+ sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True),
57
+ sa.Column("last_checkpoint_at", sa.DateTime(timezone=True), nullable=True),
58
+ sa.Column("error_message", sa.Text(), nullable=True),
59
+ sa.ForeignKeyConstraint(
60
+ ["digest_config_id"], ["digest_config.id"], ondelete="CASCADE"
61
+ ),
62
+ sa.PrimaryKeyConstraint("id"),
63
+ )
64
+ op.create_index(
65
+ op.f("ix_digest_task_execution_action_type"),
66
+ "digest_task_execution",
67
+ ["action_type"],
68
+ unique=False,
69
+ )
70
+ op.create_index(
71
+ op.f("ix_digest_task_execution_celery_task_id"),
72
+ "digest_task_execution",
73
+ ["celery_task_id"],
74
+ unique=False,
75
+ )
76
+ op.create_index(
77
+ op.f("ix_digest_task_execution_digest_config_id"),
78
+ "digest_task_execution",
79
+ ["digest_config_id"],
80
+ unique=False,
81
+ )
82
+ op.create_index(
83
+ op.f("ix_digest_task_execution_id"),
84
+ "digest_task_execution",
85
+ ["id"],
86
+ unique=False,
87
+ )
88
+ op.create_index(
89
+ op.f("ix_digest_task_execution_status"),
90
+ "digest_task_execution",
91
+ ["status"],
92
+ unique=False,
93
+ )
94
+ # ### end Alembic commands ###
95
+
96
+
97
+ def downgrade():
98
+ # ### commands auto generated by Alembic - please adjust! ###
99
+ op.drop_index(
100
+ op.f("ix_digest_task_execution_status"), table_name="digest_task_execution"
101
+ )
102
+ op.drop_index(
103
+ op.f("ix_digest_task_execution_id"), table_name="digest_task_execution"
104
+ )
105
+ op.drop_index(
106
+ op.f("ix_digest_task_execution_digest_config_id"),
107
+ table_name="digest_task_execution",
108
+ )
109
+ op.drop_index(
110
+ op.f("ix_digest_task_execution_celery_task_id"),
111
+ table_name="digest_task_execution",
112
+ )
113
+ op.drop_index(
114
+ op.f("ix_digest_task_execution_action_type"), table_name="digest_task_execution"
115
+ )
116
+ op.drop_table("digest_task_execution")
117
+ # ### end Alembic commands ###
@@ -179,6 +179,10 @@ class AwaitingAsyncTask(BaseException):
179
179
  """Request Task is Awaiting Processing - Awaiting Async Task"""
180
180
 
181
181
 
182
+ class AwaitingAsyncProcessing(BaseException):
183
+ """Request Task is actively being processed by external system - Fides is polling"""
184
+
185
+
182
186
  class UpstreamTasksNotReady(BaseException):
183
187
  """Privacy Request Task awaiting upstream tasks"""
184
188
 
fides/api/main.py CHANGED
@@ -45,9 +45,9 @@ from fides.api.service.privacy_request.email_batch_service import (
45
45
  initiate_scheduled_batch_email_send,
46
46
  )
47
47
  from fides.api.service.privacy_request.request_service import (
48
- initiate_async_tasks_status_polling,
49
48
  initiate_interrupted_task_requeue_poll,
50
49
  initiate_poll_for_exited_privacy_request_tasks,
50
+ initiate_polling_task_requeue,
51
51
  initiate_scheduled_dsr_data_removal,
52
52
  )
53
53
 
@@ -103,7 +103,7 @@ async def lifespan(wrapped_app: FastAPI) -> AsyncGenerator[None, None]:
103
103
  initiate_poll_for_exited_privacy_request_tasks()
104
104
  initiate_scheduled_dsr_data_removal()
105
105
  initiate_interrupted_task_requeue_poll()
106
- initiate_async_tasks_status_polling()
106
+ initiate_polling_task_requeue()
107
107
  initiate_bcrypt_migration_task()
108
108
  initiate_post_upgrade_index_creation()
109
109
 
@@ -52,6 +52,7 @@ class AttachmentReferenceType(str, EnumType):
52
52
  privacy_request = "privacy_request"
53
53
  comment = "comment"
54
54
  manual_task_submission = "manual_task_submission"
55
+ request_task = "request_task"
55
56
 
56
57
 
57
58
  class AttachmentReference(Base):
@@ -5,10 +5,12 @@ from fides.api.models.digest.conditional_dependencies import (
5
5
  DigestConditionType,
6
6
  )
7
7
  from fides.api.models.digest.digest_config import DigestConfig, DigestType
8
+ from fides.api.models.digest.digest_execution import DigestTaskExecution
8
9
 
9
10
  __all__ = [
10
11
  "DigestConfig",
11
12
  "DigestType",
12
13
  "DigestCondition",
13
14
  "DigestConditionType",
15
+ "DigestTaskExecution",
14
16
  ]
@@ -1,5 +1,5 @@
1
1
  from enum import Enum
2
- from typing import Optional, Union
2
+ from typing import TYPE_CHECKING, Optional, Union
3
3
 
4
4
  from sqlalchemy import Boolean, Column, DateTime, String, Text
5
5
  from sqlalchemy.dialects.postgresql import JSONB
@@ -19,6 +19,9 @@ from fides.api.task.conditional_dependencies.schemas import (
19
19
  ConditionLeaf,
20
20
  )
21
21
 
22
+ if TYPE_CHECKING:
23
+ from fides.api.models.digest.digest_execution import DigestTaskExecution
24
+
22
25
 
23
26
  class DigestType(str, Enum):
24
27
  """Types of digests that can be configured."""
@@ -60,6 +63,12 @@ class DigestConfig(Base):
60
63
  back_populates="digest_config",
61
64
  cascade="all, delete-orphan",
62
65
  )
66
+ executions = relationship(
67
+ "DigestTaskExecution",
68
+ back_populates="digest_config",
69
+ cascade="all, delete-orphan",
70
+ order_by="DigestTaskExecution.created_at.desc()",
71
+ )
63
72
 
64
73
  def get_receiver_condition(
65
74
  self, db: Session
@@ -0,0 +1,132 @@
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional
2
+
3
+ from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Text
4
+ from sqlalchemy.dialects.postgresql import JSONB
5
+ from sqlalchemy.ext.declarative import declared_attr
6
+ from sqlalchemy.orm import Session, relationship
7
+ from sqlalchemy.sql import func
8
+
9
+ from fides.api.db.base_class import Base
10
+ from fides.api.models.worker_task import ExecutionLogStatus, WorkerTask
11
+
12
+ if TYPE_CHECKING:
13
+ from fides.api.models.digest.digest_config import DigestConfig
14
+
15
+
16
+ class DigestTaskExecution(
17
+ WorkerTask, Base
18
+ ): # pylint: disable=too-many-instance-attributes
19
+ """
20
+ Model for tracking digest task execution state and progress.
21
+
22
+ This model enables graceful resumption of digest tasks after worker
23
+ interruptions by persisting execution state and progress information.
24
+ """
25
+
26
+ @declared_attr
27
+ def __tablename__(cls) -> str:
28
+ return "digest_task_execution"
29
+
30
+ # Foreign key to digest config
31
+ digest_config_id = Column(
32
+ String,
33
+ ForeignKey("digest_config.id", ondelete="CASCADE"),
34
+ nullable=False,
35
+ index=True,
36
+ )
37
+
38
+ # Celery task tracking
39
+ celery_task_id = Column(String, nullable=True, index=True)
40
+
41
+ # Progress tracking
42
+ total_recipients = Column(Integer, nullable=True)
43
+ processed_recipients = Column(Integer, nullable=False, default=0)
44
+ successful_communications = Column(Integer, nullable=False, default=0)
45
+ failed_communications = Column(Integer, nullable=False, default=0)
46
+
47
+ # State persistence for resumption
48
+ execution_state = Column(JSONB, nullable=True, default={})
49
+ processed_user_ids = Column(JSONB, nullable=True, default=[])
50
+
51
+ # Timing information
52
+ started_at = Column(DateTime(timezone=True), nullable=True)
53
+ completed_at = Column(DateTime(timezone=True), nullable=True)
54
+ last_checkpoint_at = Column(DateTime(timezone=True), nullable=True)
55
+
56
+ # Error information
57
+ error_message = Column(Text, nullable=True)
58
+
59
+ # Relationships
60
+ digest_config = relationship("DigestConfig", back_populates="executions")
61
+
62
+ @classmethod
63
+ def allowed_action_types(cls) -> List[str]:
64
+ """Return allowed action types for digest task execution."""
65
+ return ["digest_processing"]
66
+
67
+ def mark_started(self, db: Session, celery_task_id: str) -> None:
68
+ """Mark the execution as started."""
69
+ self.status = ExecutionLogStatus.in_processing
70
+ self.celery_task_id = celery_task_id
71
+ self.started_at = func.now()
72
+ self.save(db)
73
+
74
+ def mark_awaiting_processing(self, db: Session) -> None:
75
+ """Mark the execution as awaiting processing."""
76
+ self.status = ExecutionLogStatus.awaiting_processing
77
+ self.save(db)
78
+
79
+ def update_progress(
80
+ self,
81
+ db: Session,
82
+ processed_count: int,
83
+ successful_count: int,
84
+ failed_count: int,
85
+ processed_user_ids: List[str],
86
+ execution_state: Optional[Dict[str, Any]] = None,
87
+ ) -> None:
88
+ """Update execution progress and create checkpoint."""
89
+ self.processed_recipients = processed_count
90
+ self.successful_communications = successful_count
91
+ self.failed_communications = failed_count
92
+ self.processed_user_ids = processed_user_ids
93
+ self.last_checkpoint_at = func.now()
94
+
95
+ if execution_state:
96
+ self.execution_state = execution_state
97
+
98
+ self.save(db)
99
+
100
+ def mark_completed(self, db: Session) -> None:
101
+ """Mark the execution as completed."""
102
+ self.status = ExecutionLogStatus.complete
103
+ self.completed_at = func.now()
104
+ self.save(db)
105
+
106
+ def mark_failed(self, db: Session, error_message: str) -> None:
107
+ """Mark the execution as failed."""
108
+ self.status = ExecutionLogStatus.error
109
+ self.error_message = error_message
110
+ self.completed_at = func.now()
111
+ self.save(db)
112
+
113
+ def can_resume(self) -> bool:
114
+ """Check if this execution can be resumed."""
115
+ return (
116
+ self.status
117
+ in [
118
+ ExecutionLogStatus.in_processing,
119
+ ExecutionLogStatus.awaiting_processing,
120
+ ]
121
+ and self.processed_user_ids is not None
122
+ )
123
+
124
+ def get_remaining_work(self) -> Dict[str, Any]:
125
+ """Get information about remaining work for resumption."""
126
+ return {
127
+ "processed_user_ids": self.processed_user_ids or [],
128
+ "execution_state": self.execution_state or {},
129
+ "processed_count": self.processed_recipients or 0,
130
+ "successful_count": self.successful_communications,
131
+ "failed_count": self.failed_communications,
132
+ }
@@ -31,6 +31,14 @@ class EventAuditType(str, EnumType):
31
31
  taxonomy_element_updated = "taxonomy.element.updated"
32
32
  taxonomy_element_deleted = "taxonomy.element.deleted"
33
33
 
34
+ # Digest
35
+ digest_execution_started = "digest.execution.started"
36
+ digest_execution_completed = "digest.execution.completed"
37
+ digest_execution_interrupted = "digest.execution.interrupted"
38
+ digest_execution_resumed = "digest.execution.resumed"
39
+ digest_communications_sent = "digest.communications.sent"
40
+ digest_checkpoint_created = "digest.checkpoint.created"
41
+
34
42
 
35
43
  class EventAuditStatus(str, EnumType):
36
44
  """Status enum for event audit logging."""
@@ -369,7 +369,7 @@ class PrivacyRequest(
369
369
  return {
370
370
  "id": self.id,
371
371
  "external_id": self.external_id,
372
- "status": self.status.value,
372
+ "status": self.status.value if self.status is not None else None,
373
373
  "requested_at": (
374
374
  self.requested_at.isoformat() if self.requested_at else None
375
375
  ),
@@ -8,8 +8,9 @@ from typing import TYPE_CHECKING, List, Optional, Tuple
8
8
  from loguru import logger
9
9
  from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
10
10
  from sqlalchemy.dialects.postgresql import JSONB
11
+ from sqlalchemy.ext.declarative import declared_attr
11
12
  from sqlalchemy.ext.mutable import MutableDict, MutableList
12
- from sqlalchemy.orm import Query, Session, relationship
13
+ from sqlalchemy.orm import Query, RelationshipProperty, Session, relationship
13
14
  from sqlalchemy_utils.types.encrypted.encrypted_type import (
14
15
  AesGcmEngine,
15
16
  StringEncryptedType,
@@ -183,6 +184,14 @@ class RequestTask(WorkerTask, Base):
183
184
  uselist=False,
184
185
  )
185
186
 
187
+ # Stores the sub-requests data for async polling tasks
188
+ sub_requests: "RelationshipProperty[List[RequestTaskSubRequest]]" = relationship(
189
+ "RequestTaskSubRequest",
190
+ back_populates="request_task",
191
+ cascade="all, delete-orphan",
192
+ order_by="RequestTaskSubRequest.created_at",
193
+ )
194
+
186
195
  @property
187
196
  def request_task_address(self) -> CollectionAddress:
188
197
  """Convert the collection_address into Collection Address format"""
@@ -318,3 +327,91 @@ class RequestTask(WorkerTask, Base):
318
327
  )
319
328
 
320
329
  return task_in_flight
330
+
331
+
332
+ class RequestTaskSubRequest(Base):
333
+ """
334
+ Model for storing individual sub-request data during the execution of a request task.
335
+ Supports 1:N relationship - each RequestTask can have multiple sub-requests.
336
+ Currently used for storing request data for polling tasks.
337
+ """
338
+
339
+ @declared_attr
340
+ def __tablename__(cls) -> str:
341
+ """Overriding base class method to set the table name."""
342
+ return "request_task_sub_request"
343
+
344
+ request_task_id = Column(
345
+ String(255),
346
+ ForeignKey(
347
+ "requesttask.id",
348
+ name="request_task_sub_request_request_task_id_fkey",
349
+ ondelete="CASCADE",
350
+ ),
351
+ nullable=False,
352
+ index=True,
353
+ )
354
+
355
+ request_task = relationship(
356
+ "RequestTask",
357
+ back_populates="sub_requests",
358
+ )
359
+
360
+ # Individual sub-request data (e.g., request_id, status, result data)
361
+ # Additional fields for enhanced sub-request tracking
362
+ param_values = Column( # An encrypted JSON String - saved as a dict
363
+ StringEncryptedType(
364
+ type_in=JSONTypeOverride,
365
+ key=CONFIG.security.app_encryption_key,
366
+ engine=AesGcmEngine,
367
+ padding="pkcs5",
368
+ ),
369
+ nullable=False,
370
+ )
371
+ status = Column(String, nullable=False)
372
+
373
+ # Raw data retrieved from an access request is stored here. This contains all of the
374
+ # intermediate data we retrieved, needed for downstream tasks, but hasn't been filtered
375
+ # by data category for the end user.
376
+ _access_data = Column( # An encrypted JSON String - saved as a list of Rows
377
+ "access_data",
378
+ StringEncryptedType(
379
+ type_in=JSONTypeOverride,
380
+ key=CONFIG.security.app_encryption_key,
381
+ engine=AesGcmEngine,
382
+ padding="pkcs5",
383
+ ),
384
+ )
385
+
386
+ # Use descriptors for automatic external storage handling
387
+ access_data = EncryptedLargeDataDescriptor(
388
+ field_name="access_data", empty_default=[]
389
+ )
390
+
391
+ # Written after an erasure is completed
392
+ rows_masked = Column(Integer)
393
+
394
+ def get_correlation_id(self) -> Optional[str]:
395
+ """Helper method to extract correlation_id from param_values."""
396
+ if self.param_values and "request_id" in self.param_values:
397
+ return self.param_values["request_id"]
398
+ return None
399
+
400
+ def update_status(self, db: Session, status: str) -> None:
401
+ """Helper method to update the status of this sub-request."""
402
+ self.status = status
403
+ self.save(db)
404
+
405
+ def cleanup_external_storage(self) -> None:
406
+ """Clean up all external storage files for this sub-request"""
407
+ # Access the descriptor from the class to call cleanup
408
+ RequestTaskSubRequest.access_data.cleanup(self)
409
+
410
+ def get_access_data(self) -> List[Row]:
411
+ """Helper to retrieve access data or default to empty list"""
412
+ return self.access_data or []
413
+
414
+ def delete(self, db: Session) -> None:
415
+ """Override delete to cleanup external storage first"""
416
+ self.cleanup_external_storage()
417
+ super().delete(db)
@@ -17,6 +17,14 @@ class ExecutionLogStatus(enum.Enum):
17
17
  awaiting_processing = "paused" # "paused" in the database to avoid a migration, but use "awaiting_processing" in the app
18
18
  retrying = "retrying"
19
19
  skipped = "skipped"
20
+ polling = "polling"
21
+
22
+
23
+ # Statuses that can be resumed
24
+ RESUMABLE_EXECUTION_LOG_STATUSES = [
25
+ ExecutionLogStatus.pending,
26
+ ExecutionLogStatus.polling,
27
+ ]
20
28
 
21
29
 
22
30
  class WorkerTask: