ethyca-fides 2.66.2rc0__py2.py3-none-any.whl → 2.67.0__py2.py3-none-any.whl

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

Potentially problematic release.


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

Files changed (335) hide show
  1. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0.dist-info}/RECORD +297 -282
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/7e9a2b52f498_adding_masking_secrets.py +60 -0
  5. fides/api/alembic/migrations/versions/a7065df4dcf1_add_finalized_fields_to_privacy_request.py +65 -0
  6. fides/api/alembic/migrations/versions/d0031087eacb_create_manualtaskconditionaldependency_.py +106 -0
  7. fides/api/api/v1/endpoints/dataset_config_endpoints.py +13 -5
  8. fides/api/api/v1/endpoints/drp_endpoints.py +7 -1
  9. fides/api/api/v1/endpoints/privacy_request_endpoints.py +44 -1
  10. fides/api/api/v1/endpoints/user_endpoints.py +83 -7
  11. fides/api/app_setup.py +3 -2
  12. fides/api/common_exceptions.py +8 -0
  13. fides/api/db/base.py +1 -0
  14. fides/api/db/database.py +1 -1
  15. fides/api/graph/execution.py +46 -0
  16. fides/api/graph/graph.py +13 -2
  17. fides/api/graph/traversal.py +126 -39
  18. fides/api/models/manual_task/__init__.py +2 -0
  19. fides/api/models/manual_task/conditional_dependency.py +144 -0
  20. fides/api/models/{manual_task.py → manual_task/manual_task.py} +10 -0
  21. fides/api/models/masking_secret.py +72 -0
  22. fides/api/models/policy.py +23 -0
  23. fides/api/models/privacy_request/execution_log.py +1 -0
  24. fides/api/models/privacy_request/privacy_request.py +64 -26
  25. fides/api/oauth/roles.py +2 -0
  26. fides/api/schemas/application_config.py +12 -1
  27. fides/api/schemas/connection_configuration/connection_secrets_datahub.py +10 -1
  28. fides/api/schemas/masking/masking_secrets.py +1 -1
  29. fides/api/schemas/policy.py +1 -0
  30. fides/api/schemas/privacy_request.py +5 -0
  31. fides/api/service/connectors/base_connector.py +15 -0
  32. fides/api/service/connectors/bigquery_connector.py +72 -19
  33. fides/api/service/connectors/dynamodb_connector.py +2 -1
  34. fides/api/service/connectors/fides_connector.py +1 -0
  35. fides/api/service/connectors/http_connector.py +1 -0
  36. fides/api/service/connectors/manual_task_connector.py +1 -0
  37. fides/api/service/connectors/manual_webhook_connector.py +2 -1
  38. fides/api/service/connectors/mongodb_connector.py +1 -0
  39. fides/api/service/connectors/okta_connector.py +1 -0
  40. fides/api/service/connectors/query_configs/bigquery_query_config.py +95 -36
  41. fides/api/service/connectors/query_configs/snowflake_query_config.py +3 -3
  42. fides/api/service/connectors/rds_mysql_connector.py +1 -0
  43. fides/api/service/connectors/rds_postgres_connector.py +1 -0
  44. fides/api/service/connectors/s3_connector.py +1 -0
  45. fides/api/service/connectors/saas_connector.py +1 -0
  46. fides/api/service/connectors/scylla_connector.py +1 -0
  47. fides/api/service/connectors/snowflake_connector.py +55 -2
  48. fides/api/service/connectors/sql_connector.py +159 -13
  49. fides/api/service/connectors/website_connector.py +1 -0
  50. fides/api/service/privacy_request/dsr_package/templates/welcome.html +2 -2
  51. fides/api/service/privacy_request/request_runner_service.py +145 -55
  52. fides/api/service/privacy_request/request_service.py +172 -52
  53. fides/api/task/conditional_dependencies/__init__.py +0 -0
  54. fides/api/task/conditional_dependencies/evaluator.py +109 -0
  55. fides/api/task/conditional_dependencies/schemas.py +54 -0
  56. fides/api/task/create_request_tasks.py +1 -1
  57. fides/api/task/deprecated_graph_task.py +24 -6
  58. fides/api/task/execute_request_tasks.py +93 -12
  59. fides/api/task/filter_results.py +1 -1
  60. fides/api/task/graph_task.py +86 -5
  61. fides/api/task/manual/manual_task_address.py +46 -0
  62. fides/api/task/manual/manual_task_graph_task.py +118 -126
  63. fides/api/task/manual/manual_task_utils.py +52 -105
  64. fides/api/util/aws_util.py +5 -1
  65. fides/api/util/cache.py +61 -0
  66. fides/api/util/encryption/secrets_util.py +48 -18
  67. fides/api/util/memory_watchdog.py +286 -0
  68. fides/common/api/scope_registry.py +3 -0
  69. fides/common/api/v1/urn_registry.py +1 -1
  70. fides/config/execution_settings.py +12 -0
  71. fides/config/utils.py +2 -0
  72. fides/service/privacy_request/privacy_request_service.py +6 -1
  73. fides/ui-build/static/admin/404.html +1 -1
  74. fides/ui-build/static/admin/_next/static/MNlh9olWjgbqAHKyQY3LF/_buildManifest.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/1817-b78b58ae3b75d75a.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/1975.7d4634a0e823a02b.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/{203-5a663f465ba26bb4.js → 203-cd78ea279cecba60.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/{3450-0ba194991d0cca88.js → 3450-69f4e16978971bb8.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/3550-d04125c828d591a1.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/{3855-e172870d3e21b0dd.js → 3855-509ca7ac99b5eada.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/{3872-46cebf7ec1b31a2b.js → 3872-0a0f0032ca39a93f.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/409-ea70638a59296659.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/{4121-2bc09fc4ddbfe5cb.js → 4121-877e19d3fa078c7b.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/{4230-60100f7ef3ddcde1.js → 4230-114e31621c19ea69.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/4259.d1507e0db19cbed7.js +1 -0
  91. fides/ui-build/static/admin/_next/static/chunks/431-1db919f6569a4021.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/{4608-bbb7bf511a05c3c2.js → 4608-f16f281f2d05d963.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/5309-d9a488457898263b.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/{905-ffdbd0b14167e8bd.js → 5596-4378b2927dae65b2.js} +3 -3
  96. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/{6084-7178ff6ea6822475.js → 6084-ddbad3149364725d.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/6148-59a59d5c5925344f.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/{6662-507be5d46e5b719b.js → 6662-a9e54ead3dc53644.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/6780-b42a27e72707936d.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/{6853-2ad3e08fe6f9f5f2.js → 6853-d0190d2cca9dbde2.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/{6882-6af16fef26c21e06.js → 6882-59ea739e3616ce83.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/6954-ba98e778a5b45ebf.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/{7476-281ee9a8286556f3.js → 7476-cc0d9a94ed7aad53.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/7725-539d3a906f627531.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/{787-fb41002f797eb2df.js → 787-c57185ad89c4e288.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/{79-7e87aff851423d4a.js → 79-2aab56be75e16187.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/{796-329a5f823ec258a5.js → 796-3bdda2a7868464af.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/8735-40caf91800a3610c.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/9046-7085a401297c5520.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/{9226-746771d47dff6266.js → 9226-2dcac54ab3fb94be.js} +1 -1
  115. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/{9951-9b753ad7c3f51bdf.js → 9951-7c6639e5d062779e.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-39ccb07327c2c5d5.js → _app-750d6bd16c971bb9.js} +56 -56
  118. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-98777246bec9dc2a.js → manual-2a655ff3a97f2492.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-a71c0aff4e0e6535.js → add-systems-0902f0bb4080643e.js} +1 -1
  120. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-1edf582ba3cd3bbb.js → [id]-f22ddd9b48a5c418.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-06bb3b0bf097fcdb.js → new-e74cb5ea87f15b40.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-685771e5f7196d87.js → privacy-experience-21f997c69fc3b4c2.js} +1 -1
  123. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-6ccedc70dc447089.js → [id]-da4124b7600a2a1d.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-944bca1cc57985b5.js → new-a57d251c88ce68ae.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-84f4bd14ce8673bc.js → privacy-notices-ad105181bc91209b.js} +1 -1
  126. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-b0c4235fe6d0b0c8.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-11d52f1570759c4d.js → [resourceUrn]-aad6047a4604b945.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-32eac8bbd217615a.js → projects-29784a11fe0fbd0a.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-b83afa5565d0c84e.js → [resourceUrn]-b6b98cea25dd94fa.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-6f630d42ac9fb6b4.js → data-catalog-7770a8dc34bd0fc0.js} +1 -1
  131. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3e5725cd06d7fe6c.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-92b0bd97d8e79340.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-ee3c0a103346fc06.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-9aa744d56cdacb0d.js → activity-ad6a84a6276f914c.js} +1 -1
  135. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-14bd7500362ff224.js → [resourceUrn]-f98dd251babb7e28.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-9e7dfd5a6acc2e8f.js → discovery-56eb4c014f0d96a3.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-d23b3ae139f0428b.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-c0d2bfd465df20e0.js → [...subfieldNames]-15301bd6bf7cf718.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-28280a8a39a6e37c.js → [collectionName]-0fa72873e464f581.js} +1 -1
  140. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-82fb246d87e58ebd.js → new-0d50084fbdf9b84c.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-20165c31ab1bc7cf.js → dataset-f3348d0a92543bab.js} +1 -1
  142. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-b4a6bcc87d126840.js → [id]-7d6027570d05c57f.js} +1 -1
  143. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-f95d7b0bbfc58f5a.js → new-c6614583b14dc9f2.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-5d8fd1af75f19e2f.js → fides-js-docs-1f4335dca5c09860.js} +1 -1
  145. fides/ui-build/static/admin/_next/static/chunks/pages/{index-1919aab9e5834b51.js → index-fbf9b845bb901238.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-8e346fb36e8034d2.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-e2d5d7e2a5265e68.js → integrations-7f15cd8538cdc24d.js} +1 -1
  148. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-1bae386d8c190348.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-69ad86b7a8a9a115.js → table-migration-05616e2ae20ff4f8.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-79f1576b1126975c.js +1 -0
  151. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-f1d818242d8550f8.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-d40a26bddb126c5c.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-96a08c4431b5462c.js +1 -0
  154. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-9d1840f8309b706e.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-fc201657f4a782c7.js → [purpose_id]-e891d01ece59669e.js} +1 -1
  156. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-c2d39cba8396ef3a.js → consent-f61b87e79367865b.js} +1 -1
  157. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-d992103cc55901ae.js → custom-fields-f8eea5d508c60c64.js} +1 -1
  158. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-023e1895552817de.js → locations-ed6a140b362c5baa.js} +1 -1
  159. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-ac403c0886b20e20.js → organization-ff9a34264d48c35f.js} +1 -1
  160. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-7a3396ac819c7904.js → test-datasets-a4b6d41ca679298b.js} +1 -1
  161. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-8314a819837f5b2a.js → [id]-c8f5fbaa83dd9945.js} +1 -1
  162. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-21f423a7c417aa9d.js → systems-c05b49ddec1a1b4f.js} +1 -1
  163. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-df0d88716578e295.js +1 -0
  164. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-da68efc31998dc66.js +1 -0
  165. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-173ac3a1ed2b05a6.js → user-management-e98dfc7d4f2a4e16.js} +1 -1
  166. fides/ui-build/static/admin/_next/static/chunks/webpack-90e8ec1fc5c6455b.js +1 -0
  167. fides/ui-build/static/admin/_next/static/css/{5bfb2473e5701527.css → 23cf870196941c9a.css} +1 -1
  168. fides/ui-build/static/admin/_next/static/css/{94965f224bc991e9.css → 8bc1833f1fa53ff0.css} +1 -1
  169. fides/ui-build/static/admin/_next/static/css/d9924caa849931b3.css +1 -0
  170. fides/ui-build/static/admin/_next/static/css/dbcf63488933a4d5.css +29 -0
  171. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  172. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  173. fides/ui-build/static/admin/add-systems.html +1 -1
  174. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  175. fides/ui-build/static/admin/consent/configure.html +1 -1
  176. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  177. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  178. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  179. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  180. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  181. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  182. fides/ui-build/static/admin/consent/properties.html +1 -1
  183. fides/ui-build/static/admin/consent/reporting.html +1 -1
  184. fides/ui-build/static/admin/consent.html +1 -1
  185. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  186. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  187. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  188. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  189. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  190. fides/ui-build/static/admin/data-catalog.html +1 -1
  191. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  192. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  193. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  194. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  195. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  196. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  197. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  198. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  199. fides/ui-build/static/admin/datamap.html +1 -1
  200. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  201. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  202. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  203. fides/ui-build/static/admin/dataset/new.html +1 -1
  204. fides/ui-build/static/admin/dataset.html +1 -1
  205. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  206. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  207. fides/ui-build/static/admin/datastore-connection.html +1 -1
  208. fides/ui-build/static/admin/index.html +1 -1
  209. fides/ui-build/static/admin/integrations/[id].html +1 -1
  210. fides/ui-build/static/admin/integrations.html +1 -1
  211. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  212. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  213. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  214. fides/ui-build/static/admin/lib/fides-tcf.js +4 -4
  215. fides/ui-build/static/admin/lib/fides.js +4 -4
  216. fides/ui-build/static/admin/login/[provider].html +1 -1
  217. fides/ui-build/static/admin/login.html +1 -1
  218. fides/ui-build/static/admin/messaging/[id].html +1 -1
  219. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  220. fides/ui-build/static/admin/messaging.html +1 -1
  221. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  222. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  223. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  224. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  225. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  226. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  227. fides/ui-build/static/admin/poc/forms.html +1 -1
  228. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  229. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  230. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  231. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  232. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  233. fides/ui-build/static/admin/privacy-requests.html +1 -1
  234. fides/ui-build/static/admin/properties/[id].html +1 -1
  235. fides/ui-build/static/admin/properties/add-property.html +1 -1
  236. fides/ui-build/static/admin/properties.html +1 -1
  237. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  238. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  239. fides/ui-build/static/admin/settings/about.html +1 -1
  240. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  241. fides/ui-build/static/admin/settings/consent.html +1 -1
  242. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  243. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  244. fides/ui-build/static/admin/settings/domains.html +1 -1
  245. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  246. fides/ui-build/static/admin/settings/locations.html +1 -1
  247. fides/ui-build/static/admin/settings/organization.html +1 -1
  248. fides/ui-build/static/admin/settings/regulations.html +1 -1
  249. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  250. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  251. fides/ui-build/static/admin/systems.html +1 -1
  252. fides/ui-build/static/admin/taxonomy.html +1 -1
  253. fides/ui-build/static/admin/user-management/new.html +1 -1
  254. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  255. fides/ui-build/static/admin/user-management.html +1 -1
  256. fides/ui-build/static/admin/_next/static/8108ANFxs99VY7KZ_Xev2/_buildManifest.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/1316-6cc72a45ebf7ff81.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/1807-3beab149351d5ded.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/1817-e601e737e3cc7a0e.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/255-7db55b0e3a0f9dea.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/2599-6c4d22e75028d8b6.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/2858-0b44609b6be7850b.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/2866-a73888c17a195cbe.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/409-a257e14acebcd73b.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/431-34f0b91c26f8d9ab.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/5309-b2c4803370634ff8.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/6780-e3d40aa17a4bf2e9.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/6954-bb875d9ac89f6030.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/7062.fda15dcb7df85675.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/7c79804f.7a7112aece470725.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/9046-5c4c22c375de25b1.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/9278-9b1b5970f0702668.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/9392.f4520f66206d347d.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/ea076c0a.84423f606aef37cd.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-afdbd4665657cfa1.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2265ecb899d45fbc.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-5d522637871ac6c8.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9ddb52ebb7ac4c71.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7674b97d655c193b.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-0a58aee2d1e7fa01.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-5094ffea13f32ed9.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-32600543eb7b584f.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-10ce53ea356f8bad.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-5501bbb129fee9c4.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-cbe4c8f9096b6543.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-e130c0197362e8f3.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-6387fcc8cce872eb.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-ff5738706da07801.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/webpack-ff0cd6bff75588da.js +0 -1
  293. fides/ui-build/static/admin/_next/static/css/2cadb5f62dcd7c2b.css +0 -1
  294. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0.dist-info}/WHEEL +0 -0
  295. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0.dist-info}/entry_points.txt +0 -0
  296. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0.dist-info}/licenses/LICENSE +0 -0
  297. {ethyca_fides-2.66.2rc0.dist-info → ethyca_fides-2.67.0.dist-info}/top_level.txt +0 -0
  298. /fides/ui-build/static/admin/_next/static/{8108ANFxs99VY7KZ_Xev2 → MNlh9olWjgbqAHKyQY3LF}/_ssgManifest.js +0 -0
  299. /fides/ui-build/static/admin/_next/static/chunks/{2921-455e6357b74d2f76.js → 2921-86f1547ac40a5cdf.js} +0 -0
  300. /fides/ui-build/static/admin/_next/static/chunks/{3923-6cc911dafccc5f63.js → 3923-13a6b4da2d51bf8f.js} +0 -0
  301. /fides/ui-build/static/admin/_next/static/chunks/{401-1b529d5800aa1f3a.js → 401-3cc1fee61494e3bd.js} +0 -0
  302. /fides/ui-build/static/admin/_next/static/chunks/{5574-b13021775a15bfd2.js → 5574-9312f97b637d9ee2.js} +0 -0
  303. /fides/ui-build/static/admin/_next/static/chunks/{7630-9aac73191ed5ed13.js → 7630-b1c93688013ef013.js} +0 -0
  304. /fides/ui-build/static/admin/_next/static/chunks/{9826-111aaee8bd8dbd09.js → 9826-3c578665c6d3b21d.js} +0 -0
  305. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-aece2c920ea14514.js → 404-2d803dab6a00f353.js} +0 -0
  306. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-dc75dc6e37e52f05.js → multiple-8ff7f37913ad736a.js} +0 -0
  307. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-24d226b5a8de5c74.js → add-vendors-d00c9034cdeb0236.js} +0 -0
  308. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-6a8ef51138ac926a.js → configure-0e1ca0f4c8e7f4da.js} +0 -0
  309. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-6f86ab63a08a6528.js → properties-057cad65e7414a44.js} +0 -0
  310. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-73d3cbf68f7c3a31.js → consent-e17c56eec8d91371.js} +0 -0
  311. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-6ba9e160dae64695.js → [projectUrn]-80a6cc8e8573514a.js} +0 -0
  312. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-7648bbd4f6711e4d.js → resources-6c3714ee97a718c1.js} +0 -0
  313. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-393e20924c83373e.js → [resourceUrn]-31e6c54794a9883e.js} +0 -0
  314. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-8733807dad4bc96e.js → detection-2822a423a7ad0550.js} +0 -0
  315. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-006b695e5af5ef24.js → [datasetId]-a8e8b5f4ee7af86c.js} +0 -0
  316. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-c391c6fad56eec48.js → datastore-connection-3bd77864da523d41.js} +0 -0
  317. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-53fecfb9dd6a1e0c.js → [id]-5627d0d0668077f9.js} +0 -0
  318. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-76b01cec5fde10a9.js → add-template-feca66ad5c5fe54a.js} +0 -0
  319. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-5c08e8447c45ce44.js → ant-components-64a322d01aae5ca7.js} +0 -0
  320. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-06ad5f34585480aa.js → AntForm-8bca16a7726e7eb2.js} +0 -0
  321. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-6f071c2bc9446cb0.js → FormikAntFormItem-b0f246fc3b67ebf7.js} +0 -0
  322. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-efcc38c58991ac9e.js → FormikControlled-1a0852b090bfc392.js} +0 -0
  323. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-430ba5c979abfb7c.js → FormikField-11f3de1b45e36583.js} +0 -0
  324. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-5c561880bf131afb.js → forms-1b73a1c2b6c6285f.js} +0 -0
  325. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-d888a69a3bbe040e.js → configure-e551a860ec727802.js} +0 -0
  326. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-d3d8e3d7583ec635.js → [id]-dd99183f93763ae4.js} +0 -0
  327. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-1af10ed303815d46.js → add-property-0bdbc1fcbf553b8f.js} +0 -0
  328. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-cebc0dc186be499a.js → properties-e959378bb32b6b73.js} +0 -0
  329. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-5e1322de868d615e.js → alpha-1066f0c202ef744c.js} +0 -0
  330. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-241f95e372b65d0f.js → about-37ba24a72a06862e.js} +0 -0
  331. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-41242f805599feda.js → domain-records-51333dbd21cb37c8.js} +0 -0
  332. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-2e885f74c92f669c.js → domains-bde86e5f6c09da5a.js} +0 -0
  333. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-ff112655ad5f41e5.js → email-templates-4f9a5cc8bea7725b.js} +0 -0
  334. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-86062a18e081a52a.js → regulations-102efd9199e87124.js} +0 -0
  335. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-a2524414e968f862.js → new-de8cb3739ab99c09.js} +0 -0
