ethyca-fides 2.66.2b2__py2.py3-none-any.whl → 2.66.2rc0__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 (282) hide show
  1. {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/RECORD +259 -270
  3. fides/_version.py +3 -3
  4. fides/api/api/v1/endpoints/dataset_config_endpoints.py +5 -13
  5. fides/api/api/v1/endpoints/drp_endpoints.py +1 -7
  6. fides/api/api/v1/endpoints/privacy_request_endpoints.py +1 -44
  7. fides/api/api/v1/endpoints/user_endpoints.py +7 -83
  8. fides/api/app_setup.py +2 -3
  9. fides/api/common_exceptions.py +0 -4
  10. fides/api/db/base.py +0 -1
  11. fides/api/db/database.py +1 -1
  12. fides/api/graph/execution.py +0 -30
  13. fides/api/graph/traversal.py +1 -1
  14. fides/api/models/{manual_task/manual_task.py → manual_task.py} +0 -10
  15. fides/api/models/policy.py +0 -23
  16. fides/api/models/privacy_request/execution_log.py +0 -1
  17. fides/api/models/privacy_request/privacy_request.py +13 -31
  18. fides/api/oauth/roles.py +0 -2
  19. fides/api/schemas/application_config.py +1 -11
  20. fides/api/schemas/masking/masking_secrets.py +1 -1
  21. fides/api/schemas/policy.py +0 -1
  22. fides/api/schemas/privacy_request.py +0 -5
  23. fides/api/service/connectors/base_connector.py +0 -1
  24. fides/api/service/connectors/bigquery_connector.py +19 -67
  25. fides/api/service/connectors/dynamodb_connector.py +1 -2
  26. fides/api/service/connectors/fides_connector.py +0 -1
  27. fides/api/service/connectors/http_connector.py +0 -1
  28. fides/api/service/connectors/manual_task_connector.py +0 -1
  29. fides/api/service/connectors/manual_webhook_connector.py +1 -2
  30. fides/api/service/connectors/mongodb_connector.py +0 -1
  31. fides/api/service/connectors/okta_connector.py +0 -1
  32. fides/api/service/connectors/query_configs/bigquery_query_config.py +32 -91
  33. fides/api/service/connectors/rds_mysql_connector.py +0 -1
  34. fides/api/service/connectors/rds_postgres_connector.py +0 -1
  35. fides/api/service/connectors/s3_connector.py +0 -1
  36. fides/api/service/connectors/saas_connector.py +0 -1
  37. fides/api/service/connectors/scylla_connector.py +0 -1
  38. fides/api/service/connectors/sql_connector.py +4 -36
  39. fides/api/service/connectors/website_connector.py +0 -1
  40. fides/api/service/privacy_request/request_runner_service.py +53 -142
  41. fides/api/service/privacy_request/request_service.py +22 -1
  42. fides/api/task/create_request_tasks.py +1 -1
  43. fides/api/task/deprecated_graph_task.py +6 -24
  44. fides/api/task/execute_request_tasks.py +12 -89
  45. fides/api/task/filter_results.py +1 -1
  46. fides/api/task/graph_task.py +3 -38
  47. fides/api/task/manual/manual_task_graph_task.py +126 -118
  48. fides/api/task/manual/manual_task_utils.py +105 -52
  49. fides/api/util/cache.py +0 -5
  50. fides/api/util/encryption/secrets_util.py +18 -48
  51. fides/common/api/scope_registry.py +0 -3
  52. fides/common/api/v1/urn_registry.py +1 -1
  53. fides/config/execution_settings.py +0 -4
  54. fides/config/utils.py +0 -1
  55. fides/service/privacy_request/privacy_request_service.py +1 -6
  56. fides/ui-build/static/admin/404.html +1 -1
  57. fides/ui-build/static/admin/_next/static/8108ANFxs99VY7KZ_Xev2/_buildManifest.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/1817-e601e737e3cc7a0e.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/{203-4e777c324a01dbec.js → 203-5a663f465ba26bb4.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/431-34f0b91c26f8d9ab.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/6780-e3d40aa17a4bf2e9.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-f2c3d287bac00395.js → _app-39ccb07327c2c5d5.js} +56 -56
  63. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2265ecb899d45fbc.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-5d522637871ac6c8.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-f10a7dcf7541c865.js → integrations-e2d5d7e2a5265e68.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-05616e2ae20ff4f8.js → table-migration-69ad86b7a8a9a115.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-32600543eb7b584f.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-10ce53ea356f8bad.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-5501bbb129fee9c4.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-cbe4c8f9096b6543.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-ff5738706da07801.js +1 -0
  72. fides/ui-build/static/admin/_next/static/css/2cadb5f62dcd7c2b.css +1 -0
  73. fides/ui-build/static/admin/_next/static/css/{23cf870196941c9a.css → 5bfb2473e5701527.css} +1 -1
  74. fides/ui-build/static/admin/_next/static/css/{8bc1833f1fa53ff0.css → 94965f224bc991e9.css} +1 -1
  75. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  76. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  77. fides/ui-build/static/admin/add-systems.html +1 -1
  78. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  79. fides/ui-build/static/admin/consent/configure.html +1 -1
  80. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  81. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  82. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  83. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  84. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  85. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  86. fides/ui-build/static/admin/consent/properties.html +1 -1
  87. fides/ui-build/static/admin/consent/reporting.html +1 -1
  88. fides/ui-build/static/admin/consent.html +1 -1
  89. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  90. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  91. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  92. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  93. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  94. fides/ui-build/static/admin/data-catalog.html +1 -1
  95. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  96. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  97. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  98. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  99. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  100. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  101. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  102. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  103. fides/ui-build/static/admin/datamap.html +1 -1
  104. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  105. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  106. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  107. fides/ui-build/static/admin/dataset/new.html +1 -1
  108. fides/ui-build/static/admin/dataset.html +1 -1
  109. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  110. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  111. fides/ui-build/static/admin/datastore-connection.html +1 -1
  112. fides/ui-build/static/admin/index.html +1 -1
  113. fides/ui-build/static/admin/integrations/[id].html +1 -1
  114. fides/ui-build/static/admin/integrations.html +1 -1
  115. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  116. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  117. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  118. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  119. fides/ui-build/static/admin/lib/fides.js +3 -3
  120. fides/ui-build/static/admin/login/[provider].html +1 -1
  121. fides/ui-build/static/admin/login.html +1 -1
  122. fides/ui-build/static/admin/messaging/[id].html +1 -1
  123. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  124. fides/ui-build/static/admin/messaging.html +1 -1
  125. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  126. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  127. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  128. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  129. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  130. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  131. fides/ui-build/static/admin/poc/forms.html +1 -1
  132. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  133. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  134. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  135. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  136. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  137. fides/ui-build/static/admin/privacy-requests.html +1 -1
  138. fides/ui-build/static/admin/properties/[id].html +1 -1
  139. fides/ui-build/static/admin/properties/add-property.html +1 -1
  140. fides/ui-build/static/admin/properties.html +1 -1
  141. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  142. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  143. fides/ui-build/static/admin/settings/about.html +1 -1
  144. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  145. fides/ui-build/static/admin/settings/consent.html +1 -1
  146. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  147. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  148. fides/ui-build/static/admin/settings/domains.html +1 -1
  149. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  150. fides/ui-build/static/admin/settings/locations.html +1 -1
  151. fides/ui-build/static/admin/settings/organization.html +1 -1
  152. fides/ui-build/static/admin/settings/regulations.html +1 -1
  153. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  154. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  155. fides/ui-build/static/admin/systems.html +1 -1
  156. fides/ui-build/static/admin/taxonomy.html +1 -1
  157. fides/ui-build/static/admin/user-management/new.html +1 -1
  158. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  159. fides/ui-build/static/admin/user-management.html +1 -1
  160. fides/api/alembic/migrations/versions/7e9a2b52f498_adding_masking_secrets.py +0 -60
  161. fides/api/alembic/migrations/versions/a7065df4dcf1_add_finalized_fields_to_privacy_request.py +0 -65
  162. fides/api/alembic/migrations/versions/d0031087eacb_create_manualtaskconditionaldependency_.py +0 -106
  163. fides/api/models/manual_task/__init__.py +0 -2
  164. fides/api/models/manual_task/conditional_dependency.py +0 -144
  165. fides/api/models/masking_secret.py +0 -72
  166. fides/api/task/conditional_dependencies/__init__.py +0 -0
  167. fides/api/task/conditional_dependencies/evaluator.py +0 -109
  168. fides/api/task/conditional_dependencies/schemas.py +0 -54
  169. fides/api/task/manual/manual_task_address.py +0 -46
  170. fides/ui-build/static/admin/_next/static/EACyrT3Bb5qN9POVQHTCB/_buildManifest.js +0 -1
  171. fides/ui-build/static/admin/_next/static/chunks/1817-6f35f58cd08b04ae.js +0 -1
  172. fides/ui-build/static/admin/_next/static/chunks/431-ade3e312fac3430b.js +0 -1
  173. fides/ui-build/static/admin/_next/static/chunks/6780-a00c87739acc004d.js +0 -1
  174. fides/ui-build/static/admin/_next/static/chunks/8237-55049f8f5fd5e058.js +0 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-71579a199158952e.js +0 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-7d3115059503b904.js +0 -1
  177. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-c73497fc333c324d.js +0 -1
  178. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-7498d1d5974a78b0.js +0 -1
  179. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-2d3a2d967767a131.js +0 -1
  180. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-6a9068df48bdee05.js +0 -1
  181. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-fe58cebba358119d.js +0 -1
  182. fides/ui-build/static/admin/_next/static/css/79e296c724c1568c.css +0 -1
  183. {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/WHEEL +0 -0
  184. {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/entry_points.txt +0 -0
  185. {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/licenses/LICENSE +0 -0
  186. {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/top_level.txt +0 -0
  187. /fides/ui-build/static/admin/_next/static/{EACyrT3Bb5qN9POVQHTCB → 8108ANFxs99VY7KZ_Xev2}/_ssgManifest.js +0 -0
  188. /fides/ui-build/static/admin/_next/static/chunks/{2921-86f1547ac40a5cdf.js → 2921-455e6357b74d2f76.js} +0 -0
  189. /fides/ui-build/static/admin/_next/static/chunks/{3450-1cc2bb07ed142203.js → 3450-0ba194991d0cca88.js} +0 -0
  190. /fides/ui-build/static/admin/_next/static/chunks/{3855-e2fa6db53d32c3de.js → 3855-e172870d3e21b0dd.js} +0 -0
  191. /fides/ui-build/static/admin/_next/static/chunks/{3872-84b7e380b88b4454.js → 3872-46cebf7ec1b31a2b.js} +0 -0
  192. /fides/ui-build/static/admin/_next/static/chunks/{3923-13a6b4da2d51bf8f.js → 3923-6cc911dafccc5f63.js} +0 -0
  193. /fides/ui-build/static/admin/_next/static/chunks/{401-3cc1fee61494e3bd.js → 401-1b529d5800aa1f3a.js} +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/{409-45a125437261580c.js → 409-a257e14acebcd73b.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/{4121-f50675521dfee6eb.js → 4121-2bc09fc4ddbfe5cb.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/{4230-840c287045c88b34.js → 4230-60100f7ef3ddcde1.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/{4608-a8e3100e2806dbff.js → 4608-bbb7bf511a05c3c2.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/{5309-1172322bf91b5d57.js → 5309-b2c4803370634ff8.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/{5574-9312f97b637d9ee2.js → 5574-b13021775a15bfd2.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/{6084-5d7598b7bcb548cf.js → 6084-7178ff6ea6822475.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/{6662-efb2cf74641647f2.js → 6662-507be5d46e5b719b.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/{6853-4f8bf6558f8c6a46.js → 6853-2ad3e08fe6f9f5f2.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/chunks/{6882-586b84aeb02d5830.js → 6882-6af16fef26c21e06.js} +0 -0
  204. /fides/ui-build/static/admin/_next/static/chunks/{6954-34e062e4bffc7e71.js → 6954-bb875d9ac89f6030.js} +0 -0
  205. /fides/ui-build/static/admin/_next/static/chunks/{7476-d206c11823c91088.js → 7476-281ee9a8286556f3.js} +0 -0
  206. /fides/ui-build/static/admin/_next/static/chunks/{7630-b1c93688013ef013.js → 7630-9aac73191ed5ed13.js} +0 -0
  207. /fides/ui-build/static/admin/_next/static/chunks/{787-cbe2d0bfb513d90a.js → 787-fb41002f797eb2df.js} +0 -0
  208. /fides/ui-build/static/admin/_next/static/chunks/{79-3db1941d274f40c7.js → 79-7e87aff851423d4a.js} +0 -0
  209. /fides/ui-build/static/admin/_next/static/chunks/{796-98d4bd68909fbe1e.js → 796-329a5f823ec258a5.js} +0 -0
  210. /fides/ui-build/static/admin/_next/static/chunks/{9046-c8233981762585b4.js → 9046-5c4c22c375de25b1.js} +0 -0
  211. /fides/ui-build/static/admin/_next/static/chunks/{9226-72ad691ca57b83ef.js → 9226-746771d47dff6266.js} +0 -0
  212. /fides/ui-build/static/admin/_next/static/chunks/{9826-3c578665c6d3b21d.js → 9826-111aaee8bd8dbd09.js} +0 -0
  213. /fides/ui-build/static/admin/_next/static/chunks/{9951-595d0f1588215081.js → 9951-9b753ad7c3f51bdf.js} +0 -0
  214. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-2d803dab6a00f353.js → 404-aece2c920ea14514.js} +0 -0
  215. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-acb59f8b5e97512a.js → manual-98777246bec9dc2a.js} +0 -0
  216. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-8ff7f37913ad736a.js → multiple-dc75dc6e37e52f05.js} +0 -0
  217. /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-0943633a8e422695.js → add-systems-a71c0aff4e0e6535.js} +0 -0
  218. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-d00c9034cdeb0236.js → add-vendors-24d226b5a8de5c74.js} +0 -0
  219. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-0e1ca0f4c8e7f4da.js → configure-6a8ef51138ac926a.js} +0 -0
  220. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-fc3a011154a2e1de.js → [id]-1edf582ba3cd3bbb.js} +0 -0
  221. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-09d4408014bcfe1c.js → privacy-experience-685771e5f7196d87.js} +0 -0
  222. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-d67542783ef5ddac.js → [id]-6ccedc70dc447089.js} +0 -0
  223. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-3f20e8a316bb3d5b.js → new-944bca1cc57985b5.js} +0 -0
  224. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-23e9dcd4590312d2.js → privacy-notices-84f4bd14ce8673bc.js} +0 -0
  225. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-057cad65e7414a44.js → properties-6f86ab63a08a6528.js} +0 -0
  226. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-8f891957c8944137.js → reporting-afdbd4665657cfa1.js} +0 -0
  227. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-e17c56eec8d91371.js → consent-73d3cbf68f7c3a31.js} +0 -0
  228. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-99c9092d65c94807.js → [resourceUrn]-11d52f1570759c4d.js} +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-80a6cc8e8573514a.js → [projectUrn]-6ba9e160dae64695.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-774fecea22ba8852.js → projects-32eac8bbd217615a.js} +0 -0
  231. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-f6bd6aff389cb9fe.js → [resourceUrn]-b83afa5565d0c84e.js} +0 -0
  232. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-6c3714ee97a718c1.js → resources-7648bbd4f6711e4d.js} +0 -0
  233. /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-8a7f9285da66b965.js → data-catalog-6f630d42ac9fb6b4.js} +0 -0
  234. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-85e140788e251272.js → action-center-9ddb52ebb7ac4c71.js} +0 -0
  235. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-5af9381f02b2aff6.js → activity-9aa744d56cdacb0d.js} +0 -0
  236. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-31e6c54794a9883e.js → [resourceUrn]-393e20924c83373e.js} +0 -0
  237. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-2822a423a7ad0550.js → detection-8733807dad4bc96e.js} +0 -0
  238. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6421ce247549c5d6.js → [resourceUrn]-14bd7500362ff224.js} +0 -0
  239. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-3eac407ac5181a3c.js → discovery-9e7dfd5a6acc2e8f.js} +0 -0
  240. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-d2b275d83089820d.js → datamap-7674b97d655c193b.js} +0 -0
  241. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-1c98bd0959d9570a.js → [...subfieldNames]-c0d2bfd465df20e0.js} +0 -0
  242. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-e548cabda7da32c9.js → [collectionName]-28280a8a39a6e37c.js} +0 -0
  243. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-a8e8b5f4ee7af86c.js → [datasetId]-006b695e5af5ef24.js} +0 -0
  244. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-513c862c3a707735.js → new-82fb246d87e58ebd.js} +0 -0
  245. /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-747b7a13289f1cd7.js → dataset-20165c31ab1bc7cf.js} +0 -0
  246. /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-3d22525b3c327b2e.js → [id]-b4a6bcc87d126840.js} +0 -0
  247. /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-d2cad97495e86adb.js → new-f95d7b0bbfc58f5a.js} +0 -0
  248. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-0f29b47402292070.js → datastore-connection-c391c6fad56eec48.js} +0 -0
  249. /fides/ui-build/static/admin/_next/static/chunks/pages/{index-12ac3e317fc86f21.js → index-1919aab9e5834b51.js} +0 -0
  250. /fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-f9c0eac932188593.js → [id]-0a58aee2d1e7fa01.js} +0 -0
  251. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-5627d0d0668077f9.js → [id]-53fecfb9dd6a1e0c.js} +0 -0
  252. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-feca66ad5c5fe54a.js → add-template-76b01cec5fde10a9.js} +0 -0
  253. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-c1bd3e7adbe8d2d3.js → messaging-5094ffea13f32ed9.js} +0 -0
  254. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-64a322d01aae5ca7.js → ant-components-5c08e8447c45ce44.js} +0 -0
  255. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-8bca16a7726e7eb2.js → AntForm-06ad5f34585480aa.js} +0 -0
  256. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-b0f246fc3b67ebf7.js → FormikAntFormItem-6f071c2bc9446cb0.js} +0 -0
  257. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-1a0852b090bfc392.js → FormikControlled-efcc38c58991ac9e.js} +0 -0
  258. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-11f3de1b45e36583.js → FormikField-430ba5c979abfb7c.js} +0 -0
  259. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-1b73a1c2b6c6285f.js → forms-5c561880bf131afb.js} +0 -0
  260. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-e551a860ec727802.js → configure-d888a69a3bbe040e.js} +0 -0
  261. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-dd99183f93763ae4.js → [id]-d3d8e3d7583ec635.js} +0 -0
  262. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0bdbc1fcbf553b8f.js → add-property-1af10ed303815d46.js} +0 -0
  263. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-e959378bb32b6b73.js → properties-cebc0dc186be499a.js} +0 -0
  264. /fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-2a98bd257edd8f47.js → datamap-e130c0197362e8f3.js} +0 -0
  265. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-8f98a4895e74725e.js → alpha-5e1322de868d615e.js} +0 -0
  266. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-8155a35a62fdb5ae.js → about-241f95e372b65d0f.js} +0 -0
  267. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-668d74c041d74650.js → [purpose_id]-fc201657f4a782c7.js} +0 -0
  268. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-a989532a12c40dcf.js → consent-c2d39cba8396ef3a.js} +0 -0
  269. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-45bea76ff7eda3cb.js → custom-fields-d992103cc55901ae.js} +0 -0
  270. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-51333dbd21cb37c8.js → domain-records-41242f805599feda.js} +0 -0
  271. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-bde86e5f6c09da5a.js → domains-2e885f74c92f669c.js} +0 -0
  272. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-4f9a5cc8bea7725b.js → email-templates-ff112655ad5f41e5.js} +0 -0
  273. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-6946e78a5d43e654.js → locations-023e1895552817de.js} +0 -0
  274. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-55a10e01dffc8039.js → organization-ac403c0886b20e20.js} +0 -0
  275. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-102efd9199e87124.js → regulations-86062a18e081a52a.js} +0 -0
  276. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-f91f22cf96566ed4.js → test-datasets-7a3396ac819c7904.js} +0 -0
  277. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-d4a57ea18935dd70.js → [id]-8314a819837f5b2a.js} +0 -0
  278. /fides/ui-build/static/admin/_next/static/chunks/pages/{systems-648a0ff4920579ce.js → systems-21f423a7c417aa9d.js} +0 -0
  279. /fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-0b9d1a24188f65a9.js → taxonomy-6387fcc8cce872eb.js} +0 -0
  280. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-bc4eb541906781e6.js → new-a2524414e968f862.js} +0 -0
  281. /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-45bfa04e45a7d13f.js → user-management-173ac3a1ed2b05a6.js} +0 -0
  282. /fides/ui-build/static/admin/_next/static/chunks/{webpack-63a0c45b150a1037.js → webpack-ff0cd6bff75588da.js} +0 -0
