ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.74.0rc1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ethyca-fides might be problematic. Click here for more details.

Files changed (495) hide show
  1. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/METADATA +3 -2
  2. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/RECORD +377 -327
  3. fides/_version.py +3 -3
  4. fides/api/alembic/alembic.ini +5 -1
  5. fides/api/alembic/migrations/env.py +7 -1
  6. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
  7. fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
  8. fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
  9. fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
  10. fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
  11. fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
  12. fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
  13. fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
  14. fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
  15. fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
  16. fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
  17. fides/api/api/v1/endpoints/generic_overrides.py +75 -6
  18. fides/api/api/v1/endpoints/privacy_request_endpoints.py +60 -6
  19. fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
  20. fides/api/api/v1/endpoints/system.py +11 -43
  21. fides/api/api/v1/endpoints/user_endpoints.py +8 -1
  22. fides/api/app_setup.py +1 -3
  23. fides/api/common_exceptions.py +8 -0
  24. fides/api/db/base.py +2 -0
  25. fides/api/db/database.py +257 -2
  26. fides/api/email_templates/get_email_template.py +3 -0
  27. fides/api/email_templates/template_names.py +1 -0
  28. fides/api/email_templates/templates/manual_task_digest.html +316 -0
  29. fides/api/main.py +2 -2
  30. fides/api/models/attachment.py +1 -0
  31. fides/api/models/detection_discovery/__init__.py +2 -0
  32. fides/api/models/detection_discovery/core.py +10 -0
  33. fides/api/models/detection_discovery/monitor_task.py +1 -0
  34. fides/api/models/detection_discovery/staged_resource_error.py +25 -0
  35. fides/api/models/digest/__init__.py +2 -0
  36. fides/api/models/digest/digest_config.py +10 -1
  37. fides/api/models/digest/digest_execution.py +142 -0
  38. fides/api/models/event_audit.py +17 -0
  39. fides/api/models/identity_definition.py +65 -0
  40. fides/api/models/messaging_template.py +7 -0
  41. fides/api/models/privacy_experience.py +11 -0
  42. fides/api/models/privacy_preference.py +2 -0
  43. fides/api/models/privacy_request/duplicate_group.py +84 -0
  44. fides/api/models/privacy_request/privacy_request.py +56 -8
  45. fides/api/models/privacy_request/request_task.py +98 -1
  46. fides/api/models/sql_models.py +3 -0
  47. fides/api/models/taxonomy.py +14 -4
  48. fides/api/models/v3/__init__.py +0 -0
  49. fides/api/models/v3/privacy_preferences.py +85 -0
  50. fides/api/models/worker_task.py +8 -0
  51. fides/api/schemas/application_config.py +28 -0
  52. fides/api/schemas/connection_configuration/connection_config.py +1 -30
  53. fides/api/schemas/messaging/messaging.py +15 -0
  54. fides/api/schemas/privacy_request.py +17 -3
  55. fides/api/schemas/saas/async_polling_configuration.py +81 -0
  56. fides/api/schemas/saas/saas_config.py +10 -3
  57. fides/api/schemas/saas/strategy_configuration.py +0 -12
  58. fides/api/schemas/taxonomy_extensions.py +8 -0
  59. fides/api/service/async_dsr/handlers/__init__.py +0 -0
  60. fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
  61. fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
  62. fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
  63. fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
  64. fides/api/service/async_dsr/strategies/__init__.py +0 -0
  65. fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
  66. fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
  67. fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
  68. fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +686 -0
  69. fides/api/service/async_dsr/utils.py +130 -0
  70. fides/api/service/connectors/bigquery_connector.py +34 -16
  71. fides/api/service/connectors/fides/fides_client.py +63 -1
  72. fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
  73. fides/api/service/connectors/saas/connector_registry_service.py +1 -138
  74. fides/api/service/connectors/saas_connector.py +116 -94
  75. fides/api/service/connectors/sql_connector.py +14 -4
  76. fides/api/service/deps.py +8 -0
  77. fides/api/service/messaging/message_dispatch_service.py +38 -1
  78. fides/api/service/privacy_request/attachment_handling.py +9 -2
  79. fides/api/service/privacy_request/duplication_detection.py +424 -0
  80. fides/api/service/privacy_request/request_runner_service.py +46 -84
  81. fides/api/service/privacy_request/request_service.py +47 -74
  82. fides/api/service/saas_request/saas_request_override_factory.py +71 -1
  83. fides/api/task/execute_request_tasks.py +17 -9
  84. fides/api/task/filter_results.py +35 -2
  85. fides/api/task/graph_task.py +37 -8
  86. fides/api/tasks/__init__.py +0 -1
  87. fides/api/util/connection_util.py +99 -215
  88. fides/api/util/event_audit_util.py +230 -0
  89. fides/api/util/logger_context_utils.py +3 -1
  90. fides/api/util/masking_util.py +31 -0
  91. fides/api/util/memory_watchdog.py +118 -0
  92. fides/api/util/saas_config_updater.py +66 -0
  93. fides/api/util/saas_util.py +28 -1
  94. fides/common/api/scope_registry.py +0 -7
  95. fides/common/api/v1/urn_registry.py +2 -0
  96. fides/config/__init__.py +10 -1
  97. fides/config/celery_settings.py +42 -0
  98. fides/config/config_proxy.py +10 -0
  99. fides/config/duplicate_detection_settings.py +31 -0
  100. fides/config/execution_settings.py +7 -3
  101. fides/config/utils.py +5 -0
  102. fides/data/language/languages.yml +2 -0
  103. fides/service/connection/__init__.py +0 -0
  104. fides/service/connection/connection_service.py +651 -0
  105. fides/service/event_audit_service.py +16 -22
  106. fides/service/privacy_request/privacy_request_service.py +162 -43
  107. fides/service/taxonomy/handlers/legacy_handler.py +3 -3
  108. fides/service/taxonomy/taxonomy_service.py +15 -15
  109. fides/ui-build/static/admin/404.html +1 -1
  110. fides/ui-build/static/admin/_next/static/FZTEUgamBvOhgPWce135w/_buildManifest.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-0da062111df309bf.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/1817-508b16628e8eb225.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/1840-5bbe6d878ed73fb4.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.afe8cad52f904fcf.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-fe1a06d82c0413f1.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/2397-40b8db1cb2f23e2a.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/2921-b10bbc3a9104933b.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/3377-eb5cd82b3ee6ab0c.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/3655-93ecd09f1cb9dbef.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-6db05a35ae806825.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-44255a63d6d80ff5.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/401-fe8db8b5d8f600de.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/4277-13bcf4516326d474.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/4496-bed72bd5639075be.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/4817-d29f40d4ce729f37.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/5185-b2ac9fecc00b67e7.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/5258-4672eae0656430f9.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/5487-8dedd1ca94fbba54.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/549-6e2442db533a711e.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/5643-55d758444a8d7162.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/5724-1e40975cefa405f0.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-6055edba275155ca.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/6084-82e2df433fe5ba85.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/6344-3e21444374f8059f.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/6362-12e3fd23130ccf15.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/6372-a8d0f08dac1ebd0e.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/6780-3db5133c1f4c6f1e.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/6853-1adbdf6418ec3d62.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/6954-aa0c60ee1092be8e.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/7059-12be23a345a94c1e.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/7079-6e6efc3396ff1ebb.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/7218-d297a4a06f924b09.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/7245-686665c197b58e68.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-a43c046c24de37cc.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/7630-c654c61ba98d8c74.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/7654-716cf37a020b3d11.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-e83ace3c6ab99ac7.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/8212-b9e8295ca883c9f8.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/8939-4925751c57c51f87.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  157. fides/ui-build/static/admin/_next/static/chunks/9046-e4daf28840a69fd6.js +1 -0
  158. fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-550bd50d538c5f79.js} +3 -3
  159. fides/ui-build/static/admin/_next/static/chunks/9330-e519adec48222d45.js +1 -0
  160. fides/ui-build/static/admin/_next/static/chunks/9341-bfc0e59bcc56c604.js +1 -0
  161. fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
  162. fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.7d029a5383595b69.js} +1 -1
  163. fides/ui-build/static/admin/_next/static/chunks/9682-da69ac5d06f281da.js +1 -0
  164. fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-657652d55936a8c6.js} +1 -1
  165. fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
  166. fides/ui-build/static/admin/_next/static/chunks/9965-56c5e4fc9cd3b3a5.js +1 -0
  167. fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-d079b8bf35250874.js} +1 -1
  168. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-e64fd8510033a27c.js} +63 -63
  169. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ddd9d7d40847fc28.js +1 -0
  170. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-b4d18c1f4d414f5f.js +1 -0
  171. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d451bc8932330141.js +1 -0
  172. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-c24663cd5dec57db.js} +1 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-d93418688bd258eb.js} +1 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-9b1f2b1c06968166.js} +1 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-115a085e5d42de45.js} +1 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d9b7b311195df29e.js +1 -0
  177. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-3de34624829cbce8.js} +1 -1
  178. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-dc95e7ed278d1a29.js} +1 -1
  179. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cdfc9bb19f47c709.js +1 -0
  180. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-0b995b01dc4dbd1f.js} +1 -1
  181. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-e3ad3a55624e302a.js +1 -0
  182. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-b37ed76849330edd.js} +1 -1
  183. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-dd82729296dee5c5.js} +1 -1
  184. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-49e5477eb1a11b92.js +1 -0
  185. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-dfc1ead4a12c9ffa.js +1 -0
  186. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-8442eb219958ac7e.js} +1 -1
  187. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-feda358d1801c18d.js +1 -0
  188. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d16acb6fc07aad46.js +1 -0
  189. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-c51a1e98c45d231a.js +1 -0
  190. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
  191. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-bcfe38eebca30f8c.js +1 -0
  192. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-f66d0655897c4400.js +1 -0
  193. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
  194. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6f1e012cd641da19.js +1 -0
  195. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-581d6248fcf98d17.js +1 -0
  196. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-ddc1c1641e1e9430.js} +1 -1
  197. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-2b48f7e524743b2b.js} +1 -1
  198. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-862b67418600251e.js} +1 -1
  199. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-0ffec855f5df262c.js} +1 -1
  200. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a030ab8c2e2b0db.js +1 -0
  201. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-6cb66f649b8ca4bf.js +1 -0
  202. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-0b008dad90b00aaa.js +1 -0
  203. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-5566edf9a9d1be2d.js +1 -0
  204. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4ca1f485b6e9e02.js +1 -0
  205. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-85dee7e81dc4bafb.js +1 -0
  206. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-e905e018a2cab35d.js +1 -0
  207. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-912723bc86299b1a.js +1 -0
  208. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f1f0affc18327033.js +1 -0
  209. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-692d27dbe9392c9f.js} +1 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-1b94e2d769a182b2.js +1 -0
  212. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adfe6c5ac5b703d0.js +1 -0
  213. fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-f9be7080ebbb7445.js +1 -0
  214. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-caaa8602a1d449b1.js +1 -0
  215. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-9b106b1d2d93985b.js +1 -0
  216. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-6a1ded8cdde836c4.js +1 -0
  217. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-f94e3accf9507ebf.js +1 -0
  218. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-5e83220ff1f2a250.js +1 -0
  219. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-a03cbd698a23e5b3.js +1 -0
  220. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-3cde574b3c8447c0.js +1 -0
  221. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-0448bb4ae8536c58.js +1 -0
  222. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-1621a4b87c432117.js +1 -0
  223. fides/ui-build/static/admin/_next/static/chunks/pages/notifications-4ea28f6b1dd63642.js +1 -0
  224. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-e02516d9fd314528.js +1 -0
  225. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-fec08bea801b4918.js +1 -0
  226. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d911e5fbf5a4a888.js +1 -0
  227. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-91b1adcac6a57b2d.js +1 -0
  228. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-de309d8813b1ebfb.js +1 -0
  229. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-f2943c1309062284.js +1 -0
  230. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-03eda417711ae909.js} +1 -1
  231. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1fe486f3af832c80.js +1 -0
  232. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-ea6f78fa8b2d3f6c.js +1 -0
  233. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-bda7b474493e7128.js} +1 -1
  234. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-2c0ec8fed16c20ae.js +1 -0
  235. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-30d298a47e85709f.js} +1 -1
  236. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-438084cca0d0f10d.js} +1 -1
  237. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-17fd44d98f5bd5b6.js} +1 -1
  238. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-baf77d34a3b3bece.js +1 -0
  239. fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-8c80391025ca7339.js +1 -0
  240. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7c19810858b708cc.js +1 -0
  241. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee8820fe0fa14c77.js +1 -0
  242. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{[id]-bd1042a0e9be6aff.js → [id]-8eb862182f19a6c2.js} +1 -1
  243. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{new-469ad83c8cfa1290.js → new-37c29ef618e9fe3c.js} +1 -1
  244. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-1db425150dcb1b6b.js +1 -0
  245. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-e334b43fa5c5b1e6.js} +1 -1
  246. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-9d18eb5c38d85522.js +1 -0
  247. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-cb937ed7c4b1e5a8.js} +1 -1
  248. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-835281251f0785cd.js} +1 -1
  249. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-7fd050c92866938c.js} +1 -1
  250. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-59ea66130fca0d05.js +1 -0
  251. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-b0fe1051d908f366.js} +1 -1
  252. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f108bf5015144d2f.js +1 -0
  253. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-0e7c7228d01290ea.js} +1 -1
  254. fides/ui-build/static/admin/_next/static/chunks/pages/systems-adc13b542e10a37d.js +1 -0
  255. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-23dd250da26511c5.js +1 -0
  256. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-aed30fb22ae7c9ec.js} +1 -1
  257. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-6b88ca3e02ee67c9.js} +1 -1
  258. fides/ui-build/static/admin/_next/static/chunks/webpack-6f97ebe373e7ef6b.js +1 -0
  259. fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
  260. fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
  261. fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
  262. fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
  263. fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
  264. fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
  265. fides/ui-build/static/admin/_next/static/css/65ae906f224cd8ae.css +1 -0
  266. fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
  267. fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
  268. fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
  269. fides/ui-build/static/admin/_next/static/css/d5701118537cbdd2.css +1 -0
  270. fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
  271. fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
  272. fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
  273. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  274. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  275. fides/ui-build/static/admin/add-systems.html +1 -1
  276. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  277. fides/ui-build/static/admin/consent/configure.html +1 -1
  278. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  279. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  280. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  281. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  282. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  283. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  284. fides/ui-build/static/admin/consent/properties.html +1 -1
  285. fides/ui-build/static/admin/consent/reporting.html +1 -1
  286. fides/ui-build/static/admin/consent.html +1 -1
  287. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  288. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  289. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  290. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  291. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  292. fides/ui-build/static/admin/data-catalog.html +1 -1
  293. fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -0
  294. fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
  295. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
  296. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
  297. fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
  298. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  299. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  300. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  301. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  302. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  303. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  304. fides/ui-build/static/admin/datamap.html +1 -1
  305. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  306. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  307. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  308. fides/ui-build/static/admin/dataset/new.html +1 -1
  309. fides/ui-build/static/admin/dataset.html +1 -1
  310. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  311. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  312. fides/ui-build/static/admin/datastore-connection.html +1 -1
  313. fides/ui-build/static/admin/index.html +1 -1
  314. fides/ui-build/static/admin/integrations/[id].html +1 -1
  315. fides/ui-build/static/admin/integrations.html +1 -1
  316. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  317. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  318. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  319. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  320. fides/ui-build/static/admin/lib/fides.js +3 -3
  321. fides/ui-build/static/admin/login/[provider].html +1 -1
  322. fides/ui-build/static/admin/login.html +1 -1
  323. fides/ui-build/static/admin/new-privacy-requests.html +1 -0
  324. fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
  325. fides/ui-build/static/admin/notifications/digests/new.html +1 -0
  326. fides/ui-build/static/admin/notifications/digests.html +1 -0
  327. fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
  328. fides/ui-build/static/admin/notifications/providers/new.html +1 -0
  329. fides/ui-build/static/admin/notifications/providers.html +1 -0
  330. fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
  331. fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
  332. fides/ui-build/static/admin/notifications/templates.html +1 -0
  333. fides/ui-build/static/admin/notifications.html +1 -0
  334. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  335. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  336. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  337. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  338. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  339. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  340. fides/ui-build/static/admin/poc/forms.html +1 -1
  341. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  342. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  343. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  344. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  345. fides/ui-build/static/admin/privacy-requests.html +1 -1
  346. fides/ui-build/static/admin/properties/[id].html +1 -1
  347. fides/ui-build/static/admin/properties/add-property.html +1 -1
  348. fides/ui-build/static/admin/properties.html +1 -1
  349. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  350. fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -0
  351. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  352. fides/ui-build/static/admin/settings/about.html +1 -1
  353. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  354. fides/ui-build/static/admin/settings/consent.html +1 -1
  355. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  356. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  357. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  358. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  359. fides/ui-build/static/admin/settings/domains.html +1 -1
  360. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  361. fides/ui-build/static/admin/settings/locations.html +1 -1
  362. fides/ui-build/static/admin/settings/organization.html +1 -1
  363. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  364. fides/ui-build/static/admin/settings/regulations.html +1 -1
  365. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  366. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  367. fides/ui-build/static/admin/systems.html +1 -1
  368. fides/ui-build/static/admin/taxonomy.html +1 -1
  369. fides/ui-build/static/admin/user-management/new.html +1 -1
  370. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  371. fides/ui-build/static/admin/user-management.html +1 -1
  372. fides/api/service/async_dsr/async_dsr_service.py +0 -195
  373. fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
  374. fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
  375. fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
  376. fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
  377. fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
  378. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
  379. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
  380. fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
  381. fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +0 -1
  382. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +0 -1
  383. fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
  384. fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
  385. fides/ui-build/static/admin/_next/static/chunks/2921-66f65496c3a09316.js +0 -1
  386. fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +0 -1
  387. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
  388. fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +0 -1
  389. fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
  390. fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
  391. fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
  392. fides/ui-build/static/admin/_next/static/chunks/401-ffe4e8436e1eceb9.js +0 -1
  393. fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
  394. fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
  395. fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
  396. fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
  397. fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
  398. fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
  399. fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
  400. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
  401. fides/ui-build/static/admin/_next/static/chunks/5185-51eaa78e3ed6bfb7.js +0 -1
  402. fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +0 -1
  403. fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
  404. fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
  405. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
  406. fides/ui-build/static/admin/_next/static/chunks/5643-10a36584c399526c.js +0 -1
  407. fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +0 -1
  408. fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +0 -1
  409. fides/ui-build/static/admin/_next/static/chunks/6853-7004a8c420b1ca02.js +0 -1
  410. fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
  411. fides/ui-build/static/admin/_next/static/chunks/6954-4b24e1731c1cc3b3.js +0 -1
  412. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
  413. fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
  414. fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
  415. fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
  416. fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
  417. fides/ui-build/static/admin/_next/static/chunks/7630-d0d3a0fe3f95e971.js +0 -1
  418. fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
  419. fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
  420. fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
  421. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
  422. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
  423. fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
  424. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
  425. fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
  426. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
  427. fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
  428. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
  429. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-2ca59996860a33c5.js +0 -1
  430. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
  431. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-92182be6603c2842.js +0 -1
  432. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-ab54b19609bff325.js +0 -1
  433. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
  434. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
  435. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
  436. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
  437. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
  438. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
  439. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
  440. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
  441. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
  442. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
  443. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
  444. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
  445. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
  446. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
  447. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
  448. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
  449. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
  450. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
  451. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
  452. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
  453. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-e8d2140787045acd.js +0 -1
  454. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-e3f93462a08251bf.js +0 -1
  455. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-b5f7d6afdecd013d.js +0 -1
  456. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-248ad9f65a872442.js +0 -1
  457. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-aedb66a62042b10a.js +0 -1
  458. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-018df38b7cd77fdb.js +0 -1
  459. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6ca9099d03aab817.js +0 -1
  460. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0f2c90786ea005a4.js +0 -1
  461. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-200b51a725f8b2d1.js +0 -1
  462. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
  463. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
  464. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
  465. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
  466. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-f3e6e74e0efb005c.js +0 -1
  467. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +0 -1
  468. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
  469. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a3275554ffe8e640.js +0 -1
  470. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-77239269acc2d31a.js +0 -1
  471. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-8bf1821722b082e9.js +0 -1
  472. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
  473. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
  474. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-2deb6becece69d46.js +0 -1
  475. fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
  476. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
  477. fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +0 -1
  478. fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
  479. fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
  480. fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
  481. fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
  482. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
  483. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
  484. fides/ui-build/static/admin/messaging/[id].html +0 -1
  485. fides/ui-build/static/admin/messaging/add-template.html +0 -1
  486. fides/ui-build/static/admin/messaging.html +0 -1
  487. fides/ui-build/static/admin/settings/messaging-providers/[key].html +0 -1
  488. fides/ui-build/static/admin/settings/messaging-providers/new.html +0 -1
  489. fides/ui-build/static/admin/settings/messaging-providers.html +0 -1
  490. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/WHEEL +0 -0
  491. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/entry_points.txt +0 -0
  492. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/licenses/LICENSE +0 -0
  493. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/top_level.txt +0 -0
  494. /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → FZTEUgamBvOhgPWce135w}/_ssgManifest.js +0 -0
  495. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-7dce2916cc589c54.js} +0 -0
