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
|
@@ -0,0 +1,691 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Tuple, cast
|
|
2
|
+
from uuid import uuid4
|
|
3
|
+
|
|
4
|
+
import pydash
|
|
5
|
+
from loguru import logger
|
|
6
|
+
from sqlalchemy.orm import Session
|
|
7
|
+
|
|
8
|
+
from fides.api.common_exceptions import (
|
|
9
|
+
AwaitingAsyncProcessing,
|
|
10
|
+
FidesopsException,
|
|
11
|
+
PrivacyRequestError,
|
|
12
|
+
)
|
|
13
|
+
from fides.api.models.policy import Policy
|
|
14
|
+
from fides.api.models.privacy_request.request_task import (
|
|
15
|
+
AsyncTaskType,
|
|
16
|
+
RequestTask,
|
|
17
|
+
RequestTaskSubRequest,
|
|
18
|
+
)
|
|
19
|
+
from fides.api.models.worker_task import ExecutionLogStatus
|
|
20
|
+
from fides.api.schemas.policy import ActionType
|
|
21
|
+
from fides.api.schemas.saas.async_polling_configuration import (
|
|
22
|
+
AsyncPollingConfiguration,
|
|
23
|
+
PollingResult,
|
|
24
|
+
PollingResultType,
|
|
25
|
+
)
|
|
26
|
+
from fides.api.schemas.saas.saas_config import ReadSaaSRequest, SaaSRequest
|
|
27
|
+
from fides.api.schemas.saas.shared_schemas import SaaSRequestParams
|
|
28
|
+
from fides.api.service.async_dsr.handlers.polling_attachment_handler import (
|
|
29
|
+
PollingAttachmentHandler,
|
|
30
|
+
)
|
|
31
|
+
from fides.api.service.async_dsr.handlers.polling_request_handler import (
|
|
32
|
+
PollingRequestHandler,
|
|
33
|
+
)
|
|
34
|
+
from fides.api.service.async_dsr.handlers.polling_response_handler import (
|
|
35
|
+
PollingResponseProcessor,
|
|
36
|
+
)
|
|
37
|
+
from fides.api.service.async_dsr.handlers.polling_sub_request_handler import (
|
|
38
|
+
PollingSubRequestHandler,
|
|
39
|
+
)
|
|
40
|
+
from fides.api.service.async_dsr.strategies.async_dsr_strategy import AsyncDSRStrategy
|
|
41
|
+
from fides.api.service.async_dsr.utils import AsyncPhase, get_async_phase
|
|
42
|
+
from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
|
|
43
|
+
from fides.api.service.saas_request.saas_request_override_factory import (
|
|
44
|
+
SaaSRequestOverrideFactory,
|
|
45
|
+
SaaSRequestType,
|
|
46
|
+
)
|
|
47
|
+
from fides.api.util.collection_util import Row
|
|
48
|
+
from fides.api.util.saas_util import map_param_values
|
|
49
|
+
from fides.config import CONFIG
|
|
50
|
+
|
|
51
|
+
if TYPE_CHECKING:
|
|
52
|
+
from fides.api.models.privacy_request.privacy_request import PrivacyRequest
|
|
53
|
+
from fides.api.service.connectors.query_configs.saas_query_config import (
|
|
54
|
+
SaaSQueryConfig,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class AsyncPollingStrategy(AsyncDSRStrategy):
|
|
59
|
+
"""
|
|
60
|
+
Enhanced strategy for polling async DSR requests.
|
|
61
|
+
Works for both access and erasure operations with internal phase-based organization.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
type = AsyncTaskType.polling
|
|
65
|
+
configuration_model = AsyncPollingConfiguration
|
|
66
|
+
|
|
67
|
+
def __init__(self, session: Session, configuration: AsyncPollingConfiguration):
|
|
68
|
+
self.session = session
|
|
69
|
+
self.status_request = configuration.status_request
|
|
70
|
+
self.result_request = configuration.result_request
|
|
71
|
+
|
|
72
|
+
def async_retrieve_data(
|
|
73
|
+
self,
|
|
74
|
+
client: AuthenticatedClient,
|
|
75
|
+
request_task_id: str,
|
|
76
|
+
query_config: "SaaSQueryConfig",
|
|
77
|
+
input_data: Dict[str, List[Any]],
|
|
78
|
+
) -> List[Row]:
|
|
79
|
+
"""
|
|
80
|
+
Execute async retrieve data with internal phase routing.
|
|
81
|
+
"""
|
|
82
|
+
request_task = self._get_request_task(request_task_id)
|
|
83
|
+
async_phase = get_async_phase(request_task, query_config)
|
|
84
|
+
|
|
85
|
+
if async_phase == AsyncPhase.initial_async:
|
|
86
|
+
return self._initial_request_access(
|
|
87
|
+
client, request_task, query_config, input_data
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
if async_phase == AsyncPhase.polling_continuation:
|
|
91
|
+
return self._polling_continuation_access(client, request_task, query_config)
|
|
92
|
+
|
|
93
|
+
logger.warning(
|
|
94
|
+
f"Unexpected async phase '{async_phase}' for polling access task {request_task.id}"
|
|
95
|
+
)
|
|
96
|
+
return []
|
|
97
|
+
|
|
98
|
+
def async_mask_data(
|
|
99
|
+
self,
|
|
100
|
+
client: AuthenticatedClient,
|
|
101
|
+
request_task_id: str,
|
|
102
|
+
query_config: "SaaSQueryConfig",
|
|
103
|
+
rows: List[Row],
|
|
104
|
+
) -> int:
|
|
105
|
+
"""
|
|
106
|
+
Execute async mask data with internal phase routing.
|
|
107
|
+
"""
|
|
108
|
+
request_task = self._get_request_task(request_task_id)
|
|
109
|
+
async_phase = get_async_phase(request_task, query_config)
|
|
110
|
+
|
|
111
|
+
if async_phase == AsyncPhase.initial_async:
|
|
112
|
+
return self._initial_request_erasure(
|
|
113
|
+
client, request_task, query_config, rows
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
if async_phase == AsyncPhase.polling_continuation:
|
|
117
|
+
return self._polling_continuation_erasure(
|
|
118
|
+
client, request_task, query_config
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
logger.warning(
|
|
122
|
+
f"Unexpected async phase '{async_phase}' for polling erasure task {request_task.id}"
|
|
123
|
+
)
|
|
124
|
+
return 0
|
|
125
|
+
|
|
126
|
+
# Private helper methods
|
|
127
|
+
|
|
128
|
+
def _initial_request_access(
|
|
129
|
+
self,
|
|
130
|
+
client: AuthenticatedClient,
|
|
131
|
+
request_task: RequestTask,
|
|
132
|
+
query_config: "SaaSQueryConfig",
|
|
133
|
+
input_data: Dict[str, List[Any]],
|
|
134
|
+
) -> List[Row]:
|
|
135
|
+
"""Handle initial setup for access polling requests."""
|
|
136
|
+
logger.info(f"Initial polling request for access task {request_task.id}")
|
|
137
|
+
|
|
138
|
+
policy = request_task.privacy_request.policy
|
|
139
|
+
|
|
140
|
+
async_requests_to_process = [
|
|
141
|
+
req
|
|
142
|
+
for req in query_config.get_read_requests_by_identity()
|
|
143
|
+
if req.async_config
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
if not async_requests_to_process:
|
|
147
|
+
logger.warning(
|
|
148
|
+
f"No async-configured read requests found for task {request_task.id}"
|
|
149
|
+
)
|
|
150
|
+
return []
|
|
151
|
+
|
|
152
|
+
request_task.async_type = AsyncTaskType.polling
|
|
153
|
+
self.session.add(request_task)
|
|
154
|
+
self.session.commit()
|
|
155
|
+
|
|
156
|
+
for read_request in async_requests_to_process:
|
|
157
|
+
logger.info(
|
|
158
|
+
f"Creating initial polling sub-requests for task {request_task.id}"
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
self._handle_polling_initial_request(
|
|
162
|
+
request_task,
|
|
163
|
+
query_config,
|
|
164
|
+
read_request,
|
|
165
|
+
input_data,
|
|
166
|
+
policy,
|
|
167
|
+
client,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
self.session.refresh(request_task)
|
|
171
|
+
raise AwaitingAsyncProcessing(
|
|
172
|
+
f"Waiting for next scheduled check of {request_task.dataset_name} access results."
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
def _initial_request_erasure(
|
|
176
|
+
self,
|
|
177
|
+
client: AuthenticatedClient,
|
|
178
|
+
request_task: RequestTask,
|
|
179
|
+
query_config: "SaaSQueryConfig",
|
|
180
|
+
rows: List[Row],
|
|
181
|
+
) -> int:
|
|
182
|
+
"""Handle initial setup for erasure polling requests."""
|
|
183
|
+
logger.info(f"Initial polling request for erasure task {request_task.id}")
|
|
184
|
+
|
|
185
|
+
privacy_request = request_task.privacy_request
|
|
186
|
+
policy = privacy_request.policy
|
|
187
|
+
|
|
188
|
+
all_requests = []
|
|
189
|
+
masking_request = query_config.get_masking_request()
|
|
190
|
+
if masking_request:
|
|
191
|
+
all_requests.append(masking_request)
|
|
192
|
+
|
|
193
|
+
# Set async type once for the task
|
|
194
|
+
request_task.async_type = AsyncTaskType.polling
|
|
195
|
+
self.session.add(request_task)
|
|
196
|
+
self.session.commit()
|
|
197
|
+
|
|
198
|
+
for request in all_requests:
|
|
199
|
+
if not (request.async_config and request_task.id):
|
|
200
|
+
continue
|
|
201
|
+
|
|
202
|
+
if request.path:
|
|
203
|
+
logger.info(
|
|
204
|
+
f"Executing initial masking request for polling task {request_task.id}"
|
|
205
|
+
)
|
|
206
|
+
self._handle_polling_initial_erasure_request(
|
|
207
|
+
request_task,
|
|
208
|
+
query_config,
|
|
209
|
+
request,
|
|
210
|
+
rows,
|
|
211
|
+
policy,
|
|
212
|
+
privacy_request,
|
|
213
|
+
client,
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
# After processing all requests, raise AwaitingAsyncProcessing (like access flow)
|
|
217
|
+
# But only if we actually created any sub-requests
|
|
218
|
+
self.session.refresh(request_task)
|
|
219
|
+
if request_task.sub_requests:
|
|
220
|
+
raise AwaitingAsyncProcessing(
|
|
221
|
+
f"Waiting for next scheduled check of {request_task.dataset_name} erasure results."
|
|
222
|
+
)
|
|
223
|
+
# If no sub-requests were created (no rows to process), the task is already complete
|
|
224
|
+
return 0
|
|
225
|
+
|
|
226
|
+
def _polling_continuation_access(
|
|
227
|
+
self,
|
|
228
|
+
client: AuthenticatedClient,
|
|
229
|
+
request_task: RequestTask,
|
|
230
|
+
query_config: "SaaSQueryConfig",
|
|
231
|
+
) -> List[Row]:
|
|
232
|
+
"""Handle polling continuation for access requests."""
|
|
233
|
+
logger.info(f"Continuing polling for access task {request_task.id}")
|
|
234
|
+
|
|
235
|
+
polling_complete = self._execute_polling_requests(
|
|
236
|
+
client, request_task, query_config
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
if not polling_complete:
|
|
240
|
+
raise AwaitingAsyncProcessing(
|
|
241
|
+
f"Waiting for next scheduled check of {request_task.dataset_name} access results."
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
# Aggregate all sub-request results, merging attachments
|
|
245
|
+
aggregated_results: List[Row] = []
|
|
246
|
+
merged_attachments = []
|
|
247
|
+
|
|
248
|
+
for sub_request in request_task.sub_requests:
|
|
249
|
+
if sub_request.access_data:
|
|
250
|
+
for row in sub_request.access_data:
|
|
251
|
+
# Check if this row has retrieved_attachments
|
|
252
|
+
if "retrieved_attachments" in row:
|
|
253
|
+
# Collect attachments for merging
|
|
254
|
+
merged_attachments.extend(row["retrieved_attachments"])
|
|
255
|
+
# Remove retrieved_attachments from the row to avoid duplication
|
|
256
|
+
row_without_attachments = {
|
|
257
|
+
k: v for k, v in row.items() if k != "retrieved_attachments"
|
|
258
|
+
}
|
|
259
|
+
# Only add the row if it's not empty or if it's the first row
|
|
260
|
+
if row_without_attachments or not aggregated_results:
|
|
261
|
+
aggregated_results.append(row_without_attachments)
|
|
262
|
+
else:
|
|
263
|
+
# Regular row without attachments
|
|
264
|
+
aggregated_results.append(row)
|
|
265
|
+
|
|
266
|
+
# If we have merged attachments, add them to the first aggregated result
|
|
267
|
+
if merged_attachments and aggregated_results:
|
|
268
|
+
aggregated_results[0]["retrieved_attachments"] = merged_attachments
|
|
269
|
+
|
|
270
|
+
return aggregated_results
|
|
271
|
+
|
|
272
|
+
def _polling_continuation_erasure(
|
|
273
|
+
self,
|
|
274
|
+
client: AuthenticatedClient,
|
|
275
|
+
request_task: RequestTask,
|
|
276
|
+
query_config: "SaaSQueryConfig",
|
|
277
|
+
) -> int:
|
|
278
|
+
"""Handle polling continuation for erasure requests."""
|
|
279
|
+
logger.info(f"Continuing polling for erasure task {request_task.id}")
|
|
280
|
+
|
|
281
|
+
polling_complete = self._execute_polling_requests(
|
|
282
|
+
client, request_task, query_config
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
if not polling_complete:
|
|
286
|
+
raise AwaitingAsyncProcessing(
|
|
287
|
+
f"Waiting for next scheduled check of {request_task.dataset_name} erasure results."
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
# Aggregate rows_masked from all sub-requests
|
|
291
|
+
total_rows_masked = sum(
|
|
292
|
+
sub_request.rows_masked or 0 for sub_request in request_task.sub_requests
|
|
293
|
+
)
|
|
294
|
+
return total_rows_masked
|
|
295
|
+
|
|
296
|
+
def _handle_polling_initial_request(
|
|
297
|
+
self,
|
|
298
|
+
request_task: RequestTask,
|
|
299
|
+
query_config: "SaaSQueryConfig",
|
|
300
|
+
read_request: ReadSaaSRequest,
|
|
301
|
+
input_data: Dict[str, Any],
|
|
302
|
+
policy: Policy,
|
|
303
|
+
client: "AuthenticatedClient",
|
|
304
|
+
) -> None:
|
|
305
|
+
"""Handles the setup for asynchronous initial requests."""
|
|
306
|
+
query_config.action = "Polling - start"
|
|
307
|
+
prepared_requests: List[Tuple[SaaSRequestParams, Dict[str, Any]]] = (
|
|
308
|
+
query_config.generate_requests(input_data, policy, read_request)
|
|
309
|
+
)
|
|
310
|
+
logger.info(f"Prepared requests: {len(prepared_requests)}")
|
|
311
|
+
|
|
312
|
+
for next_request, param_value_map in prepared_requests:
|
|
313
|
+
response = client.send(next_request, read_request.ignore_errors)
|
|
314
|
+
|
|
315
|
+
if not response.ok:
|
|
316
|
+
raise FidesopsException(
|
|
317
|
+
f"Initial async request failed with status code {response.status_code}: {response.text}"
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
try:
|
|
321
|
+
response_data = response.json()
|
|
322
|
+
correlation_id = pydash.get(
|
|
323
|
+
response_data, read_request.correlation_id_path
|
|
324
|
+
)
|
|
325
|
+
if not correlation_id:
|
|
326
|
+
raise FidesopsException(
|
|
327
|
+
f"Could not extract correlation ID from response using path: {read_request.correlation_id_path}"
|
|
328
|
+
)
|
|
329
|
+
except ValueError as exc:
|
|
330
|
+
raise FidesopsException(
|
|
331
|
+
f"Invalid JSON response from initial request: {exc}"
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
param_value_map["correlation_id"] = str(correlation_id)
|
|
335
|
+
PollingSubRequestHandler.create_sub_request(
|
|
336
|
+
self.session, request_task, param_value_map
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
def _handle_polling_initial_erasure_request(
|
|
340
|
+
self,
|
|
341
|
+
request_task: RequestTask,
|
|
342
|
+
query_config: "SaaSQueryConfig",
|
|
343
|
+
request: SaaSRequest,
|
|
344
|
+
rows: List[Row],
|
|
345
|
+
policy: Policy,
|
|
346
|
+
privacy_request: "PrivacyRequest",
|
|
347
|
+
client: "AuthenticatedClient",
|
|
348
|
+
) -> None:
|
|
349
|
+
"""Handles the setup for asynchronous initial erasure requests."""
|
|
350
|
+
logger.info(
|
|
351
|
+
f"Processing {len(rows)} rows for erasure request in task {request_task.id}"
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
# Create sub-requests for erasure operations (similar to access operations)
|
|
355
|
+
for row in rows or [{}]:
|
|
356
|
+
try:
|
|
357
|
+
# Generate parameter values first (like access requests)
|
|
358
|
+
param_value_map = query_config.generate_update_param_values(
|
|
359
|
+
row, policy, privacy_request, request
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
# Generate the update request using the param_values
|
|
363
|
+
prepared_request = query_config.generate_update_stmt(
|
|
364
|
+
row, policy, privacy_request
|
|
365
|
+
)
|
|
366
|
+
response = client.send(prepared_request, request.ignore_errors)
|
|
367
|
+
|
|
368
|
+
if not response.ok:
|
|
369
|
+
raise FidesopsException(
|
|
370
|
+
f"Initial erasure request failed with status code {response.status_code}: {response.text}"
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
# Extract correlation ID from response (required, like access requests)
|
|
374
|
+
try:
|
|
375
|
+
response_data = response.json()
|
|
376
|
+
correlation_id = pydash.get(
|
|
377
|
+
response_data, request.correlation_id_path
|
|
378
|
+
)
|
|
379
|
+
if not correlation_id:
|
|
380
|
+
raise FidesopsException(
|
|
381
|
+
f"Could not extract correlation ID from response using path: {request.correlation_id_path}"
|
|
382
|
+
)
|
|
383
|
+
except ValueError as exc:
|
|
384
|
+
raise FidesopsException(
|
|
385
|
+
f"Invalid JSON response from initial erasure request: {exc}"
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
# Add correlation_id to the existing param_value_map (like access requests)
|
|
389
|
+
param_value_map["correlation_id"] = str(correlation_id)
|
|
390
|
+
PollingSubRequestHandler.create_sub_request(
|
|
391
|
+
self.session, request_task, param_value_map
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
except ValueError as exc:
|
|
395
|
+
if request.skip_missing_param_values:
|
|
396
|
+
logger.debug("Skipping optional masking request: {}", exc)
|
|
397
|
+
continue
|
|
398
|
+
raise exc
|
|
399
|
+
|
|
400
|
+
def _get_requests_for_action(
|
|
401
|
+
self, polling_task: RequestTask, query_config: "SaaSQueryConfig"
|
|
402
|
+
) -> List[ReadSaaSRequest]:
|
|
403
|
+
"""
|
|
404
|
+
Get the appropriate requests based on the action type.
|
|
405
|
+
|
|
406
|
+
Args:
|
|
407
|
+
polling_task: The polling task to get requests for
|
|
408
|
+
query_config: The SaaS query configuration
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
List of ReadSaaSRequest objects for the given action type
|
|
412
|
+
|
|
413
|
+
Raises:
|
|
414
|
+
PrivacyRequestError: If action type is unsupported or masking request not found
|
|
415
|
+
"""
|
|
416
|
+
# Validate result_request is provided for access operations
|
|
417
|
+
if polling_task.action_type == ActionType.access and not self.result_request:
|
|
418
|
+
raise PrivacyRequestError(
|
|
419
|
+
f"result_request is required for access operations but was not provided in polling configuration for task {polling_task.id}"
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
if polling_task.action_type == ActionType.access:
|
|
423
|
+
return list(query_config.get_read_requests_by_identity())
|
|
424
|
+
if polling_task.action_type == ActionType.erasure:
|
|
425
|
+
masking_request = query_config.get_masking_request()
|
|
426
|
+
if not masking_request:
|
|
427
|
+
raise PrivacyRequestError(
|
|
428
|
+
f"No masking request found for erasure task {polling_task.id}"
|
|
429
|
+
)
|
|
430
|
+
return [cast(ReadSaaSRequest, masking_request)]
|
|
431
|
+
raise PrivacyRequestError(
|
|
432
|
+
f"Unsupported action type: {polling_task.action_type}"
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
def _check_sub_request_status(
|
|
436
|
+
self, client: AuthenticatedClient, param_values: Dict[str, Any]
|
|
437
|
+
) -> bool:
|
|
438
|
+
"""
|
|
439
|
+
Check the status of a sub-request using either override function or HTTP request.
|
|
440
|
+
|
|
441
|
+
Args:
|
|
442
|
+
client: The authenticated client
|
|
443
|
+
param_values: The parameter values for the request
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
bool: True if the request is complete, False if still in progress
|
|
447
|
+
|
|
448
|
+
Raises:
|
|
449
|
+
PrivacyRequestError: If status_path is required but not provided
|
|
450
|
+
"""
|
|
451
|
+
# Check for status override vs standard HTTP request
|
|
452
|
+
if self.status_request.request_override:
|
|
453
|
+
# Handle status override function directly
|
|
454
|
+
override_function = SaaSRequestOverrideFactory.get_override(
|
|
455
|
+
self.status_request.request_override,
|
|
456
|
+
SaaSRequestType.POLLING_STATUS,
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
# Override functions return boolean status directly
|
|
460
|
+
return cast(
|
|
461
|
+
bool,
|
|
462
|
+
override_function(
|
|
463
|
+
client=client,
|
|
464
|
+
param_values=param_values,
|
|
465
|
+
request_config=self.status_request,
|
|
466
|
+
secrets=client.configuration.secrets,
|
|
467
|
+
),
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
# Standard HTTP status request - create handler only when needed
|
|
471
|
+
polling_handler = PollingRequestHandler(
|
|
472
|
+
self.status_request, self.result_request
|
|
473
|
+
)
|
|
474
|
+
response = polling_handler.get_status_response(client, param_values)
|
|
475
|
+
|
|
476
|
+
# Process status response
|
|
477
|
+
status_path = self.status_request.status_path
|
|
478
|
+
|
|
479
|
+
if status_path is None:
|
|
480
|
+
raise PrivacyRequestError(
|
|
481
|
+
"status_path is required when request_override is not provided"
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
return PollingResponseProcessor.evaluate_status_response(
|
|
485
|
+
response,
|
|
486
|
+
status_path,
|
|
487
|
+
self.status_request.status_completed_value,
|
|
488
|
+
)
|
|
489
|
+
|
|
490
|
+
def _process_completed_sub_request(
|
|
491
|
+
self,
|
|
492
|
+
client: AuthenticatedClient,
|
|
493
|
+
param_values: Dict[str, Any],
|
|
494
|
+
sub_request: RequestTaskSubRequest,
|
|
495
|
+
polling_task: RequestTask,
|
|
496
|
+
) -> None:
|
|
497
|
+
"""
|
|
498
|
+
Process a completed sub-request by getting results and handling them appropriately.
|
|
499
|
+
|
|
500
|
+
Args:
|
|
501
|
+
client: The authenticated client
|
|
502
|
+
param_values: The parameter values for the request
|
|
503
|
+
sub_request: The completed sub-request
|
|
504
|
+
polling_task: The parent polling task
|
|
505
|
+
|
|
506
|
+
Raises:
|
|
507
|
+
PrivacyRequestError: If polling result is not the expected type
|
|
508
|
+
"""
|
|
509
|
+
# Handle erasure operations differently - they don't need result_request
|
|
510
|
+
if polling_task.action_type == ActionType.erasure:
|
|
511
|
+
# For erasure operations, just mark as complete and increment counter
|
|
512
|
+
sub_request.rows_masked = 1
|
|
513
|
+
sub_request.update_status(self.session, ExecutionLogStatus.complete.value)
|
|
514
|
+
logger.info(
|
|
515
|
+
f"Sub-request {sub_request.id} for {polling_task.action_type} task {polling_task.id} completed"
|
|
516
|
+
)
|
|
517
|
+
return
|
|
518
|
+
|
|
519
|
+
# For access operations, we need result_request to get the data
|
|
520
|
+
if not self.result_request:
|
|
521
|
+
raise PrivacyRequestError(
|
|
522
|
+
f"result_request is required for processing completed sub-request {sub_request.id} but was not provided"
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
if self.result_request.request_override:
|
|
526
|
+
# Handle override function directly
|
|
527
|
+
override_function = SaaSRequestOverrideFactory.get_override(
|
|
528
|
+
self.result_request.request_override,
|
|
529
|
+
SaaSRequestType.POLLING_RESULT,
|
|
530
|
+
)
|
|
531
|
+
|
|
532
|
+
polling_result = override_function(
|
|
533
|
+
client=client,
|
|
534
|
+
param_values=param_values,
|
|
535
|
+
request_config=self.result_request,
|
|
536
|
+
secrets=client.configuration.secrets,
|
|
537
|
+
)
|
|
538
|
+
else:
|
|
539
|
+
# Standard HTTP request processing
|
|
540
|
+
polling_handler = PollingRequestHandler(
|
|
541
|
+
self.status_request, self.result_request
|
|
542
|
+
)
|
|
543
|
+
response = polling_handler.get_result_response(client, param_values)
|
|
544
|
+
|
|
545
|
+
# We need to reconstruct the request path for processing
|
|
546
|
+
prepared_result_request = map_param_values(
|
|
547
|
+
action="result",
|
|
548
|
+
context="polling request",
|
|
549
|
+
current_request=self.result_request,
|
|
550
|
+
param_values=param_values,
|
|
551
|
+
)
|
|
552
|
+
|
|
553
|
+
polling_result = PollingResponseProcessor.process_result_response(
|
|
554
|
+
prepared_result_request.path,
|
|
555
|
+
response,
|
|
556
|
+
self.result_request.result_path,
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
# Checks if we have a polling result, response could be empty in case there was no data to access
|
|
560
|
+
if polling_result:
|
|
561
|
+
# Ensure we have the expected polling result type
|
|
562
|
+
if not isinstance(polling_result, PollingResult):
|
|
563
|
+
raise PrivacyRequestError(
|
|
564
|
+
"Polling result must be PollingResult instance"
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
# Store results on the sub-request
|
|
568
|
+
self._store_sub_request_result(polling_result, sub_request, polling_task)
|
|
569
|
+
else:
|
|
570
|
+
logger.info(
|
|
571
|
+
f"No result response for sub-request {sub_request.id} for task {polling_task.id}"
|
|
572
|
+
)
|
|
573
|
+
# Mark as complete using existing method
|
|
574
|
+
sub_request.update_status(self.session, ExecutionLogStatus.complete.value)
|
|
575
|
+
|
|
576
|
+
logger.info(
|
|
577
|
+
f"Sub-request {sub_request.id} for task {polling_task.id} completed successfully"
|
|
578
|
+
)
|
|
579
|
+
|
|
580
|
+
def _process_sub_requests_for_request(
|
|
581
|
+
self,
|
|
582
|
+
client: AuthenticatedClient,
|
|
583
|
+
request: ReadSaaSRequest,
|
|
584
|
+
polling_task: RequestTask,
|
|
585
|
+
) -> None:
|
|
586
|
+
"""
|
|
587
|
+
Process all sub-requests for a given request.
|
|
588
|
+
|
|
589
|
+
Args:
|
|
590
|
+
client: The authenticated client
|
|
591
|
+
request: The SaaS request being processed
|
|
592
|
+
polling_task: The parent polling task
|
|
593
|
+
"""
|
|
594
|
+
sub_requests: List[RequestTaskSubRequest] = polling_task.sub_requests
|
|
595
|
+
|
|
596
|
+
for sub_request in sub_requests:
|
|
597
|
+
# Skip already completed sub-requests
|
|
598
|
+
if sub_request.status == ExecutionLogStatus.complete.value:
|
|
599
|
+
continue
|
|
600
|
+
|
|
601
|
+
param_values = sub_request.param_values
|
|
602
|
+
|
|
603
|
+
try:
|
|
604
|
+
# Check status of the sub-request
|
|
605
|
+
status = self._check_sub_request_status(client, param_values)
|
|
606
|
+
|
|
607
|
+
if status:
|
|
608
|
+
self._process_completed_sub_request(
|
|
609
|
+
client, param_values, sub_request, polling_task
|
|
610
|
+
)
|
|
611
|
+
else:
|
|
612
|
+
logger.debug(
|
|
613
|
+
f"Sub-request {sub_request.id} for task {polling_task.id} still not ready"
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
except Exception as exc:
|
|
617
|
+
logger.error(
|
|
618
|
+
f"Error processing sub-request {sub_request.id} for task {polling_task.id}: {exc}"
|
|
619
|
+
)
|
|
620
|
+
sub_request.update_status(self.session, ExecutionLogStatus.error.value)
|
|
621
|
+
raise exc
|
|
622
|
+
|
|
623
|
+
def _execute_polling_requests(
|
|
624
|
+
self,
|
|
625
|
+
client: AuthenticatedClient,
|
|
626
|
+
polling_task: RequestTask,
|
|
627
|
+
query_config: "SaaSQueryConfig",
|
|
628
|
+
) -> bool:
|
|
629
|
+
"""
|
|
630
|
+
Internal polling execution orchestrator with proper error handling and timeout management.
|
|
631
|
+
|
|
632
|
+
Stores results on individual sub-requests and only aggregates when ALL are successful.
|
|
633
|
+
Implements timeout checking and raises exceptions for errors and timeouts.
|
|
634
|
+
|
|
635
|
+
Returns:
|
|
636
|
+
bool: True if all polling is complete (success or failure), False if still in progress
|
|
637
|
+
"""
|
|
638
|
+
# Check for timeout before processing requests
|
|
639
|
+
timeout_days = CONFIG.execution.async_polling_request_timeout_days
|
|
640
|
+
PollingSubRequestHandler.check_timeout(polling_task, timeout_days)
|
|
641
|
+
|
|
642
|
+
# Get appropriate requests based on action type
|
|
643
|
+
requests = self._get_requests_for_action(polling_task, query_config)
|
|
644
|
+
|
|
645
|
+
# Process each request and its sub-requests
|
|
646
|
+
for request in requests:
|
|
647
|
+
if request.async_config:
|
|
648
|
+
self._process_sub_requests_for_request(client, request, polling_task)
|
|
649
|
+
|
|
650
|
+
# Check final status and return completion status
|
|
651
|
+
return PollingSubRequestHandler.check_completion(polling_task)
|
|
652
|
+
|
|
653
|
+
def _store_sub_request_result(
|
|
654
|
+
self,
|
|
655
|
+
polling_result: PollingResult,
|
|
656
|
+
sub_request: RequestTaskSubRequest,
|
|
657
|
+
polling_task: RequestTask,
|
|
658
|
+
) -> None:
|
|
659
|
+
"""Store result data on the individual sub-request."""
|
|
660
|
+
if polling_result.result_type == PollingResultType.rows:
|
|
661
|
+
# Store rows directly on the sub-request (data is always a list for rows)
|
|
662
|
+
sub_request.access_data = polling_result.data
|
|
663
|
+
sub_request.save(self.session)
|
|
664
|
+
|
|
665
|
+
elif polling_result.result_type == PollingResultType.attachment:
|
|
666
|
+
try:
|
|
667
|
+
attachment_bytes = PollingAttachmentHandler.ensure_attachment_bytes(
|
|
668
|
+
polling_result.data
|
|
669
|
+
)
|
|
670
|
+
attachment_id = PollingAttachmentHandler.store_attachment(
|
|
671
|
+
self.session,
|
|
672
|
+
polling_task,
|
|
673
|
+
attachment_data=attachment_bytes,
|
|
674
|
+
filename=polling_result.metadata.get(
|
|
675
|
+
"filename", f"attachment_{str(uuid4())[:8]}"
|
|
676
|
+
),
|
|
677
|
+
)
|
|
678
|
+
|
|
679
|
+
# Store attachment metadata on sub-request
|
|
680
|
+
attachment_metadata: List[Row] = [{"retrieved_attachments": []}]
|
|
681
|
+
PollingAttachmentHandler.add_metadata_to_rows(
|
|
682
|
+
self.session, attachment_id, attachment_metadata
|
|
683
|
+
)
|
|
684
|
+
sub_request.access_data = attachment_metadata
|
|
685
|
+
sub_request.save(self.session)
|
|
686
|
+
except Exception as exc:
|
|
687
|
+
raise PrivacyRequestError(f"Attachment storage failed: {exc}")
|
|
688
|
+
else:
|
|
689
|
+
raise PrivacyRequestError(
|
|
690
|
+
f"Unsupported result type: {polling_result.result_type}"
|
|
691
|
+
)
|