@@ -1,8 +1,13 @@
1
- from typing import Any, Dict, List, Optional
1
+ from typing import List, Optional
2
2
 
3
3
  from loguru import logger
4
4
  from sqlalchemy import text
5
- from sqlalchemy.engine import Connection, Engine, create_engine # type: ignore
5
+ from sqlalchemy.engine import ( # type: ignore
6
+ Connection,
7
+ Engine,
8
+ LegacyCursorResult,
9
+ create_engine,
10
+ )
6
11
  from sqlalchemy.orm import Session
7
12
  from sqlalchemy.sql import Executable # type: ignore
8
13
  from sqlalchemy.sql.elements import TextClause
@@ -12,7 +17,6 @@ from fides.api.graph.execution import ExecutionNode
12
17
  from fides.api.models.connectionconfig import ConnectionTestStatus
13
18
  from fides.api.models.policy import Policy
14
19
  from fides.api.models.privacy_request import PrivacyRequest, RequestTask
15
- from fides.api.schemas.application_config import SqlDryRunMode
16
20
  from fides.api.schemas.connection_configuration.connection_secrets_bigquery import (
17
21
  BigQuerySchema,
18
22
  )
@@ -95,16 +99,6 @@ class BigQueryConnector(SQLConnector):
95
99
  logger.info(
96
100
  f"Executing {len(partition_clauses)} partition queries for node '{query_config.node.address}' in DSR execution"
97
101
  )
