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
@@ -2,9 +2,8 @@
2
2
  import time
3
3
  from copy import deepcopy
4
4
  from datetime import datetime, timedelta
5
- from typing import Any, Optional, Tuple
5
+ from typing import Any, Optional
6
6
 
7
- import requests
8
7
  from loguru import logger
9
8
  from pydantic import ValidationError as PydanticValidationError
10
9
  from sqlalchemy.orm import Query, Session
@@ -22,7 +21,6 @@ from fides.api.common_exceptions import (
22
21
  ValidationError,
23
22
  )
24
23
  from fides.api.db.session import get_db_session
25
- from fides.api.graph.config import CollectionAddress
26
24
  from fides.api.graph.graph import DatasetGraph
27
25
  from fides.api.models.attachment import Attachment, AttachmentReferenceType
28
26
  from fides.api.models.audit_log import AuditLog, AuditLogAction
@@ -53,7 +51,7 @@ from fides.api.schemas.policy import ActionType, CurrentStep
53
51
  from fides.api.schemas.privacy_request import PrivacyRequestStatus
54
52
  from fides.api.schemas.redis_cache import Identity
55
53
  from fides.api.schemas.storage.storage import StorageType
56
- from fides.api.service.connectors import FidesConnector, get_connector
54
+ from fides.api.service.connectors import get_connector
57
55
  from fides.api.service.connectors.consent_email_connector import (
58
56
  CONSENT_EMAIL_CONNECTOR_TYPES,
59
57
  )
@@ -85,11 +83,7 @@ from fides.api.util.collection_util import Row
85
83
  from fides.api.util.logger import Pii, _log_exception, _log_warning
86
84
  from fides.api.util.logger_context_utils import LoggerContextKeys, log_context
87
85
  from fides.api.util.memory_watchdog import memory_limiter
88
- from fides.common.api.v1.urn_registry import (
89
- PRIVACY_CENTER_DSR_PACKAGE,
90
- PRIVACY_REQUEST_TRANSFER_TO_PARENT,
91
- V1_URL_PREFIX,
92
- )
86
+ from fides.common.api.v1.urn_registry import PRIVACY_CENTER_DSR_PACKAGE
93
87
  from fides.config import CONFIG
94
88
  from fides.config.config_proxy import ConfigProxy
95
89
 
@@ -307,8 +301,11 @@ def upload_and_save_access_results( # pylint: disable=R0912
307
301
  ) -> list[str]:
308
302
  """Process the data uploads after the access portion of the privacy request has completed"""
309
303
  download_urls: list[str] = []
