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
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
# pylint: disable=protected-access
|
|
2
2
|
import os
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
|
-
from typing import Dict,
|
|
4
|
+
from typing import Dict, List, Optional, Type
|
|
5
5
|
from zipfile import ZipFile
|
|
6
6
|
|
|
7
7
|
from fideslang.models import Dataset
|
|
8
8
|
from loguru import logger
|
|
9
|
-
from packaging.version import Version
|
|
10
9
|
from packaging.version import parse as parse_version
|
|
11
10
|
from sqlalchemy.orm import Session
|
|
12
11
|
|
|
13
12
|
from fides.api.api.deps import get_api_session
|
|
14
13
|
from fides.api.common_exceptions import ValidationError
|
|
15
14
|
from fides.api.cryptography.cryptographic_util import str_to_b64_str
|
|
16
|
-
from fides.api.models.connectionconfig import ConnectionConfig
|
|
17
15
|
from fides.api.models.custom_connector_template import CustomConnectorTemplate
|
|
18
|
-
from fides.api.models.datasetconfig import DatasetConfig
|
|
19
|
-
from fides.api.schemas.connection_configuration.saas_config_template_values import (
|
|
20
|
-
SaasConnectionTemplateValues,
|
|
21
|
-
)
|
|
22
16
|
from fides.api.schemas.saas.connector_template import ConnectorTemplate
|
|
23
17
|
from fides.api.schemas.saas.saas_config import SaaSConfig
|
|
24
18
|
from fides.api.service.authentication.authentication_strategy_oauth2_authorization_code import (
|
|
@@ -31,8 +25,6 @@ from fides.api.util.saas_util import (
|
|
|
31
25
|
load_config_from_string,
|
|
32
26
|
load_dataset_from_string,
|
|
33
27
|
load_yaml_as_string,
|
|
34
|
-
replace_config_placeholders,
|
|
35
|
-
replace_dataset_placeholders,
|
|
36
28
|
replace_version,
|
|
37
29
|
)
|
|
38
30
|
from fides.api.util.unsafe_file_util import verify_svg, verify_zip
|
|
@@ -317,132 +309,3 @@ class ConnectorRegistry:
|
|
|
317
309
|
Returns an object containing the various SaaS connector artifacts
|
|
318
310
|
"""
|
|
319
311
|
return cls._get_combined_templates().get(connector_type)
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
def create_connection_config_from_template_no_save(
|
|
323
|
-
db: Session,
|
|
324
|
-
template: ConnectorTemplate,
|
|
325
|
-
template_values: SaasConnectionTemplateValues,
|
|
326
|
-
system_id: Optional[str] = None,
|
|
327
|
-
) -> ConnectionConfig:
|
|
328
|
-
"""Creates a SaaS connection config from a template without saving it."""
|
|
329
|
-
# Load SaaS config from template and replace every instance of "<instance_fides_key>" with the fides_key
|
|
330
|
-
# the user has chosen
|
|
331
|
-
config_from_template: Dict = replace_config_placeholders(
|
|
332
|
-
template.config, "<instance_fides_key>", template_values.instance_key
|
|
333
|
-
)
|
|
334
|
-
|
|
335
|
-
data = template_values.generate_config_data_from_template(
|
|
336
|
-
config_from_template=config_from_template
|
|
337
|
-
)
|
|
338
|
-
|
|
339
|
-
if system_id:
|
|
340
|
-
data["system_id"] = system_id
|
|
341
|
-
|
|
342
|
-
# Create SaaS ConnectionConfig
|
|
343
|
-
connection_config = ConnectionConfig.create_without_saving(db, data=data)
|
|
344
|
-
|
|
345
|
-
return connection_config
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
def upsert_dataset_config_from_template(
|
|
349
|
-
db: Session,
|
|
350
|
-
connection_config: ConnectionConfig,
|
|
351
|
-
template: ConnectorTemplate,
|
|
352
|
-
template_values: SaasConnectionTemplateValues,
|
|
353
|
-
) -> DatasetConfig:
|
|
354
|
-
"""
|
|
355
|
-
Creates a `DatasetConfig` from a template
|
|
356
|
-
and associates it with a ConnectionConfig.
|
|
357
|
-
If the `DatasetConfig` already exists in the db,
|
|
358
|
-
then the existing record is updated.
|
|
359
|
-
"""
|
|
360
|
-
# Load the dataset config from template and replace every instance of "<instance_fides_key>" with the fides_key
|
|
361
|
-
# the user has chosen
|
|
362
|
-
dataset_from_template: Dict = replace_dataset_placeholders(
|
|
363
|
-
template.dataset, "<instance_fides_key>", template_values.instance_key
|
|
364
|
-
)
|
|
365
|
-
data = {
|
|
366
|
-
"connection_config_id": connection_config.id,
|
|
367
|
-
"fides_key": template_values.instance_key,
|
|
368
|
-
"dataset": dataset_from_template, # Currently used for upserting a CTL Dataset
|
|
369
|
-
}
|
|
370
|
-
dataset_config = DatasetConfig.create_or_update(db, data=data)
|
|
371
|
-
return dataset_config
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
def update_saas_configs(db: Session) -> None:
|
|
375
|
-
"""
|
|
376
|
-
Updates SaaS config instances currently in the DB if to the
|
|
377
|
-
corresponding template in the registry are found.
|
|
378
|
-
|
|
379
|
-
Effectively an "update script" for SaaS config instances,
|
|
380
|
-
to be run on server bootstrap.
|
|
381
|
-
"""
|
|
382
|
-
for connector_type in ConnectorRegistry.connector_types():
|
|
383
|
-
logger.debug(
|
|
384
|
-
"Determining if any updates are needed for connectors of type {} based on templates...",
|
|
385
|
-
connector_type,
|
|
386
|
-
)
|
|
387
|
-
template: ConnectorTemplate = ConnectorRegistry.get_connector_template( # type: ignore
|
|
388
|
-
connector_type
|
|
389
|
-
)
|
|
390
|
-
saas_config = SaaSConfig(**load_config_from_string(template.config))
|
|
391
|
-
template_version: Version = parse_version(saas_config.version)
|
|
392
|
-
|
|
393
|
-
connection_configs: Iterable[ConnectionConfig] = ConnectionConfig.filter(
|
|
394
|
-
db=db,
|
|
395
|
-
conditions=(ConnectionConfig.saas_config["type"].astext == connector_type),
|
|
396
|
-
).all()
|
|
397
|
-
for connection_config in connection_configs:
|
|
398
|
-
saas_config_instance = SaaSConfig.model_validate(
|
|
399
|
-
connection_config.saas_config
|
|
400
|
-
)
|
|
401
|
-
if parse_version(saas_config_instance.version) < template_version:
|
|
402
|
-
logger.info(
|
|
403
|
-
"Updating SaaS config instance '{}' of type '{}' as its version, {}, was found to be lower than the template version {}",
|
|
404
|
-
saas_config_instance.fides_key,
|
|
405
|
-
connector_type,
|
|
406
|
-
saas_config_instance.version,
|
|
407
|
-
template_version,
|
|
408
|
-
)
|
|
409
|
-
try:
|
|
410
|
-
update_saas_instance(
|
|
411
|
-
db,
|
|
412
|
-
connection_config,
|
|
413
|
-
template,
|
|
414
|
-
saas_config_instance,
|
|
415
|
-
)
|
|
416
|
-
except Exception:
|
|
417
|
-
logger.exception(
|
|
418
|
-
"Encountered error attempting to update SaaS config instance {}",
|
|
419
|
-
saas_config_instance.fides_key,
|
|
420
|
-
)
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
def update_saas_instance(
|
|
424
|
-
db: Session,
|
|
425
|
-
connection_config: ConnectionConfig,
|
|
426
|
-
template: ConnectorTemplate,
|
|
427
|
-
saas_config_instance: SaaSConfig,
|
|
428
|
-
) -> None:
|
|
429
|
-
"""
|
|
430
|
-
Replace in the DB the existing SaaS instance configuration data
|
|
431
|
-
(SaaSConfig, DatasetConfig) associated with the given ConnectionConfig
|
|
432
|
-
with new instance configuration data based on the given ConnectorTemplate
|
|
433
|
-
"""
|
|
434
|
-
template_vals = SaasConnectionTemplateValues(
|
|
435
|
-
name=connection_config.name,
|
|
436
|
-
key=connection_config.key,
|
|
437
|
-
description=connection_config.description,
|
|
438
|
-
secrets=connection_config.secrets,
|
|
439
|
-
instance_key=saas_config_instance.fides_key,
|
|
440
|
-
)
|
|
441
|
-
|
|
442
|
-
config_from_template: Dict = replace_config_placeholders(
|
|
443
|
-
template.config, "<instance_fides_key>", template_vals.instance_key
|
|
444
|
-
)
|
|
445
|
-
|
|
446
|
-
connection_config.update_saas_config(db, SaaSConfig(**config_from_template))
|
|
447
|
-
|
|
448
|
-
upsert_dataset_config_from_template(db, connection_config, template, template_vals)
|
|
@@ -10,18 +10,18 @@ from requests import Response
|
|
|
10
10
|
from sqlalchemy.orm import Session
|
|
11
11
|
from starlette.status import HTTP_204_NO_CONTENT
|
|
12
12
|
|
|
13
|
+
from fides.api.api.deps import get_autoclose_db_session as get_db
|
|
13
14
|
from fides.api.common_exceptions import (
|
|
14
|
-
|
|
15
|
+
ClientUnsuccessfulException,
|
|
16
|
+
ConnectionException,
|
|
15
17
|
FidesopsException,
|
|
16
18
|
PostProcessingException,
|
|
17
|
-
PrivacyRequestError,
|
|
18
19
|
SkippingConsentPropagation,
|
|
19
20
|
)
|
|
20
21
|
from fides.api.graph.execution import ExecutionNode
|
|
21
22
|
from fides.api.models.connectionconfig import ConnectionConfig, ConnectionTestStatus
|
|
22
23
|
from fides.api.models.policy import Policy
|
|
23
24
|
from fides.api.models.privacy_request import PrivacyRequest, RequestTask
|
|
24
|
-
from fides.api.models.privacy_request.request_task import AsyncTaskType
|
|
25
25
|
from fides.api.schemas.consentable_item import (
|
|
26
26
|
ConsentableItem,
|
|
27
27
|
build_consent_item_hierarchy,
|
|
@@ -39,6 +39,10 @@ from fides.api.schemas.saas.shared_schemas import (
|
|
|
39
39
|
ConsentPropagationStatus,
|
|
40
40
|
SaaSRequestParams,
|
|
41
41
|
)
|
|
42
|
+
from fides.api.service.async_dsr.strategies.async_dsr_strategy import AsyncDSRStrategy
|
|
43
|
+
from fides.api.service.async_dsr.strategies.async_dsr_strategy_factory import (
|
|
44
|
+
get_strategy,
|
|
45
|
+
)
|
|
42
46
|
from fides.api.service.connectors.base_connector import BaseConnector
|
|
43
47
|
from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
|
|
44
48
|
from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
|
|
@@ -65,7 +69,9 @@ from fides.api.util.logger_context_utils import (
|
|
|
65
69
|
from fides.api.util.saas_util import (
|
|
66
70
|
ALL_OBJECT_FIELDS,
|
|
67
71
|
CUSTOM_PRIVACY_REQUEST_FIELDS,
|
|
72
|
+
PRIVACY_REQUEST_OBJECT,
|
|
68
73
|
assign_placeholders,
|
|
74
|
+
check_dataset_missing_reference_values,
|
|
69
75
|
map_param_values,
|
|
70
76
|
)
|
|
71
77
|
|
|
@@ -216,17 +222,14 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
216
222
|
request_task: RequestTask,
|
|
217
223
|
input_data: Dict[str, List[Any]],
|
|
218
224
|
) -> List[Row]:
|
|
219
|
-
"""
|
|
225
|
+
"""
|
|
226
|
+
Retrieve data from SaaS APIs.
|
|
227
|
+
|
|
228
|
+
Handles sync requests directly and delegates async requests to external handlers.
|
|
229
|
+
"""
|
|
220
230
|
|
|
221
231
|
# pylint: disable=too-many-branches
|
|
222
232
|
self.set_privacy_request_state(privacy_request, node, request_task)
|
|
223
|
-
if request_task.callback_succeeded:
|
|
224
|
-
# If this is True, we assume we've received results from a third party
|
|
225
|
-
# asynchronously and we can proceed to the next node.
|
|
226
|
-
logger.info(
|
|
227
|
-
"Access callback succeeded for request task '{}'", request_task.id
|
|
228
|
-
)
|
|
229
|
-
return request_task.get_access_data()
|
|
230
233
|
query_config: SaaSQueryConfig = self.query_config(node)
|
|
231
234
|
|
|
232
235
|
# generate initial set of requests if read request is defined, otherwise raise an exception
|
|
@@ -264,37 +267,32 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
264
267
|
if custom_privacy_request_fields:
|
|
265
268
|
input_data[CUSTOM_PRIVACY_REQUEST_FIELDS] = [custom_privacy_request_fields]
|
|
266
269
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
+
input_data[PRIVACY_REQUEST_OBJECT] = [privacy_request.to_safe_dict()]
|
|
271
|
+
# check all the values specified by param_values are provided in input_data
|
|
270
272
|
for read_request in read_requests:
|
|
271
|
-
self.set_saas_request_state(read_request)
|
|
272
|
-
if (
|
|
273
|
-
read_request.async_config is not None
|
|
274
|
-
and request_task.id # Only supported in DSR 3.0
|
|
275
|
-
):
|
|
276
|
-
# Asynchronous read request detected. We will exit below and put the
|
|
277
|
-
# Request Task in an "awaiting_processing" status.
|
|
278
|
-
awaiting_async_processing = True
|
|
279
|
-
|
|
280
|
-
# Validate async strategy with proper enum value checking
|
|
281
|
-
strategy_value = read_request.async_config.strategy
|
|
282
|
-
valid_strategies = [task_type.value for task_type in AsyncTaskType]
|
|
283
|
-
|
|
284
|
-
if strategy_value not in valid_strategies:
|
|
285
|
-
raise PrivacyRequestError(
|
|
286
|
-
f"Invalid async type '{strategy_value}' for request task {request_task.id}. "
|
|
287
|
-
f"Valid types are: {valid_strategies}"
|
|
288
|
-
)
|
|
289
|
-
|
|
290
|
-
request_task.async_type = AsyncTaskType(strategy_value)
|
|
291
|
-
|
|
292
|
-
# check all the values specified by param_values are provided in input_data
|
|
293
273
|
if self._missing_dataset_reference_values(
|
|
294
274
|
input_data, read_request.param_values
|
|
295
275
|
):
|
|
296
276
|
return []
|
|
297
277
|
|
|
278
|
+
# Delegate async requests
|
|
279
|
+
with get_db() as db:
|
|
280
|
+
# Guard clause to ensure we only run async access requests for access requests
|
|
281
|
+
if self.guard_access_request(policy):
|
|
282
|
+
if async_dsr_strategy := _get_async_dsr_strategy(
|
|
283
|
+
db, request_task, query_config, ActionType.access
|
|
284
|
+
):
|
|
285
|
+
return async_dsr_strategy.async_retrieve_data(
|
|
286
|
+
client=self.create_client(),
|
|
287
|
+
request_task_id=request_task.id,
|
|
288
|
+
query_config=query_config,
|
|
289
|
+
input_data=input_data,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
rows: List[Row] = []
|
|
293
|
+
for read_request in read_requests:
|
|
294
|
+
self.set_saas_request_state(read_request)
|
|
295
|
+
|
|
298
296
|
# hook for user-provided request override functions
|
|
299
297
|
if read_request.request_override:
|
|
300
298
|
return self._invoke_read_request_override(
|
|
@@ -310,7 +308,12 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
310
308
|
# if a path is provided, it means we want to generate HTTP requests from the config
|
|
311
309
|
if read_request.path:
|
|
312
310
|
prepared_requests: List[Tuple[SaaSRequestParams, Dict[str, Any]]] = (
|
|
313
|
-
query_config.generate_requests(
|
|
311
|
+
query_config.generate_requests(
|
|
312
|
+
input_data,
|
|
313
|
+
policy,
|
|
314
|
+
read_request,
|
|
315
|
+
privacy_request=privacy_request,
|
|
316
|
+
)
|
|
314
317
|
)
|
|
315
318
|
|
|
316
319
|
# Iterates through initial list of prepared requests and through subsequent
|
|
@@ -334,7 +337,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
334
337
|
# This allows us to build an output object even if we didn't generate and execute
|
|
335
338
|
# any HTTP requests. This is useful if we just want to select specific input_data
|
|
336
339
|
# values to provide as row data to the mask_data function
|
|
337
|
-
elif read_request.output:
|
|
340
|
+
elif not read_request.path and read_request.output:
|
|
338
341
|
rows.extend(
|
|
339
342
|
self._apply_output_template(
|
|
340
343
|
query_config.generate_param_value_maps(
|
|
@@ -345,19 +348,21 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
345
348
|
)
|
|
346
349
|
|
|
347
350
|
self.unset_connector_state()
|
|
348
|
-
if awaiting_async_processing:
|
|
349
|
-
# If a read request was marked to expect async results, original response data here is ignored.
|
|
350
|
-
# We'll instead use the data received in the callback URL later.
|
|
351
|
-
# However for polling async request we want to save the request data for ids that we will use on the pollings status
|
|
352
|
-
if request_task.async_type == AsyncTaskType.polling:
|
|
353
|
-
# Saving the request task access data to use it on the polling status request
|
|
354
|
-
# TODO: Consider if we want to clean up the rows. Currently this is the concern of the GraphTask.
|
|
355
|
-
request_task.access_data = rows
|
|
356
|
-
# Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
|
|
357
|
-
raise AwaitingAsyncTask()
|
|
358
|
-
|
|
359
351
|
return rows
|
|
360
352
|
|
|
353
|
+
def guard_access_request(self, policy: Policy) -> bool:
|
|
354
|
+
"""
|
|
355
|
+
Guard clause to ensure we only run async access requests
|
|
356
|
+
if the access request is enabled and we are in an Access Request
|
|
357
|
+
"""
|
|
358
|
+
if (
|
|
359
|
+
self.configuration.enabled_actions is None
|
|
360
|
+
or ActionType.access in self.configuration.enabled_actions
|
|
361
|
+
):
|
|
362
|
+
if policy.get_rules_for_action(ActionType.access):
|
|
363
|
+
return True
|
|
364
|
+
return False
|
|
365
|
+
|
|
361
366
|
def _apply_output_template(
|
|
362
367
|
self,
|
|
363
368
|
param_value_maps: List[Dict[str, Any]],
|
|
@@ -387,29 +392,15 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
387
392
|
return result
|
|
388
393
|
|
|
389
394
|
def _missing_dataset_reference_values(
|
|
390
|
-
self, input_data: Dict[str, Any], param_values: Optional[List[ParamValue]]
|
|
395
|
+
self, input_data: Dict[str, List[Any]], param_values: Optional[List[ParamValue]]
|
|
391
396
|
) -> List[str]:
|
|
392
397
|
"""Return a list of dataset reference values that are not found in the input_data map"""
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
if param_value.references
|
|
399
|
-
]
|
|
400
|
-
|
|
401
|
-
# extract the keys from inside the fides_grouped_inputs and append them the other input_data keys
|
|
402
|
-
provided_input_keys = (
|
|
403
|
-
list(input_data.get("fidesops_grouped_inputs")[0].keys()) # type: ignore
|
|
404
|
-
if input_data.get("fidesops_grouped_inputs")
|
|
405
|
-
else []
|
|
406
|
-
) + list(input_data.keys())
|
|
407
|
-
|
|
408
|
-
# find the missing values
|
|
409
|
-
missing_dataset_reference_values = list(
|
|
410
|
-
set(required_param_value_references) - set(provided_input_keys)
|
|
398
|
+
missing_dataset_reference_values = check_dataset_missing_reference_values(
|
|
399
|
+
input_data, param_values
|
|
400
|
+
)
|
|
401
|
+
logger.info(
|
|
402
|
+
f"Missing dataset reference values: {missing_dataset_reference_values}"
|
|
411
403
|
)
|
|
412
|
-
|
|
413
404
|
if missing_dataset_reference_values:
|
|
414
405
|
logger.info(
|
|
415
406
|
"The '{}' request of {} is missing the following dataset reference values [{}], skipping traversal",
|
|
@@ -536,22 +527,27 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
536
527
|
rows: List[Row],
|
|
537
528
|
input_data: Optional[Dict[str, List[Any]]] = None,
|
|
538
529
|
) -> int:
|
|
539
|
-
"""
|
|
540
|
-
|
|
541
|
-
if request_task.callback_succeeded:
|
|
542
|
-
# If this is True, we assume the data was masked
|
|
543
|
-
# asynchronously and we can proceed to the next node.
|
|
544
|
-
logger.info(
|
|
545
|
-
"Masking callback succeeded for request task '{}'", request_task.id
|
|
546
|
-
)
|
|
547
|
-
# If we've received the callback for this node, return rows_masked directly
|
|
548
|
-
return request_task.rows_masked or 0
|
|
530
|
+
"""
|
|
531
|
+
Execute masking requests.
|
|
549
532
|
|
|
533
|
+
Handles synchronous requests directly and delegates async requests to external handlers.
|
|
534
|
+
"""
|
|
550
535
|
self.set_privacy_request_state(privacy_request, node, request_task)
|
|
536
|
+
|
|
551
537
|
query_config = self.query_config(node)
|
|
552
538
|
|
|
553
|
-
|
|
554
|
-
|
|
539
|
+
# Delegate async requests
|
|
540
|
+
with get_db() as db:
|
|
541
|
+
if async_dsr_strategy := _get_async_dsr_strategy(
|
|
542
|
+
db, request_task, query_config, ActionType.erasure
|
|
543
|
+
):
|
|
544
|
+
return async_dsr_strategy.async_mask_data(
|
|
545
|
+
client=self.create_client(),
|
|
546
|
+
request_task_id=request_task.id,
|
|
547
|
+
query_config=query_config,
|
|
548
|
+
rows=rows,
|
|
549
|
+
)
|
|
550
|
+
masking_request = query_config.get_masking_request()
|
|
555
551
|
rows_updated = 0
|
|
556
552
|
|
|
557
553
|
if not masking_request:
|
|
@@ -596,7 +592,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
596
592
|
for row in rows:
|
|
597
593
|
try:
|
|
598
594
|
prepared_request = query_config.generate_update_stmt(
|
|
599
|
-
row, policy, privacy_request
|
|
595
|
+
row, policy, privacy_request, input_data
|
|
600
596
|
)
|
|
601
597
|
except ValueError as exc:
|
|
602
598
|
if masking_request.skip_missing_param_values:
|
|
@@ -648,18 +644,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
648
644
|
)
|
|
649
645
|
|
|
650
646
|
self.unset_connector_state()
|
|
651
|
-
|
|
652
|
-
awaiting_async_callback: bool = bool(
|
|
653
|
-
masking_request.async_config
|
|
654
|
-
and masking_request.async_config.strategy == AsyncTaskType.callback.value
|
|
655
|
-
) and bool(
|
|
656
|
-
request_task.id
|
|
657
|
-
) # Only supported in DSR 3.0
|
|
658
|
-
if awaiting_async_callback:
|
|
659
|
-
# Asynchronous masking request detected in saas config.
|
|
660
|
-
# If the masking request was marked to expect async results, original responses are ignored
|
|
661
|
-
# and we raise an AwaitingAsyncTask to put this task in an awaiting_processing state.
|
|
662
|
-
raise AwaitingAsyncTask()
|
|
663
647
|
return rows_updated
|
|
664
648
|
|
|
665
649
|
@staticmethod
|
|
@@ -967,6 +951,9 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
967
951
|
client,
|
|
968
952
|
secrets,
|
|
969
953
|
) # type: ignore
|
|
954
|
+
except (ConnectionException, ClientUnsuccessfulException):
|
|
955
|
+
# Re-raise these exceptions as-is so the connection service can handle them properly
|
|
956
|
+
raise
|
|
970
957
|
except Exception as exc:
|
|
971
958
|
logger.error(
|
|
972
959
|
"Encountered error executing override test function '{}'",
|
|
@@ -1112,3 +1099,38 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
1112
1099
|
return []
|
|
1113
1100
|
|
|
1114
1101
|
return consent_requests.opt_in if opt_in else consent_requests.opt_out # type: ignore
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
def _get_async_dsr_strategy(
|
|
1105
|
+
session: Session,
|
|
1106
|
+
request_task: RequestTask,
|
|
1107
|
+
query_config: SaaSQueryConfig,
|
|
1108
|
+
action_type: ActionType,
|
|
1109
|
+
) -> Optional[AsyncDSRStrategy]:
|
|
1110
|
+
"""
|
|
1111
|
+
Returns the async DSR strategy if any of the read or masking requests have an async_config.
|
|
1112
|
+
"""
|
|
1113
|
+
|
|
1114
|
+
# Async processing is only supported for DSR 3.0.
|
|
1115
|
+
# A request task with an ID of None is an indicator that the request is not DSR 3.0.
|
|
1116
|
+
if request_task.id is None:
|
|
1117
|
+
return None
|
|
1118
|
+
|
|
1119
|
+
if action_type == ActionType.access:
|
|
1120
|
+
read_requests = query_config.get_read_requests_by_identity()
|
|
1121
|
+
for request in read_requests:
|
|
1122
|
+
if request.async_config is not None:
|
|
1123
|
+
return get_strategy(
|
|
1124
|
+
request.async_config.strategy,
|
|
1125
|
+
session,
|
|
1126
|
+
request.async_config.configuration,
|
|
1127
|
+
)
|
|
1128
|
+
elif action_type == ActionType.erasure:
|
|
1129
|
+
masking_request = query_config.get_masking_request()
|
|
1130
|
+
if masking_request is not None and masking_request.async_config is not None:
|
|
1131
|
+
return get_strategy(
|
|
1132
|
+
masking_request.async_config.strategy,
|
|
1133
|
+
session,
|
|
1134
|
+
masking_request.async_config.configuration,
|
|
1135
|
+
)
|
|
1136
|
+
return None
|
|
@@ -345,7 +345,7 @@ class SQLConnector(BaseConnector[Engine]):
|
|
|
345
345
|
|
|
346
346
|
# For simple table names
|
|
347
347
|
if "." not in qualified_table_name:
|
|
348
|
-
return
|
|
348
|
+
return self._check_table_exists(inspector, qualified_table_name)
|
|
349
349
|
|
|
350
350
|
# For qualified names like schema.table or database.schema.table
|
|
351
351
|
parts = qualified_table_name.split(".")
|
|
@@ -353,15 +353,15 @@ class SQLConnector(BaseConnector[Engine]):
|
|
|
353
353
|
if len(parts) == 2:
|
|
354
354
|
# schema.table format
|
|
355
355
|
schema_name, table_name = parts
|
|
356
|
-
return
|
|
356
|
+
return self._check_table_exists(inspector, table_name, schema_name)
|
|
357
357
|
|
|
358
358
|
if len(parts) >= 3:
|
|
359
359
|
# database.schema.table format (use schema.table)
|
|
360
360
|
schema_name, table_name = parts[-2], parts[-1]
|
|
361
|
-
return
|
|
361
|
+
return self._check_table_exists(inspector, table_name, schema_name)
|
|
362
362
|
|
|
363
363
|
# Fallback for unexpected format
|
|
364
|
-
return
|
|
364
|
+
return self._check_table_exists(inspector, qualified_table_name)
|
|
365
365
|
|
|
366
366
|
except Exception as exc:
|
|
367
367
|
# Graceful fallback - if we can't check, assume table exists
|
|
@@ -369,6 +369,16 @@ class SQLConnector(BaseConnector[Engine]):
|
|
|
369
369
|
logger.error("Unable to check if table exists, assuming it does: {}", exc)
|
|
370
370
|
return True
|
|
371
371
|
|
|
372
|
+
def _check_table_exists(
|
|
373
|
+
self, inspector: Any, table_name: str, schema: Optional[str] = None
|
|
374
|
+
) -> bool:
|
|
375
|
+
"""Helper method to check table existence and log if not found."""
|
|
376
|
+
table_exists = inspector.has_table(table_name, schema=schema)
|
|
377
|
+
if not table_exists:
|
|
378
|
+
qualified_name = f"{schema}.{table_name}" if schema else table_name
|
|
379
|
+
logger.error("Table '{}' does not exist", qualified_name)
|
|
380
|
+
return table_exists
|
|
381
|
+
|
|
372
382
|
def handle_table_not_found(
|
|
373
383
|
self,
|
|
374
384
|
node: ExecutionNode,
|
fides/api/service/deps.py
CHANGED
|
@@ -6,6 +6,7 @@ from fides.api.api.deps import get_config, get_config_proxy, get_db
|
|
|
6
6
|
from fides.api.db.ctl_session import get_async_db
|
|
7
7
|
from fides.config import FidesConfig
|
|
8
8
|
from fides.config.config_proxy import ConfigProxy
|
|
9
|
+
from fides.service.connection.connection_service import ConnectionService
|
|
9
10
|
from fides.service.dataset.dataset_config_service import DatasetConfigService
|
|
10
11
|
from fides.service.dataset.dataset_service import DatasetService
|
|
11
12
|
from fides.service.event_audit_service import EventAuditService
|
|
@@ -59,5 +60,12 @@ def get_taxonomy_service(
|
|
|
59
60
|
return TaxonomyService(db, event_audit_service)
|
|
60
61
|
|
|
61
62
|
|
|
63
|
+
def get_connection_service(
|
|
64
|
+
db: Session = Depends(get_db),
|
|
65
|
+
event_audit_service: EventAuditService = Depends(get_event_audit_service),
|
|
66
|
+
) -> ConnectionService:
|
|
67
|
+
return ConnectionService(db, event_audit_service)
|
|
68
|
+
|
|
69
|
+
|
|
62
70
|
def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
|
|
63
71
|
return SystemService(db)
|
|
@@ -28,6 +28,7 @@ from fides.api.schemas.messaging.messaging import (
|
|
|
28
28
|
ErrorNotificationBodyParams,
|
|
29
29
|
ExternalUserWelcomeBodyParams,
|
|
30
30
|
FidesopsMessage,
|
|
31
|
+
ManualTaskDigestBodyParams,
|
|
31
32
|
MessagingActionType,
|
|
32
33
|
MessagingMethod,
|
|
33
34
|
MessagingServiceDetails,
|
|
@@ -177,6 +178,7 @@ def dispatch_message(
|
|
|
177
178
|
UserInviteBodyParams,
|
|
178
179
|
ErrorNotificationBodyParams,
|
|
179
180
|
ExternalUserWelcomeBodyParams,
|
|
181
|
+
ManualTaskDigestBodyParams,
|
|
180
182
|
]
|
|
181
183
|
] = None,
|
|
182
184
|
subject_override: Optional[str] = None,
|
|
@@ -352,7 +354,7 @@ def _render(template_str: str, variables: Optional[Dict] = None) -> str:
|
|
|
352
354
|
return template_str
|
|
353
355
|
|
|
354
356
|
|
|
355
|
-
def _build_email( # pylint: disable=too-many-return-statements, too-many-branches
|
|
357
|
+
def _build_email( # pylint: disable=too-many-return-statements, too-many-branches, too-many-statements
|
|
356
358
|
config_proxy: ConfigProxy,
|
|
357
359
|
action_type: MessagingActionType,
|
|
358
360
|
body_params: Any,
|
|
@@ -494,6 +496,41 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
|
|
|
494
496
|
template_variables=variables,
|
|
495
497
|
)
|
|
496
498
|
|
|
499
|
+
if action_type == MessagingActionType.MANUAL_TASK_DIGEST:
|
|
500
|
+
variables = {
|
|
501
|
+
"vendor_contact_name": body_params.vendor_contact_name,
|
|
502
|
+
"organization_name": body_params.organization_name,
|
|
503
|
+
"portal_url": body_params.portal_url,
|
|
504
|
+
"imminent_task_count": body_params.imminent_task_count,
|
|
505
|
+
"upcoming_task_count": body_params.upcoming_task_count,
|
|
506
|
+
"total_task_count": body_params.total_task_count,
|
|
507
|
+
"company_logo_url": body_params.company_logo_url,
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
# Start with default subject
|
|
511
|
+
subject = f"Weekly DSR Summary from {body_params.organization_name}"
|
|
512
|
+
|
|
513
|
+
# If messaging template exists, extract customizable content
|
|
514
|
+
if messaging_template:
|
|
515
|
+
# Use custom subject if provided
|
|
516
|
+
if "subject" in messaging_template.content:
|
|
517
|
+
subject = _render(messaging_template.content["subject"], variables)
|
|
518
|
+
|
|
519
|
+
# Use custom body content to replace the intro text in HTML template
|
|
520
|
+
custom_body = messaging_template.content.get("body", "")
|
|
521
|
+
if custom_body.strip():
|
|
522
|
+
# Replace the default intro text with the custom body content
|
|
523
|
+
rendered_custom_body = _render(custom_body, variables)
|
|
524
|
+
variables["intro_text"] = rendered_custom_body
|
|
525
|
+
|
|
526
|
+
# Always use the HTML template
|
|
527
|
+
base_template = get_email_template(action_type)
|
|
528
|
+
return EmailForActionType(
|
|
529
|
+
subject=subject,
|
|
530
|
+
body=base_template.render(variables),
|
|
531
|
+
template_variables=variables,
|
|
532
|
+
)
|
|
533
|
+
|
|
497
534
|
logger.error("Message action type {} is not implemented", action_type)
|
|
498
535
|
raise MessageDispatchException(
|
|
499
536
|
f"Message action type {action_type} is not implemented"
|
|
@@ -5,7 +5,7 @@ from typing import Any, Dict, Iterator, List, Optional, Tuple
|
|
|
5
5
|
from loguru import logger
|
|
6
6
|
|
|
7
7
|
from fides.api.models.attachment import Attachment, AttachmentType
|
|
8
|
-
from fides.api.schemas.storage.storage import StorageDetails
|
|
8
|
+
from fides.api.schemas.storage.storage import StorageDetails, StorageType
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
@dataclass
|
|
@@ -84,12 +84,19 @@ def get_attachments_content(
|
|
|
84
84
|
continue
|
|
85
85
|
|
|
86
86
|
processed_count += 1
|
|
87
|
+
|
|
88
|
+
# Handle bucket_name differently for different storage types
|
|
89
|
+
bucket_name = None
|
|
90
|
+
if attachment.config.type in [StorageType.s3, StorageType.gcs]:
|
|
91
|
+
bucket_name = attachment.config.details[StorageDetails.BUCKET.value]
|
|
92
|
+
# For local storage, bucket_name is not needed
|
|
93
|
+
|
|
87
94
|
yield AttachmentData(
|
|
88
95
|
file_name=attachment.file_name,
|
|
89
96
|
file_size=size,
|
|
90
97
|
download_url=str(url) if url else None,
|
|
91
98
|
content_type=attachment.content_type,
|
|
92
|
-
bucket_name=
|
|
99
|
+
bucket_name=bucket_name or "", # Empty string for local storage
|
|
93
100
|
file_key=attachment.file_key,
|
|
94
101
|
storage_key=attachment.storage_key,
|
|
95
102
|
)
|