98
-
99
- if self.should_dry_run(SqlDryRunMode.access):
100
- for partition_clause in partition_clauses:
101
- existing_bind_params = stmt.compile().params
102
- partitioned_stmt = text(
103
- f"{stmt} AND ({text(partition_clause)})"
104
- ).params(existing_bind_params)
105
- logger.warning(f"SQL DRY RUN - Would execute SQL: {partitioned_stmt}")
106
- return []
107
-
108
102
  rows = []
109
103
  for partition_clause in partition_clauses:
110
104
  logger.debug(
@@ -141,39 +135,6 @@ class BigQueryConnector(SQLConnector):
141
135
  logger.exception(f"Error testing connection to remote BigQuery {str(e)}")
142
136
  raise ConnectionException(f"Connection error: {e}")
143
137
 
144
- def _execute_statements_with_sql_dry_run(
145
- self,
146
- statements: List[Executable],
147
- sql_dry_run_enabled: bool,
148
- client: Engine,
149
- ) -> int:
150
- """
151
- Execute SQL statements with sql_dry_run support.
152
-
153
- Args:
154
- statements: List of SQL statements to execute
155
- sql_dry_run_enabled: Whether sql_dry_run mode is enabled
156
- client: Database engine
157
-
158
- Returns:
159
- int: Number of affected rows (0 in sql_dry_run mode)
160
- """
161
- if not statements:
162
- return 0
163
-
164
- if sql_dry_run_enabled:
165
- for stmt in statements:
166
- logger.warning(f"SQL DRY RUN - Would execute SQL: {stmt}")
167
- return 0
168
-
169
- row_count = 0
170
- with client.connect() as connection:
171
- for stmt in statements:
172
- results = connection.execute(stmt)
173
- logger.debug(f"Affected {results.rowcount} rows")
174
- row_count += results.rowcount
175
- return row_count
176
-
177
138
  def mask_data(
178
139
  self,
179
140
  node: ExecutionNode,
@@ -181,31 +142,22 @@ class BigQueryConnector(SQLConnector):
181
142
  privacy_request: PrivacyRequest,
182
143
  request_task: RequestTask,
183
144
  rows: List[Row],
184
- input_data: Optional[Dict[str, List[Any]]] = None,
185
145
  ) -> int:
186
146
  """Execute a masking request. Returns the number of records updated or deleted"""
187
-
188
147
  query_config = self.query_config(node)
189
148
  update_or_delete_ct = 0
190
149
  client = self.client()
191
-
192
- if query_config.uses_delete_masking_strategy():
193
- delete_stmts = query_config.generate_delete(client, input_data or {})
194
- logger.debug(f"Generated {len(delete_stmts)} DELETE statements")
195
- update_or_delete_ct += self._execute_statements_with_sql_dry_run(
196
- delete_stmts, self.should_dry_run(SqlDryRunMode.erasure), client
197
- )
198
- else:
199
- for row in rows:
200
- update_or_delete_stmts: List[Executable] = query_config.generate_update(
201
- row, policy, privacy_request, client
202
- )
203
- logger.debug(
204
- f"Generated {len(update_or_delete_stmts)} UPDATE statements"
205
- )
206
- update_or_delete_ct += self._execute_statements_with_sql_dry_run(
207
- update_or_delete_stmts,
208
- self.should_dry_run(SqlDryRunMode.erasure),
209
- 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
210
154
  )
155
+ )
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
211
163
  return update_or_delete_ct