310
- # Remove manual webhook attachments from the list of attachments
311
- # This is done because the manual webhook attachments are already included in the manual_data
304
+ # Remove manual webhook attachments and request task attachments from the list of attachments
305
+ # This is done because:
306
+ # - manual webhook attachments are already included in the manual_data
307
+ # - manual task submission attachments are already included in the manual_data
308
+ # - request task attachments (from async polling) are already embedded in the dataset results
312
309
  loaded_attachments = [
313
310
  attachment
314
311
  for attachment in privacy_request.attachments
@@ -317,6 +314,7 @@ def upload_and_save_access_results( # pylint: disable=R0912
317
314
  in [
318
315
  AttachmentReferenceType.access_manual_webhook,
319
316
  AttachmentReferenceType.manual_task_submission,
317
+ AttachmentReferenceType.request_task,
320
318
  ]
321
319
  for ref in attachment.references
322
320
  )
@@ -922,78 +920,6 @@ def mark_paused_privacy_request_as_expired(privacy_request_id: str) -> None:
922
920
  db.close()
923
921
 
924
922
 
925
- def _retrieve_child_results( # pylint: disable=R0911
926
- fides_connector: Tuple[str, ConnectionConfig],
927
- rule_key: str,
928
- access_result: dict[str, list[Row]],
929
- ) -> Optional[list[dict[str, Optional[list[Row]]]]]:
930
- """Get child access request results to add to upload."""
931
- try:
932
- connector = FidesConnector(fides_connector[1])
933
- except Exception as e:
934
- logger.error(
935
- "Error create client for child server {}: {}", fides_connector[0], e
936
- )
937
- return None
938
-
939
- results = []
940
-
941
- for key, rows in access_result.items():
942
- address = CollectionAddress.from_string(key)
943
- privacy_request_id = None
944
- if address.dataset == fides_connector[0]:
945
- if not rows:
946
- logger.info("No rows found for result entry {}", key)
947
- continue
948
- privacy_request_id = rows[0]["id"]
949
-
950
- if not privacy_request_id:
951
- logger.error(
952
- "No privacy request found for connector key {}", fides_connector[0]
953
- )
954
- continue
955
-
956
- try:
957
- client = connector.create_client()
958
- except requests.exceptions.HTTPError as e:
959
- logger.error(
960
- "Error logger into to child server for privacy request {}: {}",
961
- privacy_request_id,
962
- e,
963
- )
964
- continue
965
-
966
- try:
967
- request = client.authenticated_request(
968
- method="get",
969
- path=f"{V1_URL_PREFIX}{PRIVACY_REQUEST_TRANSFER_TO_PARENT.format(privacy_request_id=privacy_request_id, rule_key=rule_key)}",
970
- headers={"Authorization": f"Bearer {client.token}"},
971
- )
972
- response = client.session.send(request)
973
- except requests.exceptions.HTTPError as e:
974
- logger.error(
975
- "Error retrieving data from child server for privacy request {}: {}",
976
- privacy_request_id,
977
- e,
978
- )
979
- continue
980
-
981
- if response.status_code != 200:
982
- logger.error(
983
- "Error retrieving data from child server for privacy request {}: {}",
984
- privacy_request_id,
985
- response.json(),
986
- )
987
- continue
988
-
989
- results.append(response.json())
990
-
991
- if not results:
992
- return None
993
-
994
- return results
995
-
996
-
997
923
  def get_consent_email_connection_configs(db: Session) -> Query:
998
924
  """Return enabled consent email connection configs."""
999
925
  return db.query(ConnectionConfig).filter(
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
- from asyncio import sleep
5
4
  from datetime import datetime, timedelta
6
5
  from typing import Any, Dict, List, Optional, Set
7
6
 
@@ -11,7 +10,7 @@ from sqlalchemy import text
11
10
  from sqlalchemy.orm import Session
12
11
  from sqlalchemy.sql.elements import TextClause
13
12
 
14
- from fides.api.common_exceptions import PrivacyRequestError, PrivacyRequestNotFound
13
+ from fides.api.common_exceptions import PrivacyRequestError
15
14
  from fides.api.models.privacy_request import (
16
15
  EXITED_EXECUTION_LOG_STATUSES,
17
16
  PrivacyRequest,
@@ -21,10 +20,7 @@ from fides.api.models.privacy_request.request_task import AsyncTaskType
21
20
  from fides.api.models.worker_task import ExecutionLogStatus
22
21
  from fides.api.schemas.drp_privacy_request import DrpPrivacyRequestCreate
23
22
  from fides.api.schemas.policy import ActionType
24
- from fides.api.schemas.privacy_request import (
25
- PrivacyRequestResponse,
26
- PrivacyRequestStatus,
27
- )
23
+ from fides.api.schemas.privacy_request import PrivacyRequestStatus
28
24
  from fides.api.schemas.redis_cache import Identity
29
25
  from fides.api.tasks import DSR_QUEUE_NAME, DatabaseTask, celery_app
30
26
  from fides.api.tasks.scheduled.scheduler import scheduler
@@ -38,7 +34,6 @@ from fides.api.util.cache import (
38
34
  reset_privacy_request_retry_count,
39
35
  )
40
36
  from fides.api.util.lock import redis_lock
41
- from fides.common.api.v1.urn_registry import PRIVACY_REQUESTS, V1_URL_PREFIX
42
37
  from fides.config import CONFIG
43
38
 
44
39
  PRIVACY_REQUEST_STATUS_CHANGE_POLL = "privacy_request_status_change_poll"
@@ -98,62 +93,6 @@ def get_async_client() -> AsyncClient:
98
93
  return AsyncClient()
99
94
 
100
95
 
101
- async def poll_server_for_completion(
102
- privacy_request_id: str,
103
- server_url: str,
104
- token: str,
105
- *,
106
- poll_interval_seconds: int = 30,
107
- timeout_seconds: int = 1800, # 30 minutes
108
- client: AsyncClient | None = None,
109
- ) -> PrivacyRequestResponse:
110
- """Poll a server for privacy request completion.
111
-
112
- Requests will report complete with if they have a status of canceled, complete,
113
- denied, or error. By default the polling will time out if not completed in 30
114
- minutes, time can be overridden by setting the timeout_seconds.
115
- """
116
- url = (
117
- f"{server_url}{V1_URL_PREFIX}{PRIVACY_REQUESTS}?request_id={privacy_request_id}"
118
- )
119
- start_time = datetime.now()
120
- elapsed_time = 0.0
121
- while elapsed_time < timeout_seconds:
122
- if client:
123
- response = await client.get(
124
- url, headers={"Authorization": f"Bearer {token}"}
125
- )
126
- else:
127
- async_client = get_async_client()
128
- response = await async_client.get(
129
- url, headers={"Authorization": f"Bearer {token}"}
130
- )
131
- response.raise_for_status()
132
-
133
- # Privacy requests are returned paginated. Since this is searching for a specific
134
- # privacy request there should only be one value present in items.
135
- items = response.json()["items"]
136
- if not items:
137
- raise PrivacyRequestNotFound(
138
- f"No privacy request found with id '{privacy_request_id}'"
139
- )
140
- status = PrivacyRequestResponse(**items[0])
141
- if status.status and status.status in (
142
- PrivacyRequestStatus.complete,
143
- PrivacyRequestStatus.canceled,
144
- PrivacyRequestStatus.error,
145
- PrivacyRequestStatus.denied,
146
- ):
147
- return status
148
-
149
- await sleep(poll_interval_seconds)
150
- time_delta = datetime.now() - start_time
151
- elapsed_time = time_delta.seconds
152
- raise TimeoutError(
153
- f"Timeout of {timeout_seconds} seconds has been exceeded while waiting for privacy request {privacy_request_id}"
154
- )
155
-
156
-
157
96
  def initiate_poll_for_exited_privacy_request_tasks() -> None:
158
97
  """Initiates scheduler to check if a Privacy Request's status needs to be flipped when all
159
98
  Request Tasks have had a chance to run"""
@@ -364,7 +303,7 @@ def initiate_interrupted_task_requeue_poll() -> None:
364
303
  )
365
304
 
366
305
 
367
- def initiate_async_tasks_status_polling() -> None:
306
+ def initiate_polling_task_requeue() -> None:
368
307
  """Initiates scheduler to check for and requeue pending polling async tasks"""
369
308
  if CONFIG.test_mode:
370
309
  return
@@ -375,13 +314,13 @@ def initiate_async_tasks_status_polling() -> None:
375
314
 
376
315
  logger.info("Initiating scheduler for async tasks status polling")
377
316
  scheduler.add_job(
378
- func=poll_async_tasks_status,
317
+ func=requeue_polling_tasks,
379
318
  trigger="interval",
380
319
  kwargs={},
381
320
  id=ASYNC_TASKS_STATUS_POLLING,
382
321
  coalesce=True,
383
322
  replace_existing=True,
384
- seconds=CONFIG.execution.async_tasks_status_polling_interval_seconds,
323
+ seconds=20,
385
324
  )
386
325
 
387
326
 
@@ -541,6 +480,27 @@ def _get_request_task_ids_in_progress(
541
480
  return [task[0] for task in request_tasks_in_progress]
542
481
 
543
482
 
483
+ def _has_polling_tasks(db: Session, privacy_request_id: str) -> bool:
484
+ """
485
+ Check if a privacy request has any polling async tasks.
486
+
487
+ Args:
488
+ db: Database session
489
+ privacy_request_id: The ID of the privacy request to check
490
+
491
+ Returns:
492
+ bool: True if the privacy request has polling tasks, False otherwise
493
+ """
494
+ return db.query(
495
+ db.query(RequestTask)
496
+ .filter(
497
+ RequestTask.privacy_request_id == privacy_request_id,
498
+ RequestTask.async_type == AsyncTaskType.polling,
499
+ )
500
+ .exists()
501
+ ).scalar()
502
+
503
+
544
504
  # pylint: disable=too-many-branches
545
505
  # pylint: disable=too-many-statements
546
506
  @celery_app.task(base=DatabaseTask, bind=True)
@@ -680,6 +640,17 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
680
640
  should_requeue = False
681
641
  break
682
642
 
643
+ # Check if the Privacy request has polling tasks
644
+ if _has_polling_tasks(db, privacy_request.id):
645
+ # If the polling request task has no cached task ID, it's stuck
646
+ logger.warning(
647
+ f"No task ID found for request task {request_task_id} "
648
+ f"(privacy request {privacy_request.id}) Contains polling tasks - "
649
+ f"keeping request in current status as it may be waiting for polling task to complete"
650
+ )
651
+ should_requeue = False
652
+ break
653
+
683
654
  # For other statuses, cancel the entire privacy request
684
655
  _cancel_interrupted_tasks_and_error_privacy_request(
685
656
  db,
@@ -706,7 +677,7 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
706
677
 
707
678
 
708
679
  @celery_app.task(base=DatabaseTask, bind=True)
709
- def poll_async_tasks_status(self: DatabaseTask) -> None:
680
+ def requeue_polling_tasks(self: DatabaseTask) -> None:
710
681
  """
711
682
  Poll the status of async tasks that are awaiting processing.
712
683
  """
@@ -720,19 +691,21 @@ def poll_async_tasks_status(self: DatabaseTask) -> None:
720
691
  with self.get_new_session() as db:
721
692
  logger.debug("Polling for async tasks status")
722
693
 
723
- # Get all tasks that are awaiting processing and are from polling async tasks
694
+ # Get all tasks that are polling and are from polling async tasks
724
695
  async_tasks = (
725
696
  db.query(RequestTask)
726
- .filter(RequestTask.status == ExecutionLogStatus.awaiting_processing)
697
+ .filter(RequestTask.status == ExecutionLogStatus.polling)
727
698
  .filter(RequestTask.async_type == AsyncTaskType.polling)
728
699
  .all()
729
700
  )
730
- logger.info(f"Found {len(async_tasks)} async tasks awaiting processing")
701
+ logger.info(f"Found {len(async_tasks)} async polling tasks")
731
702
 
732
703
  if async_tasks:
733
- from fides.api.service.async_dsr.async_dsr_service import ( # pylint: disable=cyclic-import
734
- requeue_polling_request,
735
- )
704
+ # Avoiding cyclic imports
705
+ from fides.api.task.execute_request_tasks import queue_request_task
736
706
 
737
707
  for async_task in async_tasks:
738
- requeue_polling_request(db, async_task)
708
+ logger.info(
709
+ f"Requeuing polling task {async_task.id} for processing"
710
+ )
711
+ queue_request_task(async_task, privacy_request_proceed=True)
@@ -1,6 +1,6 @@
1
1
  from enum import Enum
2
2
  from inspect import Signature, signature
3
- from typing import Callable, Dict, List, Union
3
+ from typing import TYPE_CHECKING, Callable, Dict, List, Union
4
4
 
5
5
  from loguru import logger
6
6
 
@@ -12,6 +12,9 @@ from fides.api.schemas.consentable_item import ConsentableItem, ConsentWebhookRe
12
12
  from fides.api.schemas.saas.shared_schemas import ConsentPropagationStatus
13
13
  from fides.api.util.collection_util import Row
14
14
 
15
+ if TYPE_CHECKING:
16
+ from fides.api.schemas.saas.async_polling_configuration import PollingResult
17
+
15
18
 
16
19
  # at some point this should likely be formalized more centrally...
17
20
  class SaaSRequestType(Enum):
@@ -30,6 +33,10 @@ class SaaSRequestType(Enum):
30
33
  UPDATE_CONSENT = "update_consent"
31
34
  PROCESS_CONSENT_WEBHOOK = "process_consent_webhook"
32
35
 
36
+ # Async polling request types
37
+ POLLING_STATUS = "polling_status"
38
+ POLLING_RESULT = "polling_result"
39
+
33
40
 
34
41
  RequestOverrideFunction = Callable[
35
42
  ...,
@@ -39,6 +46,8 @@ RequestOverrideFunction = Callable[
39
46
  List[Row],
40
47
  ConsentPropagationStatus,
41
48
  int,
49
+ bool, # For polling status overrides
50
+ "PollingResult", # For polling result overrides - string literal to avoid circular import
42
51
  None,
43
52
  ],
44
53
  ]
@@ -105,6 +114,10 @@ class SaaSRequestOverrideFactory:
105
114
  validate_update_consent_function(override_function)
106
115
  elif request_type == SaaSRequestType.PROCESS_CONSENT_WEBHOOK:
107
116
  validate_process_consent_webhook_function(override_function)
117
+ elif request_type == SaaSRequestType.POLLING_STATUS:
118
+ validate_polling_status_override_function(override_function)
119
+ elif request_type == SaaSRequestType.POLLING_RESULT:
120
+ validate_polling_result_override_function(override_function)
108
121
  else:
109
122
  raise ValueError(
110
123
  f"Invalid SaaSRequestType '{request_type}' provided for SaaS request override function"
@@ -264,5 +277,57 @@ def validate_process_consent_webhook_function(f: Callable) -> None:
264
277
  )
265
278
 
266
279
 
280
+ def validate_polling_status_override_function(f: Callable) -> None:
281
+ """
282
+ Perform some basic checks on the user-provided SaaS request override function
283
+ that will be used for polling status checks.
284
+
285
+ The validation is not overly strict to allow for some flexibility in
286
+ the functions that are used for overrides, but we check to ensure that
287
+ the function meets the framework's basic expectations.
288
+
289
+ Specifically, the validation checks that function's return type is `bool`
290
+ and that it declares at least 4 parameters.
291
+ """
292
+ sig: Signature = signature(f)
293
+ if sig.return_annotation is not bool:
294
+ raise InvalidSaaSRequestOverrideException(
295
+ "Polling status override function must return a bool"
296
+ )
297
+ if len(sig.parameters) < 4:
298
+ raise InvalidSaaSRequestOverrideException(
299
+ "Polling status override function must declare at least 4 parameters"
300
+ )
301
+
302
+
303
+ def validate_polling_result_override_function(f: Callable) -> None:
304
+ """
305
+ Perform some basic checks on the user-provided SaaS request override function
306
+ that will be used for polling result retrieval.
307
+
308
+ The validation is not overly strict to allow for some flexibility in
309
+ the functions that are used for overrides, but we check to ensure that
310
+ the function meets the framework's basic expectations.
311
+
312
+ Specifically, the validation checks that function's return type is `PollingResult`
313
+ and that it declares at least 4 parameters.
314
+ """
315
+ sig: Signature = signature(f)
316
+
317
+ # Import PollingResult here to avoid circular imports at module level
318
+ from fides.api.schemas.saas.async_polling_configuration import PollingResult
319
+
320
+ # Check return type annotation - handle both direct class and string literals
321
+ return_annotation = sig.return_annotation
322
+ if return_annotation not in (PollingResult, "PollingResult"):
323
+ raise InvalidSaaSRequestOverrideException(
324
+ "Polling result override function must return a PollingResult"
325
+ )
326
+ if len(sig.parameters) < 4:
327
+ raise InvalidSaaSRequestOverrideException(
328
+ "Polling result override function must declare at least 4 parameters"
329
+ )
330
+
331
+
267
332
  # TODO: Avoid running this on import?
268
333
  register = SaaSRequestOverrideFactory.register
@@ -22,7 +22,10 @@ from fides.api.common_exceptions import (
22
22
  from fides.api.graph.config import TERMINATOR_ADDRESS, CollectionAddress
23
23
  from fides.api.models.connectionconfig import ConnectionConfig
24
24
  from fides.api.models.privacy_request import ExecutionLog, PrivacyRequest, RequestTask
25
- from fides.api.models.worker_task import ExecutionLogStatus
25
+ from fides.api.models.worker_task import (
26
+ RESUMABLE_EXECUTION_LOG_STATUSES,
27
+ ExecutionLogStatus,
28
+ )
26
29
  from fides.api.schemas.policy import ActionType, CurrentStep
27
30
  from fides.api.schemas.privacy_request import PrivacyRequestStatus
28
31
  from fides.api.task.graph_task import (
@@ -162,7 +165,7 @@ def can_run_task_body(
162
165
  if request_task.is_root_task:
163
166
  # Shouldn't be possible but adding as a catch-all
164
167
  return False
165
- if request_task.status != ExecutionLogStatus.pending:
168
+ if request_task.status not in RESUMABLE_EXECUTION_LOG_STATUSES:
166
169
  logger_method(request_task)(
167
170
  "Skipping {} task {} with status {}.",
168
171
  request_task.action_type,
@@ -6,10 +6,43 @@ from loguru import logger
6
6
 
7
7
  from fides.api.graph.config import CollectionAddress, FieldPath
8
8
  from fides.api.graph.graph import DatasetGraph
9
+ from fides.api.service.storage.util import is_attachment_field
9
10
  from fides.api.task.manual.manual_task_address import ManualTaskAddress
10
11
  from fides.api.util.collection_util import Row
11
12
 
12
13
 
14
+ def should_skip_data_category_filtering(
15
+ node_address: str, results: List[Dict[str, Optional[Any]]]
16
+ ) -> bool:
17
+ """
18
+ Determine if results should skip data category filtering.
19
+
20
+ This includes:
21
+ 1. Manual task data - controlled by field definitions, not data categories
22
+ 2. Attachment data - should be preserved regardless of data categories (from polling or manual tasks)
23
+
24
+ :param node_address: The collection address being processed
25
+ :param results: The results data to check
26
+ :return: True if filtering should be skipped, False otherwise
27
+ """
28
+ # Check if this is a manual task address
29
+ if ManualTaskAddress.is_manual_task_address(node_address):
30
+ return True
31
+
32
+ # Check if results contain attachment data
33
+ if not results:
34
+ return False
35
+
36
+ # Verify it looks like actual attachment data
37
+ for result in results:
38
+ if isinstance(result, dict) and any(
39
+ is_attachment_field(value) for value in result.values()
40
+ ):
41
+ return True
42
+
43
+ return False
44
+
45
+
13
46
  def filter_data_categories(
14
47
  access_request_results: Dict[str, List[Dict[str, Optional[Any]]]],
15
48
  target_categories: Set[str],
@@ -38,8 +71,8 @@ def filter_data_categories(
38
71
  if not results:
39
72
  continue
40
73
 
41
- # Skip manual task data - it doesn't need filtering since it's controlled by field definitions
42
- if ManualTaskAddress.is_manual_task_address(node_address):
74
+ # Skip data that doesn't need filtering (manual tasks and attachment data)
75
+ if should_skip_data_category_filtering(node_address, results):
43
76
  filtered_access_results[node_address].extend(results)
44
77
  continue
45
78
 
@@ -13,6 +13,7 @@ from sqlalchemy.orm import Session
13
13
  from fides.api.api.deps import get_autoclose_db_session as get_db
14
14
  from fides.api.common_exceptions import (
15
15
  ActionDisabled,
16
+ AwaitingAsyncProcessing,
16
17
  AwaitingAsyncTask,
17
18
  CollectionDisabled,
18
19
  NotSupportedForCollection,
@@ -96,6 +97,7 @@ def retry(
96
97
  If we exceed the number of TASK_RETRY_COUNT retries, we re-raise the exception to stop execution of the privacy request.
97
98
  """
98
99
 
100
+ # pylint: disable=too-many-return-statements
99
101
  def decorator(func: Callable) -> Callable:
100
102
  @wraps(func)
101
103
  def result(*args: Any, **kwargs: Any) -> Any:
@@ -115,6 +117,17 @@ def retry(
115
117
  self.log_start(action_type)
116
118
  # Run access or erasure request
117
119
  return func(*args, **kwargs)
120
+ except AwaitingAsyncProcessing as ex:
121
+ logger.warning(
122
+ "Request Task {} {} {} async processing in progress",
123
+ self.request_task.id if self.request_task.id else None,
124
+ method_name,
125
+ self.execution_node.address,
126
+ )
127
+ # Log the async processing status and exit without retrying.
128
+ self.log_async_processing(action_type, ex)
129
+ # Request Task put in "polling" status and exited, external system is processing
130
+ return None
118
131
  except AwaitingAsyncTask as ex:
119
132
  logger.warning(
120
133
  "Request Task {} {} {} awaiting async continuation",
@@ -416,9 +429,13 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
416
429
  # created to keep these in sync.
417
430
  # TODO remove conditional above alongside deprecating DSR 2.0
418
431
  if self.request_task.id:
419
- # Merge the request task to ensure we keep the changes made
420
- # to self.request_task that haven't yet been committed to the database
432
+ # Merge the request_task into the current session to make it persistent,
433
+ # then refresh its `async_type` to load the latest state from the
434
+ # database. This is crucial for async tasks where `async_type` might be
435
+ # updated by another process, and avoids overwriting local data like
436
+ # `access_data`.
421
437
  request_task = db.merge(self.request_task)
438
+ db.refresh(request_task, attribute_names=["async_type"])
422
439
  request_task.update_status(db, status)
423
440
  self.request_task = request_task
424
441
 
@@ -453,6 +470,21 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
453
470
  message, [], action_type, ExecutionLogStatus.awaiting_processing
454
471
  )
455
472
 
473
+ def log_async_processing(
474
+ self,
475
+ action_type: ActionType,
476
+ ex: Optional[BaseException],
477
+ extra_message: Optional[str] = None,
478
+ ) -> None:
479
+ """On async processing activities - external system is actively processing, Fides is polling"""
480
+ logger.info("Polling for async results on node {}", self.key)
481
+
482
+ message = str(ex)
483
+ if extra_message:
484
+ message = f"{message}. {extra_message}"
485
+
486
+ self.update_status(message, [], action_type, ExecutionLogStatus.polling)
487
+
456
488
  def log_skipped(self, action_type: ActionType, ex: str) -> None:
457
489
  """Log that a collection was skipped. For now, this is because a collection has been disabled."""
458
490
  logger.info("Skipping node {}", self.key)
@@ -26,6 +26,7 @@ PRIVACY_REQUEST_ID = "privacy_request_id"
26
26
  MASKED_OBJECT_FIELDS = "masked_object_fields"
27
27
  ALL_OBJECT_FIELDS = "all_object_fields"
28
28
  CUSTOM_PRIVACY_REQUEST_FIELDS = "custom_privacy_request_fields"
29
+ PRIVACY_REQUEST_OBJECT = "privacy_request"
29
30
  UUID = "uuid"
30
31
  ISO_8601_DATETIME = "iso_8601_datetime"
31
32
  FIELD_LIST = "field_list"
@@ -61,9 +61,13 @@ class ExecutionSettings(FidesSettings):
61
61
  default=3,
62
62
  description="The number of times a privacy request will be requeued when its tasks are interrupted before being marked as error",
63
63
  )
64
- async_tasks_status_polling_interval_seconds: int = Field(
65
- default=3600,
66
- description="Seconds between polling for async tasks to requeue",
64
+ async_polling_interval_hours: int = Field(
65
+ default=24,
66
+ description="Hours between status checks for async tasks",
67
+ )
68
+ async_polling_request_timeout_days: int = Field(
69
+ default=30,
70
+ description="Maximum time in days to wait for an async polling request to complete before timing out",
67
71
  )
68
72
  erasure_request_finalization_required: bool = Field(
69
73
  default=False,
@@ -9,6 +9,8 @@ languages:
9
9
  name: Catalan
10
10
  - id: cs
11
11
  name: Czech
12
+ - id: cy
13
+ name: Welsh
12
14
  - id: da
13
15
  name: Danish
14
16
  - id: de
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/295d729ea1b11885.css" as="style"/><link rel="stylesheet" href="/_next/static/css/295d729ea1b11885.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-2766492c5dbceb0a.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-c1c2f757b1f3da12.js" defer=""></script><script src="/_next/static/chunks/pages/404-2eb8aed4939f1142.js" defer=""></script><script src="/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js" defer=""></script><script src="/_next/static/_IxwgneyQjdSaZFEF3Tqu/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"_IxwgneyQjdSaZFEF3Tqu","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/372d6a236c84613f.css" as="style"/><link rel="stylesheet" href="/_next/static/css/372d6a236c84613f.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-118fb4723d13c14f.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-9e869a44215709ed.js" defer=""></script><script src="/_next/static/chunks/pages/404-2014144a1a0fa64f.js" defer=""></script><script src="/_next/static/zmEQMSpOBih8kmA1t-EWO/_buildManifest.js" defer=""></script><script src="/_next/static/zmEQMSpOBih8kmA1t-EWO/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"zmEQMSpOBih8kmA1t-EWO","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1099],{56632:function(e,t,n){var i=n(89278),a=n(80068),o=n(50098);e.exports=function(e){return function(t,n,r){var s=Object(t);if(!a(t)){var l=i(n,3);t=o(t),n=function(e){return l(s[e],e,s)}}var c=e(t,n,r);return c>-1?s[l?t[c]:c]:void 0}}},64925:function(e,t,n){var i=n(56632)(n(66259));e.exports=i},66259:function(e,t,n){var i=n(95372),a=n(89278),o=n(47991),r=Math.max;e.exports=function(e,t,n){var s=null==e?0:e.length;if(!s)return -1;var l=null==n?0:o(n);return l<0&&(l=r(s+l,0)),i(e,a(t,3),l)}},94919:function(e,t,n){var i=n(91936),a=1/0;e.exports=function(e){return e?(e=i(e))===a||e===-a?(e<0?-1:1)*17976931348623157e292:e==e?e:0:0===e?e:0}},47991:function(e,t,n){var i=n(94919);e.exports=function(e){var t=i(e),n=t%1;return t==t?n?t-n:t:0}},12627:function(e,t,n){"use strict";var i=n(24246),a=n(79283),o=n(34929);t.Z=e=>{let{selectedTaxonomies:t,showDisabled:n=!1,...r}=e,{getDataCategoryDisplayNameProps:s,getDataCategories:l}=(0,o.Z)(),c=(n?l():l().filter(e=>e.active)).filter(e=>!(null==t?void 0:t.includes(e.fides_key))).map(e=>{let{name:t,primaryName:n}=s(e.fides_key);return{value:e.fides_key,name:t,primaryName:n,description:e.description||""}});return(0,i.jsx)(a.l,{options:c,...r})}},79283:function(e,t,n){"use strict";n.d(t,{l:function(){return d}});var i=n(24246),a=n(20595),o=n(72707),r=n.n(o);let s=e=>{let{data:{formattedTitle:t,description:n,name:o,primaryName:r}}=e;return(0,i.jsxs)(a.jqI,{gap:12,title:"".concat(t," - ").concat(n),children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("strong",{children:r||o}),r&&": ".concat(o)]}),(0,i.jsx)("em",{children:n})]})},l=e=>"options"in e&&Array.isArray(e.options),c=e=>({...e,className:r().option,formattedTitle:e.formattedTitle||[e.primaryName,e.name].filter(e=>e).join(": ")}),d=e=>{let{options:t,...n}=e,o=null==t?void 0:t.map(e=>l(e)?{...e,options:e.options.map(c)}:c(e));return(0,i.jsx)(a.WPr,{options:o,filterOption:(e,t)=>{var n,i;return(null==t?void 0:null===(n=t.formattedTitle)||void 0===n?void 0:n.toLowerCase().includes(e.toLowerCase()))||(null==t?void 0:null===(i=t.value)||void 0===i?void 0:i.toLowerCase().includes(e.toLowerCase()))||!1},optionFilterProp:"label",autoFocus:!0,variant:"borderless",optionRender:s,styles:{popup:{root:{minWidth:"500px"}}},className:"w-full p-0","data-testid":"taxonomy-select",...n})}},34929:function(e,t,n){"use strict";var i=n(24246),a=n(64925),o=n.n(a),r=n(27378),s=n(16134),l=n(30002),c=n(28079),d=n(57072);let u=()=>{let{isLoading:e}=(0,c.fd)(),t=(0,s.C)(c.U3),{isLoading:n}=(0,d.MO)(),i=(0,s.C)(d.qb),{isLoading:a}=(0,l.te)();return{dataUses:t,dataSubjects:(0,s.C)(l.ZL),dataCategories:i,isLoading:e||n||a}};t.Z=()=>{let{dataUses:e,dataCategories:t,dataSubjects:n,isLoading:a}=u(),s=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return e.split(".").slice(0,t).join(".")},l=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,i=t(e);if(!i)return{};let a=t(s(e,n)),o=!!i.parent_key;return{name:i.name||void 0,primaryName:o&&(null==a?void 0:a.name)!==i.name&&(null==a?void 0:a.name)||void 0}},c=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,{name:a,primaryName:o}=l(e,t,n);return a?o?(0,i.jsxs)(r.Fragment,{children:[(0,i.jsxs)("strong",{children:[o,":"]})," ",a]},e):(0,i.jsx)("strong",{children:a},e):e},d=t=>o()(e,{fides_key:t}),f=e=>o()(t,{fides_key:e}),v=e=>o()(n,{fides_key:e});return{getDataUses:()=>e,getDataUseByKey:d,getDataUseDisplayName:e=>c(e,d,1),getDataUseDisplayNameProps:e=>l(e,d,1),getDataCategories:()=>t,getDataCategoryByKey:f,getDataCategoryDisplayName:e=>c(e,f,2),getDataCategoryDisplayNameProps:e=>l(e,f,2),getDataSubjects:()=>n,getDataSubjectByKey:v,getDataSubjectDisplayName:e=>{let t=v(e);return t?t.name:e},getPrimaryKey:s,isLoading:a}}},61099:function(e,t,n){"use strict";var i=n(24246),a=n(20595),o=n(27378),r=n(12627),s=n(34929),l=n(26183),c=n(70675);t.Z=e=>{var t,n,d;let{resource:u}=e,[f,v]=(0,o.useState)(!1),{getDataCategoryDisplayName:p}=(0,s.Z)(),[g]=(0,c.NA)(),m=(null===(t=u.classifications)||void 0===t?void 0:t.length)?u.classifications[0].label:null,x=null!==(d=u.user_assigned_data_categories)&&void 0!==d?d:[],h=!m&&!(null==x?void 0:x.length),_=null===(n=u.sub_field_urns)||void 0===n?void 0:n.length,j=e=>{g({staged_resource_urn:u.urn,monitor_config_id:u.monitor_config_id,user_assigned_data_categories:[...x,e]})},y=e=>{var t;g({staged_resource_urn:u.urn,monitor_config_id:u.monitor_config_id,user_assigned_data_categories:null!==(t=null==x?void 0:x.filter(t=>t!==e))&&void 0!==t?t:[]})},b=!f&&!!x.length,w=!f&&!!m&&!x.length;return(0,i.jsxs)(l.Z,{"data-testid":"edit-category-cell",children:[h&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.j8w,{"data-testid":"no-classifications",color:"white",children:"None"}),!_&&(0,i.jsx)(a.j8w,{onClick:()=>v(!0),addable:!0,"data-testid":"taxonomy-add-btn","aria-label":"Add category"})]}),b&&(0,i.jsxs)(i.Fragment,{children:[x.map(e=>(0,i.jsx)(a.j8w,{"data-testid":"user-classification-".concat(e),color:"white",closable:!0,onClose:()=>y(e),closeButtonLabel:"Remove category",children:p(e)},e)),(0,i.jsx)(a.j8w,{onClick:()=>v(!0),addable:!0,"data-testid":"taxonomy-add-btn","aria-label":"Add category"})]}),w&&(0,i.jsxs)(a.j8w,{onClick:()=>v(!0),color:"white","data-testid":"classification-".concat(m),hasSparkle:!0,children:[p(m),(0,i.jsx)(a.PJP.I8b,{size:10})]}),f&&(0,i.jsx)(a.xuv,{className:"select-wrapper",position:"absolute",zIndex:10,top:"0",left:"0",width:"100%",height:"max",bgColor:"#fff",children:(0,i.jsx)(r.Z,{selectedTaxonomies:x,onChange:e=>{v(!1),j(e)},onBlur:()=>v(!1),open:!0})})]})}},26183:function(e,t,n){"use strict";var i=n(24246);n(27378),t.Z=e=>{let{children:t,className:n,...a}=e;return(0,i.jsx)("div",{className:"relative flex w-full flex-wrap items-center gap-2 overflow-x-auto py-2 ".concat(n||""),...a,children:t})}},57072:function(e,t,n){"use strict";n.d(t,{Bd:function(){return i.Bd},L5:function(){return i.L5},MO:function(){return i.MO},qb:function(){return i.qb}});var i=n(5785)},72707:function(e){e.exports={option:"TaxonomySelect_option__vY6v2"}}}]);