ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.74.0rc1__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.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/METADATA +3 -2
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/RECORD +377 -327
- fides/_version.py +3 -3
- fides/api/alembic/alembic.ini +5 -1
- fides/api/alembic/migrations/env.py +7 -1
- fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
- fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
- fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
- fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
- fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
- fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
- fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
- fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
- fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
- fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
- fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
- fides/api/api/v1/endpoints/generic_overrides.py +75 -6
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +60 -6
- fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
- fides/api/api/v1/endpoints/system.py +11 -43
- fides/api/api/v1/endpoints/user_endpoints.py +8 -1
- fides/api/app_setup.py +1 -3
- fides/api/common_exceptions.py +8 -0
- fides/api/db/base.py +2 -0
- fides/api/db/database.py +257 -2
- fides/api/email_templates/get_email_template.py +3 -0
- fides/api/email_templates/template_names.py +1 -0
- fides/api/email_templates/templates/manual_task_digest.html +316 -0
- fides/api/main.py +2 -2
- fides/api/models/attachment.py +1 -0
- fides/api/models/detection_discovery/__init__.py +2 -0
- fides/api/models/detection_discovery/core.py +10 -0
- fides/api/models/detection_discovery/monitor_task.py +1 -0
- fides/api/models/detection_discovery/staged_resource_error.py +25 -0
- fides/api/models/digest/__init__.py +2 -0
- fides/api/models/digest/digest_config.py +10 -1
- fides/api/models/digest/digest_execution.py +142 -0
- fides/api/models/event_audit.py +17 -0
- fides/api/models/identity_definition.py +65 -0
- fides/api/models/messaging_template.py +7 -0
- fides/api/models/privacy_experience.py +11 -0
- fides/api/models/privacy_preference.py +2 -0
- fides/api/models/privacy_request/duplicate_group.py +84 -0
- fides/api/models/privacy_request/privacy_request.py +56 -8
- fides/api/models/privacy_request/request_task.py +98 -1
- fides/api/models/sql_models.py +3 -0
- fides/api/models/taxonomy.py +14 -4
- fides/api/models/v3/__init__.py +0 -0
- fides/api/models/v3/privacy_preferences.py +85 -0
- fides/api/models/worker_task.py +8 -0
- fides/api/schemas/application_config.py +28 -0
- fides/api/schemas/connection_configuration/connection_config.py +1 -30
- fides/api/schemas/messaging/messaging.py +15 -0
- fides/api/schemas/privacy_request.py +17 -3
- fides/api/schemas/saas/async_polling_configuration.py +81 -0
- fides/api/schemas/saas/saas_config.py +10 -3
- fides/api/schemas/saas/strategy_configuration.py +0 -12
- fides/api/schemas/taxonomy_extensions.py +8 -0
- fides/api/service/async_dsr/handlers/__init__.py +0 -0
- fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
- fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
- fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
- fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
- fides/api/service/async_dsr/strategies/__init__.py +0 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +686 -0
- fides/api/service/async_dsr/utils.py +130 -0
- fides/api/service/connectors/bigquery_connector.py +34 -16
- fides/api/service/connectors/fides/fides_client.py +63 -1
- fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
- fides/api/service/connectors/saas/connector_registry_service.py +1 -138
- fides/api/service/connectors/saas_connector.py +116 -94
- fides/api/service/connectors/sql_connector.py +14 -4
- fides/api/service/deps.py +8 -0
- fides/api/service/messaging/message_dispatch_service.py +38 -1
- fides/api/service/privacy_request/attachment_handling.py +9 -2
- fides/api/service/privacy_request/duplication_detection.py +424 -0
- fides/api/service/privacy_request/request_runner_service.py +46 -84
- fides/api/service/privacy_request/request_service.py +47 -74
- fides/api/service/saas_request/saas_request_override_factory.py +71 -1
- fides/api/task/execute_request_tasks.py +17 -9
- fides/api/task/filter_results.py +35 -2
- fides/api/task/graph_task.py +37 -8
- fides/api/tasks/__init__.py +0 -1
- fides/api/util/connection_util.py +99 -215
- fides/api/util/event_audit_util.py +230 -0
- fides/api/util/logger_context_utils.py +3 -1
- fides/api/util/masking_util.py +31 -0
- fides/api/util/memory_watchdog.py +118 -0
- fides/api/util/saas_config_updater.py +66 -0
- fides/api/util/saas_util.py +28 -1
- fides/common/api/scope_registry.py +0 -7
- fides/common/api/v1/urn_registry.py +2 -0
- fides/config/__init__.py +10 -1
- fides/config/celery_settings.py +42 -0
- fides/config/config_proxy.py +10 -0
- fides/config/duplicate_detection_settings.py +31 -0
- fides/config/execution_settings.py +7 -3
- fides/config/utils.py +5 -0
- fides/data/language/languages.yml +2 -0
- fides/service/connection/__init__.py +0 -0
- fides/service/connection/connection_service.py +651 -0
- fides/service/event_audit_service.py +16 -22
- fides/service/privacy_request/privacy_request_service.py +162 -43
- fides/service/taxonomy/handlers/legacy_handler.py +3 -3
- fides/service/taxonomy/taxonomy_service.py +15 -15
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/FZTEUgamBvOhgPWce135w/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-0da062111df309bf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-508b16628e8eb225.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1840-5bbe6d878ed73fb4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.afe8cad52f904fcf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-fe1a06d82c0413f1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2397-40b8db1cb2f23e2a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2921-b10bbc3a9104933b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3377-eb5cd82b3ee6ab0c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3655-93ecd09f1cb9dbef.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-6db05a35ae806825.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-44255a63d6d80ff5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/401-fe8db8b5d8f600de.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/4277-13bcf4516326d474.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4496-bed72bd5639075be.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4817-d29f40d4ce729f37.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-b2ac9fecc00b67e7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-4672eae0656430f9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-8dedd1ca94fbba54.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/549-6e2442db533a711e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5643-55d758444a8d7162.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5724-1e40975cefa405f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-6055edba275155ca.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-82e2df433fe5ba85.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6344-3e21444374f8059f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6362-12e3fd23130ccf15.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6372-a8d0f08dac1ebd0e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6780-3db5133c1f4c6f1e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6853-1adbdf6418ec3d62.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-aa0c60ee1092be8e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7059-12be23a345a94c1e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7079-6e6efc3396ff1ebb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7218-d297a4a06f924b09.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7245-686665c197b58e68.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-a43c046c24de37cc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-c654c61ba98d8c74.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7654-716cf37a020b3d11.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-e83ace3c6ab99ac7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/8212-b9e8295ca883c9f8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8939-4925751c57c51f87.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9046-e4daf28840a69fd6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-550bd50d538c5f79.js} +3 -3
- fides/ui-build/static/admin/_next/static/chunks/9330-e519adec48222d45.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9341-bfc0e59bcc56c604.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.7d029a5383595b69.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9682-da69ac5d06f281da.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-657652d55936a8c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9965-56c5e4fc9cd3b3a5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-d079b8bf35250874.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-e64fd8510033a27c.js} +63 -63
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ddd9d7d40847fc28.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-b4d18c1f4d414f5f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d451bc8932330141.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-c24663cd5dec57db.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-d93418688bd258eb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-9b1f2b1c06968166.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-115a085e5d42de45.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d9b7b311195df29e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-3de34624829cbce8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-dc95e7ed278d1a29.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cdfc9bb19f47c709.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-0b995b01dc4dbd1f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-e3ad3a55624e302a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-b37ed76849330edd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-dd82729296dee5c5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-49e5477eb1a11b92.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-dfc1ead4a12c9ffa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-8442eb219958ac7e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-feda358d1801c18d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d16acb6fc07aad46.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-c51a1e98c45d231a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-bcfe38eebca30f8c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-f66d0655897c4400.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6f1e012cd641da19.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-581d6248fcf98d17.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-ddc1c1641e1e9430.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-2b48f7e524743b2b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-862b67418600251e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-0ffec855f5df262c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a030ab8c2e2b0db.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-6cb66f649b8ca4bf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-0b008dad90b00aaa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-5566edf9a9d1be2d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4ca1f485b6e9e02.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-85dee7e81dc4bafb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-e905e018a2cab35d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-912723bc86299b1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f1f0affc18327033.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-692d27dbe9392c9f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-1b94e2d769a182b2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adfe6c5ac5b703d0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-f9be7080ebbb7445.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-caaa8602a1d449b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-9b106b1d2d93985b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-6a1ded8cdde836c4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-f94e3accf9507ebf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-5e83220ff1f2a250.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-a03cbd698a23e5b3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-3cde574b3c8447c0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-0448bb4ae8536c58.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-1621a4b87c432117.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications-4ea28f6b1dd63642.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-e02516d9fd314528.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-fec08bea801b4918.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d911e5fbf5a4a888.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-91b1adcac6a57b2d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-de309d8813b1ebfb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-f2943c1309062284.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-03eda417711ae909.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1fe486f3af832c80.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-ea6f78fa8b2d3f6c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-bda7b474493e7128.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-2c0ec8fed16c20ae.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-30d298a47e85709f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-438084cca0d0f10d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-17fd44d98f5bd5b6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-baf77d34a3b3bece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-8c80391025ca7339.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7c19810858b708cc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee8820fe0fa14c77.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{[id]-bd1042a0e9be6aff.js → [id]-8eb862182f19a6c2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{new-469ad83c8cfa1290.js → new-37c29ef618e9fe3c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-1db425150dcb1b6b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-e334b43fa5c5b1e6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-9d18eb5c38d85522.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-cb937ed7c4b1e5a8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-835281251f0785cd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-7fd050c92866938c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-59ea66130fca0d05.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-b0fe1051d908f366.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f108bf5015144d2f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-0e7c7228d01290ea.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-adc13b542e10a37d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-23dd250da26511c5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-aed30fb22ae7c9ec.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-6b88ca3e02ee67c9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-6f97ebe373e7ef6b.js +1 -0
- fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
- fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
- fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
- fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
- fides/ui-build/static/admin/_next/static/css/65ae906f224cd8ae.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
- fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
- fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
- fides/ui-build/static/admin/_next/static/css/d5701118537cbdd2.css +1 -0
- fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
- 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/datastore/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
- 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/new-privacy-requests.html +1 -0
- fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
- fides/ui-build/static/admin/notifications/digests/new.html +1 -0
- fides/ui-build/static/admin/notifications/digests.html +1 -0
- fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
- fides/ui-build/static/admin/notifications/providers/new.html +1 -0
- fides/ui-build/static/admin/notifications/providers.html +1 -0
- fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
- fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
- fides/ui-build/static/admin/notifications/templates.html +1 -0
- fides/ui-build/static/admin/notifications.html +1 -0
- 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/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/sandbox/privacy-notices.html +1 -0
- 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/[id].html +1 -1
- fides/ui-build/static/admin/settings/custom-fields/new.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/privacy-requests.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/service/async_dsr/async_dsr_service.py +0 -195
- fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
- fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
- fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
- fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
- fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2921-66f65496c3a09316.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-ffe4e8436e1eceb9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5185-51eaa78e3ed6bfb7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5643-10a36584c399526c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-7004a8c420b1ca02.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-4b24e1731c1cc3b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-d0d3a0fe3f95e971.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-2ca59996860a33c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-92182be6603c2842.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-ab54b19609bff325.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-e8d2140787045acd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-e3f93462a08251bf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-b5f7d6afdecd013d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-248ad9f65a872442.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-aedb66a62042b10a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-018df38b7cd77fdb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6ca9099d03aab817.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0f2c90786ea005a4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-200b51a725f8b2d1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-f3e6e74e0efb005c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a3275554ffe8e640.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-77239269acc2d31a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-8bf1821722b082e9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-2deb6becece69d46.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +0 -1
- fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
- fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
- fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
- fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
- fides/ui-build/static/admin/messaging/[id].html +0 -1
- fides/ui-build/static/admin/messaging/add-template.html +0 -1
- fides/ui-build/static/admin/messaging.html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers/[key].html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers/new.html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers.html +0 -1
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → FZTEUgamBvOhgPWce135w}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-7dce2916cc589c54.js} +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pure utility functions for async DSR operations.
|
|
3
|
+
|
|
4
|
+
This module contains utility functions with no business logic dependencies.
|
|
5
|
+
These are helper functions that can be used across the async DSR system.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from enum import Enum
|
|
9
|
+
|
|
10
|
+
# Type checking imports
|
|
11
|
+
from typing import TYPE_CHECKING, List, cast
|
|
12
|
+
|
|
13
|
+
from loguru import logger
|
|
14
|
+
from sqlalchemy.orm import Session
|
|
15
|
+
|
|
16
|
+
from fides.api.common_exceptions import PrivacyRequestError
|
|
17
|
+
from fides.api.models.connectionconfig import ConnectionConfig
|
|
18
|
+
from fides.api.models.datasetconfig import DatasetConfig
|
|
19
|
+
from fides.api.models.privacy_request.request_task import AsyncTaskType, RequestTask
|
|
20
|
+
from fides.api.schemas.saas.saas_config import SaaSRequest
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from fides.api.service.connectors.query_configs.saas_query_config import (
|
|
24
|
+
SaaSQueryConfig,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def has_async_requests(query_config: "SaaSQueryConfig") -> bool:
|
|
29
|
+
"""Check if any read/update/delete requests have async configuration"""
|
|
30
|
+
all_requests: List[SaaSRequest] = cast(
|
|
31
|
+
List[SaaSRequest], query_config.get_read_requests_by_identity()
|
|
32
|
+
)
|
|
33
|
+
masking_request = query_config.get_masking_request()
|
|
34
|
+
if masking_request:
|
|
35
|
+
all_requests.append(masking_request)
|
|
36
|
+
return any(request.async_config is not None for request in all_requests)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def is_polling_continuation(request_task: RequestTask) -> bool:
|
|
40
|
+
"""Check if this is a polling continuation (not initial request)"""
|
|
41
|
+
async_type_check = request_task.async_type == AsyncTaskType.polling
|
|
42
|
+
sub_requests_count = len(request_task.sub_requests)
|
|
43
|
+
|
|
44
|
+
logger.warning(
|
|
45
|
+
f"is_polling_continuation for task {request_task.id}: "
|
|
46
|
+
f"async_type={request_task.async_type} (polling={async_type_check}), "
|
|
47
|
+
f"sub_requests_count={sub_requests_count}"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
return async_type_check and sub_requests_count > 0
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def is_callback_completion(request_task: RequestTask) -> bool:
|
|
54
|
+
"""Check if this is a completed callback request"""
|
|
55
|
+
return bool(request_task.callback_succeeded)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def is_async_request(
|
|
59
|
+
request_task: RequestTask, query_config: "SaaSQueryConfig"
|
|
60
|
+
) -> bool:
|
|
61
|
+
"""
|
|
62
|
+
Check if this is an async request (callback, continuation, or initial async).
|
|
63
|
+
|
|
64
|
+
This is the main entry point for async detection.
|
|
65
|
+
"""
|
|
66
|
+
return (
|
|
67
|
+
is_callback_completion(request_task)
|
|
68
|
+
or is_polling_continuation(request_task)
|
|
69
|
+
or has_async_requests(query_config)
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class AsyncPhase(Enum):
|
|
74
|
+
"""Enum representing different phases of async DSR processing."""
|
|
75
|
+
|
|
76
|
+
callback_completion = "callback_completion"
|
|
77
|
+
polling_continuation = "polling_continuation"
|
|
78
|
+
initial_async = "initial_async"
|
|
79
|
+
sync = "sync"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_async_phase(
|
|
83
|
+
request_task: RequestTask, query_config: "SaaSQueryConfig"
|
|
84
|
+
) -> AsyncPhase:
|
|
85
|
+
"""
|
|
86
|
+
Classify the phase of async request for routing purposes.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
AsyncPhase enum value representing the current phase:
|
|
90
|
+
- callback_completion: Callback has completed
|
|
91
|
+
- polling_continuation: Continuing an existing polling process
|
|
92
|
+
- initial_async: Initial async request setup
|
|
93
|
+
- sync: Not an async request
|
|
94
|
+
"""
|
|
95
|
+
if is_callback_completion(request_task):
|
|
96
|
+
return AsyncPhase.callback_completion
|
|
97
|
+
if is_polling_continuation(request_task):
|
|
98
|
+
return AsyncPhase.polling_continuation
|
|
99
|
+
if has_async_requests(query_config):
|
|
100
|
+
return AsyncPhase.initial_async
|
|
101
|
+
return AsyncPhase.sync
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_connection_config_from_task(
|
|
105
|
+
db: Session, request_task: RequestTask
|
|
106
|
+
) -> ConnectionConfig:
|
|
107
|
+
"""
|
|
108
|
+
Get ConnectionConfig from a RequestTask.
|
|
109
|
+
|
|
110
|
+
This utility function retrieves the connection configuration
|
|
111
|
+
associated with a request task by looking up the dataset configuration.
|
|
112
|
+
"""
|
|
113
|
+
dataset_config = DatasetConfig.filter(
|
|
114
|
+
db=db,
|
|
115
|
+
conditions=(DatasetConfig.fides_key == request_task.dataset_name),
|
|
116
|
+
).first()
|
|
117
|
+
if not dataset_config:
|
|
118
|
+
raise PrivacyRequestError(
|
|
119
|
+
f"DatasetConfig with fides_key {request_task.dataset_name} not found."
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
connection_config = ConnectionConfig.get(
|
|
123
|
+
db=db, object_id=dataset_config.connection_config_id
|
|
124
|
+
)
|
|
125
|
+
if not connection_config:
|
|
126
|
+
raise PrivacyRequestError(
|
|
127
|
+
f"ConnectionConfig with id {dataset_config.connection_config_id} not found."
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
return connection_config
|
|
@@ -7,7 +7,7 @@ from sqlalchemy.orm import Session
|
|
|
7
7
|
from sqlalchemy.sql import Executable # type: ignore
|
|
8
8
|
from sqlalchemy.sql.elements import TextClause
|
|
9
9
|
|
|
10
|
-
from fides.api.common_exceptions import ConnectionException
|
|
10
|
+
from fides.api.common_exceptions import ConnectionException, TableNotFound
|
|
11
11
|
from fides.api.graph.execution import ExecutionNode
|
|
12
12
|
from fides.api.models.connectionconfig import ConnectionTestStatus
|
|
13
13
|
from fides.api.models.policy import Policy
|
|
@@ -194,23 +194,41 @@ class BigQueryConnector(SQLConnector):
|
|
|
194
194
|
update_or_delete_ct = 0
|
|
195
195
|
client = self.client()
|
|
196
196
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
delete_stmts, self.should_dry_run(SqlDryRunMode.erasure), client
|
|
202
|
-
)
|
|
203
|
-
else:
|
|
204
|
-
for row in rows:
|
|
205
|
-
update_or_delete_stmts: List[Executable] = query_config.generate_update(
|
|
206
|
-
row, policy, privacy_request, client
|
|
207
|
-
)
|
|
208
|
-
logger.debug(
|
|
209
|
-
f"Generated {len(update_or_delete_stmts)} UPDATE statements"
|
|
210
|
-
)
|
|
197
|
+
try:
|
|
198
|
+
if query_config.uses_delete_masking_strategy():
|
|
199
|
+
delete_stmts = query_config.generate_delete(client, input_data or {})
|
|
200
|
+
logger.debug(f"Generated {len(delete_stmts)} DELETE statements")
|
|
211
201
|
update_or_delete_ct += self._execute_statements_with_sql_dry_run(
|
|
212
|
-
|
|
202
|
+
delete_stmts,
|
|
213
203
|
self.should_dry_run(SqlDryRunMode.erasure),
|
|
214
204
|
client,
|
|
215
205
|
)
|
|
206
|
+
else:
|
|
207
|
+
for row in rows:
|
|
208
|
+
update_or_delete_stmts: List[Executable] = (
|
|
209
|
+
query_config.generate_update(
|
|
210
|
+
row, policy, privacy_request, client
|
|
211
|
+
)
|
|
212
|
+
)
|
|
213
|
+
logger.debug(
|
|
214
|
+
f"Generated {len(update_or_delete_stmts)} UPDATE statements"
|
|
215
|
+
)
|
|
216
|
+
update_or_delete_ct += self._execute_statements_with_sql_dry_run(
|
|
217
|
+
update_or_delete_stmts,
|
|
218
|
+
self.should_dry_run(SqlDryRunMode.erasure),
|
|
219
|
+
client,
|
|
220
|
+
)
|
|
221
|
+
except Exception as exc:
|
|
222
|
+
# Check if table exists using qualified table name
|
|
223
|
+
qualified_table_name = self.get_qualified_table_name(node)
|
|
224
|
+
if not self.table_exists(qualified_table_name):
|
|
225
|
+
# For data erasure, we can always skip the collection since other collections
|
|
226
|
+
# don't depend on erasure results
|
|
227
|
+
skip_msg = (
|
|
228
|
+
f"Table '{qualified_table_name}' did not exist during data erasure."
|
|
229
|
+
)
|
|
230
|
+
raise TableNotFound(skip_msg) from exc
|
|
231
|
+
# Table exists or can't check - re-raise original exception
|
|
232
|
+
raise
|
|
233
|
+
|
|
216
234
|
return update_or_delete_ct
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from asyncio import sleep
|
|
4
|
+
from datetime import datetime
|
|
3
5
|
from typing import Any, Dict, List, Optional
|
|
4
6
|
|
|
5
7
|
import httpx
|
|
6
8
|
from httpx import AsyncClient, Client, HTTPStatusError, Request, RequestError, Timeout
|
|
7
9
|
from loguru import logger
|
|
8
10
|
|
|
11
|
+
from fides.api.common_exceptions import PrivacyRequestNotFound
|
|
9
12
|
from fides.api.schemas.privacy_request import (
|
|
10
13
|
PrivacyRequestCreate,
|
|
11
14
|
PrivacyRequestResponse,
|
|
@@ -13,11 +16,11 @@ from fides.api.schemas.privacy_request import (
|
|
|
13
16
|
)
|
|
14
17
|
from fides.api.schemas.redis_cache import Identity
|
|
15
18
|
from fides.api.schemas.user import UserLogin
|
|
16
|
-
from fides.api.service.privacy_request.request_service import poll_server_for_completion
|
|
17
19
|
from fides.api.util.collection_util import Row
|
|
18
20
|
from fides.api.util.errors import FidesError
|
|
19
21
|
from fides.api.util.wrappers import sync
|
|
20
22
|
from fides.common.api.v1 import urn_registry as urls
|
|
23
|
+
from fides.common.api.v1.urn_registry import PRIVACY_REQUESTS
|
|
21
24
|
|
|
22
25
|
COMPLETION_STATUSES = [
|
|
23
26
|
PrivacyRequestStatus.complete,
|
|
@@ -27,6 +30,65 @@ COMPLETION_STATUSES = [
|
|
|
27
30
|
]
|
|
28
31
|
|
|
29
32
|
|
|
33
|
+
def get_async_client() -> AsyncClient:
|
|
34
|
+
"""Return an async client used to make API requests"""
|
|
35
|
+
return AsyncClient()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
async def poll_server_for_completion(
|
|
39
|
+
privacy_request_id: str,
|
|
40
|
+
server_url: str,
|
|
41
|
+
token: str,
|
|
42
|
+
*,
|
|
43
|
+
poll_interval_seconds: int = 30,
|
|
44
|
+
timeout_seconds: int = 1800, # 30 minutes
|
|
45
|
+
client: AsyncClient | None = None,
|
|
46
|
+
) -> PrivacyRequestResponse:
|
|
47
|
+
"""Poll a server for privacy request completion.
|
|
48
|
+
|
|
49
|
+
Requests will report complete with if they have a status of canceled, complete,
|
|
50
|
+
denied, or error. By default the polling will time out if not completed in 30
|
|
51
|
+
minutes, time can be overridden by setting the timeout_seconds.
|
|
52
|
+
"""
|
|
53
|
+
url = f"{server_url}{urls.V1_URL_PREFIX}{PRIVACY_REQUESTS}?request_id={privacy_request_id}"
|
|
54
|
+
start_time = datetime.now()
|
|
55
|
+
elapsed_time = 0.0
|
|
56
|
+
while elapsed_time < timeout_seconds:
|
|
57
|
+
if client:
|
|
58
|
+
response = await client.get(
|
|
59
|
+
url, headers={"Authorization": f"Bearer {token}"}
|
|
60
|
+
)
|
|
61
|
+
else:
|
|
62
|
+
async_client = get_async_client()
|
|
63
|
+
response = await async_client.get(
|
|
64
|
+
url, headers={"Authorization": f"Bearer {token}"}
|
|
65
|
+
)
|
|
66
|
+
response.raise_for_status()
|
|
67
|
+
|
|
68
|
+
# Privacy requests are returned paginated. Since this is searching for a specific
|
|
69
|
+
# privacy request there should only be one value present in items.
|
|
70
|
+
items = response.json()["items"]
|
|
71
|
+
if not items:
|
|
72
|
+
raise PrivacyRequestNotFound(
|
|
73
|
+
f"No privacy request found with id '{privacy_request_id}'"
|
|
74
|
+
)
|
|
75
|
+
status = PrivacyRequestResponse(**items[0])
|
|
76
|
+
if status.status and status.status in (
|
|
77
|
+
PrivacyRequestStatus.complete,
|
|
78
|
+
PrivacyRequestStatus.canceled,
|
|
79
|
+
PrivacyRequestStatus.error,
|
|
80
|
+
PrivacyRequestStatus.denied,
|
|
81
|
+
):
|
|
82
|
+
return status
|
|
83
|
+
|
|
84
|
+
await sleep(poll_interval_seconds)
|
|
85
|
+
time_delta = datetime.now() - start_time
|
|
86
|
+
elapsed_time = time_delta.seconds
|
|
87
|
+
raise TimeoutError(
|
|
88
|
+
f"Timeout of {timeout_seconds} seconds has been exceeded while waiting for privacy request {privacy_request_id}"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
30
92
|
class FidesClient:
|
|
31
93
|
"""
|
|
32
94
|
A helper client to broker communications between Fides servers.
|
|
@@ -10,7 +10,6 @@ from uuid import uuid4
|
|
|
10
10
|
import pydash
|
|
11
11
|
from fideslang.models import FidesDatasetReference
|
|
12
12
|
from loguru import logger
|
|
13
|
-
from sqlalchemy.orm import Session
|
|
14
13
|
|
|
15
14
|
from fides.api.common_exceptions import FidesopsException
|
|
16
15
|
from fides.api.graph.execution import ExecutionNode
|
|
@@ -47,6 +46,7 @@ from fides.api.util.saas_util import (
|
|
|
47
46
|
ISO_8601_DATETIME,
|
|
48
47
|
MASKED_OBJECT_FIELDS,
|
|
49
48
|
PRIVACY_REQUEST_ID,
|
|
49
|
+
PRIVACY_REQUEST_OBJECT,
|
|
50
50
|
REPLY_TO,
|
|
51
51
|
REPLY_TO_TOKEN,
|
|
52
52
|
UUID,
|
|
@@ -83,12 +83,10 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
83
83
|
"""
|
|
84
84
|
Returns the appropriate request configs based on the current collection and identity
|
|
85
85
|
"""
|
|
86
|
-
collection_name = self.node.address.collection
|
|
87
|
-
|
|
88
86
|
try:
|
|
89
|
-
requests = self.endpoints[collection_name].requests
|
|
87
|
+
requests = self.endpoints[self.collection_name].requests
|
|
90
88
|
except KeyError:
|
|
91
|
-
logger.error("The '{}' endpoint is not defined", collection_name)
|
|
89
|
+
logger.error("The '{}' endpoint is not defined", self.collection_name)
|
|
92
90
|
return []
|
|
93
91
|
|
|
94
92
|
if not requests.read:
|
|
@@ -140,7 +138,7 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
140
138
|
)
|
|
141
139
|
return request
|
|
142
140
|
|
|
143
|
-
def get_masking_request(self
|
|
141
|
+
def get_masking_request(self) -> Optional[SaaSRequest]:
|
|
144
142
|
"""
|
|
145
143
|
Returns a tuple of the preferred action and SaaSRequest to use for masking.
|
|
146
144
|
An update request is preferred, but we can use a gdpr delete endpoint or
|
|
@@ -212,6 +210,7 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
212
210
|
input_data: Dict[str, List[Any]],
|
|
213
211
|
policy: Optional[Policy],
|
|
214
212
|
read_request: SaaSRequest,
|
|
213
|
+
privacy_request: Optional[PrivacyRequest] = None,
|
|
215
214
|
) -> List[Tuple[SaaSRequestParams, Dict[str, Any]]]:
|
|
216
215
|
"""
|
|
217
216
|
Takes the identity and reference values from input_data and combines them
|
|
@@ -224,6 +223,10 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
224
223
|
self.current_request = read_request
|
|
225
224
|
|
|
226
225
|
request_params = []
|
|
226
|
+
|
|
227
|
+
if privacy_request:
|
|
228
|
+
input_data[PRIVACY_REQUEST_OBJECT] = [privacy_request.to_safe_dict()]
|
|
229
|
+
|
|
227
230
|
param_value_maps = self.generate_param_value_maps(input_data, read_request)
|
|
228
231
|
|
|
229
232
|
for param_value_map in param_value_maps:
|
|
@@ -277,6 +280,114 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
277
280
|
name: value for name, value in self.secrets.items() if name in param_names
|
|
278
281
|
}
|
|
279
282
|
|
|
283
|
+
def _safe_extract_value(self, value_list: Optional[List[Any]]) -> Optional[Any]:
|
|
284
|
+
"""
|
|
285
|
+
Safely extract the first value from a list
|
|
286
|
+
"""
|
|
287
|
+
return value_list[0] if value_list else None
|
|
288
|
+
|
|
289
|
+
def _process_param_values_for_query(
|
|
290
|
+
self,
|
|
291
|
+
request: SaaSRequest,
|
|
292
|
+
input_data: Dict[str, List[Any]],
|
|
293
|
+
param_values: Dict[str, Any],
|
|
294
|
+
) -> None:
|
|
295
|
+
"""
|
|
296
|
+
Process param_values for query generation on access requests.
|
|
297
|
+
"""
|
|
298
|
+
for param_value in request.param_values or []:
|
|
299
|
+
if param_value.references or param_value.identity:
|
|
300
|
+
input_list = input_data.get(param_value.name)
|
|
301
|
+
if input_list:
|
|
302
|
+
param_values[param_value.name] = self._safe_extract_value(
|
|
303
|
+
input_list
|
|
304
|
+
)
|
|
305
|
+
elif param_value.connector_param:
|
|
306
|
+
connector_value = pydash.get(input_data, param_value.connector_param)
|
|
307
|
+
param_values[param_value.name] = self._safe_extract_value(
|
|
308
|
+
connector_value
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
def _process_param_values_for_update(
|
|
312
|
+
self,
|
|
313
|
+
request: SaaSRequest,
|
|
314
|
+
collection_values: Dict[str, Row],
|
|
315
|
+
identity_data: Dict[str, Any],
|
|
316
|
+
input_data: Optional[Dict[str, List[Any]]] = None,
|
|
317
|
+
param_values: Optional[Dict[str, Any]] = None,
|
|
318
|
+
) -> None:
|
|
319
|
+
"""
|
|
320
|
+
Process param_values for update generation (erasure requests).
|
|
321
|
+
Modifies param_values in place.
|
|
322
|
+
|
|
323
|
+
Args:
|
|
324
|
+
request: The SaaS request configuration
|
|
325
|
+
collection_values: Collection data for reference resolution
|
|
326
|
+
identity_data: Identity data for parameter resolution
|
|
327
|
+
input_data: Optional upstream data from other collections
|
|
328
|
+
"""
|
|
329
|
+
if param_values is None:
|
|
330
|
+
param_values = {}
|
|
331
|
+
|
|
332
|
+
for param_value in request.param_values or []:
|
|
333
|
+
if param_value.references:
|
|
334
|
+
# we resolve the param reference here for consistency,
|
|
335
|
+
# i.e. as if it may be a pointer to an `external_reference`.
|
|
336
|
+
# Cross-collection references are now supported by looking up data
|
|
337
|
+
# from upstream collections passed via input_data.
|
|
338
|
+
reference: FidesDatasetReference = SaaSConfig.resolve_param_reference(
|
|
339
|
+
param_value.references[0], self.secrets
|
|
340
|
+
)
|
|
341
|
+
param_values[param_value.name] = pydash.get(
|
|
342
|
+
collection_values, reference.field
|
|
343
|
+
)
|
|
344
|
+
if param_values[param_value.name] is None and input_data:
|
|
345
|
+
logger.info(
|
|
346
|
+
"Reference not found in collection, checking input data from upstream tasks"
|
|
347
|
+
)
|
|
348
|
+
# If the reference is not found in the collection (None), check the input data from upstream tasks
|
|
349
|
+
input_list = input_data.get(param_value.name)
|
|
350
|
+
if input_list:
|
|
351
|
+
param_values[param_value.name] = self._safe_extract_value(
|
|
352
|
+
input_list
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
elif param_value.identity:
|
|
356
|
+
param_values[param_value.name] = pydash.get(
|
|
357
|
+
identity_data, param_value.identity
|
|
358
|
+
)
|
|
359
|
+
elif param_value.connector_param:
|
|
360
|
+
param_values[param_value.name] = pydash.get(
|
|
361
|
+
self.secrets, param_value.connector_param
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
def _add_standard_parameters(
|
|
365
|
+
self,
|
|
366
|
+
param_values: Dict[str, Any],
|
|
367
|
+
) -> None:
|
|
368
|
+
"""
|
|
369
|
+
Add standard parameters that are common across query and update operations.
|
|
370
|
+
"""
|
|
371
|
+
|
|
372
|
+
# common parameters for read and update
|
|
373
|
+
if self.privacy_request:
|
|
374
|
+
param_values[PRIVACY_REQUEST_ID] = self.privacy_request.id
|
|
375
|
+
param_values[UUID] = str(uuid4())
|
|
376
|
+
param_values[ISO_8601_DATETIME] = datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
377
|
+
param_values[FIELD_LIST] = ",".join(
|
|
378
|
+
[
|
|
379
|
+
field.name
|
|
380
|
+
for field in self.top_level_field_map().values()
|
|
381
|
+
if field.data_type() != "None"
|
|
382
|
+
]
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
if self.request_task and self.request_task.id:
|
|
386
|
+
param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
|
|
387
|
+
self.request_task
|
|
388
|
+
)
|
|
389
|
+
param_values[REPLY_TO] = V1_URL_PREFIX + REQUEST_TASK_CALLBACK
|
|
390
|
+
|
|
280
391
|
@staticmethod
|
|
281
392
|
def _generate_product_list(*args: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
282
393
|
"""
|
|
@@ -326,22 +437,19 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
326
437
|
f"The 'read' action is not defined for the '{self.collection_name}' "
|
|
327
438
|
f"endpoint in {self.node.connection_key}"
|
|
328
439
|
)
|
|
329
|
-
|
|
330
|
-
# create the source of param values to populate the various placeholders
|
|
331
|
-
# in the path, headers, query_params, and body
|
|
332
440
|
param_values: Dict[str, Any] = {}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
param_values[param_value.name] = input_list[0]
|
|
338
|
-
elif param_value.connector_param:
|
|
339
|
-
param_values[param_value.name] = pydash.get(
|
|
340
|
-
input_data, param_value.connector_param
|
|
341
|
-
)[0]
|
|
441
|
+
# Process param values using utility method
|
|
442
|
+
self._process_param_values_for_query(
|
|
443
|
+
self.current_request, input_data, param_values
|
|
444
|
+
)
|
|
342
445
|
|
|
343
|
-
|
|
344
|
-
|
|
446
|
+
privacy_request_object = input_data.get(PRIVACY_REQUEST_OBJECT)
|
|
447
|
+
if (
|
|
448
|
+
isinstance(privacy_request_object, list)
|
|
449
|
+
and len(privacy_request_object) > 0
|
|
450
|
+
and isinstance(privacy_request_object[0], dict)
|
|
451
|
+
):
|
|
452
|
+
param_values[PRIVACY_REQUEST_OBJECT] = privacy_request_object[0]
|
|
345
453
|
|
|
346
454
|
custom_privacy_request_fields = input_data.get(CUSTOM_PRIVACY_REQUEST_FIELDS)
|
|
347
455
|
if (
|
|
@@ -352,20 +460,9 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
352
460
|
0
|
|
353
461
|
]
|
|
354
462
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
[
|
|
359
|
-
field.name
|
|
360
|
-
for field in self.top_level_field_map().values()
|
|
361
|
-
if field.data_type() != "None"
|
|
362
|
-
]
|
|
363
|
-
)
|
|
364
|
-
if self.request_task and self.request_task.id:
|
|
365
|
-
param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
|
|
366
|
-
self.request_task
|
|
367
|
-
)
|
|
368
|
-
param_values[REPLY_TO] = V1_URL_PREFIX + REQUEST_TASK_CALLBACK
|
|
463
|
+
# Add standard parameters
|
|
464
|
+
# For generate_query, we don't have a PrivacyRequest object, so we use self.privacy_request
|
|
465
|
+
self._add_standard_parameters(param_values)
|
|
369
466
|
|
|
370
467
|
# map param values to placeholders in path, headers, and query params
|
|
371
468
|
saas_request_params: SaaSRequestParams = saas_util.map_param_values(
|
|
@@ -377,17 +474,26 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
377
474
|
return saas_request_params
|
|
378
475
|
|
|
379
476
|
def generate_update_stmt(
|
|
380
|
-
self,
|
|
477
|
+
self,
|
|
478
|
+
row: Row,
|
|
479
|
+
policy: Policy,
|
|
480
|
+
request: PrivacyRequest,
|
|
481
|
+
input_data: Optional[Dict[str, List[Any]]] = None,
|
|
381
482
|
) -> SaaSRequestParams:
|
|
382
483
|
"""
|
|
383
484
|
This returns the method, path, header, query, and body params needed to make an API call.
|
|
384
485
|
The fields in the row are masked according to the policy and added to the request body
|
|
385
486
|
if specified by the body field of the masking request.
|
|
487
|
+
|
|
488
|
+
Args:
|
|
489
|
+
row: The current row data from this collection
|
|
490
|
+
policy: The privacy policy being applied
|
|
491
|
+
request: The privacy request being processed
|
|
492
|
+
input_data: Optional upstream data from other collections for cross-collection references
|
|
386
493
|
"""
|
|
387
|
-
|
|
388
|
-
current_request: SaaSRequest = self.get_masking_request(session) # type: ignore
|
|
494
|
+
current_request: SaaSRequest = self.get_masking_request() # type: ignore
|
|
389
495
|
param_values: Dict[str, Any] = self.generate_update_param_values(
|
|
390
|
-
row, policy, request, current_request
|
|
496
|
+
row, policy, request, current_request, input_data
|
|
391
497
|
)
|
|
392
498
|
|
|
393
499
|
return self.generate_update_request_params(param_values, current_request)
|
|
@@ -416,6 +522,7 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
416
522
|
policy: Policy,
|
|
417
523
|
privacy_request: PrivacyRequest,
|
|
418
524
|
saas_request: SaaSRequest,
|
|
525
|
+
input_data: Optional[Dict[str, List[Any]]] = None,
|
|
419
526
|
) -> Dict[str, Any]:
|
|
420
527
|
"""
|
|
421
528
|
A utility that generates the update request param values
|
|
@@ -426,10 +533,16 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
426
533
|
the fields in the provided row that have been masked according
|
|
427
534
|
to provided policy. The `all_object_fields` key maps to a JSON structure
|
|
428
535
|
that holds all values, including those that have not been masked.
|
|
536
|
+
|
|
537
|
+
Args:
|
|
538
|
+
row: The current row data from this collection
|
|
539
|
+
policy: The privacy policy being applied
|
|
540
|
+
privacy_request: The privacy request being processed
|
|
541
|
+
saas_request: The SaaS request configuration
|
|
542
|
+
input_data: Optional upstream data from other collections for cross-collection references
|
|
429
543
|
"""
|
|
430
544
|
|
|
431
|
-
|
|
432
|
-
collection_values: Dict[str, Row] = {collection_name: row}
|
|
545
|
+
collection_values: Dict[str, Row] = {self.collection_name: row}
|
|
433
546
|
identity_data: Dict[str, Any] = privacy_request.get_cached_identity_data()
|
|
434
547
|
custom_privacy_request_fields: Dict[str, Any] = (
|
|
435
548
|
privacy_request.get_cached_custom_privacy_request_fields()
|
|
@@ -438,46 +551,15 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
438
551
|
# create the source of param values to populate the various placeholders
|
|
439
552
|
# in the path, headers, query_params, and body
|
|
440
553
|
param_values: Dict[str, Any] = {}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
# however, `references` in update requests can, currently, only reference
|
|
446
|
-
# the same collection the same collection, and so it is highly unlikely
|
|
447
|
-
# that this would be an external reference at this point.
|
|
448
|
-
reference: FidesDatasetReference = SaaSConfig.resolve_param_reference(
|
|
449
|
-
param_value.references[0], self.secrets
|
|
450
|
-
)
|
|
451
|
-
param_values[param_value.name] = pydash.get(
|
|
452
|
-
collection_values, reference.field
|
|
453
|
-
)
|
|
454
|
-
elif param_value.identity:
|
|
455
|
-
param_values[param_value.name] = pydash.get(
|
|
456
|
-
identity_data, param_value.identity
|
|
457
|
-
)
|
|
458
|
-
elif param_value.connector_param:
|
|
459
|
-
param_values[param_value.name] = pydash.get(
|
|
460
|
-
self.secrets, param_value.connector_param
|
|
461
|
-
)
|
|
462
|
-
|
|
463
|
-
if self.privacy_request:
|
|
464
|
-
param_values[PRIVACY_REQUEST_ID] = self.privacy_request.id
|
|
554
|
+
# Process param values using utility method
|
|
555
|
+
self._process_param_values_for_update(
|
|
556
|
+
saas_request, collection_values, identity_data, input_data, param_values
|
|
557
|
+
)
|
|
465
558
|
|
|
559
|
+
param_values[PRIVACY_REQUEST_OBJECT] = privacy_request.to_safe_dict()
|
|
466
560
|
param_values[CUSTOM_PRIVACY_REQUEST_FIELDS] = custom_privacy_request_fields
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
param_values[FIELD_LIST] = ",".join(
|
|
470
|
-
[
|
|
471
|
-
field.name
|
|
472
|
-
for field in self.top_level_field_map().values()
|
|
473
|
-
if field.data_type() != "None"
|
|
474
|
-
]
|
|
475
|
-
)
|
|
476
|
-
if self.request_task and self.request_task.id:
|
|
477
|
-
param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
|
|
478
|
-
self.request_task
|
|
479
|
-
)
|
|
480
|
-
param_values[REPLY_TO] = V1_URL_PREFIX + REQUEST_TASK_CALLBACK
|
|
561
|
+
# Add standard parameters
|
|
562
|
+
self._add_standard_parameters(param_values)
|
|
481
563
|
# remove any row values for fields marked as read-only, these will be omitted from all update maps
|
|
482
564
|
for field_path, field in self.field_map().items():
|
|
483
565
|
if field.read_only:
|
|
@@ -503,7 +585,6 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
|
|
|
503
585
|
|
|
504
586
|
param_values[MASKED_OBJECT_FIELDS] = masked_object
|
|
505
587
|
param_values[ALL_OBJECT_FIELDS] = complete_object
|
|
506
|
-
|
|
507
588
|
return param_values
|
|
508
589
|
|
|
509
590
|
def generate_update_request_params(
|