ethyca-fides 2.73.2b0__py2.py3-none-any.whl → 2.76.0rc2__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.
Files changed (453) hide show
  1. {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/METADATA +2 -1
  2. {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/RECORD +349 -336
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/303287c70600_migrate_resource_type_from_enum_to_.py +99 -0
  5. fides/api/alembic/migrations/versions/795f46f656c0_migrate_field_type_from_enum_to_string.py +61 -0
  6. fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
  7. fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
  8. fides/api/alembic/migrations/versions/xx_2025_11_07_1709_56fe6fad2d89_add_notice_display_order.py +47 -0
  9. fides/api/alembic/migrations/versions/xx_2025_11_10_1200_a1b2c3d4e5f6_add_test_datastore_to_connectiontype.py +53 -0
  10. fides/api/alembic/migrations/versions/xx_2025_11_11_1317_7d82c8fc4c34_store_saas_template_datasets.py +68 -0
  11. fides/api/alembic/migrations/versions/xx_2025_11_12_1430_b2c3d4e5f6a7_add_default_identity_definitions.py +81 -0
  12. fides/api/alembic/migrations/versions/xx_2025_11_25_1854_3ff6449c099e_add_index_on_providedidentity_privacy_.py +50 -0
  13. fides/api/api/v1/api.py +2 -0
  14. fides/api/api/v1/endpoints/admin.py +39 -0
  15. fides/api/api/v1/endpoints/connector_template_endpoints.py +167 -0
  16. fides/api/api/v1/endpoints/generic_overrides.py +6 -6
  17. fides/api/api/v1/endpoints/pre_approval_webhook_endpoints.py +5 -5
  18. fides/api/api/v1/endpoints/privacy_request_endpoints.py +101 -21
  19. fides/api/api/v1/endpoints/saas_config_endpoints.py +3 -44
  20. fides/api/api/v1/endpoints/storage_endpoints.py +5 -1
  21. fides/api/api/v1/endpoints/system.py +2 -2
  22. fides/api/api/v1/endpoints/user_endpoints.py +10 -4
  23. fides/api/db/base.py +1 -0
  24. fides/api/db/database.py +228 -1
  25. fides/api/db/seed.py +1 -1
  26. fides/api/email_templates/templates/external_user_welcome.html +9 -5
  27. fides/api/migrations/post_upgrade_index_creation.py +10 -0
  28. fides/api/models/connectionconfig.py +4 -1
  29. fides/api/models/detection_discovery/__init__.py +2 -0
  30. fides/api/models/detection_discovery/core.py +10 -0
  31. fides/api/models/detection_discovery/staged_resource_error.py +25 -0
  32. fides/api/models/experience_notices.py +6 -1
  33. fides/api/models/identity_definition.py +2 -1
  34. fides/api/models/location_regulation_selections.py +22 -0
  35. fides/api/models/manual_webhook.py +17 -6
  36. fides/api/models/messaging_template.py +7 -0
  37. fides/api/models/policy.py +3 -0
  38. fides/api/models/privacy_experience.py +20 -0
  39. fides/api/models/privacy_notice.py +45 -1
  40. fides/api/models/privacy_preference.py +1 -0
  41. fides/api/models/privacy_request/duplicate_group.py +84 -0
  42. fides/api/models/privacy_request/privacy_request.py +84 -9
  43. fides/api/models/privacy_request/provided_identity.py +22 -1
  44. fides/api/models/saas_template_dataset.py +63 -0
  45. fides/api/models/sql_models.py +150 -7
  46. fides/api/models/taxonomy.py +61 -1
  47. fides/api/oauth/roles.py +2 -0
  48. fides/api/schemas/connection_configuration/connection_secrets_mssql.py +5 -0
  49. fides/api/schemas/messaging/messaging.py +1 -0
  50. fides/api/schemas/oauth.py +2 -1
  51. fides/api/schemas/privacy_request.py +38 -6
  52. fides/api/schemas/saas/connector_template.py +14 -0
  53. fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +19 -7
  54. fides/api/service/connectors/base_erasure_email_connector.py +7 -0
  55. fides/api/service/connectors/microsoft_sql_server_connector.py +6 -1
  56. fides/api/service/connectors/saas/connector_registry_service.py +45 -1
  57. fides/api/service/messaging/message_dispatch_service.py +44 -4
  58. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +3 -3
  59. fides/api/service/privacy_request/dsr_package/templates/attachments_index.html +41 -30
  60. fides/api/service/privacy_request/dsr_package/templates/clickme.html +68 -0
  61. fides/api/service/privacy_request/dsr_package/templates/dataset_index.html +30 -27
  62. fides/api/service/privacy_request/duplication_detection.py +439 -0
  63. fides/api/service/privacy_request/email_batch_service.py +2 -1
  64. fides/api/service/privacy_request/request_runner_service.py +31 -5
  65. fides/api/service/privacy_request/request_service.py +4 -2
  66. fides/api/service/saas_request/saas_request_override_factory.py +7 -2
  67. fides/api/task/conditional_dependencies/privacy_request/__init__.py +0 -0
  68. fides/api/task/conditional_dependencies/privacy_request/convenience_fields.py +155 -0
  69. fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py +140 -0
  70. fides/api/task/conditional_dependencies/privacy_request/schemas.py +212 -0
  71. fides/api/task/conditional_dependencies/util.py +111 -0
  72. fides/api/task/execute_request_tasks.py +17 -4
  73. fides/api/task/manual/manual_task_conditional_evaluation.py +32 -27
  74. fides/api/task/manual/manual_task_graph_task.py +4 -1
  75. fides/api/task/manual/manual_task_utils.py +63 -20
  76. fides/api/tasks/__init__.py +14 -0
  77. fides/api/util/cache.py +4 -0
  78. fides/api/util/connection_util.py +2 -3
  79. fides/api/util/fuzzy_search_utils.py +7 -1
  80. fides/api/util/lock.py +13 -3
  81. fides/api/util/logger.py +58 -4
  82. fides/api/util/logger_context_utils.py +3 -1
  83. fides/api/util/memory_watchdog.py +118 -0
  84. fides/api/util/saas_config_updater.py +12 -2
  85. fides/api/worker/__init__.py +4 -0
  86. fides/common/api/scope_registry.py +6 -0
  87. fides/common/api/v1/urn_registry.py +11 -2
  88. fides/config/__init__.py +8 -2
  89. fides/config/celery_settings.py +42 -0
  90. fides/service/messaging/messaging_service.py +75 -74
  91. fides/service/privacy_request/privacy_request_service.py +151 -19
  92. fides/ui-build/static/admin/404.html +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/1099-688fa865621531cc.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/{1115-26393b586775ea29.js → 1115-7fd171dac1eb0e51.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/1276.deb10ae2643f8463.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/1438-8a33b3834d6e43f3.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/1821-c1daa160f492aacf.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/1840-359ee056e4cf6629.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/{1975.afe8cad52f904fcf.js → 1975.bef017bc80e2012c.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/{2040-7eed8491ca7276ed.js → 2040-70972e15960d9afe.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/2121.321b0fd3932164d4.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/{2397-083fc511acb6105d.js → 2397-3434603a97f3f5d6.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/2921-49ed0ed897832958.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/3150-da5406b80d25fe6d.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/3377-02bf9780fd383d94.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/3655-5e1ba5dd68b5ec48.js +1 -0
  110. fides/ui-build/static/admin/_next/static/chunks/3729-31ff8ba51491bf21.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/3872-cff30ca0844fe2b1.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/3931-8bedde156fe83564.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/{401-7c345d019bb9bcbd.js → 401-582d9970d89deefe.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/4093-7e47408c28de5375.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/4322-f6aeff6880726c83.js +1 -0
  117. fides/ui-build/static/admin/_next/static/chunks/4339-04a715ab07122744.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/4496-ccbce2459174e0d6.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/4589-c1d83c6a8dab4d30.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/4809-a8f4a108a42f53ed.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/4903-19c0bc07a956dfa8.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/4910-d990773601f794c1.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/{5185-e7f8b81dd3dfbe0b.js → 5185-96423702fba70ced.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/5258-4e308cca01d59367.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/5487-5c3501754bf027ba.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/549-1bdc3e6f3264c020.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/5505-43b9c39491b88e08.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/{5783-21775c232dce7af7.js → 5783-016dfcee8e49bf61.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/5826-4db99ea4e5077911.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/590-be447cacf12419dd.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/6084-91badbc6569a0efb.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/6344-026cb323c1d49926.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/6362-ba0e12f2fc4cad94.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/{6853-de9905d28e5b19b3.js → 6853-882889659769d7b4.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/6882-bb1b469d7d7f5335.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/6954-0dcf22a9aabe39c5.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/7170-46db82bb5b55e856.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/7218-2ace8c82e3e7eb74.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/{7245-c9bc628d078c2170.js → 7245-1cdafb35f289861b.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/7630-7f75ab7b8df42eb3.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/7654-2e9a8be02e41769a.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/{8212-393420e5a9751791.js → 8212-348ddd2b6933db70.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-da717d324917b049.js} +3 -3
  146. fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/{9676.7d029a5383595b69.js → 9676.1f395eeb9cc34968.js} +1 -1
  148. fides/ui-build/static/admin/_next/static/chunks/{9826-a737a9956c1d0905.js → 9826-1078e46f3ac0b688.js} +1 -1
  149. fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/pages/{404-eb019192ce498f32.js → 404-800be6996aaa999c.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-ee588a308812715d.js → _app-de4b578c904df772.js} +70 -70
  152. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-7081e0e49f67716c.js → manual-f12020b82dd4bd1a.js} +1 -1
  153. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-a188f84239f4b2a8.js → multiple-a911b7990371704d.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-ee9df33ebd471099.js → add-systems-ad585b79953c2753.js} +1 -1
  155. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-4f9cf087fcee87e6.js → add-vendors-bb263d394ca1c8fa.js} +1 -1
  156. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-6907c368d8611c44.js +1 -0
  157. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-1b02a4991201b7e4.js → [id]-c32f381af358149b.js} +1 -1
  158. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-6efb3c069d8b47dd.js} +1 -1
  159. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-b08abefec298ccf1.js → privacy-experience-1975c529905eea9b.js} +1 -1
  160. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-8c164c4b8310214e.js → [id]-b05331178928ab52.js} +1 -1
  161. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-db789002d84c8829.js → new-516834e930bb0d0d.js} +1 -1
  162. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-985717f2565f9d9d.js +1 -0
  163. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-5cba30eba1e97e56.js → properties-2be773e08498e40c.js} +1 -1
  164. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-850afb74f4192e87.js +1 -0
  165. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-614af0a2c2ba966c.js → consent-b63d1e395d879b86.js} +1 -1
  166. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-5b28f0f674ea87bd.js +1 -0
  167. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-676177e2f3c9c2a2.js +1 -0
  168. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-794906929efb8e1d.js +1 -0
  169. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-3ccbf7c0d06507b9.js +1 -0
  170. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-81d1b50585468fb0.js +1 -0
  171. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-1ea0b24d306b1e67.js +1 -0
  172. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-d4861a4a218bb65a.js +1 -0
  173. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/infrastructure/[monitorId]-66bd265044daf97d.js +1 -0
  174. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/infrastructure-c9c79fa8576a4f77.js +1 -0
  175. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-60cacc3232c2eead.js +1 -0
  176. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-437bd64a3016de36.js +1 -0
  177. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-8349248c2da970a6.js +1 -0
  178. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-6919a1d6cadaa46b.js +1 -0
  179. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-b072cf25aefc98f6.js → [resourceUrn]-1a50d421897d3da1.js} +1 -1
  180. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-fd3e8817d8e6dee4.js → detection-49509414a15e8393.js} +1 -1
  181. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-146624cf59792bf7.js → [resourceUrn]-1a1bb80b586d0c0f.js} +1 -1
  182. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-9695cc9c85592ec5.js → discovery-49de61df1e8e7fba.js} +1 -1
  183. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c2719f5cff20c0f8.js +1 -0
  184. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-5f88280db168083e.js → [...subfieldNames]-415015aebab60436.js} +1 -1
  185. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-bfbcf19c28c794ae.js → [collectionName]-5accb09715b5122d.js} +1 -1
  186. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-aebecca1d8ec5f98.js +1 -0
  187. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-9551a82ddec9f909.js +1 -0
  188. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-72f8fe47beef0f09.js +1 -0
  189. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-3a8aa3f633528e88.js +1 -0
  190. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-87512616f35ec6da.js +1 -0
  191. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-2f1bf4eac7aa55fd.js +1 -0
  192. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
  193. fides/ui-build/static/admin/_next/static/chunks/pages/{index-1343fa525a206571.js → index-8d67cd2872cb682a.js} +1 -1
  194. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-7a631df29cd0e31a.js +1 -0
  195. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-ea3bc43cdaf273de.js +1 -0
  196. fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-5d8632bba1b81cd4.js +1 -0
  197. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/{[id]-63b3be660fb12c0f.js → [id]-92e01822ecde8fb8.js} +1 -1
  198. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/{new-d3b577962dd33266.js → new-1256cf6d3f6794e0.js} +1 -1
  199. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-0daac00911d27617.js +1 -0
  200. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/{[key]-720cde29f81db47f.js → [key]-2d976fe5e8ba0a3a.js} +1 -1
  201. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/{new-3668866076b53016.js → new-7766ba497b863740.js} +1 -1
  202. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-f2880d2ed4734270.js +1 -0
  203. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/{[id]-8063dceb32310c85.js → [id]-669f585c3458faff.js} +1 -1
  204. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/{add-template-4931c70bee62232f.js → add-template-c79e7724e4bc3899.js} +1 -1
  205. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-891654e8dc13965c.js +1 -0
  206. fides/ui-build/static/admin/_next/static/chunks/pages/{notifications-93af719dab3bd053.js → notifications-40c8148244c5d347.js} +1 -1
  207. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-1e86f3e28bd23ed6.js +1 -0
  208. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-9b7bd8c38f02c091.js +1 -0
  209. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-b18a53a940cf9e19.js +1 -0
  210. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6d028d7450e77578.js +1 -0
  211. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-8399083ee2cd8cc2.js +1 -0
  212. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-0a910125cdb2b3b8.js +1 -0
  213. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-acc90b6f7fe915cb.js +1 -0
  214. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-bbc42026f2685438.js +1 -0
  215. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-fa82cffba448ccd8.js → configure-c08ca6ad21c99799.js} +1 -1
  216. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-77c2db582f8823bc.js +1 -0
  217. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-bc1c289647e52c48.js → [id]-74ccea4868408e3d.js} +1 -1
  218. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-cbfaa23d96f5ed0b.js → add-property-7d9f09bfe9d44dfc.js} +1 -1
  219. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-a15a3fd0ed88f39c.js → properties-cd77bc30672bb1fa.js} +1 -1
  220. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-cc3bd9540132d5ed.js +1 -0
  221. fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-7ce7d720107ab4b5.js +1 -0
  222. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-19de0024418a4924.js → [purpose_id]-ae789892343c24f5.js} +1 -1
  223. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-13ee1b331ced0846.js +1 -0
  224. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-ee4e43692336a330.js +1 -0
  225. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-ca51d794abfcbf25.js +1 -0
  226. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-ecd1dc5db8e81409.js +1 -0
  227. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-3b87002753b23ca5.js → domain-records-df06f7e2f668c540.js} +1 -1
  228. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-aacd9d0ad47082d4.js → domains-da0c77bd510c6c51.js} +1 -1
  229. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-3cdd0b39901190ba.js → email-templates-950b0c115bf673d8.js} +1 -1
  230. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-61076eedbfd137b9.js → locations-7e36cb4756973a9d.js} +1 -1
  231. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-b07b11d6002f8c8c.js → organization-a0e5ed486d24ccf3.js} +1 -1
  232. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-3cdebafb6870d3ad.js +1 -0
  233. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-b7c0d3b1b754e70f.js → regulations-159aad34f1021320.js} +1 -1
  234. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-dbd1a64090ad0946.js +1 -0
  235. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-59c89489fa32a4cb.js → [id]-7d042497a57a3788.js} +1 -1
  236. fides/ui-build/static/admin/_next/static/chunks/pages/systems-21f1172e73dfc9f0.js +1 -0
  237. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-e553161e6338ee48.js +1 -0
  238. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-7dce2916cc589c54.js → new-efc4af017723e57a.js} +1 -1
  239. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-5d5a68e555d18693.js → [id]-b152319d67372ee4.js} +1 -1
  240. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-dba8692491f7935e.js +1 -0
  241. fides/ui-build/static/admin/_next/static/chunks/webpack-09ca52bc7beb0b43.js +1 -0
  242. fides/ui-build/static/admin/_next/static/css/3d66bb57ddcb0978.css +1 -0
  243. fides/ui-build/static/admin/_next/static/css/a1e4be9466578ef1.css +1 -0
  244. fides/ui-build/static/admin/_next/static/l2vgGUHB04Fi4oEVlVMrc/_buildManifest.js +1 -0
  245. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  246. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  247. fides/ui-build/static/admin/add-systems.html +1 -1
  248. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  249. fides/ui-build/static/admin/consent/configure.html +1 -1
  250. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  251. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  252. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  253. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  254. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  255. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  256. fides/ui-build/static/admin/consent/properties.html +1 -1
  257. fides/ui-build/static/admin/consent/reporting.html +1 -1
  258. fides/ui-build/static/admin/consent.html +1 -1
  259. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  260. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  261. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  262. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  263. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  264. fides/ui-build/static/admin/data-catalog.html +1 -1
  265. fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -1
  266. fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -1
  267. fides/ui-build/static/admin/data-discovery/action-center/infrastructure/[monitorId].html +1 -0
  268. fides/ui-build/static/admin/data-discovery/action-center/infrastructure.html +1 -0
  269. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -1
  270. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -1
  271. fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -1
  272. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  273. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  274. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  275. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  276. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  277. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  278. fides/ui-build/static/admin/datamap.html +1 -1
  279. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  280. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  281. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  282. fides/ui-build/static/admin/dataset/new.html +1 -1
  283. fides/ui-build/static/admin/dataset.html +1 -1
  284. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  285. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  286. fides/ui-build/static/admin/datastore-connection.html +1 -1
  287. fides/ui-build/static/admin/index.html +1 -1
  288. fides/ui-build/static/admin/integrations/[id].html +1 -1
  289. fides/ui-build/static/admin/integrations.html +1 -1
  290. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  291. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  292. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  293. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  294. fides/ui-build/static/admin/lib/fides.js +2 -2
  295. fides/ui-build/static/admin/login/[provider].html +1 -1
  296. fides/ui-build/static/admin/login.html +1 -1
  297. fides/ui-build/static/admin/new-privacy-requests.html +1 -1
  298. fides/ui-build/static/admin/notifications/digests/[id].html +1 -1
  299. fides/ui-build/static/admin/notifications/digests/new.html +1 -1
  300. fides/ui-build/static/admin/notifications/digests.html +1 -1
  301. fides/ui-build/static/admin/notifications/providers/[key].html +1 -1
  302. fides/ui-build/static/admin/notifications/providers/new.html +1 -1
  303. fides/ui-build/static/admin/notifications/providers.html +1 -1
  304. fides/ui-build/static/admin/notifications/templates/[id].html +1 -1
  305. fides/ui-build/static/admin/notifications/templates/add-template.html +1 -1
  306. fides/ui-build/static/admin/notifications/templates.html +1 -1
  307. fides/ui-build/static/admin/notifications.html +1 -1
  308. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  309. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  310. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  311. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  312. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  313. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  314. fides/ui-build/static/admin/poc/forms.html +1 -1
  315. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  316. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  317. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  318. fides/ui-build/static/admin/privacy-requests.html +1 -1
  319. fides/ui-build/static/admin/properties/[id].html +1 -1
  320. fides/ui-build/static/admin/properties/add-property.html +1 -1
  321. fides/ui-build/static/admin/properties.html +1 -1
  322. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  323. fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -1
  324. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  325. fides/ui-build/static/admin/settings/about.html +1 -1
  326. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  327. fides/ui-build/static/admin/settings/consent.html +1 -1
  328. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  329. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  330. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  331. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  332. fides/ui-build/static/admin/settings/domains.html +1 -1
  333. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  334. fides/ui-build/static/admin/settings/locations.html +1 -1
  335. fides/ui-build/static/admin/settings/organization.html +1 -1
  336. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  337. fides/ui-build/static/admin/settings/regulations.html +1 -1
  338. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  339. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  340. fides/ui-build/static/admin/systems.html +1 -1
  341. fides/ui-build/static/admin/taxonomy.html +1 -1
  342. fides/ui-build/static/admin/user-management/new.html +1 -1
  343. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  344. fides/ui-build/static/admin/user-management.html +1 -1
  345. fides/api/service/privacy_request/dsr_package/templates/welcome.html +0 -66
  346. fides/ui-build/static/admin/_next/static/chunks/1099-31f9d973bc287df8.js +0 -1
  347. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
  348. fides/ui-build/static/admin/_next/static/chunks/1437-8b1f6c8797c68bfd.js +0 -1
  349. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
  350. fides/ui-build/static/admin/_next/static/chunks/155-f6302d32cba4cab6.js +0 -1
  351. fides/ui-build/static/admin/_next/static/chunks/1817-2d5cf537a2992c79.js +0 -1
  352. fides/ui-build/static/admin/_next/static/chunks/2121.1de2fa060eae34aa.js +0 -1
  353. fides/ui-build/static/admin/_next/static/chunks/2921-34a43f2f8f5e5e69.js +0 -1
  354. fides/ui-build/static/admin/_next/static/chunks/2962-342ad1b4ab402ded.js +0 -1
  355. fides/ui-build/static/admin/_next/static/chunks/3377-988ac2f3a2e8d5d4.js +0 -1
  356. fides/ui-build/static/admin/_next/static/chunks/3446-f40c352c43ac950c.js +0 -1
  357. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
  358. fides/ui-build/static/admin/_next/static/chunks/3696-6f90e41a53d22920.js +0 -1
  359. fides/ui-build/static/admin/_next/static/chunks/3700-f695f2f6b8251971.js +0 -1
  360. fides/ui-build/static/admin/_next/static/chunks/3772-9f1713f9d5f97a10.js +0 -1
  361. fides/ui-build/static/admin/_next/static/chunks/3873-d18e47b327445db5.js +0 -1
  362. fides/ui-build/static/admin/_next/static/chunks/3923-f0a85dc5c3684fa0.js +0 -1
  363. fides/ui-build/static/admin/_next/static/chunks/4496-4ff19366c597ec16.js +0 -1
  364. fides/ui-build/static/admin/_next/static/chunks/4817-1f3e6ea38625d8d5.js +0 -1
  365. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
  366. fides/ui-build/static/admin/_next/static/chunks/5258-62d6bc19add60aa6.js +0 -1
  367. fides/ui-build/static/admin/_next/static/chunks/5279-bd6cccabdd6ca447.js +0 -1
  368. fides/ui-build/static/admin/_next/static/chunks/549-28537a6de666944b.js +0 -1
  369. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
  370. fides/ui-build/static/admin/_next/static/chunks/5643-3459282d296a3c59.js +0 -1
  371. fides/ui-build/static/admin/_next/static/chunks/6277-3759894435cb8569.js +0 -1
  372. fides/ui-build/static/admin/_next/static/chunks/6315-e2fb5ea77179a871.js +0 -1
  373. fides/ui-build/static/admin/_next/static/chunks/6344-ca66a6e10d128179.js +0 -1
  374. fides/ui-build/static/admin/_next/static/chunks/6419-11d67f7fd4e2f247.js +0 -1
  375. fides/ui-build/static/admin/_next/static/chunks/6954-84789a4e4fb04eb9.js +0 -1
  376. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
  377. fides/ui-build/static/admin/_next/static/chunks/7059-2bb7c38578549703.js +0 -1
  378. fides/ui-build/static/admin/_next/static/chunks/7202.3febe9e89640c712.js +0 -1
  379. fides/ui-build/static/admin/_next/static/chunks/7476-a02d970ea4d3f7d0.js +0 -1
  380. fides/ui-build/static/admin/_next/static/chunks/7488-cf92601852e3c509.js +0 -1
  381. fides/ui-build/static/admin/_next/static/chunks/7630-a11610c2b31ab2ca.js +0 -1
  382. fides/ui-build/static/admin/_next/static/chunks/7773-9ae233109bc64ec2.js +0 -1
  383. fides/ui-build/static/admin/_next/static/chunks/796-e36d610066135f8c.js +0 -1
  384. fides/ui-build/static/admin/_next/static/chunks/8011-75af8b480fa114e6.js +0 -1
  385. fides/ui-build/static/admin/_next/static/chunks/8373-22b4d20e8cc06b3a.js +0 -1
  386. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
  387. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
  388. fides/ui-build/static/admin/_next/static/chunks/9046-d9c6498368b993d1.js +0 -1
  389. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
  390. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
  391. fides/ui-build/static/admin/_next/static/chunks/9330-f753636a31c4ea04.js +0 -1
  392. fides/ui-build/static/admin/_next/static/chunks/9682-d1a3afa1394f8304.js +0 -1
  393. fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
  394. fides/ui-build/static/admin/_next/static/chunks/9899-d6437facac926264.js +0 -1
  395. fides/ui-build/static/admin/_next/static/chunks/9965-25621dd507e0cfd6.js +0 -1
  396. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-9af75caefc74eaca.js +0 -1
  397. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-6528eb24165aceb6.js +0 -1
  398. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-11f1683aa15e1a62.js +0 -1
  399. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-32bd7a7c990e5bf6.js +0 -1
  400. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-d60761c20382b259.js +0 -1
  401. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-07e7d38ce34e1e6c.js +0 -1
  402. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-b07a0707f8c2ec0d.js +0 -1
  403. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-aed94957009eb3fd.js +0 -1
  404. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-127c114dd8f102ed.js +0 -1
  405. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-5aa7a9fa96160de8.js +0 -1
  406. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-899bf30dde8b3292.js +0 -1
  407. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-73085f50abb775c0.js +0 -1
  408. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-823d0dd77e66585b.js +0 -1
  409. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-24a82e07a0008516.js +0 -1
  410. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-3b100c44ea9e3988.js +0 -1
  411. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-6fbe2b584a509226.js +0 -1
  412. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-3d1e48f4b95d7f6b.js +0 -1
  413. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-d3c6ecf7f29bea6e.js +0 -1
  414. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-0a4aa42be2da0255.js +0 -1
  415. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-14313e441a13192c.js +0 -1
  416. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f139d1ce26404f30.js +0 -1
  417. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-b2d3d28b10a758e6.js +0 -1
  418. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-a733e5d7c3ce9bb8.js +0 -1
  419. fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-df0c95e408c54c7e.js +0 -1
  420. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-aed9afd988a48acf.js +0 -1
  421. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-36a0ac36062abd02.js +0 -1
  422. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-a14c876b49422597.js +0 -1
  423. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-9cfb469de7b4aeab.js +0 -1
  424. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-e715cc654fb6a5cd.js +0 -1
  425. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-72ae299bcb6adae6.js +0 -1
  426. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-2337f8c81a766eb0.js +0 -1
  427. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0af454f55494f6fa.js +0 -1
  428. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-d1b90ffa996fbd89.js +0 -1
  429. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-19724b9e0581b96d.js +0 -1
  430. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-cdd3754289a28317.js +0 -1
  431. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-cc41ae605f2b55ae.js +0 -1
  432. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-6e4c535b6d614596.js +0 -1
  433. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-632b3ee563d070f2.js +0 -1
  434. fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-afe921f6e2a526fb.js +0 -1
  435. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-5b6807dced8d03c5.js +0 -1
  436. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-8634aae3259def37.js +0 -1
  437. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-2d9dcca17965dc57.js +0 -1
  438. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-7dce52bfc1b2652c.js +0 -1
  439. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-084a2b4431d35322.js +0 -1
  440. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-b72d36243a0a545c.js +0 -1
  441. fides/ui-build/static/admin/_next/static/chunks/pages/systems-cfaa37a0df83674b.js +0 -1
  442. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-56a5434969cbe9ba.js +0 -1
  443. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-e6a211d8a0401086.js +0 -1
  444. fides/ui-build/static/admin/_next/static/chunks/webpack-c2c11809187b9f84.js +0 -1
  445. fides/ui-build/static/admin/_next/static/css/d41a048a166d50e4.css +0 -1
  446. fides/ui-build/static/admin/_next/static/css/d78390d6134d8328.css +0 -1
  447. fides/ui-build/static/admin/_next/static/wCNFtmYQhEDMaMPeBB4BM/_buildManifest.js +0 -1
  448. fides/ui-build/static/admin/poc/table-migration.html +0 -1
  449. {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/WHEEL +0 -0
  450. {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/entry_points.txt +0 -0
  451. {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/licenses/LICENSE +0 -0
  452. {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/top_level.txt +0 -0
  453. /fides/ui-build/static/admin/_next/static/{wCNFtmYQhEDMaMPeBB4BM → l2vgGUHB04Fi4oEVlVMrc}/_ssgManifest.js +0 -0
@@ -9,7 +9,16 @@ from typing import Any, Dict, List, Optional, Set, Type
9
9
  from fideslang.validation import FidesKey, validate_fides_key
10
10
  from sqlalchemy import Boolean, Column
11
11
  from sqlalchemy import Enum as EnumColumn
12
- from sqlalchemy import Float, ForeignKey, String, UniqueConstraint, false, or_, text
12
+ from sqlalchemy import (
13
+ Float,
14
+ ForeignKey,
15
+ Integer,
16
+ String,
17
+ UniqueConstraint,
18
+ false,
19
+ or_,
20
+ text,
21
+ )
13
22
  from sqlalchemy.dialects.postgresql import ARRAY, JSONB
14
23
  from sqlalchemy.ext.mutable import MutableList
15
24
  from sqlalchemy.orm import RelationshipProperty, Session, relationship, selectinload
@@ -162,11 +171,18 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
162
171
  ForeignKey("privacynotice.id", ondelete="SET NULL"),
163
172
  nullable=True,
164
173
  )
174
+ display_order = Column(
175
+ Integer,
176
+ nullable=True,
177
+ doc="Optional ordering for child notices within a parent. Lower values appear first.",
178
+ )
179
+
165
180
  children: "RelationshipProperty[List[PrivacyNotice]]" = relationship(
166
181
  "PrivacyNotice",
167
182
  back_populates="parent",
168
183
  cascade="all",
169
184
  passive_deletes=True,
185
+ order_by=lambda: PrivacyNotice.display_order.asc().nullslast(),
170
186
  )
171
187
  parent: "RelationshipProperty[Optional[PrivacyNotice]]" = relationship(
172
188
  "PrivacyNotice",
@@ -375,6 +391,26 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
375
391
  res = [result for result in experience_regions_cursor_result]
376
392
  return res[0]["regions"] if res else []
377
393
 
394
+ @staticmethod
395
+ def _set_child_notice_display_order(
396
+ child_notices: List[Dict[str, Any]],
397
+ existing_notices: List[PrivacyNotice],
398
+ ) -> None:
399
+ """
400
+ Sets display_order on child notice objects based on their position in the child_notices list.
401
+
402
+ Args:
403
+ child_notices: List of dictionaries containing notice IDs in the desired order
404
+ existing_notices: List of PrivacyNotice objects to update
405
+ """
406
+ notice_id_to_index = {
407
+ child_notice["id"]: index
408
+ for index, child_notice in enumerate(child_notices)
409
+ }
410
+ for child_notice_obj in existing_notices:
411
+ if child_notice_obj.id in notice_id_to_index:
412
+ child_notice_obj.display_order = notice_id_to_index[child_notice_obj.id]
413
+
378
414
  @classmethod
379
415
  def fetch_and_validate_notices(
380
416
  cls,
@@ -442,6 +478,10 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
442
478
 
443
479
  # automatically links and unlinks at the DB level with this assignment
444
480
  created.children = existing_notices
481
+
482
+ # Set display_order on children based on their position in the ORIGINAL child_notices list
483
+ cls._set_child_notice_display_order(child_notices, existing_notices)
484
+
445
485
  db.commit()
446
486
 
447
487
  data.pop(
@@ -481,6 +521,9 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
481
521
  # automatically links and unlinks at the DB level with this assignment
482
522
  self.children = existing_notices
483
523
 
524
+ # Set display_order on children based on their position in the ORIGINAL child_notices list
525
+ self._set_child_notice_display_order(child_notices, existing_notices)
526
+
484
527
  # Performs a patch update of the base privacy notice
485
528
  base_notice_updated: bool = update_if_modified(self, db=db, data=data)
486
529
 
@@ -680,6 +723,7 @@ def create_historical_record_for_notice_and_translation(
680
723
  history_data: dict = create_historical_data_from_record(privacy_notice)
681
724
  history_data.pop("translations", None)
682
725
  history_data.pop("parent_id", None)
726
+ history_data.pop("display_order", None)
683
727
  # The source PrivacyNotice may have cached/computed attributes (e.g., @cached_property)
684
728
  # stored on the instance dict. These should not be included in historical payloads.
685
729
  # For example, 'cookies' is cached on the PrivacyNotice instance when accessed.
@@ -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):
@@ -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,15 +4,22 @@ 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
- from sqlalchemy.orm import Query, RelationshipProperty, Session, backref, relationship
15
+ from sqlalchemy.orm import (
16
+ Query,
17
+ RelationshipProperty,
18
+ Session,
19
+ backref,
20
+ defer,
21
+ relationship,
22
+ )
16
23
  from sqlalchemy.orm.dynamic import AppenderQuery
17
24
  from sqlalchemy_utils.types.encrypted.encrypted_type import (
18
25
  AesGcmEngine,
@@ -69,6 +76,7 @@ from fides.api.models.pre_approval_webhook import (
69
76
  PreApprovalWebhook,
70
77
  PreApprovalWebhookReply,
71
78
  )
79
+ from fides.api.models.privacy_request.duplicate_group import DuplicateGroup
72
80
  from fides.api.models.privacy_request.execution_log import (
73
81
  COMPLETED_EXECUTION_LOG_STATUSES,
74
82
  EXITED_EXECUTION_LOG_STATUSES,
@@ -225,7 +233,16 @@ class PrivacyRequest(
225
233
  location = Column(String, nullable=True)
226
234
 
227
235
  # Duplicate detection - group ID to link duplicates together
228
- duplicate_request_group_id = Column(String, index=True, nullable=True)
236
+ duplicate_request_group_id = Column(
237
+ UUID(as_uuid=True),
238
+ ForeignKey("duplicate_group.id"),
239
+ nullable=True,
240
+ )
241
+ duplicate_group = relationship(
242
+ DuplicateGroup,
243
+ back_populates="privacy_requests",
244
+ uselist=False,
245
+ )
229
246
 
230
247
  # A PrivacyRequest can be soft deleted, so we store when it was deleted
231
248
  deleted_at = Column(DateTime(timezone=True), nullable=True)
@@ -364,6 +381,29 @@ class PrivacyRequest(
364
381
 
365
382
  return super().create(db=db, data=data, check_name=check_name)
366
383
 
384
+ @classmethod
385
+ def query_without_large_columns(cls, db: Session) -> Query:
386
+ """
387
+ Returns a query for PrivacyRequest with large columns deferred to prevent OOM errors.
388
+
389
+ This excludes the large columns (_filtered_final_upload and access_result_urls)
390
+ which can be very large (MBs per request). Use this method for list views, bulk
391
+ operations, and background tasks that don't need the filtered results.
392
+
393
+ The large columns can still be accessed later if needed by accessing them directly
394
+ on individual PrivacyRequest instances.
395
+
396
+ Args:
397
+ db: Database session
398
+
399
+ Returns:
400
+ Query with large columns deferred
401
+ """
402
+ return db.query(cls).options(
403
+ defer(cls._filtered_final_upload),
404
+ defer(cls.access_result_urls),
405
+ )
406
+
367
407
  def to_safe_dict(self) -> Dict[str, Any]:
368
408
  """
369
409
  Return a dict representation of the PrivacyRequest, excluding any fields
@@ -604,7 +644,10 @@ class PrivacyRequest(
604
644
  """Verify the identification code supplied by the user
605
645
  If verified, change the status of the request to "pending", and set the datetime the identity was verified.
606
646
  """
607
- if not self.status == PrivacyRequestStatus.identity_unverified:
647
+ if not self.status in [
648
+ PrivacyRequestStatus.identity_unverified,
649
+ PrivacyRequestStatus.duplicate,
650
+ ]:
608
651
  raise IdentityVerificationException(
609
652
  f"Invalid identity verification request. Privacy request '{self.id}' status = {self.status.value}." # type: ignore # pylint: disable=no-member
610
653
  )
@@ -682,12 +725,29 @@ class PrivacyRequest(
682
725
  },
683
726
  )
684
727
 
685
- def get_cached_identity_data(self) -> Dict[str, Any]:
686
- """Retrieves any identity data pertaining to this request from the cache"""
728
+ def identity_prefix_cache_and_keys(self) -> Tuple[str, FidesopsRedis, List[str]]:
729
+ """Returns the prefix and cache keys for the identity data for this request"""
687
730
  prefix = f"id-{self.id}-identity-*"
688
731
  cache: FidesopsRedis = get_cache()
689
732
  keys = cache.keys(prefix)
690
- result = {}
733
+ return prefix, cache, keys
734
+
735
+ def verify_cache_for_identity_data(self) -> bool:
736
+ """Verifies if the identity data is cached for this request"""
737
+ _, _, keys = self.identity_prefix_cache_and_keys()
738
+ return len(keys) > 0
739
+
740
+ def get_cached_identity_data(self) -> Dict[str, Any]:
741
+ """Retrieves any identity data pertaining to this request from the cache"""
742
+ result: Dict[str, Any] = {}
743
+ prefix, cache, keys = self.identity_prefix_cache_and_keys()
744
+
745
+ if not keys:
746
+ logger.debug(f"Cache miss for request {self.id}, falling back to DB")
747
+ identity = self.get_persisted_identity()
748
+ self.cache_identity(identity)
749
+ keys = cache.keys(prefix)
750
+
691
751
  for key in keys:
692
752
  value = cache.get(key)
693
753
  if value:
@@ -705,10 +765,25 @@ class PrivacyRequest(
705
765
 
706
766
  def get_cached_custom_privacy_request_fields(self) -> Dict[str, Any]:
707
767
  """Retrieves any custom fields pertaining to this request from the cache"""
768
+ result: Dict[str, Any] = {}
708
769
  prefix = f"id-{self.id}-custom-privacy-request-field-*"
770
+
709
771
  cache: FidesopsRedis = get_cache()
710
772
  keys = cache.keys(prefix)
711
- result = {}
773
+
774
+ if not keys:
775
+ logger.debug(f"Cache miss for request {self.id}, falling back to DB")
776
+ custom_privacy_request_fields = (
777
+ self.get_persisted_custom_privacy_request_fields()
778
+ )
779
+ self.cache_custom_privacy_request_fields(
780
+ {
781
+ key: CustomPrivacyRequestFieldSchema(**value)
782
+ for key, value in custom_privacy_request_fields.items()
783
+ }
784
+ )
785
+ keys = cache.keys(prefix)
786
+
712
787
  for key in keys:
713
788
  value = cache.get(key)
714
789
  if value:
@@ -5,7 +5,8 @@ from __future__ import annotations
5
5
  from enum import Enum as EnumType
6
6
  from typing import TYPE_CHECKING
7
7
 
8
- from sqlalchemy import Column, ForeignKey, String
8
+ from sqlalchemy import Column, ForeignKey, Index, String
9
+ from sqlalchemy.ext.declarative import declared_attr
9
10
  from sqlalchemy.ext.mutable import MutableDict
10
11
  from sqlalchemy.orm import relationship
11
12
  from sqlalchemy_utils.types.encrypted.encrypted_type import (
@@ -46,6 +47,26 @@ class ProvidedIdentity(HashMigrationMixin, Base): # pylint: disable=R0904
46
47
  creation time.
47
48
  """
48
49
 
50
+ @declared_attr
51
+ def __table_args__(cls) -> tuple: # type: ignore[override]
52
+ """Define table-level constructs including indexes."""
53
+ return (
54
+ # Index on foreign key for better join performance and N+1 prevention
55
+ # Created via migration 3ff6449c099e
56
+ Index(
57
+ "ix_providedidentity_privacy_request_id",
58
+ "privacy_request_id",
59
+ ),
60
+ # Hash migration tracking index from HashMigrationMixin
61
+ Index(
62
+ "idx_providedidentity_unmigrated",
63
+ "is_hash_migrated",
64
+ postgresql_where=cls.is_hash_migrated.is_( # type: ignore[attr-defined] # pylint: disable=no-member
65
+ False
66
+ ),
67
+ ),
68
+ )
69
+
49
70
  privacy_request_id = Column(
50
71
  String,
51
72
  ForeignKey("privacyrequest.id", ondelete="CASCADE", onupdate="CASCADE"),
@@ -0,0 +1,63 @@
1
+ from typing import Dict
2
+
3
+ from sqlalchemy import Column, String
4
+ from sqlalchemy.dialects.postgresql import JSONB
5
+ from sqlalchemy.ext.declarative import declared_attr
6
+ from sqlalchemy.orm import Session
7
+
8
+ from fides.api.db.base_class import Base
9
+
10
+
11
+ class SaasTemplateDataset(Base):
12
+ """
13
+ Stores the latest template dataset for each SaaS connection type.
14
+
15
+ This table maintains a record of the template datasets that come with
16
+ Fides for each SaaS connector type. It's used as a baseline for
17
+ detecting customer modifications to datasets.
18
+ """
19
+
20
+ @declared_attr
21
+ def __tablename__(self) -> str:
22
+ return "saas_template_dataset"
23
+
24
+ connection_type = Column(String, nullable=False, unique=True, index=True)
25
+ dataset_json = Column(JSONB, nullable=False)
26
+
27
+ def __repr__(self) -> str:
28
+ return f"<SaasTemplateDataset(connection_type='{self.connection_type}')>"
29
+
30
+ @classmethod
31
+ def get_or_create( # type: ignore[override]
32
+ cls,
33
+ db: Session,
34
+ connector_type: str,
35
+ dataset_json: Dict,
36
+ ) -> tuple[bool, "SaasTemplateDataset"]:
37
+ """
38
+ Get existing SaasTemplateDataset by connector_type or create if it doesn't exist.
39
+
40
+ Args:
41
+ db: Database session
42
+ connector_type: The connection type identifier
43
+ dataset_json: The dataset JSON to use if creating
44
+
45
+ Returns:
46
+ Existing or newly created SaasTemplateDataset instance
47
+ """
48
+ created = False
49
+ template_dataset = cls.get_by(
50
+ db=db, field="connection_type", value=connector_type
51
+ )
52
+
53
+ if not template_dataset:
54
+ template_dataset = cls.create(
55
+ db=db,
56
+ data={
57
+ "connection_type": connector_type,
58
+ "dataset_json": dataset_json,
59
+ },
60
+ )
61
+ created = True
62
+
63
+ return created, template_dataset
@@ -1,5 +1,5 @@
1
1
  # type: ignore
2
- # pylint: disable=comparison-with-callable
2
+ # pylint: disable=comparison-with-callable, too-many-lines
3
3
  """
4
4
  Contains all of the SqlAlchemy models for the Fides resources.
5
5
  """
@@ -15,9 +15,10 @@ from fideslang.models import DataCategory as FideslangDataCategory
15
15
  from fideslang.models import Dataset as FideslangDataset
16
16
  from fideslang.models import DatasetCollection as FideslangDatasetCollection
17
17
  from pydantic import BaseModel
18
- from sqlalchemy import BOOLEAN, JSON, Column
19
- from sqlalchemy import Enum as EnumColumn
20
18
  from sqlalchemy import (
19
+ BOOLEAN,
20
+ JSON,
21
+ Column,
21
22
  ForeignKey,
22
23
  Index,
23
24
  Integer,
@@ -200,6 +201,54 @@ class DataCategory(Base, FidesBase):
200
201
  remote_side=[fides_key],
201
202
  )
202
203
 
204
+ @classmethod
205
+ def create(
206
+ cls: Type["DataCategory"],
207
+ db: Session,
208
+ *,
209
+ data: dict[str, Any],
210
+ check_name: bool = True,
211
+ ) -> "DataCategory":
212
+ """
213
+ Override create to skip name uniqueness check for hierarchical taxonomy.
214
+
215
+ DataCategory is hierarchical - fides_key provides sufficient uniqueness.
216
+ Multiple categories can share the same name as long as their keys differ.
217
+ """
218
+ # Check if data category with same fides_key already exists
219
+ if "fides_key" in data and data["fides_key"]:
220
+ existing_by_key = (
221
+ db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
222
+ )
223
+ if existing_by_key:
224
+ raise KeyOrNameAlreadyExists(
225
+ f'Data category with fides_key "{data["fides_key"]}" already exists.'
226
+ )
227
+ # Always skip name check - fides_key uniqueness is sufficient
228
+ return super().create(db=db, data=data, check_name=False)
229
+
230
+ def update(self, db: Session, *, data: dict[str, Any]) -> "DataCategory":
231
+ """
232
+ Override update to check for existing data categories with the same fides_key
233
+ when fides_key is being changed.
234
+ """
235
+ # Check if fides_key is being changed and if it conflicts with an existing category
236
+ if (
237
+ "fides_key" in data
238
+ and data["fides_key"]
239
+ and data["fides_key"] != self.fides_key
240
+ ):
241
+ existing_by_key = (
242
+ db.query(DataCategory)
243
+ .filter(DataCategory.fides_key == data["fides_key"])
244
+ .first()
245
+ )
246
+ if existing_by_key:
247
+ raise KeyOrNameAlreadyExists(
248
+ f'Data category with fides_key "{data["fides_key"]}" already exists.'
249
+ )
250
+ return super().update(db=db, data=data)
251
+
203
252
  @classmethod
204
253
  def from_fideslang_obj(
205
254
  cls, data_category: FideslangDataCategory
@@ -231,6 +280,54 @@ class DataSubject(Base, FidesBase):
231
280
  version_deprecated = Column(Text)
232
281
  replaced_by = Column(Text)
233
282
 
283
+ @classmethod
284
+ def create(
285
+ cls: Type["DataSubject"],
286
+ db: Session,
287
+ *,
288
+ data: dict[str, Any],
289
+ check_name: bool = True,
290
+ ) -> "DataSubject":
291
+ """
292
+ Override create to skip name uniqueness check for data subjects.
293
+
294
+ DataSubject allows duplicate names - fides_key provides sufficient uniqueness.
295
+ Multiple subjects can share the same name as long as their keys differ.
296
+ """
297
+ # Check if data subject with same fides_key already exists
298
+ if "fides_key" in data and data["fides_key"]:
299
+ existing_by_key = (
300
+ db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
301
+ )
302
+ if existing_by_key:
303
+ raise KeyOrNameAlreadyExists(
304
+ f'Data subject with fides_key "{data["fides_key"]}" already exists.'
305
+ )
306
+ # Always skip name check - fides_key uniqueness is sufficient
307
+ return super().create(db=db, data=data, check_name=False)
308
+
309
+ def update(self, db: Session, *, data: dict[str, Any]) -> "DataSubject":
310
+ """
311
+ Override update to check for existing data subjects with the same fides_key
312
+ when fides_key is being changed.
313
+ """
314
+ # Check if fides_key is being changed and if it conflicts with an existing subject
315
+ if (
316
+ "fides_key" in data
317
+ and data["fides_key"]
318
+ and data["fides_key"] != self.fides_key
319
+ ):
320
+ existing_by_key = (
321
+ db.query(DataSubject)
322
+ .filter(DataSubject.fides_key == data["fides_key"])
323
+ .first()
324
+ )
325
+ if existing_by_key:
326
+ raise KeyOrNameAlreadyExists(
327
+ f'Data subject with fides_key "{data["fides_key"]}" already exists.'
328
+ )
329
+ return super().update(db=db, data=data)
330
+
234
331
 
235
332
  class DataUse(Base, FidesBase):
236
333
  """
@@ -264,6 +361,52 @@ class DataUse(Base, FidesBase):
264
361
  remote_side=[fides_key],
265
362
  )
266
363
 
364
+ @classmethod
365
+ def create(
366
+ cls: Type["DataUse"],
367
+ db: Session,
368
+ *,
369
+ data: dict[str, Any],
370
+ check_name: bool = True,
371
+ ) -> "DataUse":
372
+ """
373
+ Override create to skip name uniqueness check for hierarchical taxonomy.
374
+
375
+ DataUse is hierarchical - fides_key provides sufficient uniqueness.
376
+ Multiple uses can share the same name as long as their keys differ.
377
+ """
378
+ # Check if data use with same fides_key already exists
379
+ if "fides_key" in data and data["fides_key"]:
380
+ existing_by_key = (
381
+ db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
382
+ )
383
+ if existing_by_key:
384
+ raise KeyOrNameAlreadyExists(
385
+ f'Data use with fides_key "{data["fides_key"]}" already exists.'
386
+ )
387
+ # Always skip name check - fides_key uniqueness is sufficient
388
+ return super().create(db=db, data=data, check_name=False)
389
+
390
+ def update(self, db: Session, *, data: dict[str, Any]) -> "DataUse":
391
+ """
392
+ Override update to check for existing data uses with the same fides_key
393
+ when fides_key is being changed.
394
+ """
395
+ # Check if fides_key is being changed and if it conflicts with an existing use
396
+ if (
397
+ "fides_key" in data
398
+ and data["fides_key"]
399
+ and data["fides_key"] != self.fides_key
400
+ ):
401
+ existing_by_key = (
402
+ db.query(DataUse).filter(DataUse.fides_key == data["fides_key"]).first()
403
+ )
404
+ if existing_by_key:
405
+ raise KeyOrNameAlreadyExists(
406
+ f'DataUse with fides_key "{data["fides_key"]}" already exists.'
407
+ )
408
+ return super().update(db=db, data=data)
409
+
267
410
  @staticmethod
268
411
  def get_parent_uses_from_key(data_use_key: str) -> Set[str]:
269
412
  """
@@ -311,7 +454,7 @@ class Dataset(Base, FidesBase):
311
454
  Duplicate names are allowed.
312
455
  """
313
456
  # Check if dataset with same fides_key already exists
314
- if "fides_key" in data:
457
+ if "fides_key" in data and data["fides_key"]:
315
458
  existing_by_key = (
316
459
  db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
317
460
  )
@@ -775,11 +918,11 @@ class CustomFieldDefinition(Base):
775
918
  name = Column(String, index=True, nullable=False)
776
919
  description = Column(String)
777
920
  field_type = Column(
778
- EnumColumn(AllowedTypes),
921
+ String,
779
922
  nullable=False,
780
923
  )
781
924
  allow_list_id = Column(String, ForeignKey(CustomFieldValueList.id), nullable=True)
782
- resource_type = Column(EnumColumn(ResourceTypes), nullable=False)
925
+ resource_type = Column(String, nullable=False)
783
926
  field_definition = Column(String)
784
927
  custom_field = relationship(
785
928
  "CustomField",
@@ -843,7 +986,7 @@ class CustomField(Base):
843
986
 
844
987
  __tablename__ = "plus_custom_field"
845
988
 
846
- resource_type = Column(EnumColumn(ResourceTypes), nullable=False)
989
+ resource_type = Column(String, nullable=False)
847
990
  resource_id = Column(String, index=True, nullable=False)
848
991
  custom_field_definition_id = Column(
849
992
  String, ForeignKey(CustomFieldDefinition.id), nullable=False