@@ -58,6 +58,13 @@ DEFAULT_MESSAGING_TEMPLATES: Dict[str, Any] = {
58
58
  "body": "Your erasure request has been completed.",
59
59
  },
60
60
  },
61
+ MessagingActionType.MANUAL_TASK_DIGEST.value: {
62
+ "label": "Manual task digest",
63
+ "content": {
64
+ "subject": "Weekly DSR Summary from __ORGANIZATION_NAME__",
65
+ "body": "This is your weekly summary of open data subject requests tasks from __ORGANIZATION_NAME__ that require your attention. Please review the tasks in our Privacy Center to ensure timely completion.",
66
+ },
67
+ },
61
68
  }
62
69
 
63
70
 
@@ -101,6 +101,11 @@ class PrivacyExperienceConfigBase:
101
101
  nullable=True,
102
102
  default=True,
103
103
  ) # base is nullable for privacy experience config history
104
+ cookie_deletion_based_on_host_domain = Column(
105
+ Boolean,
106
+ nullable=True,
107
+ default=True,
108
+ ) # base is nullable for privacy experience config history
104
109
 
105
110
  disabled = Column(Boolean, nullable=False, default=True)
106
111
 
@@ -143,6 +148,9 @@ class ExperienceConfigTemplate(PrivacyExperienceConfigBase, Base):
143
148
  auto_subdomain_cookie_deletion = Column(
144
149
  Boolean, nullable=False, default=True, server_default="t"
145
150
  ) # Overrides PrivacyExperienceConfigBase to make non-nullable
