ethyca-fides 2.69.1rc0__py2.py3-none-any.whl → 2.76.0rc2__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.
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/METADATA +9 -6
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/RECORD +488 -361
- 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/0eef0016cf06_adding_oauth2_config_for_.py +69 -0
- fides/api/alembic/migrations/versions/303287c70600_migrate_resource_type_from_enum_to_.py +99 -0
- fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
- fides/api/alembic/migrations/versions/3efe14d4469a_adds_new_experience_configs_for_vendor_.py +79 -0
- fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
- fides/api/alembic/migrations/versions/4d8c0fcc5771_adding_default_system_groups.py +78 -0
- fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
- fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
- fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
- fides/api/alembic/migrations/versions/795f46f656c0_migrate_field_type_from_enum_to_string.py +61 -0
- fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
- fides/api/alembic/migrations/versions/918aefc950c9_create_digest_conditional_dependencies.py +125 -0
- fides/api/alembic/migrations/versions/9caf76161e55_make_user_assigned_data_uses_nullable_.py +64 -0
- fides/api/alembic/migrations/versions/9e0dcbf67b9f_add_digest_config.py +84 -0
- fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
- fides/api/alembic/migrations/versions/a8e0c016afd_add_classification_benchmark_table.py +126 -0
- fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
- fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
- fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
- fides/api/alembic/migrations/versions/cd8649be3a2b_add_classifications_and_user_assigned_.py +74 -0
- fides/api/alembic/migrations/versions/e2cda8d6abc3_add_dismissed_in_activity_view_to_.py +29 -0
- fides/api/alembic/migrations/versions/f108fa05c579_adds_optional_duration_field_to_assets.py +28 -0
- fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
- fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -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/alembic/migrations/versions/xx_2025_11_07_1709_56fe6fad2d89_add_notice_display_order.py +47 -0
- fides/api/alembic/migrations/versions/xx_2025_11_10_1200_a1b2c3d4e5f6_add_test_datastore_to_connectiontype.py +53 -0
- fides/api/alembic/migrations/versions/xx_2025_11_11_1317_7d82c8fc4c34_store_saas_template_datasets.py +68 -0
- fides/api/alembic/migrations/versions/xx_2025_11_12_1430_b2c3d4e5f6a7_add_default_identity_definitions.py +81 -0
- fides/api/alembic/migrations/versions/xx_2025_11_25_1854_3ff6449c099e_add_index_on_providedidentity_privacy_.py +50 -0
- fides/api/api/v1/api.py +2 -0
- fides/api/api/v1/endpoints/admin.py +39 -0
- fides/api/api/v1/endpoints/connection_endpoints.py +191 -47
- fides/api/api/v1/endpoints/connector_template_endpoints.py +167 -0
- fides/api/api/v1/endpoints/generic_overrides.py +90 -15
- fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
- fides/api/api/v1/endpoints/pre_approval_webhook_endpoints.py +5 -5
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +231 -46
- fides/api/api/v1/endpoints/saas_config_endpoints.py +63 -92
- fides/api/api/v1/endpoints/storage_endpoints.py +5 -1
- fides/api/api/v1/endpoints/system.py +157 -100
- fides/api/api/v1/endpoints/user_endpoints.py +17 -4
- fides/api/app_setup.py +1 -3
- fides/api/common_exceptions.py +8 -0
- fides/api/db/base.py +8 -0
- fides/api/db/crud.py +30 -2
- fides/api/db/database.py +261 -4
- fides/api/db/safe_crud.py +377 -0
- fides/api/db/seed.py +35 -1
- fides/api/email_templates/get_email_template.py +3 -0
- fides/api/email_templates/template_names.py +1 -0
- fides/api/email_templates/templates/external_user_welcome.html +9 -5
- fides/api/email_templates/templates/manual_task_digest.html +316 -0
- fides/api/main.py +2 -0
- fides/api/migrations/post_upgrade_index_creation.py +20 -0
- fides/api/models/asset.py +17 -1
- fides/api/models/attachment.py +1 -0
- fides/api/models/conditional_dependency/__init__.py +0 -0
- fides/api/models/conditional_dependency/conditional_dependency_base.py +311 -0
- fides/api/models/connection_oauth_credentials.py +57 -0
- fides/api/models/connectionconfig.py +11 -1
- fides/api/models/detection_discovery/__init__.py +4 -0
- fides/api/models/detection_discovery/classification_benchmark.py +140 -0
- fides/api/models/detection_discovery/core.py +78 -3
- fides/api/models/detection_discovery/monitor_task.py +3 -1
- fides/api/models/detection_discovery/staged_resource_error.py +25 -0
- fides/api/models/detection_discovery/web_monitor.py +61 -0
- fides/api/models/digest/__init__.py +16 -0
- fides/api/models/digest/conditional_dependencies.py +275 -0
- fides/api/models/digest/digest_config.py +110 -0
- fides/api/models/digest/digest_execution.py +142 -0
- fides/api/models/event_audit.py +85 -0
- fides/api/models/experience_notices.py +6 -1
- fides/api/models/fides_user.py +9 -0
- fides/api/models/identity_definition.py +66 -0
- fides/api/models/location_regulation_selections.py +22 -0
- fides/api/models/manual_task/conditional_dependency.py +29 -87
- fides/api/models/manual_webhook.py +17 -6
- fides/api/models/messaging.py +30 -10
- fides/api/models/messaging_template.py +14 -0
- fides/api/models/policy.py +27 -0
- fides/api/models/privacy_experience.py +41 -0
- fides/api/models/privacy_notice.py +196 -13
- 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 +154 -8
- fides/api/models/privacy_request/provided_identity.py +22 -1
- fides/api/models/privacy_request/request_task.py +98 -1
- fides/api/models/privacy_request/webhook.py +3 -1
- fides/api/models/saas_template_dataset.py +63 -0
- fides/api/models/sql_models.py +161 -7
- fides/api/models/system_group.py +85 -0
- fides/api/models/taxonomy.py +91 -9
- 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/oauth/roles.py +4 -0
- fides/api/schemas/application_config.py +32 -1
- fides/api/schemas/connection_configuration/connection_config.py +1 -30
- fides/api/schemas/connection_configuration/connection_oauth_config.py +42 -0
- fides/api/schemas/connection_configuration/connection_secrets_mongodb.py +15 -3
- fides/api/schemas/connection_configuration/connection_secrets_mssql.py +5 -0
- fides/api/schemas/messaging/messaging.py +49 -66
- fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
- fides/api/schemas/messaging/shared_schemas.py +102 -0
- fides/api/schemas/oauth.py +2 -1
- fides/api/schemas/privacy_center_config.py +29 -5
- fides/api/schemas/privacy_request.py +44 -7
- fides/api/schemas/saas/async_polling_configuration.py +81 -0
- fides/api/schemas/saas/connector_template.py +14 -0
- fides/api/schemas/saas/saas_config.py +12 -20
- fides/api/schemas/system.py +8 -0
- fides/api/schemas/taxonomy_extensions.py +8 -0
- fides/api/schemas/user.py +2 -2
- 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 +691 -0
- fides/api/service/async_dsr/utils.py +130 -0
- fides/api/service/connectors/base_erasure_email_connector.py +7 -0
- fides/api/service/connectors/bigquery_connector.py +34 -16
- fides/api/service/connectors/fides/fides_client.py +63 -1
- fides/api/service/connectors/http_connector.py +48 -12
- fides/api/service/connectors/microsoft_sql_server_connector.py +6 -1
- fides/api/service/connectors/mongodb_connector.py +74 -9
- fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
- fides/api/service/connectors/saas/connector_registry_service.py +42 -135
- fides/api/service/connectors/saas_connector.py +116 -76
- fides/api/service/connectors/sql_connector.py +14 -4
- fides/api/service/deps.py +25 -2
- fides/api/service/messaging/message_dispatch_service.py +98 -20
- fides/api/service/messaging/messaging_crud_service.py +5 -9
- fides/api/service/privacy_request/attachment_handling.py +9 -2
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +17 -9
- fides/api/service/privacy_request/dsr_package/templates/attachments_index.html +41 -30
- fides/api/service/privacy_request/dsr_package/templates/clickme.html +68 -0
- fides/api/service/privacy_request/dsr_package/templates/dataset_index.html +30 -27
- fides/api/service/privacy_request/duplication_detection.py +439 -0
- fides/api/service/privacy_request/email_batch_service.py +2 -1
- fides/api/service/privacy_request/request_runner_service.py +92 -91
- fides/api/service/privacy_request/request_service.py +74 -90
- fides/api/service/saas_request/saas_request_override_factory.py +71 -1
- fides/api/service/storage/streaming/schemas.py +27 -19
- fides/api/service/storage/streaming/smart_open_client.py +2 -2
- fides/api/service/storage/streaming/smart_open_streaming_storage.py +238 -147
- fides/api/service/storage/util.py +20 -106
- fides/api/service/strategy.py +6 -3
- fides/api/task/conditional_dependencies/privacy_request/__init__.py +0 -0
- fides/api/task/conditional_dependencies/privacy_request/convenience_fields.py +155 -0
- fides/api/task/conditional_dependencies/privacy_request/privacy_request_data.py +140 -0
- fides/api/task/conditional_dependencies/privacy_request/schemas.py +212 -0
- fides/api/task/conditional_dependencies/sql_schemas.py +301 -0
- fides/api/task/conditional_dependencies/sql_translator.py +757 -0
- fides/api/task/conditional_dependencies/util.py +111 -0
- fides/api/task/execute_request_tasks.py +34 -13
- fides/api/task/filter_results.py +35 -2
- fides/api/task/graph_runners.py +2 -32
- fides/api/task/graph_task.py +42 -12
- fides/api/task/manual/manual_task_conditional_evaluation.py +33 -28
- fides/api/task/manual/manual_task_graph_task.py +4 -1
- fides/api/task/manual/manual_task_utils.py +68 -26
- fides/api/task/scheduler_utils.py +39 -0
- fides/api/tasks/__init__.py +15 -1
- fides/api/util/cache.py +5 -1
- fides/api/util/connection_util.py +101 -218
- fides/api/util/event_audit_util.py +230 -0
- fides/api/util/filter_utils.py +0 -3
- fides/api/util/fuzzy_search_utils.py +7 -1
- fides/api/util/lock.py +13 -3
- fides/api/util/logger.py +58 -4
- 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/rate_limit.py +25 -7
- fides/api/util/saas_config_updater.py +76 -0
- fides/api/util/saas_util.py +28 -1
- fides/api/worker/__init__.py +6 -0
- fides/common/api/scope_registry.py +6 -7
- fides/common/api/v1/urn_registry.py +15 -3
- fides/config/__init__.py +11 -2
- 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 +6 -6
- fides/config/security_settings.py +4 -1
- 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/dataset/dataset_service.py +39 -0
- fides/service/event_audit_service.py +109 -0
- fides/service/messaging/aws_ses_service.py +2 -4
- fides/service/messaging/messaging_service.py +75 -74
- fides/service/privacy_request/privacy_request_service.py +345 -100
- fides/service/system/__init__.py +0 -0
- fides/service/system/system_service.py +153 -0
- fides/service/taxonomy/handlers/legacy_handler.py +3 -3
- fides/service/taxonomy/taxonomy_service.py +64 -18
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-688fa865621531cc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1115-7fd171dac1eb0e51.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1276.deb10ae2643f8463.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1438-8a33b3834d6e43f3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1821-c1daa160f492aacf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1840-359ee056e4cf6629.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.bef017bc80e2012c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2040-70972e15960d9afe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2121.321b0fd3932164d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2397-3434603a97f3f5d6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2921-49ed0ed897832958.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3150-da5406b80d25fe6d.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-02bf9780fd383d94.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-5e1ba5dd68b5ec48.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3729-31ff8ba51491bf21.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3872-cff30ca0844fe2b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3931-8bedde156fe83564.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/401-582d9970d89deefe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4093-7e47408c28de5375.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/431-e01ee730c8ad9ece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4322-f6aeff6880726c83.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4339-04a715ab07122744.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4496-ccbce2459174e0d6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4589-c1d83c6a8dab4d30.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4809-a8f4a108a42f53ed.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4903-19c0bc07a956dfa8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4910-d990773601f794c1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-96423702fba70ced.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-4e308cca01d59367.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-5c3501754bf027ba.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/549-1bdc3e6f3264c020.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5505-43b9c39491b88e08.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5698.2135391a128cc373.js +164 -0
- fides/ui-build/static/admin/_next/static/chunks/5783-016dfcee8e49bf61.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5826-4db99ea4e5077911.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/590-be447cacf12419dd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6084-91badbc6569a0efb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6344-026cb323c1d49926.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6362-ba0e12f2fc4cad94.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6853-882889659769d7b4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6882-bb1b469d7d7f5335.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-0dcf22a9aabe39c5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7170-46db82bb5b55e856.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7218-2ace8c82e3e7eb74.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7245-1cdafb35f289861b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7630-7f75ab7b8df42eb3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7654-2e9a8be02e41769a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8212-348ddd2b6933db70.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5596-bb601cbf40e47a0f.js → 9195-da717d324917b049.js} +3 -3
- fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.9fd9552ef744c717.js → 9676.1f395eeb9cc34968.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9826-1078e46f3ac0b688.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-800be6996aaa999c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-de4b578c904df772.js} +57 -220
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-f12020b82dd4bd1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-a911b7990371704d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-ad585b79953c2753.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-bb263d394ca1c8fa.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-6907c368d8611c44.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-c32f381af358149b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-e74cb5ea87f15b40.js → new-6efb3c069d8b47dd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-1975c529905eea9b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-b05331178928ab52.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-516834e930bb0d0d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-985717f2565f9d9d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-2be773e08498e40c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-850afb74f4192e87.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-b63d1e395d879b86.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-5b28f0f674ea87bd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-676177e2f3c9c2a2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-794906929efb8e1d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-3ccbf7c0d06507b9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-1ea0b24d306b1e67.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-d4861a4a218bb65a.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/infrastructure/[monitorId]-66bd265044daf97d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/infrastructure-c9c79fa8576a4f77.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-60cacc3232c2eead.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-437bd64a3016de36.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-8349248c2da970a6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-6919a1d6cadaa46b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-1a50d421897d3da1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-49509414a15e8393.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-1a1bb80b586d0c0f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-49de61df1e8e7fba.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c2719f5cff20c0f8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-dfd71c1e9c458b89.js → [...subfieldNames]-415015aebab60436.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-7cdc42ec5493b83d.js → [collectionName]-5accb09715b5122d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-aebecca1d8ec5f98.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-9551a82ddec9f909.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-72f8fe47beef0f09.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-3a8aa3f633528e88.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-87512616f35ec6da.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-2f1bf4eac7aa55fd.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-8d67cd2872cb682a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-7a631df29cd0e31a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-ea3bc43cdaf273de.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-5d8632bba1b81cd4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-92e01822ecde8fb8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-1256cf6d3f6794e0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-0daac00911d27617.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-2d976fe5e8ba0a3a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-7766ba497b863740.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-f2880d2ed4734270.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-669f585c3458faff.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-c79e7724e4bc3899.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-891654e8dc13965c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications-40c8148244c5d347.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-1e86f3e28bd23ed6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-9b7bd8c38f02c091.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-b18a53a940cf9e19.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6d028d7450e77578.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-8399083ee2cd8cc2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-0a910125cdb2b3b8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-acc90b6f7fe915cb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-bbc42026f2685438.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-c08ca6ad21c99799.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-77c2db582f8823bc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-74ccea4868408e3d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-7d9f09bfe9d44dfc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-cd77bc30672bb1fa.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-cc3bd9540132d5ed.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-7ce7d720107ab4b5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-ae789892343c24f5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-13ee1b331ced0846.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-ee4e43692336a330.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-ca51d794abfcbf25.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-ecd1dc5db8e81409.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-df06f7e2f668c540.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-da0c77bd510c6c51.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-950b0c115bf673d8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-7e36cb4756973a9d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-a0e5ed486d24ccf3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-3cdebafb6870d3ad.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-159aad34f1021320.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-dbd1a64090ad0946.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-7d042497a57a3788.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-21f1172e73dfc9f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-e553161e6338ee48.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-efc4af017723e57a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-b152319d67372ee4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-dba8692491f7935e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/webpack-09ca52bc7beb0b43.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/3d66bb57ddcb0978.css +1 -0
- fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1e4be9466578ef1.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/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/_next/static/l2vgGUHB04Fi4oEVlVMrc/_buildManifest.js +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/infrastructure/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/infrastructure.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/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 -0
- fides/ui-build/static/admin/settings/custom-fields/new.html +1 -0
- 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 -75
- fides/api/service/privacy_request/dsr_package/templates/welcome.html +0 -66
- fides/ui-build/static/admin/_next/static/OmXHlY9MvjoZH9jDkAytl/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.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-52328140bc420d0f.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-d04125c828d591a1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3847-230bf61b053bc706.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-ef5194cdb228beb6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3923-bb2417b8dcade7a4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-4af0a912e249d30f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5258-b0de22a8521686ab.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-b17673391117c976.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.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/9826-dbae8dee941a7fac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9951-a88367a129b724ba.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ace203dfacacbdc4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-920fb469e0dda1d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-9dda4de5ec580279.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-0d4844d0b808e6e4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-28b192e2c074b0f3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-2c29ff7a01198f30.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-8eb581024bc0172f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-e1ba213fb666b3f4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-6d133580045abdda.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-927b7e476c4b47d0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-cbe100d50df34285.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4c3c413a2668df53.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-95402b5001c07ef2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-3c6dc2f6e6bae960.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-4a6d4023a7791be8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-76b204c9b98d656f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-bc0e2adf6e0d3ac7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-86ffcc1ad3fa912e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-ec04f595465bdf69.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-41d309754ff0c1de.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-cab1f78cec7808f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-eb6058221403b156.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-48500551fd6a7602.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-6903f42a0412bfa6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-9495e2eb506606c7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-6e15332935f6b538.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-9cec020f89544426.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-678e89d68dbcd94f.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/304c6f148886a8d4.css +0 -1
- fides/ui-build/static/admin/_next/static/css/650df9c348000a26.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/poc/table-migration.html +0 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.69.1rc0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-81d1b50585468fb0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/{OmXHlY9MvjoZH9jDkAytl → l2vgGUHB04Fi4oEVlVMrc}/_ssgManifest.js +0 -0
|
@@ -10,8 +10,10 @@ 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
19
|
SkippingConsentPropagation,
|
|
@@ -27,7 +29,6 @@ from fides.api.schemas.consentable_item import (
|
|
|
27
29
|
from fides.api.schemas.limiter.rate_limit_config import RateLimitConfig
|
|
28
30
|
from fides.api.schemas.policy import ActionType
|
|
29
31
|
from fides.api.schemas.saas.saas_config import (
|
|
30
|
-
AsyncStrategy,
|
|
31
32
|
ClientConfig,
|
|
32
33
|
ConsentRequestMap,
|
|
33
34
|
ParamValue,
|
|
@@ -38,6 +39,10 @@ from fides.api.schemas.saas.shared_schemas import (
|
|
|
38
39
|
ConsentPropagationStatus,
|
|
39
40
|
SaaSRequestParams,
|
|
40
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
|
+
)
|
|
41
46
|
from fides.api.service.connectors.base_connector import BaseConnector
|
|
42
47
|
from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
|
|
43
48
|
from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
|
|
@@ -64,7 +69,9 @@ from fides.api.util.logger_context_utils import (
|
|
|
64
69
|
from fides.api.util.saas_util import (
|
|
65
70
|
ALL_OBJECT_FIELDS,
|
|
66
71
|
CUSTOM_PRIVACY_REQUEST_FIELDS,
|
|
72
|
+
PRIVACY_REQUEST_OBJECT,
|
|
67
73
|
assign_placeholders,
|
|
74
|
+
check_dataset_missing_reference_values,
|
|
68
75
|
map_param_values,
|
|
69
76
|
)
|
|
70
77
|
|
|
@@ -215,17 +222,14 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
215
222
|
request_task: RequestTask,
|
|
216
223
|
input_data: Dict[str, List[Any]],
|
|
217
224
|
) -> List[Row]:
|
|
218
|
-
"""
|
|
225
|
+
"""
|
|
226
|
+
Retrieve data from SaaS APIs.
|
|
227
|
+
|
|
228
|
+
Handles sync requests directly and delegates async requests to external handlers.
|
|
229
|
+
"""
|
|
219
230
|
|
|
220
231
|
# pylint: disable=too-many-branches
|
|
221
232
|
self.set_privacy_request_state(privacy_request, node, request_task)
|
|
222
|
-
if request_task.callback_succeeded:
|
|
223
|
-
# If this is True, we assume we've received results from a third party
|
|
224
|
-
# asynchronously and we can proceed to the next node.
|
|
225
|
-
logger.info(
|
|
226
|
-
"Access callback succeeded for request task '{}'", request_task.id
|
|
227
|
-
)
|
|
228
|
-
return request_task.get_access_data()
|
|
229
233
|
query_config: SaaSQueryConfig = self.query_config(node)
|
|
230
234
|
|
|
231
235
|
# generate initial set of requests if read request is defined, otherwise raise an exception
|
|
@@ -263,25 +267,32 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
263
267
|
if custom_privacy_request_fields:
|
|
264
268
|
input_data[CUSTOM_PRIVACY_REQUEST_FIELDS] = [custom_privacy_request_fields]
|
|
265
269
|
|
|
266
|
-
|
|
267
|
-
|
|
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
|
|
268
272
|
for read_request in read_requests:
|
|
269
|
-
self.set_saas_request_state(read_request)
|
|
270
|
-
if (
|
|
271
|
-
read_request.async_config
|
|
272
|
-
and read_request.async_config.strategy == AsyncStrategy.callback
|
|
273
|
-
and request_task.id # Only supported in DSR 3.0
|
|
274
|
-
):
|
|
275
|
-
# Asynchronous read request detected. We will exit below and put the
|
|
276
|
-
# Request Task in an "awaiting_processing" status.
|
|
277
|
-
awaiting_async_callback = True
|
|
278
|
-
|
|
279
|
-
# check all the values specified by param_values are provided in input_data
|
|
280
273
|
if self._missing_dataset_reference_values(
|
|
281
274
|
input_data, read_request.param_values
|
|
282
275
|
):
|
|
283
276
|
return []
|
|
284
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
|
+
|
|
285
296
|
# hook for user-provided request override functions
|
|
286
297
|
if read_request.request_override:
|
|
287
298
|
return self._invoke_read_request_override(
|
|
@@ -297,7 +308,12 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
297
308
|
# if a path is provided, it means we want to generate HTTP requests from the config
|
|
298
309
|
if read_request.path:
|
|
299
310
|
prepared_requests: List[Tuple[SaaSRequestParams, Dict[str, Any]]] = (
|
|
300
|
-
query_config.generate_requests(
|
|
311
|
+
query_config.generate_requests(
|
|
312
|
+
input_data,
|
|
313
|
+
policy,
|
|
314
|
+
read_request,
|
|
315
|
+
privacy_request=privacy_request,
|
|
316
|
+
)
|
|
301
317
|
)
|
|
302
318
|
|
|
303
319
|
# Iterates through initial list of prepared requests and through subsequent
|
|
@@ -321,7 +337,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
321
337
|
# This allows us to build an output object even if we didn't generate and execute
|
|
322
338
|
# any HTTP requests. This is useful if we just want to select specific input_data
|
|
323
339
|
# values to provide as row data to the mask_data function
|
|
324
|
-
elif read_request.output:
|
|
340
|
+
elif not read_request.path and read_request.output:
|
|
325
341
|
rows.extend(
|
|
326
342
|
self._apply_output_template(
|
|
327
343
|
query_config.generate_param_value_maps(
|
|
@@ -332,14 +348,21 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
332
348
|
)
|
|
333
349
|
|
|
334
350
|
self.unset_connector_state()
|
|
335
|
-
if awaiting_async_callback:
|
|
336
|
-
# If a read request was marked to expect async results, original response data here is ignored.
|
|
337
|
-
# We'll instead use the data received in the callback URL later.
|
|
338
|
-
# Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
|
|
339
|
-
raise AwaitingAsyncTask()
|
|
340
|
-
|
|
341
351
|
return rows
|
|
342
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
|
+
|
|
343
366
|
def _apply_output_template(
|
|
344
367
|
self,
|
|
345
368
|
param_value_maps: List[Dict[str, Any]],
|
|
@@ -369,29 +392,15 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
369
392
|
return result
|
|
370
393
|
|
|
371
394
|
def _missing_dataset_reference_values(
|
|
372
|
-
self, input_data: Dict[str, Any], param_values: Optional[List[ParamValue]]
|
|
395
|
+
self, input_data: Dict[str, List[Any]], param_values: Optional[List[ParamValue]]
|
|
373
396
|
) -> List[str]:
|
|
374
397
|
"""Return a list of dataset reference values that are not found in the input_data map"""
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
if param_value.references
|
|
381
|
-
]
|
|
382
|
-
|
|
383
|
-
# extract the keys from inside the fides_grouped_inputs and append them the other input_data keys
|
|
384
|
-
provided_input_keys = (
|
|
385
|
-
list(input_data.get("fidesops_grouped_inputs")[0].keys()) # type: ignore
|
|
386
|
-
if input_data.get("fidesops_grouped_inputs")
|
|
387
|
-
else []
|
|
388
|
-
) + list(input_data.keys())
|
|
389
|
-
|
|
390
|
-
# find the missing values
|
|
391
|
-
missing_dataset_reference_values = list(
|
|
392
|
-
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}"
|
|
393
403
|
)
|
|
394
|
-
|
|
395
404
|
if missing_dataset_reference_values:
|
|
396
405
|
logger.info(
|
|
397
406
|
"The '{}' request of {} is missing the following dataset reference values [{}], skipping traversal",
|
|
@@ -518,22 +527,27 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
518
527
|
rows: List[Row],
|
|
519
528
|
input_data: Optional[Dict[str, List[Any]]] = None,
|
|
520
529
|
) -> int:
|
|
521
|
-
"""
|
|
522
|
-
|
|
523
|
-
if request_task.callback_succeeded:
|
|
524
|
-
# If this is True, we assume the data was masked
|
|
525
|
-
# asynchronously and we can proceed to the next node.
|
|
526
|
-
logger.info(
|
|
527
|
-
"Masking callback succeeded for request task '{}'", request_task.id
|
|
528
|
-
)
|
|
529
|
-
# If we've received the callback for this node, return rows_masked directly
|
|
530
|
-
return request_task.rows_masked or 0
|
|
530
|
+
"""
|
|
531
|
+
Execute masking requests.
|
|
531
532
|
|
|
533
|
+
Handles synchronous requests directly and delegates async requests to external handlers.
|
|
534
|
+
"""
|
|
532
535
|
self.set_privacy_request_state(privacy_request, node, request_task)
|
|
536
|
+
|
|
533
537
|
query_config = self.query_config(node)
|
|
534
538
|
|
|
535
|
-
|
|
536
|
-
|
|
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()
|
|
537
551
|
rows_updated = 0
|
|
538
552
|
|
|
539
553
|
if not masking_request:
|
|
@@ -578,7 +592,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
578
592
|
for row in rows:
|
|
579
593
|
try:
|
|
580
594
|
prepared_request = query_config.generate_update_stmt(
|
|
581
|
-
row, policy, privacy_request
|
|
595
|
+
row, policy, privacy_request, input_data
|
|
582
596
|
)
|
|
583
597
|
except ValueError as exc:
|
|
584
598
|
if masking_request.skip_missing_param_values:
|
|
@@ -630,18 +644,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
630
644
|
)
|
|
631
645
|
|
|
632
646
|
self.unset_connector_state()
|
|
633
|
-
|
|
634
|
-
awaiting_async_callback: bool = bool(
|
|
635
|
-
masking_request.async_config
|
|
636
|
-
and masking_request.async_config.strategy == AsyncStrategy.callback
|
|
637
|
-
) and bool(
|
|
638
|
-
request_task.id
|
|
639
|
-
) # Only supported in DSR 3.0
|
|
640
|
-
if awaiting_async_callback:
|
|
641
|
-
# Asynchronous masking request detected in saas config.
|
|
642
|
-
# If the masking request was marked to expect async results, original responses are ignored
|
|
643
|
-
# and we raise an AwaitingAsyncTask to put this task in an awaiting_processing state.
|
|
644
|
-
raise AwaitingAsyncTask()
|
|
645
647
|
return rows_updated
|
|
646
648
|
|
|
647
649
|
@staticmethod
|
|
@@ -949,6 +951,9 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
949
951
|
client,
|
|
950
952
|
secrets,
|
|
951
953
|
) # type: ignore
|
|
954
|
+
except (ConnectionException, ClientUnsuccessfulException):
|
|
955
|
+
# Re-raise these exceptions as-is so the connection service can handle them properly
|
|
956
|
+
raise
|
|
952
957
|
except Exception as exc:
|
|
953
958
|
logger.error(
|
|
954
959
|
"Encountered error executing override test function '{}'",
|
|
@@ -1094,3 +1099,38 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
1094
1099
|
return []
|
|
1095
1100
|
|
|
1096
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
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
from fastapi import Depends
|
|
2
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
2
3
|
from sqlalchemy.orm import Session
|
|
3
4
|
|
|
4
5
|
from fides.api.api.deps import get_config, get_config_proxy, get_db
|
|
6
|
+
from fides.api.db.ctl_session import get_async_db
|
|
5
7
|
from fides.config import FidesConfig
|
|
6
8
|
from fides.config.config_proxy import ConfigProxy
|
|
9
|
+
from fides.service.connection.connection_service import ConnectionService
|
|
7
10
|
from fides.service.dataset.dataset_config_service import DatasetConfigService
|
|
8
11
|
from fides.service.dataset.dataset_service import DatasetService
|
|
12
|
+
from fides.service.event_audit_service import EventAuditService
|
|
9
13
|
from fides.service.messaging.messaging_service import MessagingService
|
|
10
14
|
from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
|
|
15
|
+
from fides.service.system.system_service import SystemService
|
|
11
16
|
from fides.service.taxonomy.taxonomy_service import TaxonomyService
|
|
12
17
|
from fides.service.user.user_service import UserService
|
|
13
18
|
|
|
@@ -44,5 +49,23 @@ def get_user_service(
|
|
|
44
49
|
return UserService(db, config, config_proxy)
|
|
45
50
|
|
|
46
51
|
|
|
47
|
-
def
|
|
48
|
-
return
|
|
52
|
+
def get_event_audit_service(db: Session = Depends(get_db)) -> EventAuditService:
|
|
53
|
+
return EventAuditService(db)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def get_taxonomy_service(
|
|
57
|
+
db: Session = Depends(get_db),
|
|
58
|
+
event_audit_service: EventAuditService = Depends(get_event_audit_service),
|
|
59
|
+
) -> TaxonomyService:
|
|
60
|
+
return TaxonomyService(db, event_audit_service)
|
|
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
|
+
|
|
70
|
+
def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
|
|
71
|
+
return SystemService(db)
|
|
@@ -6,6 +6,7 @@ from typing import Any, Callable, Dict, List, Optional, Union
|
|
|
6
6
|
import requests
|
|
7
7
|
import sendgrid
|
|
8
8
|
from loguru import logger
|
|
9
|
+
from requests.exceptions import RequestException, Timeout
|
|
9
10
|
from sendgrid.helpers.mail import Content, Email, Mail, Personalization, TemplateId, To
|
|
10
11
|
from sqlalchemy.orm import Session
|
|
11
12
|
from twilio.base.exceptions import TwilioRestException
|
|
@@ -28,6 +29,7 @@ from fides.api.schemas.messaging.messaging import (
|
|
|
28
29
|
ErrorNotificationBodyParams,
|
|
29
30
|
ExternalUserWelcomeBodyParams,
|
|
30
31
|
FidesopsMessage,
|
|
32
|
+
ManualTaskDigestBodyParams,
|
|
31
33
|
MessagingActionType,
|
|
32
34
|
MessagingMethod,
|
|
33
35
|
MessagingServiceDetails,
|
|
@@ -44,7 +46,6 @@ from fides.api.service.messaging.messaging_crud_service import (
|
|
|
44
46
|
get_enabled_messaging_template_by_type_and_property,
|
|
45
47
|
)
|
|
46
48
|
from fides.api.tasks import DatabaseTask, celery_app
|
|
47
|
-
from fides.api.util.logger import Pii
|
|
48
49
|
from fides.config import CONFIG
|
|
49
50
|
from fides.config.config_proxy import ConfigProxy
|
|
50
51
|
from fides.service.messaging.aws_ses_service import AWS_SES_Service
|
|
@@ -53,7 +54,18 @@ EMAIL_JOIN_STRING = ", "
|
|
|
53
54
|
EMAIL_TEMPLATE_NAME = "fides"
|
|
54
55
|
|
|
55
56
|
|
|
56
|
-
@celery_app.task(
|
|
57
|
+
@celery_app.task(
|
|
58
|
+
base=DatabaseTask,
|
|
59
|
+
bind=True,
|
|
60
|
+
autoretry_for=(
|
|
61
|
+
Timeout,
|
|
62
|
+
RequestException,
|
|
63
|
+
TwilioRestException,
|
|
64
|
+
),
|
|
65
|
+
retry_kwargs={"max_retries": 3},
|
|
66
|
+
retry_backoff=2,
|
|
67
|
+
retry_jitter=True,
|
|
68
|
+
)
|
|
57
69
|
def dispatch_message_task(
|
|
58
70
|
self: DatabaseTask,
|
|
59
71
|
message_meta: Dict[str, Any],
|
|
@@ -62,7 +74,14 @@ def dispatch_message_task(
|
|
|
62
74
|
property_id: Optional[str],
|
|
63
75
|
) -> None:
|
|
64
76
|
"""
|
|
65
|
-
A wrapper function to dispatch a message task into the Celery queues
|
|
77
|
+
A wrapper function to dispatch a message task into the Celery queues.
|
|
78
|
+
|
|
79
|
+
This task will automatically retry up to 3 times on transient network failures
|
|
80
|
+
(timeouts, connection errors, temporary service unavailability) with exponential
|
|
81
|
+
backoff (2s, 4s, 8s) and jitter to prevent thundering herd issues.
|
|
82
|
+
|
|
83
|
+
Permanent errors (missing config, invalid identities, etc.) will fail immediately
|
|
84
|
+
without retry to provide fast feedback and avoid wasting worker resources.
|
|
66
85
|
"""
|
|
67
86
|
schema = FidesopsMessage.model_validate(message_meta)
|
|
68
87
|
with self.get_new_session() as db:
|
|
@@ -178,6 +197,7 @@ def dispatch_message(
|
|
|
178
197
|
UserInviteBodyParams,
|
|
179
198
|
ErrorNotificationBodyParams,
|
|
180
199
|
ExternalUserWelcomeBodyParams,
|
|
200
|
+
ManualTaskDigestBodyParams,
|
|
181
201
|
]
|
|
182
202
|
] = None,
|
|
183
203
|
subject_override: Optional[str] = None,
|
|
@@ -353,7 +373,7 @@ def _render(template_str: str, variables: Optional[Dict] = None) -> str:
|
|
|
353
373
|
return template_str
|
|
354
374
|
|
|
355
375
|
|
|
356
|
-
def _build_email( # pylint: disable=too-many-return-statements, too-many-branches
|
|
376
|
+
def _build_email( # pylint: disable=too-many-return-statements, too-many-branches, too-many-statements
|
|
357
377
|
config_proxy: ConfigProxy,
|
|
358
378
|
action_type: MessagingActionType,
|
|
359
379
|
body_params: Any,
|
|
@@ -466,7 +486,6 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
|
|
|
466
486
|
),
|
|
467
487
|
)
|
|
468
488
|
if action_type == MessagingActionType.EXTERNAL_USER_WELCOME:
|
|
469
|
-
base_template = get_email_template(action_type)
|
|
470
489
|
# Generate display name for personalization
|
|
471
490
|
display_name = body_params.username
|
|
472
491
|
if body_params.first_name:
|
|
@@ -489,8 +508,61 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
|
|
|
489
508
|
"access_token": body_params.access_token,
|
|
490
509
|
}
|
|
491
510
|
|
|
511
|
+
# Start with default subject
|
|
512
|
+
subject = "Welcome to our Privacy Center"
|
|
513
|
+
|
|
514
|
+
# If messaging template exists, extract customizable content
|
|
515
|
+
if messaging_template:
|
|
516
|
+
# Use custom subject if provided
|
|
517
|
+
if "subject" in messaging_template.content:
|
|
518
|
+
subject = _render(messaging_template.content["subject"], variables)
|
|
519
|
+
|
|
520
|
+
# Use custom body content to replace the intro text in HTML template
|
|
521
|
+
custom_body = messaging_template.content.get("body", "")
|
|
522
|
+
if custom_body.strip():
|
|
523
|
+
# Replace the default intro text with the custom body content
|
|
524
|
+
rendered_custom_body = _render(custom_body, variables)
|
|
525
|
+
variables["custom_intro"] = rendered_custom_body
|
|
526
|
+
|
|
527
|
+
# Always use the HTML template
|
|
528
|
+
base_template = get_email_template(action_type)
|
|
529
|
+
return EmailForActionType(
|
|
530
|
+
subject=subject,
|
|
531
|
+
body=base_template.render(variables),
|
|
532
|
+
template_variables=variables,
|
|
533
|
+
)
|
|
534
|
+
|
|
535
|
+
if action_type == MessagingActionType.MANUAL_TASK_DIGEST:
|
|
536
|
+
variables = {
|
|
537
|
+
"vendor_contact_name": body_params.vendor_contact_name,
|
|
538
|
+
"organization_name": body_params.organization_name,
|
|
539
|
+
"portal_url": body_params.portal_url,
|
|
540
|
+
"imminent_task_count": body_params.imminent_task_count,
|
|
541
|
+
"upcoming_task_count": body_params.upcoming_task_count,
|
|
542
|
+
"total_task_count": body_params.total_task_count,
|
|
543
|
+
"company_logo_url": body_params.company_logo_url,
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
# Start with default subject
|
|
547
|
+
subject = f"Weekly DSR Summary from {body_params.organization_name}"
|
|
548
|
+
|
|
549
|
+
# If messaging template exists, extract customizable content
|
|
550
|
+
if messaging_template:
|
|
551
|
+
# Use custom subject if provided
|
|
552
|
+
if "subject" in messaging_template.content:
|
|
553
|
+
subject = _render(messaging_template.content["subject"], variables)
|
|
554
|
+
|
|
555
|
+
# Use custom body content to replace the intro text in HTML template
|
|
556
|
+
custom_body = messaging_template.content.get("body", "")
|
|
557
|
+
if custom_body.strip():
|
|
558
|
+
# Replace the default intro text with the custom body content
|
|
559
|
+
rendered_custom_body = _render(custom_body, variables)
|
|
560
|
+
variables["intro_text"] = rendered_custom_body
|
|
561
|
+
|
|
562
|
+
# Always use the HTML template
|
|
563
|
+
base_template = get_email_template(action_type)
|
|
492
564
|
return EmailForActionType(
|
|
493
|
-
subject=
|
|
565
|
+
subject=subject,
|
|
494
566
|
body=base_template.render(variables),
|
|
495
567
|
template_variables=variables,
|
|
496
568
|
)
|
|
@@ -564,6 +636,7 @@ def _mailchimp_transactional_dispatcher(
|
|
|
564
636
|
"https://mandrillapp.com/api/1.0/messages/send",
|
|
565
637
|
headers={"Content-Type": "application/json"},
|
|
566
638
|
data=data,
|
|
639
|
+
timeout=10,
|
|
567
640
|
)
|
|
568
641
|
if not response.ok:
|
|
569
642
|
logger.error("Email failed to send with status code: %s", response.status_code)
|
|
@@ -611,6 +684,7 @@ def _mailgun_dispatcher(
|
|
|
611
684
|
"api",
|
|
612
685
|
messaging_config.secrets[MessagingServiceSecrets.MAILGUN_API_KEY.value],
|
|
613
686
|
),
|
|
687
|
+
timeout=10,
|
|
614
688
|
)
|
|
615
689
|
|
|
616
690
|
data = {
|
|
@@ -635,6 +709,7 @@ def _mailgun_dispatcher(
|
|
|
635
709
|
],
|
|
636
710
|
),
|
|
637
711
|
data=data,
|
|
712
|
+
timeout=10,
|
|
638
713
|
)
|
|
639
714
|
|
|
640
715
|
if not response.ok:
|
|
@@ -655,6 +730,7 @@ def _mailgun_dispatcher(
|
|
|
655
730
|
],
|
|
656
731
|
),
|
|
657
732
|
data=data,
|
|
733
|
+
timeout=10,
|
|
658
734
|
)
|
|
659
735
|
if not response.ok:
|
|
660
736
|
logger.error(
|
|
@@ -663,9 +739,9 @@ def _mailgun_dispatcher(
|
|
|
663
739
|
raise MessageDispatchException(
|
|
664
740
|
f"Email failed to send with status code {response.status_code}"
|
|
665
741
|
)
|
|
666
|
-
except Exception as
|
|
667
|
-
logger.error("Email failed to send: {}",
|
|
668
|
-
raise MessageDispatchException(f"Email failed to send due to: {
|
|
742
|
+
except Exception as exc:
|
|
743
|
+
logger.error("Email failed to send: {}", str(exc))
|
|
744
|
+
raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
|
|
669
745
|
|
|
670
746
|
|
|
671
747
|
def _twilio_email_dispatcher(
|
|
@@ -707,14 +783,14 @@ def _twilio_email_dispatcher(
|
|
|
707
783
|
logger.error(
|
|
708
784
|
"Email failed to send: %s: %s",
|
|
709
785
|
response.status_code,
|
|
710
|
-
|
|
786
|
+
str(response.body),
|
|
711
787
|
)
|
|
712
788
|
raise MessageDispatchException(
|
|
713
|
-
f"Email failed to send: {response.status_code}, {
|
|
789
|
+
f"Email failed to send: {response.status_code}, {str(response.body)}"
|
|
714
790
|
)
|
|
715
|
-
except Exception as
|
|
716
|
-
logger.error("Email failed to send: {}",
|
|
717
|
-
raise MessageDispatchException(f"Email failed to send due to: {
|
|
791
|
+
except Exception as exc:
|
|
792
|
+
logger.error("Email failed to send: {}", str(exc))
|
|
793
|
+
raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
|
|
718
794
|
|
|
719
795
|
|
|
720
796
|
def _twilio_sms_dispatcher(
|
|
@@ -753,9 +829,9 @@ def _twilio_sms_dispatcher(
|
|
|
753
829
|
raise MessageDispatchException(
|
|
754
830
|
"Message failed to send. Either sender phone number or messaging service sid must be provided."
|
|
755
831
|
)
|
|
756
|
-
except TwilioRestException as
|
|
757
|
-
logger.error("Twilio SMS failed to send: {}",
|
|
758
|
-
raise MessageDispatchException(f"Twilio SMS failed to send due to: {
|
|
832
|
+
except TwilioRestException as exc:
|
|
833
|
+
logger.error("Twilio SMS failed to send: {}", str(exc))
|
|
834
|
+
raise MessageDispatchException(f"Twilio SMS failed to send due to: {str(exc)}")
|
|
759
835
|
|
|
760
836
|
|
|
761
837
|
def _aws_ses_dispatcher(
|
|
@@ -769,9 +845,11 @@ def _aws_ses_dispatcher(
|
|
|
769
845
|
|
|
770
846
|
try:
|
|
771
847
|
aws_ses_serivce.send_email(to, message.subject, message.body)
|
|
772
|
-
except Exception as
|
|
773
|
-
logger.error("Email failed to send: {}",
|
|
774
|
-
raise MessageDispatchException(
|
|
848
|
+
except Exception as exc:
|
|
849
|
+
logger.error("Email failed to send: {}", str(exc))
|
|
850
|
+
raise MessageDispatchException(
|
|
851
|
+
f"AWS SES email failed to send due to: {str(exc)}"
|
|
852
|
+
)
|
|
775
853
|
|
|
776
854
|
|
|
777
855
|
def _get_template_id_if_exists(
|
|
@@ -25,7 +25,7 @@ from fides.api.schemas.messaging.messaging import (
|
|
|
25
25
|
|
|
26
26
|
def update_messaging_config(
|
|
27
27
|
db: Session, key: FidesKey, config: MessagingConfigRequest
|
|
28
|
-
) ->
|
|
28
|
+
) -> MessagingConfig:
|
|
29
29
|
existing_config_with_key: Optional[MessagingConfig] = MessagingConfig.get_by(
|
|
30
30
|
db=db, field="key", value=key
|
|
31
31
|
)
|
|
@@ -38,7 +38,7 @@ def update_messaging_config(
|
|
|
38
38
|
|
|
39
39
|
def create_or_update_messaging_config(
|
|
40
40
|
db: Session, config: MessagingConfigRequest
|
|
41
|
-
) ->
|
|
41
|
+
) -> MessagingConfig:
|
|
42
42
|
data = {
|
|
43
43
|
"key": config.key,
|
|
44
44
|
"name": config.name,
|
|
@@ -46,16 +46,10 @@ def create_or_update_messaging_config(
|
|
|
46
46
|
}
|
|
47
47
|
if config.details:
|
|
48
48
|
data["details"] = config.details.__dict__ # type: ignore
|
|
49
|
-
|
|
49
|
+
return MessagingConfig.create_or_update(
|
|
50
50
|
db=db,
|
|
51
51
|
data=data,
|
|
52
52
|
)
|
|
53
|
-
return MessagingConfigResponse(
|
|
54
|
-
name=messaging_config.name,
|
|
55
|
-
key=messaging_config.key,
|
|
56
|
-
service_type=messaging_config.service_type.value, # type: ignore
|
|
57
|
-
details=messaging_config.details,
|
|
58
|
-
)
|
|
59
53
|
|
|
60
54
|
|
|
61
55
|
def delete_messaging_config(db: Session, key: FidesKey) -> None:
|
|
@@ -84,6 +78,8 @@ def get_messaging_config_by_key(db: Session, key: FidesKey) -> MessagingConfigRe
|
|
|
84
78
|
key=config.key,
|
|
85
79
|
service_type=config.service_type.value, # type: ignore[attr-defined]
|
|
86
80
|
details=config.details,
|
|
81
|
+
last_test_timestamp=config.last_test_timestamp,
|
|
82
|
+
last_test_succeeded=config.last_test_succeeded,
|
|
87
83
|
)
|
|
88
84
|
|
|
89
85
|
|