@@ -140,9 +140,8 @@ 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,
144
143
  ) -> int:
145
- """Execute a masking request for DynamoDB"""
144
+ """Execute a masking requestfor DynamoDB"""
146
145
 
147
146
  query_config = self.query_config(node)
148
147
  collection_name = node.address.collection
@@ -142,7 +142,6 @@ 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,
146
145
  ) -> int:
147
146
  """Execute an erasure request on remote fides"""
148
147
  identity_data = {
@@ -90,7 +90,6 @@ 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,
94
93
  ) -> int:
95
94
  """Currently not supported as webhooks are not called at the collection level"""
96
95
  raise NotImplementedError(
@@ -80,7 +80,6 @@ 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,
84
83
  ) -> int:
85
84
  """
86
85
  Manual tasks don't support erasure operations.
@@ -1,4 +1,4 @@
1
- from typing import Any, Dict, List, Optional
1
+ from typing import Any, Dict, List
2
2
 
3
3
  from fides.api.graph.execution import ExecutionNode
4
4
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionTestStatus
@@ -53,7 +53,6 @@ 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,
57
56
  ) -> None:
58
57
  """
59
58
  Not applicable for a manual webhook. Manual webhooks are not called as part of the traversal.
@@ -126,7 +126,6 @@ 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,
130
129
  ) -> int:
