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
@@ -133,8 +133,9 @@ def poll_for_exited_privacy_request_tasks(self: DatabaseTask) -> Set[str]:
133
133
  # Privacy Requests that didn't need approval are "In Processing".
134
134
  # Privacy Requests in these states should be examined to see if all of its Request Tasks have had a chance
135
135
  # to complete.
136
+ # Use query_without_large_columns to prevent OOM errors when processing many privacy requests
136
137
  in_progress_privacy_requests = (
137
- db.query(PrivacyRequest)
138
+ PrivacyRequest.query_without_large_columns(db)
138
139
  .filter(
139
140
  PrivacyRequest.status.in_(
140
141
  [
@@ -528,8 +529,9 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
528
529
  logger.debug("Starting check for interrupted tasks to requeue")
529
530
 
530
531
  # Get all in-progress privacy requests that haven't been updated in the last 5 minutes
532
+ # Use query_without_large_columns to prevent OOM errors when processing many privacy requests
531
533
  in_progress_requests = (
532
- db.query(PrivacyRequest)
534
+ PrivacyRequest.query_without_large_columns(db)
533
535
  .filter(
534
536
  PrivacyRequest.status.in_(
535
537
  [
@@ -1,6 +1,6 @@
1
1
  from enum import Enum
2
2
  from inspect import Signature, signature
3
- from typing import TYPE_CHECKING, Callable, Dict, List, Union
3
+ from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Union
4
4
 
5
5
  from loguru import logger
6
6
 
@@ -319,7 +319,12 @@ def validate_polling_result_override_function(f: Callable) -> None:
319
319
 
320
320
  # Check return type annotation - handle both direct class and string literals
321
321
  return_annotation = sig.return_annotation
322
- if return_annotation not in (PollingResult, "PollingResult"):
322
+ if return_annotation not in (
323
+ PollingResult,
324
+ "PollingResult",
325
+ Optional[PollingResult],
326
+ "Optional[PollingResult]",
327
+ ):
323
328
  raise InvalidSaaSRequestOverrideException(
324
329
  "Polling result override function must return a PollingResult"
325
330
  )
@@ -0,0 +1,155 @@
1
+ from typing import Any, Optional
2
+
3
+ from fides.api.models.location_regulation_selections import get_location_by_id
4
+ from fides.api.models.policy import Policy
5
+ from fides.api.schemas.policy import ActionType
6
+ from fides.api.task.conditional_dependencies.privacy_request.schemas import (
7
+ ConditionalDependencyFieldInfo,
8
+ ConditionalDependencyFieldType,
9
+ PrivacyRequestConvenienceFields,
10
+ PrivacyRequestLocationConvenienceFields,
11
+ PrivacyRequestPolicyConvenienceFields,
12
+ )
13
+
14
+
15
+ def build_convenience_field_list() -> list[ConditionalDependencyFieldInfo]:
16
+ """Builds a list of ConditionalDependencyFieldInfo objects for convenience fields."""
17
+ return [
18
+ # Policy convenience fields
19
+ ConditionalDependencyFieldInfo(
20
+ field_path=PrivacyRequestConvenienceFields.rule_action_types.value,
21
+ field_type=ConditionalDependencyFieldType.array,
22
+ description="List of action types from policy rules (e.g., ['access', 'erasure']). Use with list_contains operator.",
23
+ is_convenience_field=True,
24
+ ),
25
+ ConditionalDependencyFieldInfo(
26
+ field_path=PrivacyRequestConvenienceFields.has_access_rule.value,
27
+ field_type=ConditionalDependencyFieldType.boolean,
28
+ description="Whether the policy has at least one rule with action_type 'access'.",
29
+ is_convenience_field=True,
30
+ ),
31
+ ConditionalDependencyFieldInfo(
32
+ field_path=PrivacyRequestConvenienceFields.has_erasure_rule.value,
33
+ field_type=ConditionalDependencyFieldType.boolean,
34
+ description="Whether the policy has at least one rule with action_type 'erasure'.",
35
+ is_convenience_field=True,
36
+ ),
37
+ ConditionalDependencyFieldInfo(
38
+ field_path=PrivacyRequestConvenienceFields.has_consent_rule.value,
39
+ field_type=ConditionalDependencyFieldType.boolean,
40
+ description="Whether the policy has at least one rule with action_type 'consent'.",
41
+ is_convenience_field=True,
42
+ ),
43
+ ConditionalDependencyFieldInfo(
44
+ field_path=PrivacyRequestConvenienceFields.has_update_rule.value,
45
+ field_type=ConditionalDependencyFieldType.boolean,
46
+ description="Whether the policy has at least one rule with action_type 'update'.",
47
+ is_convenience_field=True,
48
+ ),
49
+ ConditionalDependencyFieldInfo(
50
+ field_path=PrivacyRequestConvenienceFields.rule_count.value,
51
+ field_type=ConditionalDependencyFieldType.integer,
52
+ description="Number of rules in the policy.",
53
+ is_convenience_field=True,
54
+ ),
55
+ ConditionalDependencyFieldInfo(
56
+ field_path=PrivacyRequestConvenienceFields.rule_names.value,
57
+ field_type=ConditionalDependencyFieldType.array,
58
+ description="List of rule names from the policy. Use with list_contains operator.",
59
+ is_convenience_field=True,
60
+ ),
61
+ ConditionalDependencyFieldInfo(
62
+ field_path=PrivacyRequestConvenienceFields.has_storage_destination.value,
63
+ field_type=ConditionalDependencyFieldType.boolean,
64
+ description="Whether any rule in the policy has a storage destination configured.",
65
+ is_convenience_field=True,
66
+ ),
67
+ # Location hierarchy convenience fields
68
+ ConditionalDependencyFieldInfo(
69
+ field_path=PrivacyRequestConvenienceFields.location_country.value,
70
+ field_type=ConditionalDependencyFieldType.string,
71
+ description="The country code for the location (e.g., 'us' for 'us_ca', 'fr' for France). Use with eq operator to check if a location is in a specific country.",
72
+ is_convenience_field=True,
73
+ ),
74
+ ConditionalDependencyFieldInfo(
75
+ field_path=PrivacyRequestConvenienceFields.location_groups.value,
76
+ field_type=ConditionalDependencyFieldType.array,
77
+ description="List of location groups this location belongs to (e.g., ['us'] for US states, ['eea'] for EU countries). Use with list_contains operator.",
78
+ is_convenience_field=True,
79
+ ),
80
+ ConditionalDependencyFieldInfo(
81
+ field_path=PrivacyRequestConvenienceFields.location_regulations.value,
82
+ field_type=ConditionalDependencyFieldType.array,
83
+ description="List of regulations applicable to this location (e.g., ['ccpa'] for California, ['gdpr'] for EU). Use with list_contains operator.",
84
+ is_convenience_field=True,
85
+ ),
86
+ ]
87
+
88
+
89
+ def get_policy_convenience_fields(
90
+ policy: Policy,
91
+ ) -> dict[str, Any]:
92
+ """Gets convenience fields for a policy."""
93
+ extra_fields: dict[str, Any] = {}
94
+ extra_fields["id"] = policy.id
95
+
96
+ # Get rules for convenience field derivation
97
+ rules = policy.rules if hasattr(policy, "rules") and policy.rules else []
98
+ action_types = policy.get_all_action_types()
99
+
100
+ # Add convenience fields for rules
101
+ extra_fields[PrivacyRequestPolicyConvenienceFields.rule_action_types.value] = [
102
+ action_type.value for action_type in action_types if action_type
103
+ ]
104
+ for action_type in ActionType:
105
+ extra_fields[f"has_{action_type.value}_rule"] = action_type in action_types
106
+ extra_fields[PrivacyRequestPolicyConvenienceFields.rule_count.value] = (
107
+ len(rules) if rules else 0
108
+ )
109
+ extra_fields[PrivacyRequestPolicyConvenienceFields.rule_names.value] = [
110
+ rule.name for rule in rules if hasattr(rule, "name") and rule.name
111
+ ]
112
+ extra_fields[
113
+ PrivacyRequestPolicyConvenienceFields.has_storage_destination.value
114
+ ] = any(
115
+ hasattr(rule, "storage_destination") and rule.storage_destination is not None
116
+ for rule in rules
117
+ )
118
+ return extra_fields
119
+
120
+
121
+ def get_location_convenience_fields(location: Optional[str]) -> dict[str, Any]:
122
+ """Gets convenience fields for a location to support hierarchy-based conditions."""
123
+ extra_fields: dict[str, Any] = {
124
+ PrivacyRequestLocationConvenienceFields.location_country.value: None,
125
+ PrivacyRequestLocationConvenienceFields.location_groups.value: [],
126
+ PrivacyRequestLocationConvenienceFields.location_regulations.value: [],
127
+ }
128
+
129
+ if not location:
130
+ return extra_fields
131
+
132
+ location_data = get_location_by_id(location)
133
+ if not location_data:
134
+ return extra_fields
135
+
136
+ # If location has parent groups, the first one is typically the country
137
+ # (e.g., us_ca belongs to [us])
138
+ belongs_to = location_data.belongs_to or []
139
+ extra_fields[PrivacyRequestLocationConvenienceFields.location_groups.value] = (
140
+ belongs_to
141
+ )
142
+
143
+ # Set location_country to the first parent if the location is a subdivision
144
+ # This helps with conditions like "is this a US state?"
145
+ if belongs_to and not location_data.is_country:
146
+ extra_fields[PrivacyRequestLocationConvenienceFields.location_country.value] = (
147
+ belongs_to[0]
148
+ )
149
+
150
+ # Add regulations applicable to this location
151
+ extra_fields[PrivacyRequestLocationConvenienceFields.location_regulations.value] = (
152
+ location_data.regulation or []
153
+ )
154
+
155
+ return extra_fields
@@ -0,0 +1,140 @@
1
+ from typing import Any, Optional
2
+
3
+ from pydantic.v1.utils import deep_update
4
+
5
+ from fides.api.models.policy import Policy
6
+ from fides.api.models.privacy_request import PrivacyRequest
7
+ from fides.api.schemas.policy import Policy as PolicySchema
8
+ from fides.api.task.conditional_dependencies.privacy_request.convenience_fields import (
9
+ get_location_convenience_fields,
10
+ get_policy_convenience_fields,
11
+ )
12
+ from fides.api.task.conditional_dependencies.privacy_request.schemas import (
13
+ PrivacyRequestLocationConvenienceFields,
14
+ )
15
+ from fides.api.task.conditional_dependencies.util import (
16
+ extract_nested_field_value,
17
+ set_nested_value,
18
+ transform_value_for_evaluation,
19
+ )
20
+
21
+
22
+ class PrivacyRequestDataTransformer:
23
+ """
24
+ Transforms a PrivacyRequest ORM object into a dictionary structure for condition evaluation.
25
+
26
+ - This class extracts the fields referenced in conditions and builds a minimal nested structure
27
+ for evaluation. Privacy request fields must be prefixed with the "privacy_request" namespace.
28
+ - This class is used to get the privacy request data for condition evaluation.
29
+ - The task.conditional_dependencies.evaluator expects the data to be in a nested dictionary structure
30
+ and uses the operators defined in the task.conditional_dependencies.operators.py which have defined
31
+ data type compatibility.
32
+
33
+ Note: Privacy request relationships are eager loaded in the execute_request_tasks.py file.
34
+ """
35
+
36
+ def __init__(self, privacy_request: PrivacyRequest):
37
+ self.privacy_request = privacy_request
38
+ self.policy_data = self._transform_policy_object(privacy_request.policy)
39
+ self.identity_data = self.privacy_request.get_persisted_identity()
40
+ self.custom_privacy_request_fields_data = (
41
+ self.privacy_request.get_persisted_custom_privacy_request_fields()
42
+ )
43
+ self.location_convenience_fields = get_location_convenience_fields(
44
+ privacy_request.location
45
+ )
46
+
47
+ def to_evaluation_data(self, field_addresses: set[str]) -> dict[str, Any]:
48
+ """
49
+ Transforms the PrivacyRequest into an evaluation-ready dictionary structure.
50
+
51
+ Args:
52
+ field_addresses: Set of field addresses referenced in conditions
53
+ """
54
+ if not field_addresses:
55
+ return {}
56
+
57
+ result: dict[str, Any] = {"privacy_request": {}}
58
+ field_paths: set[str] = {addr.replace(":", ".") for addr in field_addresses}
59
+
60
+ # Extract each field dynamically based on its path
61
+ for field_path in field_paths:
62
+ value = self._extract_value_by_path(field_path)
63
+ privacy_request_data: Optional[dict[str, Any]] = set_nested_value(
64
+ field_path.split("."), value
65
+ )
66
+ if privacy_request_data:
67
+ result = deep_update(result, privacy_request_data)
68
+
69
+ return result
70
+
71
+ def _extract_value_by_path(self, field_address: str) -> Any:
72
+ """
73
+ Extracts a value from PrivacyRequest by following the field address path.
74
+
75
+ Args:
76
+ field_address: The field address path (e.g., "privacy_request.location", "privacy_request.policy.rules")
77
+
78
+ """
79
+ # first part will always be privacy_request
80
+ parts: list[str] = field_address.split(".")[1:]
81
+ current: Any = self.privacy_request
82
+ is_labeled_field = False
83
+
84
+ # Handle location convenience fields - these are derived fields, not direct attributes
85
+ # Check if we're accessing a location convenience field before trying to extract from privacy_request
86
+
87
+ if len(parts) == 1 and parts[0] in [
88
+ e.value for e in PrivacyRequestLocationConvenienceFields
89
+ ]:
90
+ return self.location_convenience_fields.get(parts[0])
91
+
92
+ # Route to the appropriate data source based on the first path component
93
+ if parts[0] == "policy":
94
+ current = self.policy_data
95
+ parts.pop(0)
96
+ elif parts[0] == "identity":
97
+ current = self.identity_data
98
+ # Identity fields may contain LabeledIdentity objects with label/value structure
99
+ is_labeled_field = True
100
+ parts.pop(0)
101
+ elif parts[0] == "custom_privacy_request_fields":
102
+ current = self.custom_privacy_request_fields_data
103
+ # Custom fields are stored as {"label": ..., "value": ...} dicts
104
+ is_labeled_field = True
105
+ parts.pop(0)
106
+
107
+ current = extract_nested_field_value(current, parts)
108
+
109
+ # If we started with an Identity object and didn't extract any field from it
110
+ # (current is still the identity object), return None
111
+ # Otherwise, transform the value (which could be a BaseModel like LabeledIdentity)
112
+ if current is self.identity_data:
113
+ return None
114
+
115
+ # Transform the value first (converts LabeledIdentity to dict, handles other types)
116
+ current = transform_value_for_evaluation(current)
117
+
118
+ # For labeled fields (custom privacy request fields and identity fields with labels),
119
+ # extract just the value from the {"label": ..., "value": ...} structure
120
+ if is_labeled_field and isinstance(current, dict) and "value" in current:
121
+ current = current["value"]
122
+
123
+ return current
124
+
125
+ def _transform_policy_object(self, policy: Policy) -> dict[str, Any]:
126
+ """
127
+ Transforms a Policy ORM object to a dictionary using existing Pydantic schema
128
+ and adds convenience fields.
129
+
130
+ Args:
131
+ policy: The Policy ORM object
132
+ """
133
+ if not policy:
134
+ return {}
135
+ extra_fields = get_policy_convenience_fields(policy)
136
+
137
+ # Convert Policy ORM object to dictionary using Pydantic schema
138
+ policy_dict = PolicySchema.model_validate(policy).model_dump()
139
+ policy_dict.update(extra_fields)
140
+ return policy_dict
@@ -0,0 +1,212 @@
1
+ from enum import Enum
2
+ from typing import Optional, Union
3
+
4
+ from pydantic import BaseModel, Field, field_validator
5
+
6
+
7
+ class PrivacyRequestTopLevelFields(Enum):
8
+ """Top level fields for privacy request."""
9
+
10
+ privacy_request = "privacy_request"
11
+ policy = "privacy_request.policy"
12
+ identity = "privacy_request.identity"
13
+
14
+
15
+ class PrivacyRequestPolicyConvenienceFields(Enum):
16
+ """Convenience fields for privacy request policy."""
17
+
18
+ rule_action_types = "rule_action_types"
19
+ has_access_rule = "has_access_rule"
20
+ has_erasure_rule = "has_erasure_rule"
21
+ has_consent_rule = "has_consent_rule"
22
+ has_update_rule = "has_update_rule"
23
+ rule_count = "rule_count"
24
+ rule_names = "rule_names"
25
+ has_storage_destination = "has_storage_destination"
26
+
27
+
28
+ class PrivacyRequestLocationConvenienceFields(Enum):
29
+ """Convenience fields for privacy request location."""
30
+
31
+ location_country = "location_country"
32
+ location_groups = "location_groups"
33
+ location_regulations = "location_regulations"
34
+
35
+
36
+ class PrivacyRequestConvenienceFields(Enum):
37
+ """Convenience fields for privacy request."""
38
+
39
+ # Policy convenience fields
40
+ rule_action_types = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.rule_action_types.value}"
41
+ has_access_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_access_rule.value}"
42
+ has_erasure_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_erasure_rule.value}"
43
+ has_consent_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_consent_rule.value}"
44
+ has_update_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_update_rule.value}"
45
+ rule_count = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.rule_count.value}"
46
+ rule_names = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.rule_names.value}"
47
+ has_storage_destination = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_storage_destination.value}"
48
+ # Location hierarchy convenience fields
49
+ location_country = f"{PrivacyRequestTopLevelFields.privacy_request.value}.{PrivacyRequestLocationConvenienceFields.location_country.value}"
50
+ location_groups = f"{PrivacyRequestTopLevelFields.privacy_request.value}.{PrivacyRequestLocationConvenienceFields.location_groups.value}"
51
+ location_regulations = f"{PrivacyRequestTopLevelFields.privacy_request.value}.{PrivacyRequestLocationConvenienceFields.location_regulations.value}"
52
+
53
+
54
+ class PrivacyRequestFields(Enum):
55
+ """Fields for privacy request."""
56
+
57
+ created_at = f"{PrivacyRequestTopLevelFields.privacy_request.value}.created_at"
58
+ due_date = f"{PrivacyRequestTopLevelFields.privacy_request.value}.due_date"
59
+ identity_verified_at = (
60
+ f"{PrivacyRequestTopLevelFields.privacy_request.value}.identity_verified_at"
61
+ )
62
+ location = f"{PrivacyRequestTopLevelFields.privacy_request.value}.location"
63
+ origin = f"{PrivacyRequestTopLevelFields.privacy_request.value}.origin"
64
+ requested_at = f"{PrivacyRequestTopLevelFields.privacy_request.value}.requested_at"
65
+ source = f"{PrivacyRequestTopLevelFields.privacy_request.value}.source"
66
+ submitted_by = f"{PrivacyRequestTopLevelFields.privacy_request.value}.submitted_by"
67
+
68
+
69
+ class PolicyFields(Enum):
70
+ """Fields for policy."""
71
+
72
+ id = "privacy_request.policy.id"
73
+ name = f"{PrivacyRequestTopLevelFields.policy.value}.name"
74
+ key = f"{PrivacyRequestTopLevelFields.policy.value}.key"
75
+ description = f"{PrivacyRequestTopLevelFields.policy.value}.description"
76
+ execution_timeframe = (
77
+ f"{PrivacyRequestTopLevelFields.policy.value}.execution_timeframe"
78
+ )
79
+ rules = f"{PrivacyRequestTopLevelFields.policy.value}.rules"
80
+
81
+
82
+ class IdentityFields(Enum):
83
+ """Fields for identity."""
84
+
85
+ email = f"{PrivacyRequestTopLevelFields.identity.value}.email"
86
+ phone_number = f"{PrivacyRequestTopLevelFields.identity.value}.phone_number"
87
+ external_id = f"{PrivacyRequestTopLevelFields.identity.value}.external_id"
88
+ fides_user_device_id = (
89
+ f"{PrivacyRequestTopLevelFields.identity.value}.fides_user_device_id"
90
+ )
91
+ ljt_readerID = f"{PrivacyRequestTopLevelFields.identity.value}.ljt_readerID"
92
+ ga_client_id = f"{PrivacyRequestTopLevelFields.identity.value}.ga_client_id"
93
+
94
+
95
+ class ConditionalDependencyFieldType(Enum):
96
+ """Type of the field for conditional dependencies."""
97
+
98
+ string = "string"
99
+ boolean = "boolean"
100
+ array = "array"
101
+ integer = "integer"
102
+ float = "float"
103
+ date = "date"
104
+
105
+
106
+ class CustomFieldPathPrefix(Enum):
107
+ """Valid path prefixes for custom fields in privacy request conditional dependencies.
108
+
109
+ Custom privacy request fields are dynamically created based on privacy center
110
+ configuration and are stored on the privacy request itself (not the policy).
111
+ """
112
+
113
+ custom_privacy_request_fields = "privacy_request.custom_privacy_request_fields"
114
+
115
+ @classmethod
116
+ def is_valid_custom_field_path(cls, field_path: str) -> bool:
117
+ """Check if a field path is a valid custom field path.
118
+
119
+ Args:
120
+ field_path: The field path to validate
121
+
122
+ Returns:
123
+ True if the path starts with a valid custom field prefix, False otherwise
124
+ """
125
+ return any(field_path.startswith(prefix.value + ".") for prefix in cls)
126
+
127
+ @classmethod
128
+ def get_custom_field_name(cls, field_path: str) -> Optional[str]:
129
+ """Extract the custom field name from a valid custom field path.
130
+
131
+ Args:
132
+ field_path: The field path to extract the field name from
133
+
134
+ Returns:
135
+ The custom field name if the path is valid, None otherwise
136
+ """
137
+ for prefix in cls:
138
+ if field_path.startswith(prefix.value + "."):
139
+ return field_path[len(prefix.value) + 1 :]
140
+ return None
141
+
142
+
143
+ # Union type for all valid field paths
144
+ # Pydantic will validate against enum values for standard fields
145
+ # Custom field paths (dynamically created, validated at runtime) follow the pattern:
146
+ # privacy_request.custom_privacy_request_fields.{field_name}
147
+ ConditionalDependencyFieldPath = Union[
148
+ PrivacyRequestFields,
149
+ PolicyFields,
150
+ IdentityFields,
151
+ PrivacyRequestConvenienceFields,
152
+ str, # Custom field paths (must match prefix pattern, validated below)
153
+ ]
154
+
155
+
156
+ class ConditionalDependencyFieldInfo(BaseModel):
157
+ """Information about a field available for conditional dependencies."""
158
+
159
+ field_path: ConditionalDependencyFieldPath = Field(
160
+ ...,
161
+ description="Path to the field in the PrivacyRequest. Must be one of the standard field paths or a valid custom field path.",
162
+ )
163
+ field_type: ConditionalDependencyFieldType = Field(
164
+ ..., description="Type of the field from ConditionalDependencyFieldType"
165
+ )
166
+ description: Optional[str] = Field(None, description="Description of the field")
167
+ is_convenience_field: bool = Field(
168
+ False,
169
+ description="Whether this is a convenience field (derived from other fields)",
170
+ )
171
+
172
+ @field_validator("field_path")
173
+ @classmethod
174
+ def validate_field_path(cls, value: Union[Enum, str]) -> Union[Enum, str]:
175
+ """Validate that field_path is either an enum value or a valid custom field path.
176
+
177
+ Args:
178
+ value: The field path to validate (can be an enum member or string)
179
+
180
+ Returns:
181
+ The validated field path
182
+
183
+ Raises:
184
+ ValueError: If the field path is not valid
185
+ """
186
+ # If it's already an enum member, it's valid
187
+ if isinstance(value, Enum):
188
+ return value
189
+
190
+ # If it's a string, check if it matches an enum value or is a valid custom field path
191
+ if isinstance(value, str):
192
+ # Check if it matches any enum value
193
+ all_enum_values = (
194
+ {field.value for field in PrivacyRequestFields}
195
+ | {field.value for field in PolicyFields}
196
+ | {field.value for field in IdentityFields}
197
+ | {field.value for field in PrivacyRequestConvenienceFields}
198
+ )
199
+
200
+ if value in all_enum_values:
201
+ return value
202
+
203
+ # If it doesn't match an enum value, it must be a valid custom field path
204
+ if not CustomFieldPathPrefix.is_valid_custom_field_path(value):
205
+ raise ValueError(
206
+ f"Invalid field_path '{value}'. Must be one of the standard field paths "
207
+ f"or a valid custom field path starting with one of: "
208
+ f"{', '.join(prefix.value for prefix in CustomFieldPathPrefix)}"
209
+ )
210
+ return value
211
+
212
+ return value
@@ -0,0 +1,111 @@
1
+ from datetime import datetime
2
+ from typing import Any
3
+ from uuid import UUID
4
+
5
+ from pydantic import BaseModel
6
+
7
+
8
+ # pylint: disable=too-many-return-statements
9
+ def transform_value_for_evaluation(value: Any) -> Any:
10
+ """
11
+ Transforms a value to its evaluation-ready form.
12
+
13
+ Handles various data types defensively to ensure compatibility with
14
+ the operators defined in task.conditional_dependencies.operators.py
15
+
16
+ Args:
17
+ value: The value to transform
18
+
19
+ Returns:
20
+ The transformed value compatible with evaluation operators
21
+ """
22
+ if value is None:
23
+ return None
24
+
25
+ # Handle Pydantic models first (before checking for other attributes)
26
+ if isinstance(value, BaseModel):
27
+ return value.model_dump(mode="json")
28
+
29
+ # Handle enums (must come before other checks as enums might have other attributes)
30
+ if hasattr(value, "value") and not isinstance(value, BaseModel):
31
+ return value.value
32
+
33
+ # Handle date/time types
34
+ if isinstance(value, datetime):
35
+ return value.isoformat()
36
+
37
+ # Handle UUIDs
38
+ if isinstance(value, UUID):
39
+ return str(value)
40
+
41
+ # Handle bytes types - convert to strings for string operators
42
+ if isinstance(value, (bytes, bytearray)):
43
+ try:
44
+ return value.decode("utf-8")
45
+ except UnicodeDecodeError:
46
+ # If decode fails, use repr for a string representation
47
+ return repr(value)
48
+
49
+ # Handle complex numbers - convert to string as they can't be compared with < > etc
50
+ if isinstance(value, complex):
51
+ return str(value)
52
+
53
+ # Handle set/frozenset/tuple - convert to lists for list operators
54
+ # (operators.py list operations check isinstance(x, list))
55
+ if isinstance(value, (set, frozenset, tuple)):
56
+ return list(value)
57
+
58
+ # Return value as-is if no transformation needed
59
+ return value
60
+
61
+
62
+ def extract_nested_field_value(data: Any, field_path: list[str]) -> Any:
63
+ """
64
+ Extracts a value from a dictionary by following the path.
65
+
66
+ Args:
67
+ data: The dictionary to extract from
68
+ field_path: The path to extract the value from
69
+
70
+ Returns:
71
+ The extracted value
72
+ """
73
+ current: Any = data
74
+ for part in field_path:
75
+ if current is None:
76
+ return None
77
+ if hasattr(current, part):
78
+ current = getattr(current, part)
79
+ elif isinstance(current, list) and part.isdigit():
80
+ if 0 <= int(part) < len(current):
81
+ current = current[int(part)]
82
+ else:
83
+ return None
84
+ elif isinstance(current, dict) and part in current:
85
+ current = current[part]
86
+ else:
87
+ # If we can't find the part, return None
88
+ return None
89
+ return current
90
+
91
+
92
+ def set_nested_value(path: list[str], value: Any) -> dict[str, Any]:
93
+ """
94
+ Returns a dictionary with a nested value set at the path.
95
+
96
+ Args:
97
+ path: List of keys to traverse (e.g., ["policy", "key"])
98
+ value: The value to set at the end of the path
99
+ """
100
+ result: dict[str, Any] = {}
101
+ final_key = path[-1]
102
+ current = result
103
+
104
+ for key in path[:-1]:
105
+ if key not in current:
106
+ current[key] = {}
107
+ current = current[key]
108
+
109
+ # Set the final value
110
+ current[final_key] = value
111
+ return result