@@ -50,6 +50,7 @@ from fides.api.models.comment import Comment, CommentReference, CommentReference
50
50
  from fides.api.models.fides_user import FidesUser
51
51
  from fides.api.models.field_types import EncryptedLargeDataDescriptor
52
52
  from fides.api.models.manual_webhook import AccessManualWebhook
53
+ from fides.api.models.masking_secret import MaskingSecret
53
54
  from fides.api.models.policy import (
54
55
  Policy,
55
56
  PolicyPreWebhook,
@@ -98,7 +99,6 @@ from fides.api.util.cache import (
98
99
  get_drp_request_body_cache_key,
99
100
  get_encryption_cache_key,
100
101
  get_identity_cache_key,
101
- get_masking_secret_cache_key,
102
102
  )
103
103
  from fides.api.util.collection_util import Row, extract_key_for_address
104
104
  from fides.api.util.constants import API_DATE_FORMAT
@@ -145,6 +145,12 @@ class PrivacyRequest(
145
145
  ForeignKey(FidesUser.id_field_path, ondelete="SET NULL"),
146
146
  nullable=True,
147
147
  )
148
+ finalized_at = Column(DateTime(timezone=True), nullable=True)
149
+ finalized_by = Column(
150
+ String,
151
+ ForeignKey(FidesUser.id_field_path, ondelete="SET NULL"),
152
+ nullable=True,
153
+ )
148
154
  submitted_by = Column(
149
155
  String,
150
156
  ForeignKey(FidesUser.id_field_path, ondelete="SET NULL"),
@@ -289,6 +295,13 @@ class PrivacyRequest(
289
295
  order_by="RequestTask.created_at",
290
296
  )
291
297
 
298
+ masking_secrets: "RelationshipProperty[List[MaskingSecret]]" = relationship(
299
+ "MaskingSecret",
300
+ back_populates="privacy_request",
301
+ uselist=True,
302
+ passive_deletes="all",
303
+ )
304
+
292
305
  @property
293
306
  def days_left(self: PrivacyRequest) -> Union[int, None]:
294
307
  if self.due_date is None:
@@ -566,19 +579,24 @@ class PrivacyRequest(
566
579
  encryption_key,
567
580
  )
568
581
 
569
- def cache_masking_secret(self, masking_secret: MaskingSecretCache) -> None:
570
- """Sets masking encryption secrets in the Fides app cache if provided"""
571
- if not masking_secret:
582
+ def persist_masking_secrets(
583
+ self, masking_secrets: List[MaskingSecretCache]
584
+ ) -> None:
585
+ """Persists masking encryption secrets to database."""
586
+ if not masking_secrets:
572
587
  return
573
- cache: FidesopsRedis = get_cache()
574
- cache.set_with_autoexpire(
575
- get_masking_secret_cache_key(
576
- self.id,
577
- masking_strategy=masking_secret.masking_strategy,
578
- secret_type=masking_secret.secret_type,
579
- ),
580
- FidesopsRedis.encode_obj(masking_secret.secret),
581
- )
588
+
589
+ session = Session.object_session(self)
590
+ for masking_secret in masking_secrets:
591
+ MaskingSecret.create(
592
+ db=session,
593
+ data={
594
+ "privacy_request_id": self.id,
595
+ "secret": masking_secret.secret,
596
+ "masking_strategy": masking_secret.masking_strategy,
597
+ "secret_type": masking_secret.secret_type,
598
+ },
599
+ )
582
600
 
583
601
  def get_cached_identity_data(self) -> Dict[str, Any]:
584
602
  """Retrieves any identity data pertaining to this request from the cache"""
@@ -991,6 +1009,38 @@ class PrivacyRequest(
991
1009
  request_task_celery_ids.append(request_task_id)
992
1010
  return request_task_celery_ids
993
1011
 
1012
+ def cancel_celery_tasks(self) -> None:
1013
+ """Cancel all Celery tasks associated with this privacy request.
1014
+
1015
+ This includes both the main privacy request task and any sub-tasks (Request Tasks).
1016
+ """
1017
+ task_ids: List[str] = []
1018
+
1019
+ # Add the main privacy request task ID
1020
+ parent_task_id = self.get_cached_task_id()
1021
+ if parent_task_id:
1022
+ task_ids.append(parent_task_id)
1023
+
1024
+ # Add all request task IDs
1025
+ request_task_celery_ids = self.get_request_task_celery_task_ids()
1026
+ task_ids.extend(request_task_celery_ids)
1027
+
1028
+ if not task_ids:
1029
+ return
1030
+
1031
+ # Revoke all Celery tasks in batch
1032
+ logger.info(f"Revoking {len(task_ids)} tasks for privacy request {self.id}")
1033
+ try:
1034
+ # Use terminate=False to allow graceful shutdown if already running
1035
+ celery_app.control.revoke(task_ids, terminate=False)
1036
+ logger.info(
1037
+ f"Successfully revoked {len(task_ids)} tasks for privacy request {self.id}"
1038
+ )
1039
+ except Exception as exc:
1040
+ logger.warning(
1041
+ f"Failed to revoke {len(task_ids)} tasks for privacy request {self.id}: {exc}"
1042
+ )
1043
+
994
1044
  def cancel_processing(self, db: Session, cancel_reason: Optional[str]) -> None:
995
1045
  """Cancels a privacy request. Currently should only cancel 'pending' tasks
996
1046
 
@@ -1003,19 +1053,7 @@ class PrivacyRequest(
1003
1053
  self.canceled_at = datetime.utcnow()
1004
1054
  self.save(db)
1005
1055
 
1006
- task_ids: List[str] = (
1007
- self.get_request_task_celery_task_ids()
1008
- ) # Celery tasks for sub tasks (DSR 3.0 Request Tasks)
1009
- parent_task_id = (
1010
- self.get_cached_task_id()
1011
- ) # Celery task for current Privacy Request
1012
- if parent_task_id:
1013
- task_ids.append(parent_task_id)
1014
-
1015
- for celery_task_id in task_ids:
1016
- logger.info("Revoking task {} for request {}", celery_task_id, self.id)
1017
- # Only revokes if execution is not already in progress.
1018
- celery_app.control.revoke(celery_task_id, terminate=False)
1056
+ self.cancel_celery_tasks()
1019
1057
 
1020
1058
  def error_processing(self, db: Session) -> None:
1021
1059
  """Mark privacy request as errored, and note time processing was finished"""
fides/api/oauth/roles.py CHANGED
@@ -47,6 +47,7 @@ from fides.common.api.scope_registry import (
47
47
  SYSTEM_READ,
48
48
  USER_PERMISSION_ASSIGN_OWNERS,
49
49
  USER_READ,
50
+ USER_READ_OWN,
50
51
  WEBHOOK_READ,
51
52
  )
52
53
 
@@ -126,6 +127,7 @@ viewer_scopes = [ # Intentionally omitted USER_PERMISSION_READ and PRIVACY_REQU
126
127
 
127
128
  respondent_scopes = [
128
129
  PRIVACY_REQUEST_MANUAL_STEPS_RESPOND, # allows respondents to respond to assigned manual steps
130
+ USER_READ_OWN,
129
131
  ]
130
132
 
131
133
  external_respondent_scopes = [
@@ -11,6 +11,14 @@ from fides.api.schemas.messaging.messaging import MessagingServiceType
11
11
  from fides.config.admin_ui_settings import ErrorNotificationMode
12
12
 
13
13
 
14
+ class SqlDryRunMode(str, Enum):
15
+ """SQL dry run mode for controlling execution of SQL statements in privacy requests"""
16
+
17
+ none = "none"
18
+ access = "access"
19
+ erasure = "erasure"
20
+
21
+
14
22
  class StorageTypeApiAccepted(Enum):
15
23
  """Enum for storage destination types accepted in API updates"""
16
24
 
@@ -62,7 +70,10 @@ class ExecutionApplicationConfig(FidesSchema):
62
70
  subject_identity_verification_required: Optional[bool] = None
63
71
  disable_consent_identity_verification: Optional[bool] = None
64
72
  require_manual_request_approval: Optional[bool] = None
65
- model_config = ConfigDict(extra="forbid")
73
+ memory_watchdog_enabled: Optional[bool] = None
74
+ sql_dry_run: Optional[SqlDryRunMode] = None
75
+
76
+ model_config = ConfigDict(use_enum_values=True, extra="forbid")
66
77
 
67
78
 
68
79
  class AdminUIConfig(FidesSchema):
@@ -16,6 +16,15 @@ class PeriodicIntegrationFrequency(Enum):
16
16
  daily = "daily"
17
17
  weekly = "weekly"
18
18
  monthly = "monthly"
19
+ not_scheduled = "not scheduled"
20
+
21
+
22
+ PERIODIC_INTEGRATION_FREQUENCY_TO_DAYS = {
23
+ PeriodicIntegrationFrequency.daily.value: 1,
24
+ PeriodicIntegrationFrequency.weekly.value: 7,
25
+ PeriodicIntegrationFrequency.monthly.value: 30,
26
+ PeriodicIntegrationFrequency.not_scheduled.value: -1, # negative value to indicate that the integration is not scheduled
27
+ }
19
28
 
20
29
 
21
30
  class DatahubSchema(ConnectionConfigSecretsSchema):
@@ -30,7 +39,7 @@ class DatahubSchema(ConnectionConfigSecretsSchema):
30
39
  )
31
40
  frequency: PeriodicIntegrationFrequency = Field(
32
41
  title="Frequency",
33
- description="The frequency at which the integration should run. Available options are daily, weekly, and monthly.",
42
+ description="The frequency at which the integration should run. Available options are daily, weekly, monthly, and not scheduled.",
34
43
  )
35
44
  glossary_node: str = Field(
36
45
  title="Glossary node",
@@ -5,7 +5,7 @@ from typing import Callable, Generic, TypeVar
5
5
  T = TypeVar("T")
6
6
 
7
7
 
8
- class SecretType(Enum):
8
+ class SecretType(str, Enum):
9
9
  """Enum that holds all possible types of secrets across all masking strategies"""
10
10
 
11
11
  key = "key"
@@ -28,6 +28,7 @@ class CurrentStep(EnumType):
28
28
  finalize_consent = "finalize_consent"
29
29
  email_post_send = "email_post_send"
30
30
  post_webhooks = "post_webhooks"
31
+ finalization = "finalization"
31
32
 
32
33
 
33
34
  # action types we actively support in policies/requests
@@ -124,6 +124,8 @@ class PrivacyRequestResubmit(PrivacyRequestCreate):
124
124
  identity_verified_at: Optional[datetime] = None
125
125
  custom_privacy_request_fields_approved_at: Optional[datetime] = None
126
126
  custom_privacy_request_fields_approved_by: Optional[str] = None
127
+ finalized_at: Optional[datetime] = None
128
+ finalized_by: Optional[str] = None
127
129
 
128
130
 
129
131
  class ConsentRequestCreate(FidesSchema):
@@ -287,6 +289,7 @@ class PrivacyRequestStatus(str, EnumType):
287
289
  complete = "complete"
288
290
  paused = "paused"
289
291
  awaiting_email_send = "awaiting_email_send"
292
+ requires_manual_finalization = "requires_manual_finalization"
290
293
  canceled = "canceled"
291
294
  error = "error"
292
295
 
@@ -320,6 +323,8 @@ class PrivacyRequestResponse(FidesSchema):
320
323
  source: Optional[PrivacyRequestSource] = None
321
324
  deleted_at: Optional[datetime] = None
322
325
  deleted_by: Optional[str] = None
326
+ finalized_at: Optional[datetime] = None
327
+ finalized_by: Optional[str] = None
323
328
  model_config = ConfigDict(from_attributes=True, use_enum_values=True)
324
329
 
325
330
 
@@ -82,6 +82,7 @@ class BaseConnector(Generic[DB_CONNECTOR_TYPE], ABC):
82
82
  privacy_request: PrivacyRequest,
83
83
  request_task: RequestTask,
84
84
  rows: List[Row],
85
+ input_data: Optional[Dict[str, List[Any]]] = None,
85
86
  ) -> int:
86
87
  """Execute a masking request. Return the number of rows that have been updated
87
88
 
@@ -143,3 +144,17 @@ class BaseConnector(Generic[DB_CONNECTOR_TYPE], ABC):
143
144
  # Defaulting to true for now so we can keep the default behavior and
144
145
  # incrementally determine the need for primary keys across all connectors
145
146
  return True
147
+
148
+ def get_qualified_table_name(self, node: ExecutionNode) -> str:
149
+ """
150
+ Get the fully qualified table name for the given execution node.
151
+ """
152
+ raise NotImplementedError(
153
+ "get_qualified_table_name is not implemented by this connector"
154
+ )
155
+
156
+ def table_exists(self, qualified_table_name: str) -> bool:
157
+ """
158
+ Check if a table exists in the datastore.
159
+ """
160
+ raise NotImplementedError("table_exists is not implemented by this connector")
@@ -1,13 +1,8 @@
1
- from typing import List, Optional
1
+ from typing import Any, Dict, List, Optional
2
2
 
3
3
  from loguru import logger
4
4
  from sqlalchemy import text
5
- from sqlalchemy.engine import ( # type: ignore
6
- Connection,
7
- Engine,
8
- LegacyCursorResult,
9
- create_engine,
10
- )
5
+ from sqlalchemy.engine import Connection, Engine, create_engine # type: ignore
11
6
  from sqlalchemy.orm import Session
12
7
  from sqlalchemy.sql import Executable # type: ignore
13
8
  from sqlalchemy.sql.elements import TextClause
@@ -17,6 +12,7 @@ from fides.api.graph.execution import ExecutionNode
17
12
  from fides.api.models.connectionconfig import ConnectionTestStatus
18
13
  from fides.api.models.policy import Policy
19
14
  from fides.api.models.privacy_request import PrivacyRequest, RequestTask
15
+ from fides.api.schemas.application_config import SqlDryRunMode
20
16
  from fides.api.schemas.connection_configuration.connection_secrets_bigquery import (
21
17
  BigQuerySchema,
22
18
  )
@@ -74,6 +70,11 @@ class BigQueryConnector(SQLConnector):
74
70
  node, SQLConnector.get_namespace_meta(db, node.address.dataset)
75
71
  )
76
72
 
73
+ def get_qualified_table_name(self, node: ExecutionNode) -> str:
74
+ """Get fully qualified BigQuery table name using existing query config logic"""
75
+ query_config = self.query_config(node)
76
+ return query_config.generate_table_name()
77
+
77
78
  def partitioned_retrieval(
78
79
  self,
79
80
  query_config: SQLQueryConfig,
@@ -99,6 +100,16 @@ class BigQueryConnector(SQLConnector):
99
100
  logger.info(
100
101
  f"Executing {len(partition_clauses)} partition queries for node '{query_config.node.address}' in DSR execution"
101
102
  )
103
+
104
+ if self.should_dry_run(SqlDryRunMode.access):
105
+ for partition_clause in partition_clauses:
106
+ existing_bind_params = stmt.compile().params
107
+ partitioned_stmt = text(
108
+ f"{stmt} AND ({text(partition_clause)})"
109
+ ).params(existing_bind_params)
110
+ logger.warning(f"SQL DRY RUN - Would execute SQL: {partitioned_stmt}")
111
+ return []
112
+
102
113
  rows = []
103
114
  for partition_clause in partition_clauses:
104
115
  logger.debug(
@@ -135,6 +146,39 @@ class BigQueryConnector(SQLConnector):
135
146
  logger.exception(f"Error testing connection to remote BigQuery {str(e)}")
136
147
  raise ConnectionException(f"Connection error: {e}")
137
148
 
149
+ def _execute_statements_with_sql_dry_run(
150
+ self,
151
+ statements: List[Executable],
152
+ sql_dry_run_enabled: bool,
153
+ client: Engine,
154
+ ) -> int:
155
+ """
156
+ Execute SQL statements with sql_dry_run support.
157
+
158
+ Args:
159
+ statements: List of SQL statements to execute
160
+ sql_dry_run_enabled: Whether sql_dry_run mode is enabled
161
+ client: Database engine
162
+
163
+ Returns:
164
+ int: Number of affected rows (0 in sql_dry_run mode)
165
+ """
166
+ if not statements:
167
+ return 0
168
+
169
+ if sql_dry_run_enabled:
170
+ for stmt in statements:
171
+ logger.warning(f"SQL DRY RUN - Would execute SQL: {stmt}")
172
+ return 0
173
+
174
+ row_count = 0
175
+ with client.connect() as connection:
176
+ for stmt in statements:
177
+ results = connection.execute(stmt)
178
+ logger.debug(f"Affected {results.rowcount} rows")
179
+ row_count += results.rowcount
180
+ return row_count
181
+
138
182
  def mask_data(
139
183
  self,
140
184
  node: ExecutionNode,
@@ -142,22 +186,31 @@ class BigQueryConnector(SQLConnector):
142
186
  privacy_request: PrivacyRequest,
143
187
  request_task: RequestTask,
144
188
  rows: List[Row],
189
+ input_data: Optional[Dict[str, List[Any]]] = None,
145
190
  ) -> int:
146
191
  """Execute a masking request. Returns the number of records updated or deleted"""
192
+
147
193
  query_config = self.query_config(node)
148
194
  update_or_delete_ct = 0
149
195
  client = self.client()
150
- for row in rows:
151
- update_or_delete_stmts: List[Executable] = (
152
- query_config.generate_masking_stmt(
153
- node, row, policy, privacy_request, client
154
- )
196
+
197
+ if query_config.uses_delete_masking_strategy():
198
+ delete_stmts = query_config.generate_delete(client, input_data or {})
199
+ logger.debug(f"Generated {len(delete_stmts)} DELETE statements")
200
+ update_or_delete_ct += self._execute_statements_with_sql_dry_run(
201
+ delete_stmts, self.should_dry_run(SqlDryRunMode.erasure), client
155
202
  )
156
- if update_or_delete_stmts:
157
- with client.connect() as connection:
158
- for update_or_delete_stmt in update_or_delete_stmts:
159
- results: LegacyCursorResult = connection.execute(
160
- update_or_delete_stmt
161
- )
162
- update_or_delete_ct = update_or_delete_ct + results.rowcount
203
+ else:
204
+ for row in rows:
205
+ update_or_delete_stmts: List[Executable] = query_config.generate_update(
206
+ row, policy, privacy_request, client
207
+ )
208
+ logger.debug(
209
+ f"Generated {len(update_or_delete_stmts)} UPDATE statements"
210
+ )
211
+ update_or_delete_ct += self._execute_statements_with_sql_dry_run(
212
+ update_or_delete_stmts,
213
+ self.should_dry_run(SqlDryRunMode.erasure),
214
+ client,
215
+ )
163
216
  return update_or_delete_ct
@@ -140,8 +140,9 @@ class DynamoDBConnector(BaseConnector[Any]): # type: ignore
140
140
  privacy_request: PrivacyRequest,
141
141
  request_task: RequestTask,
142
142
  rows: List[Row],
143
+ input_data: Optional[Dict[str, List[Any]]] = None,
143
144
  ) -> int:
144
- """Execute a masking requestfor DynamoDB"""
145
+ """Execute a masking request for DynamoDB"""
145
146
 
146
147
  query_config = self.query_config(node)
147
148
  collection_name = node.address.collection
@@ -142,6 +142,7 @@ class FidesConnector(BaseConnector[FidesClient]):
142
142
  privacy_request: PrivacyRequest,
143
143
  request_task: RequestTask,
144
144
  rows: List[Row],
145
+ input_data: Optional[Dict[str, List[Any]]] = None,
145
146
  ) -> int:
146
147
  """Execute an erasure request on remote fides"""
147
148
  identity_data = {
@@ -90,6 +90,7 @@ class HTTPSConnector(BaseConnector[None]):
90
90
  privacy_request: PrivacyRequest,
91
91
  request_task: RequestTask,
92
92
  rows: List[Row],
93
+ input_data: Optional[Dict[str, List[Any]]] = None,
93
94
  ) -> int:
94
95
  """Currently not supported as webhooks are not called at the collection level"""
95
96
  raise NotImplementedError(
@@ -80,6 +80,7 @@ class ManualTaskConnector(BaseConnector):
80
80
  privacy_request: PrivacyRequest,
81
81
  request_task: RequestTask,
82
82
  rows: List[Row],
83
+ input_data: Optional[Dict[str, List[Any]]] = None,
83
84
  ) -> int:
84
85
  """
85
86
  Manual tasks don't support erasure operations.
@@ -1,4 +1,4 @@
1
- from typing import Any, Dict, List
1
+ from typing import Any, Dict, List, Optional
2
2
 
3
3
  from fides.api.graph.execution import ExecutionNode
4
4
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionTestStatus
@@ -53,6 +53,7 @@ class ManualWebhookConnector(BaseConnector[None]):
53
53
  privacy_request: PrivacyRequest,
54
54
  request_task: RequestTask,
55
55
  rows: List[Row],
56
+ input_data: Optional[List[List[Row]]] = None,
56
57
  ) -> None:
57
58
  """
58
59
  Not applicable for a manual webhook. Manual webhooks are not called as part of the traversal.
@@ -126,6 +126,7 @@ class MongoDBConnector(BaseConnector[MongoClient]):
126
126
  privacy_request: PrivacyRequest,
127
127
  request_task: RequestTask,
128
128
  rows: List[Row],
129
+ input_data: Optional[Dict[str, List[Any]]] = None,
129
130
  ) -> int:
130
131
  """Execute a masking request"""
131
132
  query_config = self.query_config(node)
@@ -82,6 +82,7 @@ class OktaConnector(BaseConnector):
82
82
  privacy_request: PrivacyRequest,
83
83
  request_task: RequestTask,
84
84
  rows: List[Row],
85
+ input_data: Optional[Dict[str, List[Any]]] = None,
85
86
  ) -> int:
86
87
  """DSR execution not supported for Okta connector"""
87
88
  return 0