151
+ cookie_deletion_based_on_host_domain = Column(
152
+ Boolean, nullable=False, default=True, server_default="t"
153
+ ) # Overrides PrivacyExperienceConfigBase to make non-nullable
146
154
  dismissable = Column(
147
155
  Boolean, nullable=False, default=True, server_default="t"
148
156
  ) # Overrides PrivacyExperienceConfigBase to make non-nullable
@@ -217,6 +225,9 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
217
225
  auto_subdomain_cookie_deletion = Column(
218
226
  Boolean, nullable=False, default=True, server_default="t"
219
227
  ) # Overrides PrivacyExperienceConfigBase to make non-nullable
228
+ cookie_deletion_based_on_host_domain = Column(
229
+ Boolean, nullable=False, default=True, server_default="t"
230
+ ) # Overrides PrivacyExperienceConfigBase to make non-nullable
220
231
  disabled = Column(
221
232
  Boolean, nullable=False, default=True, index=True
222
233
  ) # Overridding PrivacyExperienceConfigBase to index
@@ -44,6 +44,7 @@ class RequestOrigin(Enum):
44
44
  banner_and_modal = "banner_and_modal"
45
45
  api = "api"
46
46
  tcf_overlay = "tcf_overlay"
47
+ headless = "headless"
47
48
 