131
130
  """Execute a masking request"""
132
131
  query_config = self.query_config(node)
@@ -82,7 +82,6 @@ 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,
86
85
  ) -> int:
87
86
  """DSR execution not supported for Okta connector"""
88
87
  return 0
@@ -3,7 +3,7 @@ from typing import Any, Dict, List, Optional, Union, cast
3
3
  import pydash
4
4
  from fideslang.models import MaskingStrategies
5
5
  from loguru import logger
6
- from sqlalchemy import MetaData, Table, or_, text
6
+ from sqlalchemy import MetaData, Table, text
7
7
  from sqlalchemy.engine import Engine
8
8
  from sqlalchemy.sql import Delete, Update
9
9
  from sqlalchemy.sql.elements import ColumnElement, TextClause
@@ -125,7 +125,6 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
125
125
  policy: Policy,
126
126
  request: PrivacyRequest,
127
127
  client: Engine,
128
- input_data: Optional[Dict[str, List[Any]]] = None,
129
128
  ) -> Union[List[Update], List[Delete]]:
130
129
  """
131
130
  Generate a masking statement for BigQuery.
@@ -138,7 +137,7 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
138
137
  logger.info(
139
138
  f"Masking override detected for collection {node.address.value}: {masking_override.strategy.value}"
140
139
  )
141
- return self.generate_delete(client, input_data or {})
140
+ return self.generate_delete(row, client)
142
141
  return self.generate_update(row, policy, request, client)
143
142
 
144
143
  def generate_update(
@@ -199,16 +198,9 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
199
198
 
200
199
  table = Table(self._generate_table_name(), MetaData(bind=client), autoload=True)
201
200
  where_clauses: List[ColumnElement] = [
202
- table.c[k] == v for k, v in non_empty_reference_field_keys.items()
201
+ getattr(table.c, k) == v for k, v in non_empty_reference_field_keys.items()
203
202
  ]
204
203
 
205
- # Create update values using Column objects as keys to handle column names with spaces
206
- update_values = {}
207
- for column_name, value in final_update_map.items():
208
- # Use bracket notation to access columns with spaces in their names
209
- column = table.c[column_name]
210
- update_values[column] = value
211
-
212
204
  if self.partitioning:
213
205
  partition_clauses = self.get_partition_clauses()
214
206
  partitioned_queries = []
@@ -219,37 +211,34 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
219
211
  partitioned_queries.append(
220
212
  table.update()
221
213
  .where(*(where_clauses + [text(partition_clause)]))
222
- .values(update_values)
214
+ .values(**final_update_map)
223
215
  )
224
216
 
225
217
  return partitioned_queries
226
218
 
227
- return [table.update().where(*where_clauses).values(update_values)]
219
+ return [table.update().where(*where_clauses).values(**final_update_map)]
228
220
 
229
- def generate_delete(
230
- self,
231
- client: Engine,
232
- input_data: Optional[Dict[str, List[Any]]] = None,
233
- ) -> List[Delete]:
234
- """
235
- Returns a List of SQLAlchemy DELETE statements for BigQuery. Does not actually execute the delete statement.
221
+ def generate_delete(self, row: Row, client: Engine) -> List[Delete]:
222
+ """Returns a List of SQLAlchemy DELETE statements for BigQuery. Does not actually execute the delete statement.
236
223
 
237
224
  Used when a collection-level masking override is present and the masking strategy is DELETE.
238
225
 
239
226
  A List of multiple DELETE statements are returned for partitioned tables; for a non-partitioned table,
240
227
  a single DELETE statement is returned in a List for consistent typing.
241
- """
242
228
 
