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.
- {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/METADATA +1 -1
- {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/RECORD +259 -270
- fides/_version.py +3 -3
- fides/api/api/v1/endpoints/dataset_config_endpoints.py +5 -13
- fides/api/api/v1/endpoints/drp_endpoints.py +1 -7
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +1 -44
- fides/api/api/v1/endpoints/user_endpoints.py +7 -83
- fides/api/app_setup.py +2 -3
- fides/api/common_exceptions.py +0 -4
- fides/api/db/base.py +0 -1
- fides/api/db/database.py +1 -1
- fides/api/graph/execution.py +0 -30
- fides/api/graph/traversal.py +1 -1
- fides/api/models/{manual_task/manual_task.py → manual_task.py} +0 -10
- fides/api/models/policy.py +0 -23
- fides/api/models/privacy_request/execution_log.py +0 -1
- fides/api/models/privacy_request/privacy_request.py +13 -31
- fides/api/oauth/roles.py +0 -2
- fides/api/schemas/application_config.py +1 -11
- fides/api/schemas/masking/masking_secrets.py +1 -1
- fides/api/schemas/policy.py +0 -1
- fides/api/schemas/privacy_request.py +0 -5
- fides/api/service/connectors/base_connector.py +0 -1
- fides/api/service/connectors/bigquery_connector.py +19 -67
- fides/api/service/connectors/dynamodb_connector.py +1 -2
- fides/api/service/connectors/fides_connector.py +0 -1
- fides/api/service/connectors/http_connector.py +0 -1
- fides/api/service/connectors/manual_task_connector.py +0 -1
- fides/api/service/connectors/manual_webhook_connector.py +1 -2
- fides/api/service/connectors/mongodb_connector.py +0 -1
- fides/api/service/connectors/okta_connector.py +0 -1
- fides/api/service/connectors/query_configs/bigquery_query_config.py +32 -91
- fides/api/service/connectors/rds_mysql_connector.py +0 -1
- fides/api/service/connectors/rds_postgres_connector.py +0 -1
- fides/api/service/connectors/s3_connector.py +0 -1
- fides/api/service/connectors/saas_connector.py +0 -1
- fides/api/service/connectors/scylla_connector.py +0 -1
- fides/api/service/connectors/sql_connector.py +4 -36
- fides/api/service/connectors/website_connector.py +0 -1
- fides/api/service/privacy_request/request_runner_service.py +53 -142
- fides/api/service/privacy_request/request_service.py +22 -1
- fides/api/task/create_request_tasks.py +1 -1
- fides/api/task/deprecated_graph_task.py +6 -24
- fides/api/task/execute_request_tasks.py +12 -89
- fides/api/task/filter_results.py +1 -1
- fides/api/task/graph_task.py +3 -38
- fides/api/task/manual/manual_task_graph_task.py +126 -118
- fides/api/task/manual/manual_task_utils.py +105 -52
- fides/api/util/cache.py +0 -5
- fides/api/util/encryption/secrets_util.py +18 -48
- fides/common/api/scope_registry.py +0 -3
- fides/common/api/v1/urn_registry.py +1 -1
- fides/config/execution_settings.py +0 -4
- fides/config/utils.py +0 -1
- fides/service/privacy_request/privacy_request_service.py +1 -6
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/8108ANFxs99VY7KZ_Xev2/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1817-e601e737e3cc7a0e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{203-4e777c324a01dbec.js → 203-5a663f465ba26bb4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/431-34f0b91c26f8d9ab.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6780-e3d40aa17a4bf2e9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-f2c3d287bac00395.js → _app-39ccb07327c2c5d5.js} +56 -56
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2265ecb899d45fbc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-5d522637871ac6c8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-f10a7dcf7541c865.js → integrations-e2d5d7e2a5265e68.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-05616e2ae20ff4f8.js → table-migration-69ad86b7a8a9a115.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-32600543eb7b584f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-10ce53ea356f8bad.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-5501bbb129fee9c4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-cbe4c8f9096b6543.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-ff5738706da07801.js +1 -0
- fides/ui-build/static/admin/_next/static/css/2cadb5f62dcd7c2b.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{23cf870196941c9a.css → 5bfb2473e5701527.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/{8bc1833f1fa53ff0.css → 94965f224bc991e9.css} +1 -1
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
- fides/ui-build/static/admin/lib/fides.js +3 -3
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/poc/table-migration.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/settings/about/alpha.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/api/alembic/migrations/versions/7e9a2b52f498_adding_masking_secrets.py +0 -60
- fides/api/alembic/migrations/versions/a7065df4dcf1_add_finalized_fields_to_privacy_request.py +0 -65
- fides/api/alembic/migrations/versions/d0031087eacb_create_manualtaskconditionaldependency_.py +0 -106
- fides/api/models/manual_task/__init__.py +0 -2
- fides/api/models/manual_task/conditional_dependency.py +0 -144
- fides/api/models/masking_secret.py +0 -72
- fides/api/task/conditional_dependencies/__init__.py +0 -0
- fides/api/task/conditional_dependencies/evaluator.py +0 -109
- fides/api/task/conditional_dependencies/schemas.py +0 -54
- fides/api/task/manual/manual_task_address.py +0 -46
- fides/ui-build/static/admin/_next/static/EACyrT3Bb5qN9POVQHTCB/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-6f35f58cd08b04ae.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-ade3e312fac3430b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6780-a00c87739acc004d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8237-55049f8f5fd5e058.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-71579a199158952e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-7d3115059503b904.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-c73497fc333c324d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-7498d1d5974a78b0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-2d3a2d967767a131.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-6a9068df48bdee05.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-fe58cebba358119d.js +0 -1
- fides/ui-build/static/admin/_next/static/css/79e296c724c1568c.css +0 -1
- {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.66.2b2.dist-info → ethyca_fides-2.66.2rc0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{EACyrT3Bb5qN9POVQHTCB → 8108ANFxs99VY7KZ_Xev2}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-86f1547ac40a5cdf.js → 2921-455e6357b74d2f76.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3450-1cc2bb07ed142203.js → 3450-0ba194991d0cca88.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3855-e2fa6db53d32c3de.js → 3855-e172870d3e21b0dd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3872-84b7e380b88b4454.js → 3872-46cebf7ec1b31a2b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3923-13a6b4da2d51bf8f.js → 3923-6cc911dafccc5f63.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{401-3cc1fee61494e3bd.js → 401-1b529d5800aa1f3a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{409-45a125437261580c.js → 409-a257e14acebcd73b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4121-f50675521dfee6eb.js → 4121-2bc09fc4ddbfe5cb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4230-840c287045c88b34.js → 4230-60100f7ef3ddcde1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4608-a8e3100e2806dbff.js → 4608-bbb7bf511a05c3c2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5309-1172322bf91b5d57.js → 5309-b2c4803370634ff8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5574-9312f97b637d9ee2.js → 5574-b13021775a15bfd2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6084-5d7598b7bcb548cf.js → 6084-7178ff6ea6822475.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6662-efb2cf74641647f2.js → 6662-507be5d46e5b719b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6853-4f8bf6558f8c6a46.js → 6853-2ad3e08fe6f9f5f2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6882-586b84aeb02d5830.js → 6882-6af16fef26c21e06.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6954-34e062e4bffc7e71.js → 6954-bb875d9ac89f6030.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7476-d206c11823c91088.js → 7476-281ee9a8286556f3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7630-b1c93688013ef013.js → 7630-9aac73191ed5ed13.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{787-cbe2d0bfb513d90a.js → 787-fb41002f797eb2df.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{79-3db1941d274f40c7.js → 79-7e87aff851423d4a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{796-98d4bd68909fbe1e.js → 796-329a5f823ec258a5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9046-c8233981762585b4.js → 9046-5c4c22c375de25b1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9226-72ad691ca57b83ef.js → 9226-746771d47dff6266.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9826-3c578665c6d3b21d.js → 9826-111aaee8bd8dbd09.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9951-595d0f1588215081.js → 9951-9b753ad7c3f51bdf.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-2d803dab6a00f353.js → 404-aece2c920ea14514.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-acb59f8b5e97512a.js → manual-98777246bec9dc2a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-8ff7f37913ad736a.js → multiple-dc75dc6e37e52f05.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-0943633a8e422695.js → add-systems-a71c0aff4e0e6535.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-d00c9034cdeb0236.js → add-vendors-24d226b5a8de5c74.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-0e1ca0f4c8e7f4da.js → configure-6a8ef51138ac926a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-fc3a011154a2e1de.js → [id]-1edf582ba3cd3bbb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-09d4408014bcfe1c.js → privacy-experience-685771e5f7196d87.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-d67542783ef5ddac.js → [id]-6ccedc70dc447089.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-3f20e8a316bb3d5b.js → new-944bca1cc57985b5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-23e9dcd4590312d2.js → privacy-notices-84f4bd14ce8673bc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-057cad65e7414a44.js → properties-6f86ab63a08a6528.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-8f891957c8944137.js → reporting-afdbd4665657cfa1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-e17c56eec8d91371.js → consent-73d3cbf68f7c3a31.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-99c9092d65c94807.js → [resourceUrn]-11d52f1570759c4d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-80a6cc8e8573514a.js → [projectUrn]-6ba9e160dae64695.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-774fecea22ba8852.js → projects-32eac8bbd217615a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-f6bd6aff389cb9fe.js → [resourceUrn]-b83afa5565d0c84e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-6c3714ee97a718c1.js → resources-7648bbd4f6711e4d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-8a7f9285da66b965.js → data-catalog-6f630d42ac9fb6b4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-85e140788e251272.js → action-center-9ddb52ebb7ac4c71.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-5af9381f02b2aff6.js → activity-9aa744d56cdacb0d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-31e6c54794a9883e.js → [resourceUrn]-393e20924c83373e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-2822a423a7ad0550.js → detection-8733807dad4bc96e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6421ce247549c5d6.js → [resourceUrn]-14bd7500362ff224.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-3eac407ac5181a3c.js → discovery-9e7dfd5a6acc2e8f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-d2b275d83089820d.js → datamap-7674b97d655c193b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-1c98bd0959d9570a.js → [...subfieldNames]-c0d2bfd465df20e0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-e548cabda7da32c9.js → [collectionName]-28280a8a39a6e37c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-a8e8b5f4ee7af86c.js → [datasetId]-006b695e5af5ef24.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-513c862c3a707735.js → new-82fb246d87e58ebd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-747b7a13289f1cd7.js → dataset-20165c31ab1bc7cf.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-3d22525b3c327b2e.js → [id]-b4a6bcc87d126840.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-d2cad97495e86adb.js → new-f95d7b0bbfc58f5a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-0f29b47402292070.js → datastore-connection-c391c6fad56eec48.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{index-12ac3e317fc86f21.js → index-1919aab9e5834b51.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-f9c0eac932188593.js → [id]-0a58aee2d1e7fa01.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-5627d0d0668077f9.js → [id]-53fecfb9dd6a1e0c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-feca66ad5c5fe54a.js → add-template-76b01cec5fde10a9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-c1bd3e7adbe8d2d3.js → messaging-5094ffea13f32ed9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-64a322d01aae5ca7.js → ant-components-5c08e8447c45ce44.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-8bca16a7726e7eb2.js → AntForm-06ad5f34585480aa.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-b0f246fc3b67ebf7.js → FormikAntFormItem-6f071c2bc9446cb0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-1a0852b090bfc392.js → FormikControlled-efcc38c58991ac9e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-11f3de1b45e36583.js → FormikField-430ba5c979abfb7c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-1b73a1c2b6c6285f.js → forms-5c561880bf131afb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-e551a860ec727802.js → configure-d888a69a3bbe040e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-dd99183f93763ae4.js → [id]-d3d8e3d7583ec635.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0bdbc1fcbf553b8f.js → add-property-1af10ed303815d46.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-e959378bb32b6b73.js → properties-cebc0dc186be499a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-2a98bd257edd8f47.js → datamap-e130c0197362e8f3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-8f98a4895e74725e.js → alpha-5e1322de868d615e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-8155a35a62fdb5ae.js → about-241f95e372b65d0f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-668d74c041d74650.js → [purpose_id]-fc201657f4a782c7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-a989532a12c40dcf.js → consent-c2d39cba8396ef3a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-45bea76ff7eda3cb.js → custom-fields-d992103cc55901ae.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-51333dbd21cb37c8.js → domain-records-41242f805599feda.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-bde86e5f6c09da5a.js → domains-2e885f74c92f669c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-4f9a5cc8bea7725b.js → email-templates-ff112655ad5f41e5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-6946e78a5d43e654.js → locations-023e1895552817de.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-55a10e01dffc8039.js → organization-ac403c0886b20e20.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-102efd9199e87124.js → regulations-86062a18e081a52a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-f91f22cf96566ed4.js → test-datasets-7a3396ac819c7904.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-d4a57ea18935dd70.js → [id]-8314a819837f5b2a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{systems-648a0ff4920579ce.js → systems-21f423a7c417aa9d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-0b9d1a24188f65a9.js → taxonomy-6387fcc8cce872eb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-bc4eb541906781e6.js → new-a2524414e968f862.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-45bfa04e45a7d13f.js → user-management-173ac3a1ed2b05a6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{webpack-63a0c45b150a1037.js → webpack-ff0cd6bff75588da.js} +0 -0
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
from typing import
|
|
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
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
|
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(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Any, Dict, List
|
|
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)
|
|
@@ -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,
|
|
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(
|
|
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
|
|
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(
|
|
214
|
+
.values(**final_update_map)
|
|
223
215
|
)
|
|
224
216
|
|
|
225
217
|
return partitioned_queries
|
|
226
218
|
|
|
227
|
-
return [table.update().where(*where_clauses).values(
|
|
219
|
+
return [table.update().where(*where_clauses).values(**final_update_map)]
|
|
228
220
|
|
|
229
|
-
def generate_delete(
|
|
230
|
-
|
|
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
|
-
|
|
244
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
262
|
-
|
|
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(
|
|
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
|
|
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 (
|
|
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.
|
|
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 = {"
|
|
304
|
+
filters = {"user.status": ["active", "pending"]}
|
|
363
305
|
|
|
364
|
-
Generates: SELECT id, name, email FROM `project_id.dataset_id.table_name` WHERE (
|
|
365
|
-
With parameter bindings:
|
|
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
|
|
371
|
-
|
|
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(
|
|
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
|
|
@@ -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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|