48
49
 
49
50
  class ConsentMethod(Enum):
@@ -58,6 +59,7 @@ class ConsentMethod(Enum):
58
59
  gpc = "gpc"
59
60
  individual_notice = "individual_notice"
60
61
  acknowledge = "acknowledge"
62
+ external_provider = "external_provider"
61
63
 
62
64
 
63
65
  class ServingComponent(Enum):
@@ -0,0 +1,84 @@
1
+ import hashlib
2
+ import json
3
+ import uuid
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from sqlalchemy import Boolean, Column, Text
7
+ from sqlalchemy.dialects.postgresql import UUID
8
+ from sqlalchemy.ext.declarative import declared_attr
9
+ from sqlalchemy.orm import Session, relationship
10
+
11
+ from fides.api.db.base_class import Base # type: ignore[attr-defined]
12
+ from fides.config.duplicate_detection_settings import DuplicateDetectionSettings
13
+
14
+ if TYPE_CHECKING:
15
+ from fides.api.models.privacy_request.privacy_request import PrivacyRequest
16
+
17
+
18
+ def generate_deterministic_uuid(rule_version: str, dedup_key: str) -> uuid.UUID:
19
+ """Overrides the base class method to generate a deterministic group id.
20
+
21
+ The actual rule version is a hash of the duplicate detection settings config,
22
+ using simple examples here for illustration:
23
+ - under rule "email", duplicate@example.com → group A,
24
+ - under rule "email|phone", duplicate@example.com|1234567890 → group B.
25
+ - ... and so on.
26
+
27
+ No collisions, no overlap.
28
+ """
29
+ # Combine the rule version and the key into a stable hash
30
+ hash_input = f"{rule_version}:{dedup_key}".encode("utf-8")
31
+ return uuid.UUID(hashlib.md5(hash_input).hexdigest())
32
+
33
+
34
+ def generate_rule_version(config: DuplicateDetectionSettings) -> str:
35
+ """Generate a stable short hash for the dedup rule config."""
36
+ normalized = json.dumps(config.model_dump(), sort_keys=True)
37
+ return hashlib.sha256(normalized.encode("utf-8")).hexdigest()[:8]
38
+
39
+
40
+ class DuplicateGroup(Base):
41
+ """
42
+ A table for storing duplicate request group information.
43
+ """
44
+
45
+ @declared_attr
46
+ def __tablename__(self) -> str:
47
+ return "duplicate_group"
48
+
49
+ id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
50
+ rule_version = Column(Text, nullable=False)
51
+ # TODO: The is_active column is not used yet since we are defaulting to just email for
52
+ # duplicate detection. When we allow users to configure the duplicate detection settings,
53
+ # we will need to add a way to activate/deactivate duplicate groups.
54
+ # This should be done by getting the previous rule version and deactivating all groups with
55
+ # that rule version. New groups will be created with the new rule version.
56
+ is_active = Column(Boolean, default=True, nullable=False)
57
+ dedup_key = Column(Text, nullable=False)
58
+ privacy_requests = relationship(
59
+ "PrivacyRequest",
60
+ back_populates="duplicate_group",
61
+ lazy="dynamic",
62
+ primaryjoin="and_(DuplicateGroup.id == PrivacyRequest.duplicate_request_group_id)",
63
+ )
64
+
65
+ @classmethod
66
+ def create(
67
+ cls, db: Session, *, data: dict[str, Any], check_name: bool = False
68
+ ) -> "DuplicateGroup":
69
+ """Create a new duplicate group.
70
+ Override the base class method to generate a deterministic group id.
71
+ If the group already exists, update the is_active column to True and return the group.
72
+ """
73
+ group_id = generate_deterministic_uuid(data["rule_version"], data["dedup_key"])
74
+ # If the group already exists, update the is_active column to True and return the group
75
+ duplicate_group = (
76
+ db.query(DuplicateGroup).filter(DuplicateGroup.id == group_id).one_or_none()
77
+ )
78
+ if duplicate_group:
79
+ duplicate_group.update(db, data={"is_active": True})
80
+ return duplicate_group
81
+
82
+ # If the group does not exist, create a new one
83
+ data["id"] = group_id
84
+ return super().create(db, data=data, check_name=check_name)
@@ -4,12 +4,12 @@ from __future__ import annotations
4
4
 
