ethyca-fides 2.68.1b2__py2.py3-none-any.whl → 2.68.1b3__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 (292) hide show
  1. {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/METADATA +3 -1
  2. {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/RECORD +231 -216
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/90502bcda282_update_request_tasks_add_polling_async.py +35 -0
  5. fides/api/api/v1/endpoints/privacy_request_endpoints.py +1 -1
  6. fides/api/common_exceptions.py +12 -3
  7. fides/api/models/detection_discovery/core.py +6 -0
  8. fides/api/models/privacy_request/request_task.py +25 -0
  9. fides/api/schemas/privacy_center_config.py +48 -19
  10. fides/api/schemas/storage/storage.py +2 -0
  11. fides/api/service/async_dsr/__init__.py +0 -0
  12. fides/api/service/async_dsr/async_dsr_service.py +75 -0
  13. fides/api/service/connectors/saas_connector.py +5 -6
  14. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +6 -4
  15. fides/api/service/privacy_request/request_service.py +50 -2
  16. fides/api/service/storage/storage_uploader_service.py +80 -5
  17. fides/api/service/storage/streaming/__init__.py +42 -0
  18. fides/api/service/storage/streaming/base_storage_client.py +61 -0
  19. fides/api/service/storage/streaming/dsr_storage.py +98 -0
  20. fides/api/service/storage/streaming/retry.py +282 -0
  21. fides/api/service/storage/streaming/s3/__init__.py +5 -0
  22. fides/api/service/storage/streaming/s3/s3_storage_client.py +113 -0
  23. fides/api/service/storage/streaming/s3/streaming_s3.py +196 -0
  24. fides/api/service/storage/streaming/schemas.py +173 -0
  25. fides/api/service/storage/streaming/smart_open_client.py +265 -0
  26. fides/api/service/storage/streaming/smart_open_streaming_storage.py +998 -0
  27. fides/api/service/storage/streaming/storage_client_factory.py +60 -0
  28. fides/api/task/graph_task.py +4 -4
  29. fides/api/task/manual/manual_task_graph_task.py +3 -4
  30. fides/config/execution_settings.py +4 -0
  31. fides/service/privacy_request/privacy_request_service.py +1 -9
  32. fides/ui-build/static/admin/404.html +1 -1
  33. fides/ui-build/static/admin/_next/static/_BLI2ArqQzY5XnXbrcxa2/_buildManifest.js +1 -0
  34. fides/ui-build/static/admin/_next/static/chunks/1099-7b2085a3931da9e4.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/1138-0d846ffef62c580f.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/1345-ab756811e19ff4fc.js +1 -0
  37. fides/ui-build/static/admin/_next/static/chunks/{1817-c90365325f8a3d75.js → 1817-fd21f1f5ef0faffa.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/{1975.e5cc7a1ccd477671.js → 1975.16126463309143e3.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{2921-46f9465c2852a46b.js → 2921-0e5cc63a82e31830.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/3620-6cceae71bae5b531.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/3729-7d2d52400f1f7413.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/3855-64541570e2f838fb.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/3872-7a18d18a5e287e4e.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/{3923-a33633feba5e655e.js → 3923-5c87b3d7f1626678.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{401-741bb31b586b7c96.js → 401-3902e3e98790d401.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{4121-94354b50a41f8497.js → 4121-64ef70ef906bbdd0.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/4608-70521532195124de.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/4786-53ef1662f2d0d98c.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/4808-8713433c84a62efe.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/4844-351f99b6644b654e.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/5258-c6f96dc740eb5fb1.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/5487-338800277d36b8d7.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/549-e6453a3526023e85.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/602-80d113e801d7407d.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/{6084-02abe12327fc3dbc.js → 6084-da63f20d9416a982.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/{6853-270261ef5537a106.js → 6853-1d947b75eb07188c.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/6954-24f9a4f27d67b732.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/7476-a0dd03bfccf60d0c.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/7630-9fbe06cfb98266fe.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/{787-5ba991cad1f7664a.js → 787-3dd31844cf7fec55.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/79-dcd20e8b09501c17.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/796-8773e04b64ce2260.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/8002-dcd02da6e5649a1c.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/9046-57eab238570b8bf4.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/9676.bf0a8a6ff6dfd2af.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/{9826-8c81c97a72510fcf.js → 9826-756c958aecab59a2.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/9951-cdf73904a3adb27b.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/pages/{404-9174cdb70126c2c5.js → 404-dd625a559ada46ca.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-2c10f6b217b7978b.js → _app-b6b09b2878b77b21.js} +136 -135
  71. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-621416493c89ef01.js → manual-92cf5e313be1f9e2.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-0b9908c3e1dfe49e.js → multiple-d6c525ee731a2993.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-5664a3ea796e5ffb.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-5bb1b31ae8752250.js → add-vendors-78f13de90111fd80.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-0fc678f3d6d2fcec.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-4e4d9426743b5cb4.js → [id]-126db59dc25ca326.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-d72460348fadcab8.js → privacy-experience-289605267d6cce7e.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-3e7ddc252da00c98.js → [id]-e9fd9b28ac9705af.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-35a7c305beee9428.js → new-28c003b6043bd16c.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-c643eff04525298e.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-ab96939421639153.js → properties-3ef5d01779a26455.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-baa4a2f8f08ac224.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-13240e3ca77acfeb.js → consent-8d4be9e7ec7d2a35.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-aad6047a4604b945.js → [resourceUrn]-f27ec4578c674181.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-bd37b407c80c6986.js → [projectUrn]-27b6c255bd9e73b6.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-0f66dac32040519c.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-b6b98cea25dd94fa.js → [resourceUrn]-3b938562df81c4b0.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-ebf5e7fa4e2ffb49.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b27c660039d951c9.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-8ce5d24af470888e.js +1 -0
  91. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-8e35e33928abbcdc.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-21c141279e66237a.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-31e6c54794a9883e.js → [resourceUrn]-3bc6a207693fd175.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-2822a423a7ad0550.js → detection-da16e73df395ad1d.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-f98dd251babb7e28.js → [resourceUrn]-04b242632a114405.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-56eb4c014f0d96a3.js → discovery-900fe50183a40d72.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-8f88dc31c5144ea8.js → datamap-4f1f7c3a9531a8f4.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-343294dcb10d9532.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-1c097a0809fa5b6f.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b47fa2498b534719.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-a31f881cab25704a.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-858c59c9e67e318d.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-67a7fe58b96ea739.js → [id]-16c28d272225afb6.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-90a8df230cb89877.js → new-68f502d8b0b5792c.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-1eb9acb17b133fd1.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/{index-876bfd7210040cec.js → index-fec557d99211f577.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-4e286a1e501a0c73.js → [id]-e613543818d6cbd2.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-8069f7c33695fd45.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-6e796c3fe632280b.js → [id]-4a08ca7762a19700.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-fa0f3841c5bdfdeb.js → add-template-343a965dcdb3d11e.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-3ade4c54b1c8a11e.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-9103bfb854f71410.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-11503454a62d8d7b.js → AntForm-3b97029bd4d3c3ea.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-a504941807bdb7f1.js → FormikAntFormItem-9d9beb8f0d8a278c.js} +1 -1
  115. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-0119403c8ff97f83.js → FormikControlled-84a4d8fc60f839ed.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-94f6d57d6c94ddf7.js → FormikField-1fccf542ab2e33bf.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-ed1a3ae09d72df89.js → forms-aa75263ae1ba67bb.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-db334a1cbb102255.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-11c1e4545c8f528c.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-192a986f61c23268.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-9216ac993d71387e.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-e55ec84d5380401d.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-48f447b31c786b80.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-41976b28503623cd.js → [id]-a74b51b704b80cb2.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-cb438d8f5ec6007a.js → add-property-8d23f0c55ff6510a.js} +1 -1
  126. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-b6db7036993709b3.js → properties-77acceac4f99e7af.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-4bc3e281409265cc.js → datamap-e60d398e255f4e00.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-6aad3f563ed03b3f.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-c1b8f3606d160bb1.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-d9f7f78810d58d08.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee2c7dde99b1dafb.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-a4dad8ca9de2d07b.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-386368bf7cb31771.js → domain-records-31c270d228e00581.js} +1 -1
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-996b3f250dd3ea1f.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-ee94981326ddcbf4.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-b41fb5ad277088ab.js → locations-0b831c58966782b8.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-94271ba4a224a353.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-a94dfeea43fbca7d.js → regulations-41b8136e50320fd3.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-52b45569cbc82e60.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-18b316e2dad73731.js → [id]-36d74e93e54aabaf.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/systems-24dfc8e2279ced2e.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-d9675cf5e6083b27.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-3237881945acc0ee.js → [id]-866826d7959df487.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-a3a50d9d79066935.js → user-management-e63b61a8f99ccd57.js} +1 -1
  145. fides/ui-build/static/admin/_next/static/chunks/{webpack-69658aeaf6155d89.js → webpack-6d0a487039bcf30c.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/css/{a72179b1754aadd3.css → 92441453b27e9c34.css} +1 -1
  147. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  148. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  149. fides/ui-build/static/admin/add-systems.html +1 -1
  150. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  151. fides/ui-build/static/admin/consent/configure.html +1 -1
  152. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  153. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  154. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  155. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  156. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  158. fides/ui-build/static/admin/consent/properties.html +1 -1
  159. fides/ui-build/static/admin/consent/reporting.html +1 -1
  160. fides/ui-build/static/admin/consent.html +1 -1
  161. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  162. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  163. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  164. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  165. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  166. fides/ui-build/static/admin/data-catalog.html +1 -1
  167. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  168. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  169. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  170. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  171. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  172. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  173. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  174. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  175. fides/ui-build/static/admin/datamap.html +1 -1
  176. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  177. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  178. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  179. fides/ui-build/static/admin/dataset/new.html +1 -1
  180. fides/ui-build/static/admin/dataset.html +1 -1
  181. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  182. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  183. fides/ui-build/static/admin/datastore-connection.html +1 -1
  184. fides/ui-build/static/admin/index.html +1 -1
  185. fides/ui-build/static/admin/integrations/[id].html +1 -1
  186. fides/ui-build/static/admin/integrations.html +1 -1
  187. fides/ui-build/static/admin/login/[provider].html +1 -1
  188. fides/ui-build/static/admin/login.html +1 -1
  189. fides/ui-build/static/admin/messaging/[id].html +1 -1
  190. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  191. fides/ui-build/static/admin/messaging.html +1 -1
  192. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  193. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  194. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  195. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  196. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  197. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  198. fides/ui-build/static/admin/poc/forms.html +1 -1
  199. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  200. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  201. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  202. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  203. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  204. fides/ui-build/static/admin/privacy-requests.html +1 -1
  205. fides/ui-build/static/admin/properties/[id].html +1 -1
  206. fides/ui-build/static/admin/properties/add-property.html +1 -1
  207. fides/ui-build/static/admin/properties.html +1 -1
  208. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  209. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  210. fides/ui-build/static/admin/settings/about.html +1 -1
  211. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  212. fides/ui-build/static/admin/settings/consent.html +1 -1
  213. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  214. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  215. fides/ui-build/static/admin/settings/domains.html +1 -1
  216. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  217. fides/ui-build/static/admin/settings/locations.html +1 -1
  218. fides/ui-build/static/admin/settings/organization.html +1 -1
  219. fides/ui-build/static/admin/settings/regulations.html +1 -1
  220. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  221. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  222. fides/ui-build/static/admin/systems.html +1 -1
  223. fides/ui-build/static/admin/taxonomy.html +1 -1
  224. fides/ui-build/static/admin/user-management/new.html +1 -1
  225. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  226. fides/ui-build/static/admin/user-management.html +1 -1
  227. fides/ui-build/static/admin/_next/static/chunks/203-0c6cadcda98bdd33.js +0 -1
  228. fides/ui-build/static/admin/_next/static/chunks/3450-9314e1b15df8a8da.js +0 -1
  229. fides/ui-build/static/admin/_next/static/chunks/3855-4267fd8193e7f525.js +0 -1
  230. fides/ui-build/static/admin/_next/static/chunks/3872-ac5feefd40b61ae3.js +0 -1
  231. fides/ui-build/static/admin/_next/static/chunks/409-5bc4369b80a8c11d.js +0 -1
  232. fides/ui-build/static/admin/_next/static/chunks/4230-1ebc8c0ab293a077.js +0 -1
  233. fides/ui-build/static/admin/_next/static/chunks/431-a34d7ceff17c2169.js +0 -1
  234. fides/ui-build/static/admin/_next/static/chunks/4608-557fb24665b2e4bf.js +0 -1
  235. fides/ui-build/static/admin/_next/static/chunks/5309-ffdec884eec79d29.js +0 -1
  236. fides/ui-build/static/admin/_next/static/chunks/5574-831167a8da90e2e6.js +0 -1
  237. fides/ui-build/static/admin/_next/static/chunks/6662-499c189f932a35aa.js +0 -1
  238. fides/ui-build/static/admin/_next/static/chunks/6780-7d28e030f6516e5d.js +0 -1
  239. fides/ui-build/static/admin/_next/static/chunks/6882-7cc1d14e27a80c10.js +0 -1
  240. fides/ui-build/static/admin/_next/static/chunks/6954-7784e8d5ad6b8110.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/7476-4de465016d3433b4.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/7630-2a5c57787632693d.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/7725-c79513b04113112b.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/79-98cfab20bb831137.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/796-0b768155bf20505f.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/8735-f84afcc50885883c.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/9046-97a972cc8a8ed24d.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/9226-318dadf1c050ecda.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/9676.9e6828b42ef05e06.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/9951-4df2b67e0def5500.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-18e96ce81dab51a4.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-54d7c7310763c66d.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-6bc3b73a21576869.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-fe3d6887fecf0f86.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-e4770acf7044e2f5.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-0db635c3483c9da8.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-0c0e0a7798345541.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-3c56e5fe072a44c6.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-58827eb86516931f.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-6a90131dcecd694c.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-145fe9e4cfcb231d.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-8a1e5d140785c1e9.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-227b5db4b472a6a7.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-8401f17fe5d9a1dc.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7d77b3ad069be268.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cfb25b02abb8da71.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-3fdc55d4c129e618.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-8f9c006b6166f002.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-6ba7ae4f26c06cb0.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-e8db3ad525e7ddbd.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-c14dd24592369467.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-100d7d03930629a8.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6f8d1b3ec83cfcf0.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-3ce15577435d47cb.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-709bcb0bc6a5382d.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-1ea40fcd6b4268bf.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-65c7600fadc6e55a.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-33dab986141b3663.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-1195042727c399ed.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-71b98858ecb4e097.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-cf427e04f862b5d2.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-eabeeec5bf2773c6.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-ee56698ae3a6a78b.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0e2e98cc38ee5499.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/systems-c32589c86081b750.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-a8f09bf8f3204ca7.js +0 -1
  287. fides/ui-build/static/admin/_next/static/qvk5eMANVfwYkdURE7fgG/_buildManifest.js +0 -1
  288. {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/WHEEL +0 -0
  289. {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/entry_points.txt +0 -0
  290. {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/licenses/LICENSE +0 -0
  291. {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/top_level.txt +0 -0
  292. /fides/ui-build/static/admin/_next/static/{qvk5eMANVfwYkdURE7fgG → _BLI2ArqQzY5XnXbrcxa2}/_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-08-19T14:51:50-0700",
11
+ "date": "2025-08-25T16:34:15-0600",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "047dc431c1e669789ec8aa19ededd438909b8c0c",
15
- "version": "2.68.1b2"
14
+ "full-revisionid": "05d56cc8111caa00faea2dd8433a36fd4d5b7a8a",
15
+ "version": "2.68.1b3"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,35 @@
1
+ """Update Request Tasks
2
+
3
+ Revision ID: 90502bcda282
4
+ Revises: 3baf42d251a6
5
+ Create Date: 2025-08-05 16:31:45.335384
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "90502bcda282"
14
+ down_revision = "3baf42d251a6"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+ async_task_type = sa.Enum("manual", "polling", "callback", name="asynctasktype")
19
+
20
+
21
+ def upgrade():
22
+ async_task_type.create(op.get_bind(), checkfirst=True)
23
+ op.add_column(
24
+ "requesttask",
25
+ sa.Column(
26
+ "async_type",
27
+ async_task_type,
28
+ nullable=True,
29
+ ),
30
+ )
31
+
32
+
33
+ def downgrade():
34
+ op.drop_column("requesttask", "async_type")
35
+ async_task_type.drop(op.get_bind(), checkfirst=True)
@@ -50,6 +50,7 @@ from fides.api.common_exceptions import (
50
50
  IdentityVerificationException,
51
51
  ManualWebhookFieldsUnset,
52
52
  NoCachedManualWebhookEntry,
53
+ PrivacyRequestError,
53
54
  TraversalError,
54
55
  ValidationError,
55
56
  )
@@ -175,7 +176,6 @@ from fides.service.dataset.dataset_config_service import (
175
176
  )
176
177
  from fides.service.messaging.messaging_service import MessagingService
177
178
  from fides.service.privacy_request.privacy_request_service import (
178
- PrivacyRequestError,
179
179
  PrivacyRequestService,
180
180
  _process_privacy_request_restart,
181
181
  _requeue_privacy_request,
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import List
3
+ from typing import Dict, List, Optional
4
4
 
5
5
  from fastapi import HTTPException, status
6
6
  from starlette.status import (
@@ -175,8 +175,8 @@ class RequestTaskNotFound(BaseException):
175
175
  """Privacy Request Task Not Found"""
176
176
 
177
177
 
178
- class AwaitingAsyncTaskCallback(BaseException):
179
- """Request Task is Awaiting Processing - Awaiting Async Task Callback"""
178
+ class AwaitingAsyncTask(BaseException):
179
+ """Request Task is Awaiting Processing - Awaiting Async Task"""
180
180
 
181
181
 
182
182
  class UpstreamTasksNotReady(BaseException):
@@ -373,6 +373,15 @@ class InvalidScopeError(HTTPException):
373
373
  )
374
374
 
375
375
 
376
+ class PrivacyRequestError(Exception):
377
+ """Base exception for privacy request operations."""
378
+
379
+ def __init__(self, message: str, data: Optional[Dict] = None):
380
+ self.message = message
381
+ self.data = data
382
+ super().__init__(message)
383
+
384
+
376
385
  class KeyOrNameAlreadyExists(Exception):
377
386
  """A resource already exists with this key or name."""
378
387
 
@@ -432,11 +432,17 @@ class StagedResourceAncestor(Base):
432
432
 
433
433
  # Execute batch when it reaches the desired size
434
434
  if len(current_batch) >= batch_size:
435
+ logger.debug(
436
+ f"Inserting batch of {len(current_batch)} staged resource ancestor links"
437
+ )
435
438
  db.execute(stmt_text, current_batch)
436
439
  current_batch = []
437
440
 
438
441
  # Execute any remaining items in the final batch
439
442
  if current_batch:
443
+ logger.debug(
444
+ f"Inserting batch of {len(current_batch)} staged resource ancestor links"
445
+ )
440
446
  db.execute(stmt_text, current_batch)
441
447
 
442
448
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from enum import Enum as EnumType
5
6
  from typing import TYPE_CHECKING, List, Optional, Tuple
6
7
 
7
8
  from loguru import logger
@@ -15,6 +16,7 @@ from sqlalchemy_utils.types.encrypted.encrypted_type import (
15
16
  )
16
17
 
17
18
  from fides.api.db.base_class import Base, JSONTypeOverride # type: ignore[attr-defined]
19
+ from fides.api.db.util import EnumColumn
18
20
  from fides.api.graph.config import (
19
21
  ROOT_COLLECTION_ADDRESS,
20
22
  TERMINATOR_ADDRESS,
@@ -67,6 +69,24 @@ class TraversalDetails(FidesSchema):
67
69
  )
68
70
 
69
71
 
72
+ class AsyncTaskType(EnumType):
73
+ """
74
+ Enum for asynchronous RequestTask types
75
+
76
+ These tasks differ from our regular tasks in that they are not finished on the same process that they are created,
77
+ but rather are put into a pause state and then triggered to completion by a different process
78
+
79
+ manual: A task that is manually triggered by the user
80
+ polling: A task that is triggered by a polling mechanism
81
+ callback: A task that is triggered by a callback from an external system
82
+
83
+ """
84
+
85
+ manual = "manual"
86
+ polling = "polling"
87
+ callback = "callback"
88
+
89
+
70
90
  # TODO: At some point we will refactor this model to store all task types in a common table that links to tables with specific task attributes.
71
91
  class RequestTask(WorkerTask, Base):
72
92
  """
@@ -145,6 +165,11 @@ class RequestTask(WorkerTask, Base):
145
165
 
146
166
  # For async tasks awaiting callback
147
167
  callback_succeeded = Column(Boolean)
168
+ # to recognize Polling async task
169
+ async_type = Column(
170
+ EnumColumn(AsyncTaskType, native_enum=True),
171
+ nullable=True,
172
+ )
148
173
 
149
174
  # Stores a serialized collection that can be transformed back into a Collection to help
150
175
  # execute the current task
@@ -1,3 +1,4 @@
1
+ from abc import ABC
1
2
  from typing import Any, Dict, List, Literal, Optional, Union
2
3
 
3
4
  from pydantic import ConfigDict, Field, field_validator, model_validator
@@ -12,22 +13,10 @@ class CustomIdentity(FidesSchema):
12
13
  label: str
13
14
 
14
15
 
15
- class LocationIdentityField(FidesSchema):
16
- """Location field configuration that extends the useful parts of CustomPrivacyRequestField"""
17
-
18
- label: str
19
- required: Optional[bool] = True
20
- default_value: Optional[str] = None
21
- query_param_key: Optional[str] = None
22
- ip_geolocation_hint: Optional[bool] = False
23
- # Note: We intentionally omit 'hidden' field as it doesn't make sense for location identity input
24
-
25
-
26
16
  class IdentityInputs(FidesSchema):
27
17
  name: Optional[RequiredType] = None
28
18
  email: Optional[RequiredType] = None
29
19
  phone: Optional[RequiredType] = None
30
- location: Optional[Union[RequiredType, LocationIdentityField]] = None
31
20
  model_config = ConfigDict(extra="allow")
32
21
 
33
22
  def __init__(self, **data: Any):
@@ -42,13 +31,12 @@ class IdentityInputs(FidesSchema):
42
31
  f'Custom identity "{field}" must be an instance of CustomIdentity '
43
32
  '(e.g. {"label": "Field label"})'
44
33
  )
45
- elif field == "location" and isinstance(value, dict):
46
- # Handle location field as LocationIdentityField
47
- data[field] = LocationIdentityField(**value)
48
34
  super().__init__(**data)
49
35
 
50
36
 
51
- class CustomPrivacyRequestField(FidesSchema):
37
+ class BaseCustomPrivacyRequestField(FidesSchema, ABC):
38
+ """Abstract base class for all custom privacy request fields"""
39
+
52
40
  label: str
53
41
  required: Optional[bool] = True
54
42
  default_value: Optional[str] = None
@@ -69,6 +57,41 @@ class CustomPrivacyRequestField(FidesSchema):
69
57
  return values
70
58
 
71
59
 
60
+ class CustomPrivacyRequestField(BaseCustomPrivacyRequestField):
61
+ """Regular custom privacy request field supporting text, select, and multiselect types"""
62
+
63
+ field_type: Optional[Literal["text", "select", "multiselect"]] = None
64
+ options: Optional[List[str]] = None
65
+
66
+
67
+ class LocationCustomPrivacyRequestField(BaseCustomPrivacyRequestField):
68
+ """Location field that doesn't support options and includes IP geolocation hint"""
69
+
70
+ field_type: Literal["location"] = "location"
71
+ ip_geolocation_hint: Optional[bool] = False
72
+
73
+ @model_validator(mode="before")
74
+ @classmethod
75
+ def validate_location_field(cls, values: Dict[str, Any]) -> Dict[str, Any]:
76
+ # Ensure options is not provided for location fields
77
+ if "options" in values:
78
+ raise ValueError(
79
+ "LocationCustomPrivacyRequestField does not support options"
80
+ )
81
+
82
+ # This field cannot be hidden
83
+ if values.get("hidden"):
84
+ raise ValueError("Custom location fields cannot be hidden")
85
+
86
+ return values
87
+
88
+
89
+ # Create a simple union type - Pydantic will use the field_type to determine which model to use
90
+ CustomPrivacyRequestFieldUnion = Union[
91
+ LocationCustomPrivacyRequestField, CustomPrivacyRequestField
92
+ ]
93
+
94
+
72
95
  class PrivacyRequestOption(FidesSchema):
73
96
  locations: Optional[Union[List[PrivacyNoticeRegion], Literal["fallback"]]] = None
74
97
  policy_key: Optional[str] = None
@@ -79,7 +102,9 @@ class PrivacyRequestOption(FidesSchema):
79
102
  confirm_button_text: Optional[str] = Field(alias="confirmButtonText", default=None)
80
103
  cancel_button_text: Optional[str] = Field(alias="cancelButtonText", default=None)
81
104
  identity_inputs: Optional[IdentityInputs] = None
82
- custom_privacy_request_fields: Optional[Dict[str, CustomPrivacyRequestField]] = None
105
+ custom_privacy_request_fields: Optional[
106
+ Dict[str, CustomPrivacyRequestFieldUnion]
107
+ ] = None
83
108
 
84
109
 
85
110
  class ConsentConfigButton(FidesSchema):
@@ -89,7 +114,9 @@ class ConsentConfigButton(FidesSchema):
89
114
  cancel_button_text: Optional[str] = Field(alias="cancelButtonText", default=None)
90
115
  icon_path: str
91
116
  identity_inputs: IdentityInputs
92
- custom_privacy_request_fields: Optional[Dict[str, CustomPrivacyRequestField]] = None
117
+ custom_privacy_request_fields: Optional[
118
+ Dict[str, CustomPrivacyRequestFieldUnion]
119
+ ] = None
93
120
  title: str
94
121
  modal_title: Optional[str] = Field(alias="modalTitle", default=None)
95
122
 
@@ -174,7 +201,9 @@ class PartialPrivacyRequestOption(FidesSchema):
174
201
  policy_key: str
175
202
  title: str
176
203
  identity_inputs: Optional[IdentityInputs] = None
177
- custom_privacy_request_fields: Optional[Dict[str, CustomPrivacyRequestField]] = None
204
+ custom_privacy_request_fields: Optional[
205
+ Dict[str, CustomPrivacyRequestFieldUnion]
206
+ ] = None
178
207
 
179
208
 
180
209
  class PartialPrivacyCenterConfig(FidesSchema):
@@ -37,6 +37,7 @@ class StorageDetails(Enum):
37
37
  NAMING = "naming"
38
38
  MAX_RETRIES = "max_retries"
39
39
  AUTH_METHOD = "auth_method"
40
+ ENABLE_STREAMING = "enable_streaming"
40
41
  model_config = ConfigDict(extra="forbid")
41
42
 
42
43
 
@@ -58,6 +59,7 @@ class StorageDetailsS3(FileBasedStorageDetails):
58
59
  auth_method: AWSAuthMethod
59
60
  bucket: str
60
61
  max_retries: Optional[int] = 0
62
+ enable_streaming: Optional[bool] = False
61
63
  model_config = ConfigDict(use_enum_values=True)
62
64
 
63
65
 
File without changes
@@ -0,0 +1,75 @@
1
+ from loguru import logger
2
+ from sqlalchemy.orm import Session
3
+
4
+ from fides.api.common_exceptions import PrivacyRequestError
5
+ from fides.api.models.connectionconfig import ConnectionConfig
6
+ from fides.api.models.datasetconfig import DatasetConfig
7
+ from fides.api.models.privacy_request import PrivacyRequest, RequestTask
8
+ from fides.api.schemas.privacy_request import PrivacyRequestStatus
9
+ from fides.api.task.task_resources import TaskResources
10
+
11
+
12
+ def requeue_polling_request(
13
+ db: Session,
14
+ async_task: RequestTask,
15
+ ) -> None:
16
+ """Re-queue a Privacy request that polls async tasks for a given privacy request"""
17
+ # Check that the privacy request is approved or in processing
18
+ privacy_request: PrivacyRequest = async_task.privacy_request
19
+
20
+ if privacy_request.status not in [
21
+ PrivacyRequestStatus.approved,
22
+ PrivacyRequestStatus.in_processing,
23
+ ]:
24
+ raise PrivacyRequestError(
25
+ f"Cannot re-queue privacy request {privacy_request.id} with status {privacy_request.status.value}"
26
+ )
27
+
28
+ logger.info(
29
+ "Polling starting for {} task {} {}",
30
+ async_task.action_type,
31
+ async_task.collection_address,
32
+ async_task.id,
33
+ )
34
+
35
+ connection_config = get_connection_config_from_task(db, async_task)
36
+
37
+ with TaskResources(
38
+ privacy_request,
39
+ privacy_request.policy,
40
+ [connection_config],
41
+ async_task,
42
+ db,
43
+ ) as resources:
44
+ # graph_task: GraphTask = create_graph_task(db, async_task, resources)
45
+ # Currently, upstream tasks and "input keys" (which are built by data dependencies)
46
+ # are the same, but they may not be the same in the future.
47
+ # upstream_tasks = async_task.upstream_tasks_objects(db)
48
+ # upstream_access_data: List[List[Row]] = _build_upstream_access_data(
49
+ # graph_task.execution_node.input_keys, upstream_tasks
50
+ # )
51
+ # TODO: Implement the polling strategy
52
+ logger.info(f"found resources: {resources}")
53
+ return None
54
+
55
+
56
+ def get_connection_config_from_task(
57
+ db: Session, request_task: RequestTask
58
+ ) -> ConnectionConfig:
59
+ dataset_config = DatasetConfig.filter(
60
+ db=db,
61
+ conditions=(DatasetConfig.fides_key == request_task.dataset_name),
62
+ ).first()
63
+ if not dataset_config:
64
+ raise PrivacyRequestError(
65
+ f"DatasetConfig with fides_key {request_task.dataset_name} not found."
66
+ )
67
+ connection_config = ConnectionConfig.get(
68
+ db=db, object_id=dataset_config.connection_config_id
69
+ )
70
+ if not connection_config:
71
+ raise PrivacyRequestError(
72
+ f"ConnectionConfig with id {dataset_config.connection_config_id} not found."
73
+ )
74
+
75
+ return connection_config
@@ -11,7 +11,7 @@ from sqlalchemy.orm import Session
11
11
  from starlette.status import HTTP_204_NO_CONTENT
12
12
 
13
13
  from fides.api.common_exceptions import (
14
- AwaitingAsyncTaskCallback,
14
+ AwaitingAsyncTask,
15
15
  FidesopsException,
16
16
  PostProcessingException,
17
17
  SkippingConsentPropagation,
@@ -229,7 +229,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
229
229
  query_config: SaaSQueryConfig = self.query_config(node)
230
230
 
231
231
  # generate initial set of requests if read request is defined, otherwise raise an exception
232
-
233
232
  # An endpoint can be defined with multiple 'read' requests if the data for a single
234
233
  # collection can be accessed in multiple ways for example:
235
234
  #
@@ -336,8 +335,8 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
336
335
  if awaiting_async_callback:
337
336
  # If a read request was marked to expect async results, original response data here is ignored.
338
337
  # We'll instead use the data received in the callback URL later.
339
- # Raising an AwaitingAsyncTaskCallback to put this task in an awaiting_processing state
340
- raise AwaitingAsyncTaskCallback()
338
+ # Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
339
+ raise AwaitingAsyncTask()
341
340
 
342
341
  return rows
343
342
 
@@ -641,8 +640,8 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
641
640
  if awaiting_async_callback:
642
641
  # Asynchronous masking request detected in saas config.
643
642
  # If the masking request was marked to expect async results, original responses are ignored
644
- # and we raise an AwaitingAsyncTaskCallback to put this task in an awaiting_processing state.
645
- raise AwaitingAsyncTaskCallback()
643
+ # and we raise an AwaitingAsyncTask to put this task in an awaiting_processing state.
644
+ raise AwaitingAsyncTask()
646
645
  return rows_updated
647
646
 
648
647
  @staticmethod
@@ -5,13 +5,12 @@ import zipfile
5
5
  from collections import defaultdict
6
6
  from io import BytesIO
7
7
  from pathlib import Path
8
- from typing import Any, Optional
8
+ from typing import TYPE_CHECKING, Any, Optional
9
9
 
10
10
  import jinja2
11
11
  from jinja2 import Environment, FileSystemLoader
12
12
  from loguru import logger
13
13
 
14
- from fides.api.models.privacy_request import PrivacyRequest
15
14
  from fides.api.schemas.policy import ActionType
16
15
  from fides.api.util.storage_util import StorageJSONEncoder, format_size
17
16
 
@@ -21,6 +20,9 @@ TEXT_COLOR = "#4A5568"
21
20
  HEADER_COLOR = "#FAFAFA"
22
21
  BORDER_COLOR = "#E2E8F0"
23
22
 
23
+ if TYPE_CHECKING:
24
+ from fides.api.models.privacy_request import PrivacyRequest # pragma: no cover
25
+
24
26
 
25
27
  # pylint: disable=too-many-instance-attributes
26
28
  class DsrReportBuilder:
@@ -42,7 +44,7 @@ class DsrReportBuilder:
42
44
 
43
45
  def __init__(
44
46
  self,
45
- privacy_request: PrivacyRequest,
47
+ privacy_request: "PrivacyRequest",
46
48
  dsr_data: dict[str, Any],
47
49
  ):
48
50
  """
@@ -387,7 +389,7 @@ class DsrReportBuilder:
387
389
  return self.baos
388
390
 
389
391
 
390
- def _map_privacy_request(privacy_request: PrivacyRequest) -> dict[str, Any]:
392
+ def _map_privacy_request(privacy_request: "PrivacyRequest") -> dict[str, Any]:
391
393
  """Creates a map with a subset of values from the privacy request"""
392
394
  request_data: dict[str, Any] = {}
393
395
  request_data["id"] = privacy_request.id
@@ -11,12 +11,13 @@ from sqlalchemy import text
11
11
  from sqlalchemy.orm import Session
12
12
  from sqlalchemy.sql.elements import TextClause
13
13
 
14
- from fides.api.common_exceptions import PrivacyRequestNotFound
14
+ from fides.api.common_exceptions import PrivacyRequestError, PrivacyRequestNotFound
15
15
  from fides.api.models.privacy_request import (
16
16
  EXITED_EXECUTION_LOG_STATUSES,
17
17
  PrivacyRequest,
18
18
  RequestTask,
19
19
  )
20
+ from fides.api.models.privacy_request.request_task import AsyncTaskType
20
21
  from fides.api.models.worker_task import ExecutionLogStatus
21
22
  from fides.api.schemas.drp_privacy_request import DrpPrivacyRequestCreate
22
23
  from fides.api.schemas.policy import ActionType
@@ -43,6 +44,7 @@ from fides.config import CONFIG
43
44
  PRIVACY_REQUEST_STATUS_CHANGE_POLL = "privacy_request_status_change_poll"
44
45
  DSR_DATA_REMOVAL = "dsr_data_removal"
45
46
  INTERRUPTED_TASK_REQUEUE_POLL = "interrupted_task_requeue_poll"
47
+ ASYNC_TASKS_STATUS_POLLING = "async_tasks_status_polling"
46
48
 
47
49
 
48
50
  def build_required_privacy_request_kwargs(
@@ -357,6 +359,27 @@ def initiate_interrupted_task_requeue_poll() -> None:
357
359
  )
358
360
 
359
361
 
362
+ def initiate_async_tasks_status_polling() -> None:
363
+ """Initiates scheduler to check for and requeue pending polling async tasks"""
364
+ if CONFIG.test_mode:
365
+ return
366
+
367
+ assert (
368
+ scheduler.running
369
+ ), "Scheduler is not running! Cannot add async tasks status polling job."
370
+
371
+ logger.info("Initiating scheduler for async tasks status polling")
372
+ scheduler.add_job(
373
+ func=poll_async_tasks_status,
374
+ trigger="interval",
375
+ kwargs={},
376
+ id=ASYNC_TASKS_STATUS_POLLING,
377
+ coalesce=True,
378
+ replace_existing=True,
379
+ seconds=CONFIG.execution.async_tasks_status_polling_interval_seconds,
380
+ )
381
+
382
+
360
383
  def get_cached_task_id(entity_id: str) -> Optional[str]:
361
384
  """Gets the cached task ID for a privacy request or request task by ID.
362
385
 
@@ -465,7 +488,6 @@ def _handle_privacy_request_requeue(
465
488
  )
466
489
 
467
490
  from fides.service.privacy_request.privacy_request_service import ( # pylint: disable=cyclic-import
468
- PrivacyRequestError,
469
491
  _requeue_privacy_request,
470
492
  )
471
493
 
@@ -662,3 +684,29 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
662
684
  # Requeue the privacy request if needed
663
685
  if should_requeue:
664
686
  _handle_privacy_request_requeue(db, privacy_request)
687
+
688
+
689
+ @celery_app.task(base=DatabaseTask, bind=True)
690
+ def poll_async_tasks_status(self: DatabaseTask) -> None:
691
+ """
692
+ Poll the status of async tasks that are awaiting processing.
693
+ """
694
+
695
+ with self.get_new_session() as db:
696
+ logger.debug("Polling for async tasks status")
697
+
698
+ # Get all tasks that are awaiting processing and are from polling async tasks
699
+ async_tasks = (
700
+ db.query(RequestTask)
701
+ .filter(RequestTask.status == ExecutionLogStatus.awaiting_processing)
702
+ .filter(RequestTask.async_type == AsyncTaskType.polling)
703
+ .all()
704
+ )
705
+ if async_tasks:
706
+ logger.debug(f"Found {len(async_tasks)} async tasks to poll")
707
+ from fides.api.service.async_dsr.async_dsr_service import ( # pylint: disable=cyclic-import
708
+ requeue_polling_request,
709
+ )
710
+
711
+ for async_task in async_tasks:
712
+ requeue_polling_request(db, async_task)