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
@@ -8,7 +8,12 @@ from fides.api.api.v1.endpoints import API_PREFIX
8
8
  from fides.api.db.database import configure_db, migrate_db, reset_db
9
9
  from fides.api.oauth.utils import verify_oauth_client_prod
10
10
  from fides.api.util.api_router import APIRouter
11
+ from fides.api.util.memory_watchdog import (
12
+ _capture_heap_dump,
13
+ get_memory_watchdog_enabled,
14
+ )
11
15
  from fides.common.api import scope_registry
16
+ from fides.common.api.scope_registry import HEAP_DUMP_EXEC
12
17
  from fides.config import CONFIG
13
18
 
14
19
  ADMIN_ROUTER = APIRouter(prefix=API_PREFIX, tags=["Admin"])
@@ -82,3 +87,37 @@ def db_action(action: DBActions, revision: Optional[str] = "head") -> Dict:
82
87
  "message": f"Fides database action performed successfully: {action_text}"
83
88
  }
84
89
  }
90
+
91
+
92
+ @ADMIN_ROUTER.post(
93
+ "/admin/heap-dump",
94
+ tags=["Admin"],
95
+ dependencies=[Security(verify_oauth_client_prod, scopes=[HEAP_DUMP_EXEC])],
96
+ status_code=status.HTTP_200_OK,
97
+ )
98
+ def trigger_heap_dump() -> Dict:
99
+ """
100
+ Trigger a heap dump for memory diagnostics.
101
+
102
+ Captures and logs detailed memory profiling information including:
103
+ - Process memory stats (RSS, VMS)
104
+ - Top object type counts
105
+ - Garbage collector stats
106
+ - Uncollectable objects (memory leaks)
107
+
108
+ The full heap dump report is logged to error logs.
109
+ """
110
+ if not get_memory_watchdog_enabled():
111
+ raise HTTPException(
112
+ status_code=status.HTTP_405_METHOD_NOT_ALLOWED,
113
+ detail="Heap dump functionality is not enabled. Set memory_watchdog_enabled to true in application configuration.",
114
+ )
115
+
116
+ logger.warning("Manual heap dump triggered via API")
117
+ _capture_heap_dump()
118
+
119
+ return {
120
+ "data": {
121
+ "message": "Heap dump captured successfully. Check server logs for detailed report."
122
+ }
123
+ }
@@ -0,0 +1,167 @@
1
+ from io import BytesIO
2
+ from typing import List
3
+ from zipfile import BadZipFile, ZipFile
4
+
5
+ from fastapi import Body, Depends, HTTPException
6
+ from fastapi.params import Security
7
+ from fastapi.responses import JSONResponse, Response
8
+ from loguru import logger
9
+ from sqlalchemy.orm import Session
10
+ from starlette.status import HTTP_404_NOT_FOUND
11
+
12
+ from fides.api.api import deps
13
+ from fides.api.oauth.utils import verify_oauth_client
14
+ from fides.api.schemas.saas.connector_template import ConnectorTemplateListResponse
15
+ from fides.api.service.connectors.saas.connector_registry_service import (
16
+ ConnectorRegistry,
17
+ CustomConnectorTemplateLoader,
18
+ )
19
+ from fides.api.util.api_router import APIRouter
20
+ from fides.common.api.scope_registry import (
21
+ CONNECTOR_TEMPLATE_READ,
22
+ CONNECTOR_TEMPLATE_REGISTER,
23
+ )
24
+ from fides.common.api.v1.urn_registry import (
25
+ CONNECTOR_TEMPLATES,
26
+ CONNECTOR_TEMPLATES_CONFIG,
27
+ CONNECTOR_TEMPLATES_DATASET,
28
+ CONNECTOR_TEMPLATES_REGISTER,
29
+ REGISTER_CONNECTOR_TEMPLATE,
30
+ V1_URL_PREFIX,
31
+ )
32
+
33
+ router = APIRouter(tags=["Connector Templates"], prefix=V1_URL_PREFIX)
34
+
35
+
36
+ @router.get(
37
+ CONNECTOR_TEMPLATES,
38
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_READ])],
39
+ response_model=List[ConnectorTemplateListResponse],
40
+ )
41
+ def get_all_connector_templates() -> List[ConnectorTemplateListResponse]:
42
+ """
43
+ Returns a list of all available connector templates with summary information.
44
+
45
+ Each template includes:
46
+ - **type**: The unique identifier for the connector (used in other endpoints)
47
+ - **name**: Human-readable name of the connector
48
+ - **supported_actions**: List of actions this connector supports (e.g., access, erasure)
49
+ - **category**: Optional category classification for the connector
50
+ - **custom**: Whether this is a custom connector (true) or built-in (false)
51
+ """
52
+ logger.info("Retrieving all connector templates")
53
+ return ConnectorRegistry.get_all_connector_templates_summary()
54
+
55
+
56
+ @router.post(
57
+ CONNECTOR_TEMPLATES_REGISTER,
58
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_REGISTER])],
59
+ )
60
+ def register_connector_template(
61
+ file: bytes = Body(..., media_type="application/zip"),
62
+ db: Session = Depends(deps.get_db),
63
+ ) -> JSONResponse:
64
+ """
65
+ Registers a custom connector template from a zip file uploaded by the user.
66
+
67
+ The endpoint performs the following steps:
68
+ 1. Validates the uploaded file is a proper zip file.
69
+ 2. Uses the CustomConnectorTemplateLoader to validate, register, and save the template to the database.
70
+
71
+ If the uploaded file is not a valid zip file or there are any validation errors
72
+ when creating the ConnectorTemplates an HTTP 400 status code with error details is returned.
73
+ """
74
+ try:
75
+ with ZipFile(BytesIO(file), "r") as zip_file:
76
+ CustomConnectorTemplateLoader.save_template(db=db, zip_file=zip_file)
77
+ except BadZipFile:
78
+ raise HTTPException(status_code=400, detail="Invalid zip file")
79
+ except Exception as exc:
80
+ logger.exception("Error loading connector template from zip file.")
81
+ raise HTTPException(status_code=400, detail=str(exc))
82
+
83
+ return JSONResponse(
84
+ content={"message": "Connector template successfully registered."}
85
+ )
86
+
87
+
88
+ @router.post(
89
+ REGISTER_CONNECTOR_TEMPLATE,
90
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_REGISTER])],
91
+ deprecated=True,
92
+ )
93
+ def register_custom_connector_template_deprecated(
94
+ file: bytes = Body(..., media_type="application/zip"),
95
+ db: Session = Depends(deps.get_db),
96
+ ) -> JSONResponse:
97
+ """
98
+ **DEPRECATED**: Use `POST /connector-templates/register` instead.
99
+
100
+ Registers a custom connector template from a zip file uploaded by the user.
101
+ This endpoint is maintained for backward compatibility only.
102
+ """
103
+ return register_connector_template(file=file, db=db)
104
+
105
+
106
+ @router.get(
107
+ CONNECTOR_TEMPLATES_CONFIG,
108
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_READ])],
109
+ )
110
+ def get_connector_template_config(
111
+ connector_template_type: str,
112
+ ) -> Response:
113
+ """
114
+ Retrieves the SaaS config YAML for a connector template by its type.
115
+
116
+ The `connector_template_type` parameter comes from the `type` field
117
+ returned by the `GET /connector-templates` endpoint.
118
+
119
+ Returns the raw YAML configuration that can be used to understand
120
+ or customize the connector template.
121
+ """
122
+ logger.info("Finding connector template with type '{}'", connector_template_type)
123
+ template = ConnectorRegistry.get_connector_template(connector_template_type)
124
+
125
+ if not template:
126
+ raise HTTPException(
127
+ status_code=HTTP_404_NOT_FOUND,
128
+ detail=f"No connector template found with type '{connector_template_type}'",
129
+ )
130
+
131
+ return Response(
132
+ content=template.config,
133
+ media_type="text/yaml",
134
+ )
135
+
136
+
137
+ @router.get(
138
+ CONNECTOR_TEMPLATES_DATASET,
139
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_READ])],
140
+ )
141
+ def get_connector_template_dataset(
142
+ connector_template_type: str,
143
+ ) -> Response:
144
+ """
145
+ Retrieves the dataset YAML for a connector template by its type.
146
+
147
+ The `connector_template_type` parameter comes from the `type` field
148
+ returned by the `GET /connector-templates` endpoint.
149
+
150
+ Returns the raw dataset YAML configuration that defines the data structure
151
+ for the connector template.
152
+ """
153
+ logger.info(
154
+ "Finding connector template dataset with type '{}'", connector_template_type
155
+ )
156
+ template = ConnectorRegistry.get_connector_template(connector_template_type)
157
+
158
+ if not template:
159
+ raise HTTPException(
160
+ status_code=HTTP_404_NOT_FOUND,
161
+ detail=f"No connector template found with type '{connector_template_type}'",
162
+ )
163
+
164
+ return Response(
165
+ content=template.dataset,
166
+ media_type="text/yaml",
167
+ )
@@ -370,10 +370,10 @@ async def create_data_use(
370
370
  return taxonomy_service.create_or_update_element(
371
371
  "data_use", data_use.model_dump()
372
372
  )
373
- except KeyOrNameAlreadyExists:
373
+ except KeyOrNameAlreadyExists as e:
374
374
  raise HTTPException(
375
375
  status_code=HTTP_422_UNPROCESSABLE_ENTITY,
376
- detail=f"Data use with key {data_use.fides_key} or name {data_use.name} already exists.",
376
+ detail=str(e),
377
377
  )
378
378
  except (ValidationError, PydanticValidationError) as e:
379
379
  raise HTTPException(
@@ -401,10 +401,10 @@ async def create_data_category(
401
401
  return taxonomy_service.create_or_update_element(
402
402
  "data_category", data_category.model_dump()
403
403
  )
404
- except KeyOrNameAlreadyExists:
404
+ except KeyOrNameAlreadyExists as e:
405
405
  raise HTTPException(
406
406
  status_code=HTTP_422_UNPROCESSABLE_ENTITY,
407
- detail=f"Data category with key {data_category.fides_key} or name {data_category.name} already exists.",
407
+ detail=str(e),
408
408
  )
409
409
  except (ValidationError, PydanticValidationError) as e:
410
410
  raise HTTPException(
@@ -432,10 +432,10 @@ async def create_data_subject(
432
432
  return taxonomy_service.create_or_update_element(
433
433
  "data_subject", data_subject.model_dump()
434
434
  )
435
- except KeyOrNameAlreadyExists:
435
+ except KeyOrNameAlreadyExists as e:
436
436
  raise HTTPException(
437
437
  status_code=HTTP_422_UNPROCESSABLE_ENTITY,
438
- detail=f"Data subject with key {data_subject.fides_key} or name {data_subject.name} already exists.",
438
+ detail=str(e),
439
439
  )
440
440
  except (ValidationError, PydanticValidationError) as e:
441
441
  raise HTTPException(
@@ -90,7 +90,7 @@ def get_pre_approval_webhook_detail(
90
90
  ],
91
91
  response_model=List[schemas.PreApprovalWebhookResponse],
92
92
  )
93
- def create_or_update_pre_execution_webhooks(
93
+ def create_or_update_pre_approval_webhooks(
94
94
  *,
95
95
  db: Session = Depends(deps.get_db),
96
96
  webhooks: Annotated[List[schemas.PreApprovalWebhookCreate], Field(max_length=50)], # type: ignore
@@ -148,7 +148,7 @@ def create_or_update_pre_execution_webhooks(
148
148
  webhooks_to_remove.delete()
149
149
 
150
150
  logger.info(
151
- "Creating/updating Policy Pre-Execution Webhooks: {}", staged_webhook_keys
151
+ "Creating/updating Policy Pre-Approval Webhooks: {}", staged_webhook_keys
152
152
  )
153
153
  # Committing to database now, as a last step, once we've verified that all the webhooks
154
154
  # in the request are free of issues.
@@ -164,7 +164,7 @@ def create_or_update_pre_execution_webhooks(
164
164
  ],
165
165
  response_model=schemas.PreApprovalWebhookResponse,
166
166
  )
167
- def update_pre_execution_webhook(
167
+ def update_pre_approval_webhook(
168
168
  *,
169
169
  db: Session = Depends(deps.get_db),
170
170
  webhook_key: FidesKey,
@@ -193,7 +193,7 @@ def update_pre_execution_webhook(
193
193
  detail=exc.args[0],
194
194
  )
195
195
 
196
- # Pre Execution Webhooks are not committed by default, so we commit at the end.
196
+ # Pre Approval Webhooks are not committed by default, so we commit at the end.
197
197
  db.commit()
198
198
  return schemas.PreApprovalWebhookResponse(
199
199
  connection_config=loaded_webhook.connection_config,
@@ -207,7 +207,7 @@ def update_pre_execution_webhook(
207
207
  status_code=HTTP_200_OK,
208
208
  dependencies=[Security(verify_oauth_client, scopes=[scopes.WEBHOOK_DELETE])],
209
209
  )
210
- def delete_pre_execution_webhook(
210
+ def delete_pre_approval_webhook(
211
211
  *,
212
212
  db: Session = Depends(deps.get_db),
213
213
  webhook_key: FidesKey,
@@ -29,7 +29,7 @@ from loguru import logger
29
29
  from pydantic import Field
30
30
  from pydantic import ValidationError as PydanticValidationError
31
31
  from sqlalchemy import cast, column, null, or_, select
32
- from sqlalchemy.orm import Query, Session
32
+ from sqlalchemy.orm import Query, Session, selectinload
33
33
  from sqlalchemy.sql.expression import nullslast
34
34
  from starlette.responses import StreamingResponse
35
35
  from starlette.status import (
@@ -88,9 +88,11 @@ from fides.api.schemas.dataset import CollectionAddressResponse, DryRunDatasetRe
88
88
  from fides.api.schemas.external_https import PrivacyRequestResumeFormat
89
89
  from fides.api.schemas.policy import ActionType, CurrentStep
90
90
  from fides.api.schemas.privacy_request import (
91
+ BULK_PRIVACY_REQUEST_BATCH_SIZE,
91
92
  BulkPostPrivacyRequests,
92
93
  BulkReviewResponse,
93
94
  BulkSoftDeletePrivacyRequests,
95
+ CancelPrivacyRequests,
94
96
  CheckpointActionRequired,
95
97
  DenyPrivacyRequests,
96
98
  ExecutionLogDetailResponse,
@@ -147,6 +149,7 @@ from fides.common.api.v1.urn_registry import (
147
149
  PRIVACY_REQUEST_BULK_FINALIZE,
148
150
  PRIVACY_REQUEST_BULK_RETRY,
149
151
  PRIVACY_REQUEST_BULK_SOFT_DELETE,
152
+ PRIVACY_REQUEST_CANCEL,
150
153
  PRIVACY_REQUEST_DENY,
151
154
  PRIVACY_REQUEST_FILTERED_RESULTS,
152
155
  PRIVACY_REQUEST_FINALIZE,
@@ -223,7 +226,9 @@ def create_privacy_request(
223
226
  privacy_request_service: PrivacyRequestService = Depends(
224
227
  get_privacy_request_service
225
228
  ),
226
- data: Annotated[List[PrivacyRequestCreate], Field(max_length=50)], # type: ignore
229
+ data: Annotated[
230
+ List[PrivacyRequestCreate], Field(max_length=BULK_PRIVACY_REQUEST_BATCH_SIZE)
231
+ ], # type: ignore
227
232
  ) -> BulkPostPrivacyRequests:
228
233
  """
229
234
  Given a list of privacy request data elements, create corresponding PrivacyRequest objects
@@ -249,7 +254,9 @@ def create_privacy_request_authenticated(
249
254
  verify_oauth_client,
250
255
  scopes=[PRIVACY_REQUEST_CREATE],
251
256
  ),
252
- data: Annotated[List[PrivacyRequestCreate], Field(max_length=50)], # type: ignore
257
+ data: Annotated[
258
+ List[PrivacyRequestCreate], Field(max_length=BULK_PRIVACY_REQUEST_BATCH_SIZE)
259
+ ], # type: ignore
253
260
  ) -> BulkPostPrivacyRequests:
254
261
  """
255
262
  Given a list of privacy request data elements, create corresponding PrivacyRequest objects
@@ -270,7 +277,10 @@ def privacy_request_csv_download(
270
277
  f = io.StringIO()
271
278
  csv_file = csv.writer(f)
272
279
 
273
- privacy_request_ids: List[str] = [r.id for r in privacy_request_query]
280
+ # Execute query once and convert to list to avoid multiple iterations
281
+ privacy_requests: List[PrivacyRequest] = privacy_request_query.all()
282
+ privacy_request_ids: List[str] = [r.id for r in privacy_requests]
283
+
274
284
  denial_audit_log_query: Query = db.query(AuditLog).filter(
275
285
  AuditLog.action == AuditLogAction.denied,
276
286
  AuditLog.privacy_request_id.in_(privacy_request_ids),
@@ -279,7 +289,7 @@ def privacy_request_csv_download(
279
289
  r.privacy_request_id: r.message for r in denial_audit_log_query
280
290
  }
281
291
 
282
- identity_columns, custom_field_columns = get_variable_columns(privacy_request_query)
292
+ identity_columns, custom_field_columns = get_variable_columns(privacy_requests)
283
293
 
284
294
  csv_file.writerow(
285
295
  [
@@ -299,7 +309,7 @@ def privacy_request_csv_download(
299
309
  )
300
310
 
301
311
  pr: PrivacyRequest
302
- for pr in privacy_request_query:
312
+ for pr in privacy_requests:
303
313
  denial_reason = (
304
314
  denial_audit_logs[pr.id]
305
315
  if pr.status == PrivacyRequestStatus.denied and pr.id in denial_audit_logs
@@ -344,12 +354,12 @@ def privacy_request_csv_download(
344
354
 
345
355
 
346
356
  def get_variable_columns(
347
- privacy_request_query: Query,
357
+ privacy_requests: List[PrivacyRequest],
348
358
  ) -> tuple[List[str], Dict[str, str]]:
349
359
  identity_columns: Set[str] = set()
350
360
  custom_field_columns: Dict[str, str] = {}
351
361
 
352
- for pr in privacy_request_query:
362
+ for pr in privacy_requests:
353
363
  identity_columns.update(
354
364
  extract_identity_column_names(pr.get_persisted_identity().model_dump())
355
365
  )
@@ -486,7 +496,7 @@ def _filter_privacy_request_queryset(
486
496
  errored_gt: Optional[datetime] = None,
487
497
  external_id: Optional[str] = None,
488
498
  location: Optional[str] = None,
489
- action_type: Optional[ActionType] = None,
499
+ action_type: Optional[Union[ActionType, List[ActionType]]] = None,
490
500
  include_consent_webhook_requests: Optional[bool] = False,
491
501
  include_deleted_requests: Optional[bool] = False,
492
502
  ) -> Query:
@@ -676,9 +686,11 @@ def _filter_privacy_request_queryset(
676
686
  PrivacyRequest.finished_processing_at > errored_gt,
677
687
  )
678
688
  if action_type:
689
+ if isinstance(action_type, ActionType):
690
+ action_type = [action_type]
679
691
  policy_ids_for_action_type = (
680
692
  db.query(Rule)
681
- .filter(Rule.action_type == action_type)
693
+ .filter(Rule.action_type.in_(action_type))
682
694
  .with_entities(Rule.policy_id)
683
695
  .distinct()
684
696
  )
@@ -792,7 +804,7 @@ def _shared_privacy_request_search(
792
804
  errored_gt: Optional[datetime] = None,
793
805
  external_id: Optional[str] = None,
794
806
  location: Optional[str] = None,
795
- action_type: Optional[ActionType] = None,
807
+ action_type: Optional[Union[ActionType, List[ActionType]]] = None,
796
808
  verbose: Optional[bool] = False,
797
809
  include_identities: Optional[bool] = False,
798
810
  include_custom_privacy_request_fields: Optional[bool] = False,
@@ -811,7 +823,8 @@ def _shared_privacy_request_search(
811
823
 
812
824
  logger.debug("Finding all request statuses with pagination params {}", params)
813
825
 
814
- query = db.query(PrivacyRequest)
826
+ # Use query_without_large_columns to prevent OOM errors when loading many privacy requests
827
+ query = PrivacyRequest.query_without_large_columns(db)
815
828
  query = _filter_privacy_request_queryset(
816
829
  db,
817
830
  query,
@@ -843,10 +856,29 @@ def _shared_privacy_request_search(
843
856
 
844
857
  if download_csv:
845
858
  _validate_result_size(query)
859
+ # Eager load relationships needed for CSV export to avoid N+1 queries
860
+ query = query.options(
861
+ selectinload(PrivacyRequest.provided_identities), # type: ignore[attr-defined]
862
+ selectinload(PrivacyRequest.custom_fields), # type: ignore[attr-defined]
863
+ selectinload(PrivacyRequest.policy).selectinload(Policy.rules), # type: ignore[attr-defined]
864
+ )
846
865
  # Returning here if download_csv param was specified
847
866
  logger.info("Downloading privacy requests as csv")
848
867
  return privacy_request_csv_download(db, query)
849
868
 
869
+ # Eager load relationships for regular list view to avoid N+1 queries
870
+ if include_identities or include_custom_privacy_request_fields:
871
+ eager_load_options = []
872
+ if include_identities:
873
+ eager_load_options.append(
874
+ selectinload(PrivacyRequest.provided_identities) # type: ignore[attr-defined]
875
+ )
876
+ if include_custom_privacy_request_fields:
877
+ eager_load_options.append(
878
+ selectinload(PrivacyRequest.custom_fields) # type: ignore[attr-defined]
879
+ )
880
+ query = query.options(*eager_load_options)
881
+
850
882
  # Conditionally embed execution log details in the response.
851
883
  if verbose:
852
884
  logger.info("Finding execution and audit log details")
@@ -1283,15 +1315,26 @@ def validate_manual_input(
1283
1315
  ],
1284
1316
  )
1285
1317
  def bulk_restart_privacy_request_from_failure(
1286
- privacy_request_ids: List[str],
1318
+ privacy_request_ids: Annotated[
1319
+ List[str], Field(max_length=BULK_PRIVACY_REQUEST_BATCH_SIZE)
1320
+ ],
1287
1321
  *,
1288
1322
  db: Session = Depends(deps.get_db),
1289
1323
  ) -> BulkPostPrivacyRequests:
1290
- """Bulk restart a of privacy request from failure."""
1324
+ """Bulk restart privacy requests from failure."""
1291
1325
  succeeded: List[PrivacyRequestResponse] = []
1292
1326
  failed: List[Dict[str, Any]] = []
1327
+
1328
+ # Fetch all privacy requests in one query to avoid N+1
1329
+ privacy_requests_dict = {
1330
+ pr.id: pr
1331
+ for pr in PrivacyRequest.query_without_large_columns(db)
1332
+ .filter(PrivacyRequest.id.in_(privacy_request_ids))
1333
+ .all()
1334
+ }
1335
+
1293
1336
  for privacy_request_id in privacy_request_ids:
1294
- privacy_request = PrivacyRequest.get(db, object_id=privacy_request_id)
1337
+ privacy_request = privacy_requests_dict.get(privacy_request_id)
1295
1338
 
1296
1339
  if not privacy_request:
1297
1340
  failed.append(
@@ -1357,10 +1400,10 @@ def restart_privacy_request_from_failure(
1357
1400
  )
1358
1401
 
1359
1402
  # Automatically resubmit the request if the cache has expired
1403
+
1360
1404
  if (
1361
- not privacy_request.get_cached_identity_data()
1362
- and privacy_request.status
1363
- not in [PrivacyRequestStatus.complete, PrivacyRequestStatus.pending]
1405
+ not privacy_request.verify_cache_for_identity_data()
1406
+ and privacy_request.status != PrivacyRequestStatus.complete
1364
1407
  ):
1365
1408
  logger.info(
1366
1409
  f"Cached data for privacy request {privacy_request.id} has expired, automatically resubmitting request"
@@ -1477,10 +1520,37 @@ def deny_privacy_request(
1477
1520
  )
1478
1521
 
1479
1522
 
1523
+ @router.patch(
1524
+ PRIVACY_REQUEST_CANCEL,
1525
+ status_code=HTTP_200_OK,
1526
+ response_model=BulkReviewResponse,
1527
+ )
1528
+ def cancel_privacy_request(
1529
+ *,
1530
+ client: ClientDetail = Security(
1531
+ verify_oauth_client,
1532
+ scopes=[PRIVACY_REQUEST_REVIEW],
1533
+ ),
1534
+ privacy_request_service: PrivacyRequestService = Depends(
1535
+ get_privacy_request_service
1536
+ ),
1537
+ privacy_requests: CancelPrivacyRequests,
1538
+ ) -> BulkReviewResponse:
1539
+ """Cancel a list of privacy requests and/or report failure"""
1540
+
1541
+ return privacy_request_service.cancel_privacy_requests(
1542
+ privacy_requests.request_ids, privacy_requests.reason, user_id=client.user_id
1543
+ )
1544
+
1545
+
1480
1546
  def _validate_privacy_request_pending_or_error(
1481
1547
  db: Session, privacy_request_id: str
1482
1548
  ) -> None:
1483
- privacy_request = PrivacyRequest.get(db, object_id=privacy_request_id)
1549
+ privacy_request = (
1550
+ PrivacyRequest.query_without_large_columns(db)
1551
+ .filter(PrivacyRequest.id == privacy_request_id)
1552
+ .first()
1553
+ )
1484
1554
  if not privacy_request:
1485
1555
  raise HTTPException(
1486
1556
  status_code=HTTP_404_NOT_FOUND,
@@ -2184,8 +2254,18 @@ def bulk_soft_delete_privacy_requests(
2184
2254
  if client.id == CONFIG.security.oauth_root_client_id:
2185
2255
  user_id = "root"
2186
2256
 
2187
- for privacy_request_id in privacy_requests.request_ids:
2188
- privacy_request = PrivacyRequest.get(db, object_id=privacy_request_id)
2257
+ request_ids = privacy_requests.request_ids
2258
+
2259
+ # Fetch all privacy requests in one query to avoid N+1
2260
+ privacy_requests_dict = {
2261
+ pr.id: pr
2262
+ for pr in PrivacyRequest.query_without_large_columns(db)
2263
+ .filter(PrivacyRequest.id.in_(request_ids))
2264
+ .all()
2265
+ }
2266
+
2267
+ for privacy_request_id in request_ids:
2268
+ privacy_request = privacy_requests_dict.get(privacy_request_id)
2189
2269
 
2190
2270
  if not privacy_request:
2191
2271
  failed.append(
@@ -1,11 +1,8 @@
1
- from io import BytesIO
2
1
  from typing import Optional
3
- from zipfile import BadZipFile, ZipFile
4
2
 
5
- from fastapi import Body, Depends, HTTPException, Request
3
+ from fastapi import Depends, HTTPException, Request
6
4
  from fastapi.encoders import jsonable_encoder
7
5
  from fastapi.params import Security
8
- from fastapi.responses import JSONResponse
9
6
  from fideslang.validation import FidesKey
10
7
  from loguru import logger
11
8
  from pydantic import ValidationError
@@ -48,15 +45,11 @@ from fides.api.service.authentication.authentication_strategy import (
48
45
  from fides.api.service.authentication.authentication_strategy_oauth2_authorization_code import (
49
46
  OAuth2AuthorizationCodeAuthenticationStrategy,
50
47
  )
51
- from fides.api.service.connectors.saas.connector_registry_service import (
52
- CustomConnectorTemplateLoader,
53
- )
54
48
  from fides.api.util.api_router import APIRouter
55
49
  from fides.api.util.connection_util import validate_secrets_error_message
56
50
  from fides.api.util.event_audit_util import generate_connection_audit_event_details
57
51
  from fides.common.api.scope_registry import (
58
52
  CONNECTION_AUTHORIZE,
59
- CONNECTOR_TEMPLATE_REGISTER,
60
53
  SAAS_CONFIG_CREATE_OR_UPDATE,
61
54
  SAAS_CONFIG_DELETE,
62
55
  SAAS_CONFIG_READ,
@@ -64,7 +57,6 @@ from fides.common.api.scope_registry import (
64
57
  )
65
58
  from fides.common.api.v1.urn_registry import (
66
59
  AUTHORIZE,
67
- REGISTER_CONNECTOR_TEMPLATE,
68
60
  SAAS_CONFIG,
69
61
  SAAS_CONFIG_VALIDATE,
70
62
  SAAS_CONNECTOR_FROM_TEMPLATE,
@@ -312,11 +304,11 @@ def authorize_connection(
312
304
  response_model=SaasConnectionTemplateResponse,
313
305
  )
314
306
  def instantiate_connection_from_template(
315
- saas_connector_type: str,
307
+ connector_template_type: str,
316
308
  template_values: SaasConnectionTemplateValues,
317
309
  db: Session = Depends(deps.get_db),
318
310
  ) -> SaasConnectionTemplateResponse:
319
- return instantiate_connection(db, saas_connector_type, template_values)
311
+ return instantiate_connection(db, connector_template_type, template_values)
320
312
 
321
313
 
322
314
  def instantiate_connection(
@@ -373,36 +365,3 @@ def instantiate_connection(
373
365
  return SaasConnectionTemplateResponse(
374
366
  connection=connection_config, dataset=dataset_config.ctl_dataset
375
367
  )
376
-
377
-
378
- @router.post(
379
- REGISTER_CONNECTOR_TEMPLATE,
380
- dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_REGISTER])],
381
- )
382
- def register_custom_connector_template(
383
- file: bytes = Body(..., media_type="application/zip"),
384
- db: Session = Depends(deps.get_db),
385
- ) -> JSONResponse:
386
- """
387
- Registers a custom connector template from a zip file uploaded by the user.
388
- The endpoint performs the following steps:
389
-
390
- 1. Validates the uploaded file is a proper zip file.
391
- 2. Uses the CustomConnectorTemplateLoader to validate, register, and save the template to the database.
392
-
393
- If the uploaded file is not a valid zip file or there are any validation errors
394
- when creating the ConnectorTemplates an HTTP 400 status code with error details is returned.
395
- """
396
-
397
- try:
398
- with ZipFile(BytesIO(file), "r") as zip_file:
399
- CustomConnectorTemplateLoader.save_template(db=db, zip_file=zip_file)
400
- except BadZipFile:
401
- raise HTTPException(status_code=400, detail="Invalid zip file")
402
- except Exception as exc:
403
- logger.exception("Error loading connector template from zip file.")
404
- raise HTTPException(status_code=400, detail=str(exc))
405
-
406
- return JSONResponse(
407
- content={"message": "Connector template successfully registered."}
408
- )
@@ -95,7 +95,11 @@ def upload_data(
95
95
  """
96
96
  logger.info("Finding privacy request with id '{}'", request_id)
97
97
 
98
- privacy_request = PrivacyRequest.get(db, object_id=request_id)
98
+ privacy_request = (
99
+ PrivacyRequest.query_without_large_columns(db)
100
+ .filter(PrivacyRequest.id == request_id)
101
+ .first()
102
+ )
99
103
  if not privacy_request:
100
104
  raise HTTPException(
101
105
  status_code=HTTP_404_NOT_FOUND,
@@ -557,7 +557,7 @@ async def get(
557
557
  )
558
558
  def instantiate_connection_from_template(
559
559
  fides_key: str,
560
- saas_connector_type: str,
560
+ connector_template_type: str,
561
561
  template_values: SaasConnectionTemplateValues,
562
562
  db: Session = Depends(deps.get_db),
563
563
  ) -> SaasConnectionTemplateResponse:
@@ -567,4 +567,4 @@ def instantiate_connection_from_template(
567
567
  """
568
568
 
569
569
  system = get_system(db, fides_key)
570
- return instantiate_connection(db, saas_connector_type, template_values, system)
570
+ return instantiate_connection(db, connector_template_type, template_values, system)