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
@@ -609,6 +609,7 @@ def get_users(
609
609
  params: Params = Depends(),
610
610
  username: Optional[str] = None,
611
611
  include_external: bool = True,
612
+ exclude_approvers: bool = False,
612
613
  client: ClientDetail = Security(verify_user_read_scopes),
613
614
  authorization: str = Security(oauth2_scheme),
614
615
  ) -> AbstractPage[FidesUser]:
@@ -628,10 +629,15 @@ def get_users(
628
629
  query = query.filter(FidesUser.username.ilike(f"%{escape_like(username)}%"))
629
630
 
630
631
  # Filter out external respondents if include_external is False
631
- if not include_external:
632
- query = query.join(FidesUserPermissions).filter(
633
- ~FidesUserPermissions.roles.op("@>")([EXTERNAL_RESPONDENT])
634
- )
632
+ # Filter out approvers if exclude_approvers is True
633
+ if not include_external or exclude_approvers:
634
+ query = query.join(FidesUserPermissions)
635
+ if not include_external:
636
+ query = query.filter(
637
+ ~FidesUserPermissions.roles.op("@>")([EXTERNAL_RESPONDENT])
638
+ )
639
+ if exclude_approvers:
640
+ query = query.filter(~FidesUserPermissions.roles.op("@>")([APPROVER]))
635
641
  else:
636
642
  # User has USER_READ_OWN scope, only show their own data
637
643
  query = query.filter(FidesUser.id == client.user_id)
fides/api/db/base.py CHANGED
@@ -80,6 +80,7 @@ from fides.api.models.property import (
80
80
  Property,
81
81
  )
82
82
  from fides.api.models.registration import UserRegistration
83
+ from fides.api.models.saas_template_dataset import SaasTemplateDataset
83
84
  from fides.api.models.storage import StorageConfig
84
85
  from fides.api.models.system_compass_sync import SystemCompassSync
85
86
  from fides.api.models.system_group import SystemGroup, SystemGroupMember
fides/api/db/database.py CHANGED
@@ -2,7 +2,10 @@
2
2
  Contains all of the logic related to the database including connections, setup, teardown, etc.
3
3
  """
4
4
 
5
+ import os
6
+ import subprocess
5
7
  from os import path
8
+ from pathlib import Path
6
9
  from typing import Literal, Optional, Tuple
7
10
 
8
11
  from alembic import command, script
@@ -190,4 +193,228 @@ def check_missing_migrations(database_url: str) -> None:
190
193
  for item in result:
191
194
  log.error(f" - {item}")
192
195
  raise SystemExit("Migration needs to be generated!")
193
- print("No migrations need to be generated.")
196
+ log.info("No migrations need to be generated.")
197
+
198
+
199
+ def _get_base_branch_for_comparison() -> str:
200
+ """
201
+ Determine the base branch to compare against for detecting new migrations.
202
+
203
+ In GitHub Actions PRs, uses GITHUB_BASE_REF (the PR target branch).
204
+ Otherwise, falls back to origin/main for local development.
205
+
206
+ Returns:
207
+ The base branch reference (e.g., 'origin/main', 'origin/develop')
208
+ """
209
+ base_ref = os.environ.get("GITHUB_BASE_REF")
210
+ if base_ref:
211
+ base_branch = f"origin/{base_ref}"
212
+ log.info(f"Comparing against PR target branch: {base_branch}")
213
+ else:
214
+ base_branch = "origin/main"
215
+ log.info(f"No GITHUB_BASE_REF found, comparing against: {base_branch}")
216
+ return base_branch
217
+
218
+
219
+ def _get_new_migration_files(repo_root: str, base_branch: str) -> list[str]:
220
+ """
221
+ Get list of new migration files added in the current branch.
222
+
223
+ Files are sorted by the timestamp in their filename to ensure chronological order.
224
+ Migration files follow the pattern: xx_YYYY_MM_DD_HHMM_revision_description.py
225
+
226
+ Args:
227
+ repo_root: Absolute path to the git repository root
228
+ base_branch: The base branch to compare against
229
+
230
+ Returns:
231
+ List of relative file paths to new migration files, sorted chronologically
232
+
233
+ Raises:
234
+ SystemExit: If the migrations directory does not exist
235
+ """
236
+ # Validate that the migrations directory exists
237
+ migrations_dir = (
238
+ Path(repo_root)
239
+ / "src"
240
+ / "fides"
241
+ / "api"
242
+ / "alembic"
243
+ / "migrations"
244
+ / "versions"
245
+ )
246
+ if not migrations_dir.exists():
247
+ log.error(f"Migrations directory not found: {migrations_dir}")
248
+ raise SystemExit(
249
+ f"Migration directory not found at expected path: {migrations_dir}\n"
250
+ "If the migrations directory has been moved, update the path in "
251
+ "fides.api.db.database._get_new_migration_files()"
252
+ )
253
+
254
+ migration_pattern = "src/fides/api/alembic/migrations/versions/*.py"
255
+ diff_output = subprocess.check_output(
256
+ [
257
+ "git",
258
+ "diff",
259
+ "--name-only",
260
+ "--diff-filter=A", # Only added files
261
+ f"{base_branch}...HEAD",
262
+ "--",
263
+ migration_pattern,
264
+ ],
265
+ stderr=subprocess.STDOUT,
266
+ text=True,
267
+ cwd=repo_root,
268
+ ).strip()
269
+
270
+ if not diff_output:
271
+ return []
272
+
273
+ migration_files = [f for f in diff_output.split("\n") if f]
274
+
275
+ # Sort by filename to ensure chronological order
276
+ # Files are named: xx_YYYY_MM_DD_HHMM_revision_description.py
277
+ # Sorting alphabetically will sort them chronologically due to the date format
278
+ migration_files.sort()
279
+
280
+ return migration_files
281
+
282
+
283
+ def _parse_migration_revisions(migration_path: Path) -> tuple[str, Optional[str]]:
284
+ """
285
+ Extract revision and down_revision IDs from a migration file.
286
+
287
+ Args:
288
+ migration_path: Path to the migration file
289
+
290
+ Returns:
291
+ Tuple of (revision, down_revision). down_revision may be None.
292
+
293
+ Raises:
294
+ SystemExit: If revision ID cannot be found in the file
295
+ """
296
+ revision = None
297
+ down_revision = None
298
+
299
+ with open(migration_path, "r", encoding="utf-8") as f:
300
+ for line in f:
301
+ if line.strip().startswith("revision ="):
302
+ revision = line.split("=")[1].strip().strip("\"'")
303
+ elif line.strip().startswith("down_revision ="):
304
+ down_rev_value = line.split("=")[1].strip().strip("\"'")
305
+ if down_rev_value.lower() != "none":
306
+ down_revision = down_rev_value
307
+
308
+ if not revision:
309
+ log.error(f"Could not find revision ID in {migration_path}")
310
+ raise SystemExit(f"Invalid migration file: {migration_path}")
311
+
312
+ return revision, down_revision
313
+
314
+
315
+ def _test_migrations_upgrade_downgrade_sequence(
316
+ alembic_config: Config,
317
+ migrations: list[tuple[str, str, Optional[str]]],
318
+ ) -> None:
319
+ """
320
+ Test multiple migrations can be upgraded and downgraded successfully in sequence.
321
+
322
+ Tests all new migrations together by:
323
+ 1. Downgrading incrementally through all migrations (newest to oldest)
324
+ 2. Upgrading incrementally back through all migrations (oldest to newest)
325
+
326
+ After Phase 2, the database is at the newest migration revision, which should
327
+ match HEAD for the new migrations being tested.
328
+
329
+ This approach tests migrations in a realistic sequence and can catch
330
+ interaction issues between migrations.
331
+
332
+ Args:
333
+ alembic_config: Alembic configuration
334
+ migrations: List of (migration_name, revision, down_revision) tuples
335
+
336
+ Raises:
337
+ SystemExit: If any migration upgrade/downgrade test fails
338
+ """
339
+ if not migrations:
340
+ return
341
+
342
+ log.info(f"Testing {len(migrations)} migration(s) in sequence")
343
+
344
+ try:
345
+ # Phase 1: Downgrade through all migrations (newest to oldest)
346
+ log.info("Phase 1: Downgrading through all new migrations...")
347
+ for migration_name, revision, down_revision in reversed(migrations):
348
+ if down_revision:
349
+ log.info(f" Downgrading {migration_name} to {down_revision}...")
350
+ downgrade_db(alembic_config, down_revision)
351
+ else:
352
+ log.info(f" Skipping {migration_name} (no down_revision)")
353
+
354
+ # Phase 2: Upgrade back through all migrations (oldest to newest)
355
+ log.info("Phase 2: Upgrading back through all new migrations...")
356
+ for migration_name, revision, down_revision in migrations:
357
+ log.info(f" Upgrading {migration_name} to {revision}...")
358
+ upgrade_db(alembic_config, revision)
359
+
360
+ log.info(f"✓ All {len(migrations)} migration(s) passed upgrade/downgrade test")
361
+
362
+ except Exception as error:
363
+ log.error("Migration upgrade/downgrade sequence test failed!")
364
+ log.error(str(error))
365
+ raise SystemExit("Migration upgrade/downgrade test failed")
366
+
367
+
368
+ def check_new_migrations_upgrade_downgrade(database_url: str) -> None:
369
+ """
370
+ Detects new migrations added in the current branch and tests that they
371
+ can be successfully upgraded and downgraded.
372
+
373
+ Uses git to compare against the target/base branch to find new migration files.
374
+ In CI, uses GITHUB_BASE_REF if available, otherwise falls back to origin/main.
375
+ """
376
+ try:
377
+ # Get the repo root directory
378
+ repo_root = subprocess.check_output(
379
+ ["git", "rev-parse", "--show-toplevel"],
380
+ stderr=subprocess.STDOUT,
381
+ text=True,
382
+ ).strip()
383
+
384
+ # Determine base branch and get new migration files
385
+ base_branch = _get_base_branch_for_comparison()
386
+ migration_files = _get_new_migration_files(repo_root, base_branch)
387
+
388
+ if not migration_files:
389
+ log.info("No new migration files detected in current branch")
390
+ log.info("No new migrations to test.")
391
+ return
392
+
393
+ log.info(f"Detected {len(migration_files)} new migration(s) to test")
394
+
395
+ # Log the migrations in order
396
+ for i, file_path in enumerate(migration_files, 1):
397
+ log.info(f" {i}. {Path(file_path).name}")
398
+
399
+ alembic_config = get_alembic_config(database_url)
400
+
401
+ # Parse all migrations first
402
+ migrations = []
403
+ for file_path in migration_files:
404
+ abs_path = Path(repo_root) / file_path
405
+ revision, down_revision = _parse_migration_revisions(abs_path)
406
+ migrations.append((abs_path.name, revision, down_revision))
407
+
408
+ # Test all migrations in sequence
409
+ _test_migrations_upgrade_downgrade_sequence(alembic_config, migrations)
410
+
411
+ log.info(
412
+ f"All {len(migration_files)} new migration(s) passed upgrade/downgrade tests."
413
+ )
414
+
415
+ except subprocess.CalledProcessError as error:
416
+ # Git command failed - might not be in a git repo or no origin/main
417
+ log.warning(f"Could not detect new migrations via git: {error}")
418
+ log.warning(
419
+ "Skipping migration upgrade/downgrade check (git detection failed)."
420
+ )
fides/api/db/seed.py CHANGED
@@ -388,7 +388,7 @@ async def load_samples(async_session: AsyncSession) -> None:
388
388
  ) # not supported by this API!
389
389
  instantiate_connection_from_template(
390
390
  db=db_session,
391
- saas_connector_type=connection.saas_connector_type,
391
+ connector_template_type=connection.saas_connector_type,
392
392
  template_values=SaasConnectionTemplateValues.model_validate(
393
393
  saas_template_data
394
394
  ),
@@ -8,16 +8,20 @@
8
8
  <main>
9
9
  <p>Hello {{ display_name }},</p>
10
10
 
11
- <p>An account has been created for you by the privacy team at {{ org_name }} so that you can assist them in responding to data subject requests, as required by the GDPR and many US state laws, for users that have data in your systems.</p>
11
+ {% if custom_intro %}
12
+ <div>{{ custom_intro | safe }}</div>
13
+ {% else %}
14
+ <p>An account has been created for you by the privacy team at {{ org_name }} so that you can assist them in responding to data subject requests, as required by the GDPR and many US state laws, for users that have data in your systems.</p>
12
15
 
13
- <p>A portal is available to view and take action on these requests at: <a href="{{ portal_link }}">{{ portal_link }}</a>. Through this portal you can upload or provide user data for users who have requested a copy of their information and attest that users have been removed from your system in the case of an erasure request.</p>
16
+ <p>A portal is available to view and take action on these requests at: <a href="{{ portal_link }}">{{ portal_link }}</a>. Through this portal you can upload or provide user data for users who have requested a copy of their information and attest that users have been removed from your system in the case of an erasure request.</p>
14
17
 
15
- <p>The provided link is valid for 30 days and you will be asked to verify your email address each time you access the portal.</p>
18
+ <p>The provided link is valid for 30 days and you will be asked to verify your email address each time you access the portal.</p>
16
19
 
17
- <p>If you have any questions, please reach out first to your contacts at: {{ org_name }}</p>
20
+ <p>If you have any questions, please reach out first to your contacts at: {{ org_name }}</p>
21
+ {% endif %}
18
22
 
19
23
  <p>Regards,<br/>
20
24
  {{ org_name }} Privacy Team</p>
21
25
  </main>
22
26
  </body>
23
- </html>
27
+ </html>
@@ -33,6 +33,9 @@ This means that after the constraint is created, the index will have the same na
33
33
  """
34
34
 
35
35
  POST_UPGRADE_INDEX_CREATION = "post_upgrade_index_creation"
36
+ # This is the threshold for the number of rows in a table to create the index during application startup
37
+ # The value follows the pattern established in migrations for the tables in the TABLE_OBJECT_MAP
38
+ INDEX_ROW_COUNT_THRESHOLD = 1000000
36
39
 
37
40
  TABLE_OBJECT_MAP: Dict[str, List[Dict[str, str]]] = {
38
41
  "currentprivacypreferencev2": [
@@ -93,6 +96,13 @@ TABLE_OBJECT_MAP: Dict[str, List[Dict[str, str]]] = {
93
96
  "type": "index",
94
97
  },
95
98
  ],
99
+ "providedidentity": [
100
+ {
101
+ "name": "ix_providedidentity_privacy_request_id",
102
+ "statement": "CREATE INDEX CONCURRENTLY ix_providedidentity_privacy_request_id ON providedidentity (privacy_request_id)",
103
+ "type": "index",
104
+ },
105
+ ],
96
106
  "servednoticehistory": [
97
107
  {
98
108
  "name": "ix_servednoticehistory_hashed_external_id",
@@ -71,7 +71,8 @@ class ConnectionType(enum.Enum):
71
71
  timescale = "timescale"
72
72
  website = "website"
73
73
  # Test connection types, used for testing purposes only
74
- test_website = "test_website" # used for ConfigurableTesteWebsiteMonitor
74
+ test_datastore = "test_datastore" # used for ConfigurableTestMonitor
75
+ test_website = "test_website" # used for ConfigurableTestWebsiteMonitor
75
76
 
76
77
  @property
77
78
  def human_readable(self) -> str:
@@ -109,6 +110,7 @@ class ConnectionType(enum.Enum):
109
110
  ConnectionType.sovrn.value: "Sovrn",
110
111
  ConnectionType.timescale.value: "TimescaleDB",
111
112
  ConnectionType.website.value: "Website",
113
+ ConnectionType.test_datastore.value: "Test Datastore Connector -- not for production use",
112
114
  ConnectionType.test_website.value: "Test Website Connector -- not for production use",
113
115
  }
114
116
  try:
@@ -155,6 +157,7 @@ class ConnectionType(enum.Enum):
155
157
  ConnectionType.sovrn.value: SystemType.email,
156
158
  ConnectionType.timescale.value: SystemType.database,
157
159
  ConnectionType.website.value: SystemType.website,
160
+ ConnectionType.test_datastore.value: SystemType.database,
158
161
  ConnectionType.test_website.value: SystemType.website,
159
162
  }
160
163
 
@@ -17,6 +17,7 @@ from .monitor_task import (
17
17
  create_monitor_task_with_execution_log,
18
18
  update_monitor_task_with_execution_log,
19
19
  )
20
+ from .staged_resource_error import StagedResourceError
20
21
 
21
22
  __all__ = [
22
23
  "ClassificationBenchmark",
@@ -27,6 +28,7 @@ __all__ = [
27
28
  "SharedMonitorConfig",
28
29
  "StagedResource",
29
30
  "StagedResourceAncestor",
31
+ "StagedResourceError",
30
32
  "fetch_staged_resources_by_type_query",
31
33
  "MonitorTask",
32
34
  "MonitorTaskExecutionLog",
@@ -29,6 +29,9 @@ from sqlalchemy.orm.query import Query
29
29
 
30
30
  from fides.api.db.base_class import Base, FidesBase
31
31
  from fides.api.models.connectionconfig import ConnectionConfig
32
+ from fides.api.models.detection_discovery.staged_resource_error import (
33
+ StagedResourceError,
34
+ )
32
35
  from fides.api.models.sql_models import System # type: ignore[attr-defined]
33
36
 
34
37
 
@@ -573,6 +576,13 @@ class StagedResource(Base):
573
576
  # diff-related fields
574
577
  diff_status = Column(String, nullable=True, index=True)
575
578
 
579
+ errors: RelationshipProperty[List[StagedResourceError]] = relationship(
580
+ "StagedResourceError",
581
+ foreign_keys=[StagedResourceError.staged_resource_urn],
582
+ primaryjoin="StagedResource.urn == StagedResourceError.staged_resource_urn",
583
+ cascade="all, delete-orphan",
584
+ )
585
+
576
586
  ancestor_links: RelationshipProperty[List[StagedResourceAncestor]] = relationship(
577
587
  "StagedResourceAncestor",
578
588
  back_populates="descendant_staged_resource",
@@ -0,0 +1,25 @@
1
+ """Module for staged resource error tracking."""
2
+
3
+ from sqlalchemy import Column, DateTime, ForeignKey, String
4
+
5
+ from fides.api.db.base_class import Base, FidesBase
6
+
7
+
8
+ class StagedResourceError(Base):
9
+ """
10
+ DB model for tracking errors associated with staged resources.
11
+ Linked to StagedResource via FK with cascade delete.
12
+ """
13
+
14
+ id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
15
+ staged_resource_urn = Column(
16
+ String,
17
+ ForeignKey("stagedresource.urn", ondelete="CASCADE"),
18
+ nullable=False,
19
+ index=True,
20
+ )
21
+ message = Column(String, nullable=False)
22
+ timestamp = Column(DateTime(timezone=True), nullable=False)
23
+ error_type = Column(String, nullable=False)
24
+ diff_status = Column(String, nullable=False) # Phase where error occurred
25
+ task_id = Column(String, nullable=True, index=True)
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from uuid import uuid4
4
4
 
5
- from sqlalchemy import Column, ForeignKey, String
5
+ from sqlalchemy import Column, ForeignKey, Integer, String
6
6
 
7
7
  from fides.api.db.base_class import Base
8
8
 
@@ -42,3 +42,8 @@ class ExperienceNotices(Base):
42
42
  nullable=False,
43
43
  primary_key=True,
44
44
  )
45
+ display_order = Column(
46
+ Integer,
47
+ nullable=True,
48
+ doc="Optional ordering for notices within an experience. Lower values appear first.",
49
+ )
@@ -1,6 +1,6 @@
1
1
  from enum import Enum
2
2
 
3
- from sqlalchemy import Column, String, Text
3
+ from sqlalchemy import Boolean, Column, String, Text
4
4
  from sqlalchemy.ext.declarative import declared_attr
5
5
 
6
6
  from fides.api.db.base_class import Base, FidesBase
@@ -63,3 +63,4 @@ class IdentityDefinition(Base):
63
63
  nullable=False,
64
64
  )
65
65
  created_by = Column(String(255), nullable=True)
66
+ is_default = Column(Boolean, nullable=False, server_default="false")
@@ -408,6 +408,28 @@ privacy_notice_regions_by_id: Dict[str, Union[Location, LocationGroup]] = (
408
408
  ) # should only be accessed for read-only access
409
409
 
410
410
 
411
+ def get_location_by_id(location: str) -> Optional[Location]:
412
+ """
413
+ Get a Location object by ID, with automatic format normalization.
414
+
415
+ Handles various location formats (e.g., "US-CA", "us-ca", "us_ca") by
416
+ normalizing to the internal format (lowercase with underscores) used in locations.yml.
417
+
418
+ Args:
419
+ location: Location string in any format
420
+
421
+ Returns:
422
+ Location object if found, None otherwise
423
+
424
+ Examples:
425
+ >>> get_location_by_id("US-CA") # ISO 3166 format
426
+ >>> get_location_by_id("us_ca") # Internal format
427
+ >>> get_location_by_id("us-ca") # Mixed format
428
+ """
429
+ normalized = location.lower().replace("-", "_")
430
+ return locations_by_id.get(normalized)
431
+
432
+
411
433
  # dynamically create an enum based on definitions loaded from YAML
412
434
  # This is a combination of "locations" and "location groups" for use on Privacy Experiences
413
435
  PrivacyNoticeRegion = Enum( # type: ignore[misc]
@@ -5,7 +5,7 @@ from pydantic import ConfigDict, create_model
5
5
  from sqlalchemy import Column, ForeignKey, String, or_, text
6
6
  from sqlalchemy.dialects.postgresql import JSONB
7
7
  from sqlalchemy.ext.mutable import MutableList
8
- from sqlalchemy.orm import Session, relationship
8
+ from sqlalchemy.orm import Session, relationship, selectinload
9
9
 
10
10
  from fides.api.db.base_class import Base
11
11
  from fides.api.models.attachment import Attachment, AttachmentReference
@@ -137,11 +137,22 @@ class AccessManualWebhook(Base):
137
137
  ) -> list["AccessManualWebhook"]:
138
138
  """Get all enabled access manual webhooks with fields"""
139
139
 
140
- query = db.query(cls).filter(
141
- AccessManualWebhook.connection_config_id == ConnectionConfig.id,
142
- ConnectionConfig.disabled.is_(False),
143
- AccessManualWebhook.fields != text("'null'"),
144
- AccessManualWebhook.fields != "[]",
140
+ query = (
141
+ db.query(cls)
142
+ .join(
143
+ ConnectionConfig,
144
+ AccessManualWebhook.connection_config_id == ConnectionConfig.id,
145
+ )
146
+ .options(
147
+ selectinload(AccessManualWebhook.connection_config).selectinload(
148
+ ConnectionConfig.system
149
+ ), # type: ignore[attr-defined]
150
+ )
151
+ .filter(
152
+ ConnectionConfig.disabled.is_(False),
153
+ AccessManualWebhook.fields != text("'null'"),
154
+ AccessManualWebhook.fields != "[]",
155
+ )
145
156
  )
146
157
 
147
158
  # Add action_type filter only if action_type is provided
@@ -65,6 +65,13 @@ DEFAULT_MESSAGING_TEMPLATES: Dict[str, Any] = {
65
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
66
  },
67
67
  },
68
+ MessagingActionType.EXTERNAL_USER_WELCOME.value: {
69
+ "label": "External user welcome",
70
+ "content": {
71
+ "subject": "Welcome to our Privacy Center",
72
+ "body": "An account has been created for you by the privacy team at __ORG_NAME__ so that you can assist them in responding to data subject requests, as required by the GDPR and many US state laws, for users that have data in your systems. A portal is available to view and take action on these requests at: __PORTAL_LINK__. Through this portal you can upload or provide user data for users who have requested a copy of their information and attest that users have been removed from your system in the case of an erasure request. The provided link is valid for 30 days and you will be asked to verify your email address each time you access the portal. If you have any questions, please reach out first to your contacts at: __ORG_NAME__",
73
+ },
74
+ },
68
75
  }
69
76
 
70
77
 
@@ -142,6 +142,9 @@ class Policy(Base):
142
142
  except IndexError:
143
143
  return None
144
144
 
145
+ def get_all_action_types(self) -> Set[ActionType]:
146
+ return set(rule.action_type for rule in self.rules) # type: ignore[attr-defined]
147
+
145
148
  def generate_masking_secrets(self) -> Optional[List[MaskingSecretCache]]:
146
149
  """
147
150
  Returns a list of masking secrets for the masking strategies in the policy.
@@ -17,6 +17,7 @@ from fides.api.models import (
17
17
  dry_update_data,
18
18
  update_if_modified,
19
19
  )
20
+ from fides.api.models.experience_notices import ExperienceNotices
20
21
  from fides.api.models.location_regulation_selections import PrivacyNoticeRegion
21
22
  from fides.api.models.privacy_notice import PrivacyNotice
22
23
  from fides.api.models.property import Property
@@ -48,6 +49,7 @@ class Layer1ButtonOption(Enum):
48
49
  ACKNOWLEDGE = "acknowledge"
49
50
  OPT_IN_OPT_OUT = "opt_in_opt_out"
50
51
  OPT_IN_ONLY = "opt_in_only"
52
+ GPC_CONDITIONAL = "gpc_conditional"
51
53
 
52
54
 
53
55
  class RejectAllMechanism(Enum):
@@ -271,6 +273,7 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
271
273
  secondary="experiencenotices",
272
274
  backref="experience_configs",
273
275
  lazy="selectin",
276
+ order_by="ExperienceNotices.display_order.asc().nullslast()",
274
277
  )
275
278
 
276
279
  translations: RelationshipProperty[List[ExperienceTranslation]] = relationship(
@@ -748,15 +751,19 @@ def link_notices_to_experience_config(
748
751
  ) -> List[PrivacyNotice]:
749
752
  """
750
753
  Link supplied Notices to ExperienceConfig and unlink any notices not supplied.
754
+
755
+ Preserves the order of notices by setting display_order on the junction table records.
751
756
  """
752
757
  new_notices: Query = db.query(PrivacyNotice).filter(
753
758
  PrivacyNotice.id.in_(notice_ids)
754
759
  )
755
760
 
761
+ # Add new notices
756
762
  for notice in new_notices:
757
763
  if notice not in experience_config.privacy_notices:
758
764
  experience_config.privacy_notices.append(notice)
759
765
 
766
+ # Remove notices that are no longer in the list
760
767
  to_remove: Set[PrivacyNotice] = set(
761
768
  notice for notice in experience_config.privacy_notices
762
769
  ) - set(notice for notice in new_notices)
@@ -765,6 +772,19 @@ def link_notices_to_experience_config(
765
772
  experience_config.privacy_notices.remove(privacy_notice)
766
773
 
767
774
  experience_config.save(db)
775
+
776
+ # Update display_order on the junction table records based on the order in notice_ids
777
+ for index, notice_id in enumerate(notice_ids):
778
+ db.query(ExperienceNotices).filter(
779
+ ExperienceNotices.notice_id == notice_id,
780
+ ExperienceNotices.experience_config_id == experience_config.id,
781
+ ).update({"display_order": index})
782
+
783
+ db.commit()
784
+
785
+ # Expire the relationship to force reload with correct ordering
786
+ db.expire(experience_config, ["privacy_notices"])
787
+
768
788
  return experience_config.privacy_notices
769
789
 
770
790