243
- if not input_data:
244
- logger.warning(
245
- "No input data provided for node '{}', skipping DELETE statement generation",
246
- self.node.address,
247
- )
248
- return []
229
+ TODO: DRY up this method and `generate_update` a bit
230
+ """
249
231
 
250
- filtered_data = self.node.typed_filtered_values(input_data)
232
+ non_empty_reference_field_keys: Dict[str, Field] = filter_nonempty_values(
233
+ {
234
+ fpath.string_path: fld.cast(row[fpath.string_path])
235
+ for fpath, fld in self.reference_field_paths.items()
236
+ if fpath.string_path in row
237
+ }
238
+ )
251
239
 
252
- if not filtered_data:
240
+ valid = len(non_empty_reference_field_keys) > 0
241
+ if not valid:
253
242
  logger.warning(
254
243
  "There is not enough data to generate a valid DELETE statement for {}",
255
244
  self.node.address,
@@ -257,17 +246,9 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
257
246
  return []
258
247
 
259
248
  table = Table(self._generate_table_name(), MetaData(bind=client), autoload=True)
260
-
261
- # Build individual reference clauses
262
- where_clauses: List[ColumnElement] = []
263
- for column_name, values in filtered_data.items():
264
- if len(values) == 1:
265
- where_clauses.append(table.c[column_name] == values[0])
266
- else:
267
- where_clauses.append(table.c[column_name].in_(values))
268
-
269
- # Combine reference clauses with OR instead of AND
270
- combined_reference_clause = or_(*where_clauses)
249
+ where_clauses: List[ColumnElement] = [
250
+ getattr(table.c, k) == v for k, v in non_empty_reference_field_keys.items()
251
+ ]
271
252
 
272
253
  if self.partitioning:
273
254
  partition_clauses = self.get_partition_clauses()
@@ -278,25 +259,12 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
278
259
 
279
260
  for partition_clause in partition_clauses:
280
261
  partitioned_queries.append(
281
- table.delete()
282
- .where(combined_reference_clause)
283
- .where(text(partition_clause))
262
+ table.delete().where(*(where_clauses + [text(partition_clause)]))
284
263
  )
285
264
 
286
265
  return partitioned_queries
287
266
 
288
- return [table.delete().where(combined_reference_clause)]
289
-
290
- def uses_delete_masking_strategy(self) -> bool:
291
- """Check if this collection uses DELETE masking strategy.
292
-
293
- Returns True if masking override is present and strategy is DELETE.
294
- """
295
- masking_override = self.node.collection.masking_strategy_override
296
- return (
297
- masking_override is not None
298
- and masking_override.strategy == MaskingStrategies.DELETE
299
- )
267
+ return [table.delete().where(*where_clauses)]
300
268
 
301
269
  def format_fields_for_query(
302
270
  self,
@@ -313,25 +281,6 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
313
281
  formatted_fields.append(field_path.levels[0])
314
282
  return formatted_fields
315
283
 
316
- def format_clause_for_query(
317
- self, string_path: str, operator: str, operand: str
318
- ) -> str:
319
- """
320
- Returns clauses with proper BigQuery backtick escaping for column names.
321
- Handles column names with spaces and nested fields (dot-separated) by escaping each part individually.
322
- """
323
- # For nested fields (containing dots), escape each part individually
324
- if "." in string_path:
325
- parts = string_path.split(".")
326
- escaped_field = ".".join(f"`{part}`" for part in parts)
327
- else:
328
- # For simple fields, wrap the entire name in backticks
329
- escaped_field = f"`{string_path}`"
330
-
331
- if operator == "IN":
332
- return f"{escaped_field} IN ({operand})"
333
- return f"{escaped_field} {operator} :{operand}"
334
-
335
284
  def generate_raw_query_without_tuples(
336
285
  self, field_list: List[str], filters: Dict[str, List[Any]]
337
286
  ) -> Optional[TextClause]:
@@ -341,35 +290,27 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
341
290
 
342
291
  This is an override of the base class method that supports nested fields for BigQuery.
343
292
 
344
- Examples with field names containing dots and spaces, notice these are replaced with underscores in the parameter bindings:
293
+ Examples with dot-delimited field names, notice the periods are replaced with underscores in the parameter bindings:
345
294
 
346
295
  1. Single value filter:
347
296
  field_list = ["id", "name", "email"]
348
297
  filters = {"user.id": [123]}
349
298
 
350
- Generates: SELECT id, name, email FROM `project_id.dataset_id.table_name` WHERE (`user`.`id` = :user_id)
299
+ Generates: SELECT id, name, email FROM `project_id.dataset_id.table_name` WHERE (user.id = :user_id)
351
300
  With parameter binding: user_id = 123
352
301
 
353
- 2. Field with spaces:
354
- field_list = ["id", "custom id", "email"]
355
- filters = {"custom id": ["abc123"]}
356
-
357
- Generates: SELECT id, `custom id`, email FROM `project_id.dataset_id.table_name` WHERE (`custom id` = :custom_id)
358
- With parameter binding: custom_id = "abc123"
359
-
360
- 3. Multiple value filter with nested field:
302
+ 2. Multiple value filter:
361
303
  field_list = ["id", "name", "email"]
362
- filters = {"contact_info.primary_email": ["active", "pending"]}
304
+ filters = {"user.status": ["active", "pending"]}
363
305
 
364
- Generates: SELECT id, name, email FROM `project_id.dataset_id.table_name` WHERE (`contact_info`.`primary_email` IN (:contact_info_primary_email_in_stmt_generated_0, :contact_info_primary_email_in_stmt_generated_1))
365
- With parameter bindings: contact_info_primary_email_in_stmt_generated_0 = "active", contact_info_primary_email_in_stmt_generated_1 = "pending"
306
+ Generates: SELECT id, name, email FROM `project_id.dataset_id.table_name` WHERE (user.status IN (:user_status_in_stmt_generated_0, :user_status_in_stmt_generated_1))
307
+ With parameter bindings: user_status_in_stmt_generated_0 = "active", user_status_in_stmt_generated_1 = "pending"
366
308
  """