5
5
  import json
6
6
  from datetime import datetime, timedelta
7
- from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Union
7
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple, Union
8
8
 
9
9
  from celery.result import AsyncResult
10
10
  from loguru import logger
11
11
  from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String
12
- from sqlalchemy.dialects.postgresql import JSONB
12
+ from sqlalchemy.dialects.postgresql import JSONB, UUID
13
13
  from sqlalchemy.ext.declarative import declared_attr
14
14
  from sqlalchemy.ext.mutable import MutableDict, MutableList
15
15
  from sqlalchemy.orm import Query, RelationshipProperty, Session, backref, relationship
@@ -69,6 +69,7 @@ from fides.api.models.pre_approval_webhook import (
69
69
  PreApprovalWebhook,
70
70
  PreApprovalWebhookReply,
71
71
  )
72
+ from fides.api.models.privacy_request.duplicate_group import DuplicateGroup
72
73
  from fides.api.models.privacy_request.execution_log import (
73
74
  COMPLETED_EXECUTION_LOG_STATUSES,
74
75
  EXITED_EXECUTION_LOG_STATUSES,
@@ -224,6 +225,18 @@ class PrivacyRequest(
224
225
  source = Column(EnumColumn(PrivacyRequestSource), nullable=True)
225
226
  location = Column(String, nullable=True)
226
227
 
228
+ # Duplicate detection - group ID to link duplicates together
229
+ duplicate_request_group_id = Column(
230
+ UUID(as_uuid=True),
231
+ ForeignKey("duplicate_group.id"),
232
+ nullable=True,
233
+ )
234
+ duplicate_group = relationship(
235
+ DuplicateGroup,
236
+ back_populates="privacy_requests",
237
+ uselist=False,
238
+ )
239
+
227
240
  # A PrivacyRequest can be soft deleted, so we store when it was deleted
228
241
  deleted_at = Column(DateTime(timezone=True), nullable=True)
229
242
  # and who deleted it
@@ -369,7 +382,7 @@ class PrivacyRequest(
369
382
  return {
370
383
  "id": self.id,
371
384
  "external_id": self.external_id,
372
- "status": self.status.value,
385
+ "status": self.status.value if self.status is not None else None,
373
386
  "requested_at": (
374
387
  self.requested_at.isoformat() if self.requested_at else None
375
388
  ),
@@ -601,7 +614,10 @@ class PrivacyRequest(
601
614
  """Verify the identification code supplied by the user
602
615
  If verified, change the status of the request to "pending", and set the datetime the identity was verified.
603
616
  """
604
- if not self.status == PrivacyRequestStatus.identity_unverified:
617
+ if not self.status in [
618
+ PrivacyRequestStatus.identity_unverified,
619
+ PrivacyRequestStatus.duplicate,
620
+ ]:
605
621
  raise IdentityVerificationException(
606
622
  f"Invalid identity verification request. Privacy request '{self.id}' status = {self.status.value}." # type: ignore # pylint: disable=no-member
607
623
  )
@@ -679,12 +695,29 @@ class PrivacyRequest(
679
695
  },
680
696
  )
681
697
 
682
- def get_cached_identity_data(self) -> Dict[str, Any]:
683
- """Retrieves any identity data pertaining to this request from the cache"""
698
+ def identity_prefix_cache_and_keys(self) -> Tuple[str, FidesopsRedis, List[str]]:
699
+ """Returns the prefix and cache keys for the identity data for this request"""
684
700
  prefix = f"id-{self.id}-identity-*"
685
701
  cache: FidesopsRedis = get_cache()
686
702
  keys = cache.keys(prefix)
687
- result = {}
703
+ return prefix, cache, keys
704
+
705
+ def verify_cache_for_identity_data(self) -> bool:
706
+ """Verifies if the identity data is cached for this request"""
707
+ _, _, keys = self.identity_prefix_cache_and_keys()
708
+ return len(keys) > 0
709
+
710
+ def get_cached_identity_data(self) -> Dict[str, Any]:
711
+ """Retrieves any identity data pertaining to this request from the cache"""
712
+ result: Dict[str, Any] = {}
713
+ prefix, cache, keys = self.identity_prefix_cache_and_keys()
714
+
715
+ if not keys:
716
+ logger.debug(f"Cache miss for request {self.id}, falling back to DB")
717
+ identity = self.get_persisted_identity()
718
+ self.cache_identity(identity)
719
+ keys = cache.keys(prefix)
720
+
688
721
  for key in keys:
689
722
  value = cache.get(key)
690
723
  if value:
@@ -702,10 +735,25 @@ class PrivacyRequest(
702
735
 
703
736
  def get_cached_custom_privacy_request_fields(self) -> Dict[str, Any]:
704
737
  """Retrieves any custom fields pertaining to this request from the cache"""
738
+ result: Dict[str, Any] = {}
705
739
  prefix = f"id-{self.id}-custom-privacy-request-field-*"
740
+
706
741
  cache: FidesopsRedis = get_cache()
707
742
  keys = cache.keys(prefix)
708
- result = {}
743
+
744
+ if not keys:
745
+ logger.debug(f"Cache miss for request {self.id}, falling back to DB")
746
+ custom_privacy_request_fields = (
747
+ self.get_persisted_custom_privacy_request_fields()
748
+ )
749
+ self.cache_custom_privacy_request_fields(
750
+ {
751
+ key: CustomPrivacyRequestFieldSchema(**value)
752
+ for key, value in custom_privacy_request_fields.items()
753
+ }
754
+ )
755
+ keys = cache.keys(prefix)
756
+
709
757
  for key in keys:
710
758
  value = cache.get(key)
711
759
  if value:
@@ -8,8 +8,9 @@ from typing import TYPE_CHECKING, List, Optional, Tuple
8
8
  from loguru import logger
9
9
  from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
10
10
  from sqlalchemy.dialects.postgresql import JSONB
11
+ from sqlalchemy.ext.declarative import declared_attr
11
12
  from sqlalchemy.ext.mutable import MutableDict, MutableList
12
- from sqlalchemy.orm import Query, Session, relationship
13
+ from sqlalchemy.orm import Query, RelationshipProperty, Session, relationship
13
14
  from sqlalchemy_utils.types.encrypted.encrypted_type import (
14
15
  AesGcmEngine,
15
16
  StringEncryptedType,
@@ -183,6 +184,14 @@ class RequestTask(WorkerTask, Base):
183
184
  uselist=False,
184
185
  )
185
186
 
187
+ # Stores the sub-requests data for async polling tasks
188
+ sub_requests: "RelationshipProperty[List[RequestTaskSubRequest]]" = relationship(
189
+ "RequestTaskSubRequest",
190
+ back_populates="request_task",
191
+ cascade="all, delete-orphan",
192
+ order_by="RequestTaskSubRequest.created_at",
193
+ )
194
+
186
195
  @property
187
196
  def request_task_address(self) -> CollectionAddress:
188
197
  """Convert the collection_address into Collection Address format"""
@@ -318,3 +327,91 @@ class RequestTask(WorkerTask, Base):
318
327
  )
319
328
 
320
329
  return task_in_flight
330
+
331
+
332
+ class RequestTaskSubRequest(Base):
333
+ """
334
+ Model for storing individual sub-request data during the execution of a request task.
335
+ Supports 1:N relationship - each RequestTask can have multiple sub-requests.
336
+ Currently used for storing request data for polling tasks.
337
+ """
338
+
339
+ @declared_attr
340
+ def __tablename__(cls) -> str:
341
+ """Overriding base class method to set the table name."""
342
+ return "request_task_sub_request"
343
+
344
+ request_task_id = Column(
345
+ String(255),
346
+ ForeignKey(
347
+ "requesttask.id",
348
+ name="request_task_sub_request_request_task_id_fkey",
349
+ ondelete="CASCADE",
350
+ ),
351
+ nullable=False,
352
+ index=True,
353
+ )
354
+
355
+ request_task = relationship(
356
+ "RequestTask",
357
+ back_populates="sub_requests",
358
+ )
359
+
360
+ # Individual sub-request data (e.g., request_id, status, result data)
361
+ # Additional fields for enhanced sub-request tracking
362
+ param_values = Column( # An encrypted JSON String - saved as a dict
363
+ StringEncryptedType(
364
+ type_in=JSONTypeOverride,
365
+ key=CONFIG.security.app_encryption_key,
366
+ engine=AesGcmEngine,
367
+ padding="pkcs5",
368
+ ),
369
+ nullable=False,
370
+ )
371
+ status = Column(String, nullable=False)
372
+
373
+ # Raw data retrieved from an access request is stored here. This contains all of the
374
+ # intermediate data we retrieved, needed for downstream tasks, but hasn't been filtered
375
+ # by data category for the end user.
376
+ _access_data = Column( # An encrypted JSON String - saved as a list of Rows
377
+ "access_data",
378
+ StringEncryptedType(
379
+ type_in=JSONTypeOverride,
380
+ key=CONFIG.security.app_encryption_key,
381
+ engine=AesGcmEngine,
382
+ padding="pkcs5",
383
+ ),
384
+ )
385
+
386
+ # Use descriptors for automatic external storage handling
387
+ access_data = EncryptedLargeDataDescriptor(
388
+ field_name="access_data", empty_default=[]
389
+ )
390
+
391
+ # Written after an erasure is completed
392
+ rows_masked = Column(Integer)
393
+
394
+ def get_correlation_id(self) -> Optional[str]:
395
+ """Helper method to extract correlation_id from param_values."""
396
+ if self.param_values and "request_id" in self.param_values:
397
+ return self.param_values["request_id"]
398
+ return None
399
+
400
+ def update_status(self, db: Session, status: str) -> None:
401
+ """Helper method to update the status of this sub-request."""
402
+ self.status = status
403
+ self.save(db)
404
+
405
+ def cleanup_external_storage(self) -> None:
406
+ """Clean up all external storage files for this sub-request"""
407
+ # Access the descriptor from the class to call cleanup
408
+ RequestTaskSubRequest.access_data.cleanup(self)
409
+
410
+ def get_access_data(self) -> List[Row]:
411
+ """Helper to retrieve access data or default to empty list"""
412
+ return self.access_data or []
413
+
414
+ def delete(self, db: Session) -> None:
415
+ """Override delete to cleanup external storage first"""
416
+ self.cleanup_external_storage()
417
+ super().delete(db)
@@ -184,6 +184,9 @@ class DataCategory(Base, FidesBase):
184
184
  version_deprecated = Column(Text)
185
185
  replaced_by = Column(Text)
186
186
 
187
+ # LLM Classification
188
+ tagging_instructions = Column(Text, nullable=True)
189
+
187
190
  children: "RelationshipProperty[List[DataCategory]]" = relationship(
188
191
  "DataCategory",
189
192
  back_populates="parent",
@@ -21,7 +21,15 @@ from fides.api.common_exceptions import ValidationError
21
21
  from fides.api.db.base_class import Base
22
22
  from fides.api.models.sql_models import FidesBase # type: ignore[attr-defined]
23
23
 
24
- LEGACY_TAXONOMIES = {"data_categories", "data_uses", "data_subjects"}
24
+ # Legacy Fideslang taxonomy keys
25
+ LEGACY_TAXONOMY_KEYS = {
26
+ "data_category",
27
+ "data_use",
28
+ "data_subject",
29
+ }
30
+
31
+ # Taxonomies that are managed by Fides (legacy taxonomies and system group)
32
+ MANAGED_TAXONOMY_KEYS = {"data_category", "data_use", "data_subject", "system_group"}
25
33
 
26
34
 
27
35
  class TargetType(str, Enum):
@@ -81,7 +89,9 @@ class Taxonomy(Base, FidesBase):
81
89
  """Create a new Taxonomy with proper handling of applies_to."""
82
90
  # Disallow creating taxonomies that represent legacy types
83
91
  fides_key = data.get("fides_key")
84
- if fides_key in LEGACY_TAXONOMIES:
92
+ # Specifically exclude system_group to allow for creation during tests
93
+ # We already have unique constraints on fides_key to prevent duplicates on DB level
94
+ if fides_key in MANAGED_TAXONOMY_KEYS:
85
95
  raise ValidationError(
86
96
  f"Cannot create taxonomy '{fides_key}'. This is a taxonomy managed by the system."
87
97
  )
@@ -166,7 +176,7 @@ class TaxonomyAllowedUsage(Base):
166
176
 
167
177
  target_type can be either:
168
178
  - A generic type: "system", "privacy_declaration", "taxonomy"
169
- - A taxonomy key: "data_categories", "data_uses", etc.
179
+ - A taxonomy key: "data_category", "data_use", etc.
170
180
  """
171
181
 
172
182
  @declared_attr
@@ -193,7 +203,7 @@ class TaxonomyAllowedUsage(Base):
193
203
  )
194
204
  target_type: Column[str] = Column(
195
205
  String, primary_key=True
196
- ) # Can be "system", "dataset", OR a taxonomy key like "data_categories"
206
+ ) # Can be "system", "dataset", OR a taxonomy key like "data_category"
197
207
 
198
208
 
199
209
  class TaxonomyElement(Base, FidesBase):
File without changes
@@ -0,0 +1,85 @@
1
+ """SQLAlchemy model for the v3 privacy_preferences table."""
2
+
3
+ from sqlalchemy import ( # type: ignore[attr-defined]
4
+ BigInteger,
5
+ Boolean,
6
+ Column,
7
+ DateTime,
8
+ Identity,
9
+ Text,
10
+ text,
11
+ )
12
+ from sqlalchemy.dialects.postgresql import JSONB
13
+ from sqlalchemy.ext.declarative import declared_attr
14
+ from sqlalchemy_utils.types.encrypted.encrypted_type import (
15
+ AesGcmEngine,
16
+ StringEncryptedType,
17
+ )
18
+
19
+ from fides.api.cryptography.cryptographic_util import hash_value_with_salt
20
+ from fides.api.cryptography.identity_salt import get_identity_salt
21
+ from fides.api.db.base_class import Base
22
+ from fides.api.schemas.redis_cache import MultiValue
23
+ from fides.config import CONFIG
24
+
25
+
26
+ class PrivacyPreferences(Base):
27
+ """
28
+ Model for the v3 privacy_preferences table.
29
+ This is used for the v3 privacy preferences API.
30
+
31
+ This table stores privacy preference records with a partitioning scheme
32
+ based on the is_latest flag, splitting records into current and historic partitions.
33
+ """
34
+
35
+ @declared_attr
36
+ def __tablename__(self) -> str:
37
+ return "privacy_preferences"
38
+
39
+ # Override the default id column from Base (which is a String UUID)
40
+ # with a BigInteger identity column for this table
41
+ id = Column(
42
+ BigInteger, # type: ignore[arg-type]
43
+ Identity(start=1, increment=1, always=True),
44
+ primary_key=True,
45
+ )
46
+
47
+ # Searchable/queryable data stored as JSONB
48
+ search_data = Column(JSONB, nullable=True)
49
+
50
+ # Full record data stored as encrypted text (contains PII)
51
+ record_data = Column(
52
+ StringEncryptedType(
53
+ type_in=Text(),
54
+ key=CONFIG.security.app_encryption_key,
55
+ engine=AesGcmEngine,
56
+ padding="pkcs5",
57
+ ),
58
+ nullable=True,
59
+ )
60
+
61
+ # Partition key - determines if record goes to _current or _historic partition
62
+ is_latest = Column(
63
+ Boolean, nullable=False, server_default=text("false"), primary_key=True
64
+ )
65
+
66
+ # Override base class timestamp columns to match migration
67
+ created_at = Column(
68
+ DateTime(timezone=True), nullable=False, server_default=text("now()")
69
+ )
70
+ updated_at = Column(DateTime(timezone=True), nullable=True)
71
+
72
+ @classmethod
73
+ def hash_value(
74
+ cls,
75
+ value: MultiValue,
76
+ encoding: str = "UTF-8",
77
+ ) -> str:
78
+ """Utility function to hash the value with a generated salt"""
79
+ salt = get_identity_salt()
80
+ value_str = str(value)
81
+ hashed_value = hash_value_with_salt(
82
+ value_str.encode(encoding),
83
+ salt.encode(encoding),
84
+ )
85
+ return hashed_value
@@ -17,6 +17,14 @@ class ExecutionLogStatus(enum.Enum):
17
17
  awaiting_processing = "paused" # "paused" in the database to avoid a migration, but use "awaiting_processing" in the app
18
18
  retrying = "retrying"
19
19
  skipped = "skipped"
20
+ polling = "polling"
21
+
22
+
23
+ # Statuses that can be resumed
24
+ RESUMABLE_EXECUTION_LOG_STATUSES = [
25
+ ExecutionLogStatus.pending,
26
+ ExecutionLogStatus.polling,
27
+ ]
20
28
 
21
29
 
22
30
  class WorkerTask:
@@ -101,6 +101,31 @@ class ConsentConfig(FidesSchema):
101
101
  model_config = ConfigDict(extra="forbid")
102
102
 
103
103
 
104
+ class DuplicateDetectionApplicationConfig(FidesSchema):
105
+ """
106
+ API model - configuration settings for duplicate privacy request detection.
107
+ """
108
+
109
+ enabled: Optional[bool] = Field(
110
+ default=False,
111
+ description="Whether duplicate detection is enabled. Disabled by default.",
112
+ )
113
+
114
+ time_window_days: Optional[int] = Field(
115
+ default=365,
116
+ description="Time window in days for duplicate detection. Default is 1 year.",
117
+ ge=1,
118
+ le=3650, # Max 10 years
119
+ )
120
+
121
+ match_identity_fields: Optional[List[str]] = Field(
122
+ default=["email"],
123
+ description="Identity field names to match on for duplicate detection (e.g., 'email', 'phone_number'). Default is email only.",
124
+ )
125
+
126
+ model_config = ConfigDict(extra="forbid")
127
+
128
+
104
129
  class SecurityApplicationConfig(FidesSchema):
105
130
  # only valid URLs should be set as cors_origins
106
131
  # for advanced usage of non-URLs, e.g. wildcards (`*`), the related
@@ -129,6 +154,9 @@ class ApplicationConfig(FidesSchema):
129
154
  consent: Optional[ConsentConfig] = None
130
155
  admin_ui: Optional[AdminUIConfig] = None
131
156
  privacy_center: Optional[PrivacyCenterConfig] = None
157
+ privacy_request_duplicate_detection: Optional[
158
+ DuplicateDetectionApplicationConfig
159
+ ] = None
132
160
 
133
161
  @model_validator(mode="before")
134
162
  @classmethod
@@ -13,6 +13,7 @@ from fides.api.schemas.connection_configuration import connection_secrets_schema
13
13
  from fides.api.schemas.policy import ActionType
14
14
  from fides.api.schemas.saas.saas_config import SaaSConfigBase
15
15
  from fides.api.util.connection_type import get_connection_type_secret_schema
16
+ from fides.api.util.masking_util import mask_sensitive_fields
16
17
 
17
18
 
18
19
  class CreateConnectionConfiguration(BaseModel):
@@ -41,36 +42,6 @@ class CreateConnectionConfigurationWithSecrets(CreateConnectionConfiguration):
41
42
  model_config = ConfigDict(from_attributes=True, extra="ignore")
42
43
 
43
44
 
44
- def mask_sensitive_fields(
45
- connection_secrets: Dict[str, Any], secret_schema: Dict[str, Any]
46
- ) -> Dict[str, Any]:
47
- """
48
- Mask sensitive fields in the given secrets based on the provided schema.
49
- This function traverses the given secrets dictionary and uses the provided schema to
50
- identify fields that have been marked as sensitive. The function replaces the sensitive
51
- field values with a mask string ('********').
52
- Args:
53
- connection_secrets (Dict[str, Any]): The secrets to be masked.
54
- secret_schema (Dict[str, Any]): The schema defining which fields are sensitive.
55
- Returns:
56
- Dict[str, Any]: The secrets dictionary with sensitive fields masked.
57
- """
58
- if connection_secrets is None:
59
- return connection_secrets
60
-
61
- secret_schema_properties = secret_schema["properties"]
62
- new_connection_secrets = {}
63
-
64
- for key, value in connection_secrets.items():
65
- if key in secret_schema_properties:
66
- if secret_schema_properties.get(key, {}).get("sensitive", False):
67
- new_connection_secrets[key] = "**********"
68
- else:
69
- new_connection_secrets[key] = value
70
-
71
- return new_connection_secrets
72
-
73
-
74
45
  class ConnectionConfigSecretsMixin(BaseModel):
75
46
  """
76
47
  A schema mixin to declare a connection config `secrets` attribute
@@ -89,6 +89,7 @@ class MessagingActionType(str, Enum):
89
89
  PRIVACY_REQUEST_REVIEW_APPROVE = "privacy_request_review_approve"
90
90
  USER_INVITE = "user_invite"
91
91
  EXTERNAL_USER_WELCOME = "external_user_welcome"
92
+ MANUAL_TASK_DIGEST = "manual_task_digest"
92
93
  TEST_MESSAGE = "test_message"
93
94
 
94
95
 
@@ -101,6 +102,7 @@ CONFIGURABLE_MESSAGING_ACTION_TYPES: Tuple[str, ...] = (
101
102
  MessagingActionType.PRIVACY_REQUEST_COMPLETE_DELETION.value,
102
103
  MessagingActionType.PRIVACY_REQUEST_REVIEW_DENY.value,
103
104
  MessagingActionType.PRIVACY_REQUEST_REVIEW_APPROVE.value,
105
+ MessagingActionType.MANUAL_TASK_DIGEST.value,
104
106
  )
105
107
 
106
108
 
@@ -219,6 +221,18 @@ class ExternalUserWelcomeBodyParams(BaseModel):
219
221
  org_name: str
220
222
 
221
223
 
224
+ class ManualTaskDigestBodyParams(BaseModel):
225
+ """Body params required to send manual task digest emails"""
226
+
227
+ vendor_contact_name: str
228
+ organization_name: str
229
+ portal_url: str
230
+ imminent_task_count: int
231
+ upcoming_task_count: int
232
+ total_task_count: int
233
+ company_logo_url: Optional[str] = None
234
+
235
+
222
236
  class FidesopsMessage(
223
237
  BaseModel,
224
238
  ):
@@ -256,6 +270,7 @@ class FidesopsMessage(
256
270
  MessagingActionType.PRIVACY_REQUEST_ERROR_NOTIFICATION: ErrorNotificationBodyParams,
257
271
  MessagingActionType.USER_INVITE: UserInviteBodyParams,
258
272
  MessagingActionType.EXTERNAL_USER_WELCOME: ExternalUserWelcomeBodyParams,
273
+ MessagingActionType.MANUAL_TASK_DIGEST: ManualTaskDigestBodyParams,
259
274
  }
260
275
 
261
276
  valid_body_params = valid_body_params_for_action_type.get(