367
309
  clauses = []
368
310
  query_data = {}
369
311
  for field_name, field_value in filters.items():
370
- # Replace dots and spaces with underscores in field names for parameter binding
371
- # SQLAlchemy parameter names cannot contain spaces or special characters
372
- field_binding_name = field_name.replace(".", "_").replace(" ", "_")
312
+ # Replace dots with underscores in field names for parameter binding
313
+ field_binding_name = field_name.replace(".", "_")
373
314
  data = set(field_value)
374
315
  if len(data) == 1:
375
316
  clauses.append(
@@ -392,7 +333,7 @@ class BigQueryQueryConfig(QueryStringWithoutTuplesOverrideQueryConfig):
392
333
  clauses.append(self.format_clause_for_query(field_name, "IN", operand))
393
334
 
394
335
  if len(clauses) > 0:
395
- formatted_fields = ", ".join([f"`{field}`" for field in field_list])
336
+ formatted_fields = ", ".join(field_list)
396
337
  query_str = self.get_formatted_query_string(formatted_fields, clauses)
397
338
  return text(query_str).params(query_data)
398
339
 
@@ -158,7 +158,6 @@ class RDSMySQLConnector(RDSConnectorMixin, SQLConnector):
158
158
  privacy_request: PrivacyRequest,
159
159
  request_task: RequestTask,
160
160
  rows: List[Row],
161
- input_data: Optional[Dict[str, List[Any]]] = None,
162
161
  ) -> int:
163
162
  """DSR execution not yet supported for RDS MySQL"""
164
163
  return 0
@@ -147,7 +147,6 @@ class RDSPostgresConnector(RDSConnectorMixin, SQLConnector):
147
147
  privacy_request: PrivacyRequest,
148
148
  request_task: RequestTask,
149
149
  rows: List[Row],
150
- input_data: Optional[Dict[str, List[Any]]] = None,
151
150
  ) -> int:
152
151
  """DSR execution not yet supported for RDS Postgres"""
153
152
  return 0
@@ -66,7 +66,6 @@ class S3Connector(BaseConnector):
66
66
  privacy_request: PrivacyRequest,
67
67
  request_task: RequestTask,
68
68
  rows: List[Row],
69
- input_data: Optional[Dict[str, List[Any]]] = None,
70
69
  ) -> int:
71
70
  """DSR execution not yet supported for S3"""
72
71
  return 0
@@ -517,7 +517,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
517
517
  privacy_request: PrivacyRequest,
518
518
  request_task: RequestTask,
519
519
  rows: List[Row],
520
- input_data: Optional[Dict[str, List[Any]]] = None,
521
520
  ) -> int:
522
521
  """Execute a masking request. Return the number of rows that have been updated."""
523
522
  self.set_privacy_request_state(privacy_request, node, request_task)
@@ -150,7 +150,6 @@ class ScyllaConnector(BaseConnector[Cluster]):
150
150
  privacy_request: PrivacyRequest,
151
151
  request_task: RequestTask,
152
152
  rows: List[Row],
153
- input_data: Optional[Dict[str, List[Any]]] = None,
154
153
  ) -> int:
155
154
  """Execute a masking request"""
156
155
  query_config = self.query_config(node)
@@ -27,13 +27,11 @@ from fides.api.graph.execution import ExecutionNode
27
27
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionTestStatus
28
28
  from fides.api.models.policy import Policy
29
29
  from fides.api.models.privacy_request import PrivacyRequest, RequestTask
30
- from fides.api.schemas.application_config import SqlDryRunMode
31
30
  from fides.api.schemas.connection_configuration import ConnectionConfigSecretsSchema
32
31
  from fides.api.service.connectors.base_connector import BaseConnector
33
32
  from fides.api.service.connectors.query_configs.query_config import SQLQueryConfig
34
33
  from fides.api.util.collection_util import Row
35
34
  from fides.config import get_config
36
- from fides.config.config_proxy import ConfigProxy
37
35
 
38
36
  from fides.api.models.sql_models import ( # type: ignore[attr-defined] # isort: skip
39
37
  Dataset as CtlDataset,
@@ -60,23 +58,6 @@ class SQLConnector(BaseConnector[Engine]):
60
58
  )
61
59
  self.ssh_server: sshtunnel._ForwardServer = None
62
60
 
63
- def should_dry_run(self, mode_to_check: SqlDryRunMode) -> bool:
64
- """
65
- Check if SQL dry run is enabled for the specified mode.
66
-
67
- Args:
68
- mode_to_check: The SqlDryRunMode to check for
69
-
70
- Returns:
71
- bool: True if the current mode matches the mode to check
72
- """
73
- from fides.api.api.deps import get_autoclose_db_session as get_db
74
-
75
- with get_db() as db:
76
- config_proxy = ConfigProxy(db)
77
- current_mode = getattr(config_proxy.execution, "sql_dry_run", None)
78
- return current_mode == mode_to_check
79
-
80
61
  @staticmethod
81
62
  def cursor_result_to_rows(results: CursorResult) -> List[Row]:
82
63
  """Convert SQLAlchemy results to a list of dictionaries"""
@@ -159,10 +140,6 @@ class SQLConnector(BaseConnector[Engine]):
159
140
  if query is None:
160
141
  return []
161
142
 
162
- if self.should_dry_run(SqlDryRunMode.access):
163
- logger.warning(f"SQL DRY RUN - Would execute SQL: {query}")
164
- return []
165
-
166
143
  with client.connect() as connection:
167
144
  self.set_schema(connection)
168
145
  results = connection.execute(query)
@@ -183,10 +160,6 @@ class SQLConnector(BaseConnector[Engine]):
183
160
  if stmt is None:
184
161
  return []
185
162
 
186
- if self.should_dry_run(SqlDryRunMode.access):
187
- logger.warning(f"SQL DRY RUN - Would execute SQL: {stmt}")
188
- return []
189
-
190
163
  logger.info("Starting data retrieval for {}", node.address)
191
164
  with client.connect() as connection:
192
165
  self.set_schema(connection)
@@ -205,25 +178,20 @@ class SQLConnector(BaseConnector[Engine]):
205
178
  privacy_request: PrivacyRequest,
206
179
  request_task: RequestTask,
207
180
  rows: List[Row],
208
- input_data: Optional[Dict[str, List[Any]]] = None,
209
181
  ) -> int:
210
182
  """Execute a masking request. Returns the number of records masked"""
211
183
  query_config = self.query_config(node)
212
184
  update_ct = 0
213
185
  client = self.client()
214
-
215
186
  for row in rows:
216
187
  update_stmt: Optional[TextClause] = query_config.generate_update_stmt(
217
188
  row, policy, privacy_request
218
189
  )
219
190
  if update_stmt is not None:
220
- if self.should_dry_run(SqlDryRunMode.erasure):
221
- logger.warning(f"SQL DRY RUN - Would execute SQL: {update_stmt}")
222
- else:
223
- with client.connect() as connection:
224
- self.set_schema(connection)
225
- results: LegacyCursorResult = connection.execute(update_stmt)
226
- update_ct = update_ct + results.rowcount
191
+ with client.connect() as connection:
192
+ self.set_schema(connection)
193
+ results: LegacyCursorResult = connection.execute(update_stmt)
194
+ update_ct = update_ct + results.rowcount
227
195
  return update_ct
228
196
 
229
197
  def close(self) -> None:
@@ -75,7 +75,6 @@ class WebsiteConnector(BaseConnector):
75
75
  privacy_request: PrivacyRequest,
76
76
  request_task: RequestTask,
77
77
  rows: List[Row],
78
- input_data: Optional[Dict[str, List[Any]]] = None,
79
78
  ) -> int:
80
79
  """DSR execution not supported for website connector"""
81
80
  return 0