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,261 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pure response processing utility for async DSR polling.
|
|
3
|
+
|
|
4
|
+
This module handles data type inference, attachment classification,
|
|
5
|
+
and response parsing with no business logic dependencies.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import mimetypes
|
|
9
|
+
import os
|
|
10
|
+
from email.message import Message
|
|
11
|
+
from typing import Any, List, Optional
|
|
12
|
+
from urllib.parse import urlparse
|
|
13
|
+
|
|
14
|
+
import pydash
|
|
15
|
+
from loguru import logger
|
|
16
|
+
from requests import Response
|
|
17
|
+
|
|
18
|
+
from fides.api.common_exceptions import PrivacyRequestError
|
|
19
|
+
from fides.api.schemas.saas.async_polling_configuration import (
|
|
20
|
+
PollingResult,
|
|
21
|
+
PollingResultType,
|
|
22
|
+
SupportedDataType,
|
|
23
|
+
)
|
|
24
|
+
from fides.api.util.collection_util import Row
|
|
25
|
+
|
|
26
|
+
CONTENT_TYPE = "content-type"
|
|
27
|
+
CONTENT_DISPOSITION = "content-disposition"
|
|
28
|
+
|
|
29
|
+
# Content type mappings for data type detection
|
|
30
|
+
CONTENT_TYPE_MAP = {
|
|
31
|
+
"application/json": SupportedDataType.json,
|
|
32
|
+
"text/csv": SupportedDataType.csv,
|
|
33
|
+
"application/csv": SupportedDataType.csv,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# File extensions that indicate attachments
|
|
37
|
+
ATTACHMENT_EXTENSIONS = {
|
|
38
|
+
".zip",
|
|
39
|
+
".pdf",
|
|
40
|
+
".tar",
|
|
41
|
+
".gz",
|
|
42
|
+
".xlsx",
|
|
43
|
+
".xls",
|
|
44
|
+
".xml",
|
|
45
|
+
".csv",
|
|
46
|
+
".jpg",
|
|
47
|
+
".jpeg",
|
|
48
|
+
".png",
|
|
49
|
+
".gif",
|
|
50
|
+
".bmp",
|
|
51
|
+
".tiff",
|
|
52
|
+
".webp",
|
|
53
|
+
".svg",
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Content types that should always be attachments
|
|
57
|
+
ATTACHMENT_CONTENT_TYPES = {
|
|
58
|
+
"application/octet-stream",
|
|
59
|
+
"application/zip",
|
|
60
|
+
"application/pdf",
|
|
61
|
+
"application/xml",
|
|
62
|
+
"text/xml",
|
|
63
|
+
"image/",
|
|
64
|
+
"video/",
|
|
65
|
+
"text/csv",
|
|
66
|
+
"application/csv",
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Initialize mimetypes module for content type inference
|
|
70
|
+
mimetypes.init()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class PollingResponseProcessor:
|
|
74
|
+
"""Pure utility for processing async polling responses with smart data type inference."""
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def process_result_response(
|
|
78
|
+
cls, request_path: str, response: Response, result_path: Optional[str] = None
|
|
79
|
+
) -> PollingResult:
|
|
80
|
+
"""Process response with smart data type inference."""
|
|
81
|
+
inferred_type = cls._infer_data_type(request_path, response)
|
|
82
|
+
|
|
83
|
+
if cls._should_store_as_attachment(response, request_path, inferred_type):
|
|
84
|
+
return cls._build_attachment_result(response, request_path, inferred_type)
|
|
85
|
+
|
|
86
|
+
rows = cls._parse_to_rows(response, inferred_type, result_path)
|
|
87
|
+
return PollingResult(
|
|
88
|
+
data=rows,
|
|
89
|
+
result_type=PollingResultType.rows,
|
|
90
|
+
metadata={
|
|
91
|
+
"inferred_type": inferred_type.value,
|
|
92
|
+
"content_type": response.headers.get(CONTENT_TYPE, ""),
|
|
93
|
+
"row_count": len(rows),
|
|
94
|
+
"parsed_to_rows": True,
|
|
95
|
+
},
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
@staticmethod
|
|
99
|
+
def evaluate_status_response(
|
|
100
|
+
response: Response,
|
|
101
|
+
status_path: str,
|
|
102
|
+
status_completed_value: Optional[Any] = None,
|
|
103
|
+
) -> bool:
|
|
104
|
+
"""Process status response and extract completion status."""
|
|
105
|
+
# Check if response is JSON
|
|
106
|
+
content_type = response.headers.get(CONTENT_TYPE, "").lower()
|
|
107
|
+
if "application/json" not in content_type:
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
status_value = pydash.get(response.json(), status_path)
|
|
112
|
+
except ValueError as e:
|
|
113
|
+
logger.error(f"Invalid JSON response in status check: {e}")
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
# Handle list values - check first element
|
|
117
|
+
if isinstance(status_value, list) and status_value:
|
|
118
|
+
status_value = status_value[0]
|
|
119
|
+
|
|
120
|
+
# Direct comparison if completed value specified
|
|
121
|
+
if status_completed_value is not None:
|
|
122
|
+
return status_value == status_completed_value
|
|
123
|
+
|
|
124
|
+
# Otherwise, check truthiness
|
|
125
|
+
return bool(status_value)
|
|
126
|
+
|
|
127
|
+
@staticmethod
|
|
128
|
+
def _infer_data_type(request_path: str, response: Response) -> SupportedDataType:
|
|
129
|
+
"""Infer data type from response characteristics."""
|
|
130
|
+
content_type = response.headers.get(CONTENT_TYPE, "").lower()
|
|
131
|
+
|
|
132
|
+
# Check for attachment content types first
|
|
133
|
+
if any(ct in content_type for ct in ATTACHMENT_CONTENT_TYPES):
|
|
134
|
+
return SupportedDataType.attachment
|
|
135
|
+
|
|
136
|
+
# Check content-type header (most reliable)
|
|
137
|
+
for content_type_pattern, data_type in CONTENT_TYPE_MAP.items():
|
|
138
|
+
if content_type_pattern in content_type:
|
|
139
|
+
return data_type
|
|
140
|
+
|
|
141
|
+
# Check URL extension
|
|
142
|
+
path = urlparse(request_path.lower()).path
|
|
143
|
+
if path.endswith(".csv"):
|
|
144
|
+
return SupportedDataType.csv
|
|
145
|
+
|
|
146
|
+
# Try parsing as JSON
|
|
147
|
+
try:
|
|
148
|
+
response.json()
|
|
149
|
+
return SupportedDataType.json
|
|
150
|
+
except (ValueError, TypeError):
|
|
151
|
+
pass
|
|
152
|
+
|
|
153
|
+
return SupportedDataType.attachment # Preserve unknown types as raw data
|
|
154
|
+
|
|
155
|
+
@staticmethod
|
|
156
|
+
def _should_store_as_attachment(
|
|
157
|
+
response: Response, request_path: str, inferred_type: SupportedDataType
|
|
158
|
+
) -> bool:
|
|
159
|
+
"""Determine if response should be treated as an attachment."""
|
|
160
|
+
content_type = response.headers.get(CONTENT_TYPE, "").lower()
|
|
161
|
+
|
|
162
|
+
# Check attachment-specific indicators
|
|
163
|
+
if inferred_type == SupportedDataType.attachment:
|
|
164
|
+
return True
|
|
165
|
+
|
|
166
|
+
if "attachment" in response.headers.get(CONTENT_DISPOSITION, "").lower():
|
|
167
|
+
return True
|
|
168
|
+
|
|
169
|
+
if any(ct in content_type for ct in ATTACHMENT_CONTENT_TYPES):
|
|
170
|
+
return True
|
|
171
|
+
|
|
172
|
+
# Check file extension in URL
|
|
173
|
+
path = urlparse(request_path.lower()).path
|
|
174
|
+
if any(path.endswith(ext) for ext in ATTACHMENT_EXTENSIONS):
|
|
175
|
+
return True
|
|
176
|
+
|
|
177
|
+
return False
|
|
178
|
+
|
|
179
|
+
@staticmethod
|
|
180
|
+
def _extract_filename(response: Response, request_url: str) -> str:
|
|
181
|
+
"""Extract filename from response or URL."""
|
|
182
|
+
# Try Content-Disposition header using email.message for proper parsing
|
|
183
|
+
disposition = response.headers.get(CONTENT_DISPOSITION)
|
|
184
|
+
if disposition:
|
|
185
|
+
msg = Message()
|
|
186
|
+
msg[CONTENT_DISPOSITION] = disposition
|
|
187
|
+
filename = msg.get_filename()
|
|
188
|
+
if filename:
|
|
189
|
+
return filename
|
|
190
|
+
|
|
191
|
+
# Extract from URL path using os.path.basename
|
|
192
|
+
path = urlparse(request_url).path
|
|
193
|
+
if path:
|
|
194
|
+
filename = os.path.basename(path)
|
|
195
|
+
if filename:
|
|
196
|
+
return filename
|
|
197
|
+
|
|
198
|
+
return "polling_result"
|
|
199
|
+
|
|
200
|
+
@staticmethod
|
|
201
|
+
def _build_attachment_result(
|
|
202
|
+
response: Response, request_url: str, inferred_type: SupportedDataType
|
|
203
|
+
) -> PollingResult:
|
|
204
|
+
"""Build a PollingResult for attachment data."""
|
|
205
|
+
filename = PollingResponseProcessor._extract_filename(response, request_url)
|
|
206
|
+
|
|
207
|
+
# Get content type from header, or infer from filename extension
|
|
208
|
+
content_type = response.headers.get(CONTENT_TYPE)
|
|
209
|
+
|
|
210
|
+
# If no content type or it's generic, try to infer from filename extension using mimetypes
|
|
211
|
+
if not content_type or content_type in (
|
|
212
|
+
"application/octet-stream",
|
|
213
|
+
"text/plain",
|
|
214
|
+
):
|
|
215
|
+
guessed_type, _ = mimetypes.guess_type(filename)
|
|
216
|
+
if guessed_type:
|
|
217
|
+
content_type = guessed_type
|
|
218
|
+
else:
|
|
219
|
+
content_type = content_type or "application/octet-stream"
|
|
220
|
+
|
|
221
|
+
return PollingResult(
|
|
222
|
+
data=response.content,
|
|
223
|
+
result_type=PollingResultType.attachment,
|
|
224
|
+
metadata={
|
|
225
|
+
"inferred_type": inferred_type.value,
|
|
226
|
+
"content_type": content_type,
|
|
227
|
+
"filename": filename,
|
|
228
|
+
"size": len(response.content),
|
|
229
|
+
"preserved_as_attachment": True,
|
|
230
|
+
},
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
@staticmethod
|
|
234
|
+
def _parse_to_rows(
|
|
235
|
+
response: Response,
|
|
236
|
+
data_type: SupportedDataType,
|
|
237
|
+
result_path: Optional[str] = None,
|
|
238
|
+
) -> List[Row]:
|
|
239
|
+
"""Parse response to List[Row] based on data type."""
|
|
240
|
+
if data_type == SupportedDataType.json:
|
|
241
|
+
try:
|
|
242
|
+
data = response.json()
|
|
243
|
+
if result_path:
|
|
244
|
+
data = pydash.get(data, result_path)
|
|
245
|
+
if data is None:
|
|
246
|
+
raise PrivacyRequestError(
|
|
247
|
+
f"Could not extract data from response using path: {result_path}"
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
if isinstance(data, list):
|
|
251
|
+
return data
|
|
252
|
+
if isinstance(data, dict):
|
|
253
|
+
return [data]
|
|
254
|
+
raise PrivacyRequestError(
|
|
255
|
+
f"Expected list or dict from result request, got: {type(data)}"
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
except ValueError as e:
|
|
259
|
+
raise PrivacyRequestError(f"Invalid JSON response: {e}")
|
|
260
|
+
|
|
261
|
+
raise PrivacyRequestError(f"Cannot parse {data_type} to rows")
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Manager for polling sub-request operations and lifecycle management."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timedelta, timezone
|
|
4
|
+
from typing import Any, Dict
|
|
5
|
+
|
|
6
|
+
from loguru import logger
|
|
7
|
+
from sqlalchemy.orm import Session
|
|
8
|
+
|
|
9
|
+
from fides.api.common_exceptions import PrivacyRequestError
|
|
10
|
+
from fides.api.models.privacy_request.request_task import (
|
|
11
|
+
RequestTask,
|
|
12
|
+
RequestTaskSubRequest,
|
|
13
|
+
)
|
|
14
|
+
from fides.api.models.worker_task import ExecutionLogStatus
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class PollingSubRequestHandler:
|
|
18
|
+
"""Utility class for managing polling sub-request lifecycle and status checking."""
|
|
19
|
+
|
|
20
|
+
@staticmethod
|
|
21
|
+
def create_sub_request(
|
|
22
|
+
session: Session,
|
|
23
|
+
request_task: RequestTask,
|
|
24
|
+
param_values_map: Dict[str, Any],
|
|
25
|
+
) -> RequestTaskSubRequest:
|
|
26
|
+
"""
|
|
27
|
+
Create a new sub-request for tracking async polling operations.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
session: Database session
|
|
31
|
+
request_task: The parent request task
|
|
32
|
+
param_values_map: Parameter values including correlation_id for polling
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
RequestTaskSubRequest: The created sub-request
|
|
36
|
+
"""
|
|
37
|
+
sub_request = RequestTaskSubRequest.create(
|
|
38
|
+
session,
|
|
39
|
+
data={
|
|
40
|
+
"request_task_id": request_task.id,
|
|
41
|
+
"param_values": param_values_map,
|
|
42
|
+
"status": ExecutionLogStatus.pending.value,
|
|
43
|
+
},
|
|
44
|
+
)
|
|
45
|
+
logger.info(
|
|
46
|
+
f"Created sub-request {sub_request.id} for task '{request_task.id}'"
|
|
47
|
+
)
|
|
48
|
+
return sub_request
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def check_completion(polling_task: RequestTask) -> bool:
|
|
52
|
+
"""
|
|
53
|
+
Check if all sub-requests for a polling task are complete.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
polling_task: The polling task to check
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
bool: True if all sub-requests are complete, False if still in progress
|
|
60
|
+
"""
|
|
61
|
+
# Get all sub-requests and categorize by status
|
|
62
|
+
all_sub_requests = polling_task.sub_requests
|
|
63
|
+
completed_sub_requests = [
|
|
64
|
+
sub_request
|
|
65
|
+
for sub_request in all_sub_requests
|
|
66
|
+
if sub_request.status == ExecutionLogStatus.complete.value
|
|
67
|
+
]
|
|
68
|
+
failed_sub_requests = [
|
|
69
|
+
sub_request
|
|
70
|
+
for sub_request in all_sub_requests
|
|
71
|
+
if sub_request.status == ExecutionLogStatus.error.value
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
if (
|
|
75
|
+
len(completed_sub_requests) == len(all_sub_requests)
|
|
76
|
+
and len(all_sub_requests) > 0
|
|
77
|
+
):
|
|
78
|
+
# All sub-requests completed successfully - aggregate results
|
|
79
|
+
logger.info(
|
|
80
|
+
f"All sub-requests completed successfully for task {polling_task.id}"
|
|
81
|
+
)
|
|
82
|
+
return True
|
|
83
|
+
|
|
84
|
+
# Still polling - some sub-requests are pending
|
|
85
|
+
logger.info(
|
|
86
|
+
f"Polling task {polling_task.id}: {len(completed_sub_requests)}/{len(all_sub_requests)} sub-requests complete, {len(failed_sub_requests)} failed"
|
|
87
|
+
)
|
|
88
|
+
return False
|
|
89
|
+
|
|
90
|
+
@staticmethod
|
|
91
|
+
def check_timeout(polling_task: RequestTask, timeout_days: int) -> None:
|
|
92
|
+
"""
|
|
93
|
+
Check if any sub-requests have exceeded the polling timeout.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
polling_task: The polling task to check
|
|
97
|
+
timeout_days: Timeout threshold in days
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
PrivacyRequestError: If any sub-request has timed out
|
|
101
|
+
"""
|
|
102
|
+
timeout_seconds = timeout_days * 24 * 60 * 60 # Convert days to seconds
|
|
103
|
+
|
|
104
|
+
# Check timeout for incomplete sub-requests only
|
|
105
|
+
timed_out_sub_requests = []
|
|
106
|
+
|
|
107
|
+
for sub_request in polling_task.sub_requests:
|
|
108
|
+
if sub_request.status != ExecutionLogStatus.complete.value:
|
|
109
|
+
# Check if this sub-request has timed out
|
|
110
|
+
if sub_request.created_at:
|
|
111
|
+
timeout_threshold = sub_request.created_at + timedelta(
|
|
112
|
+
seconds=timeout_seconds
|
|
113
|
+
)
|
|
114
|
+
current_time = datetime.now(timezone.utc)
|
|
115
|
+
if current_time > timeout_threshold:
|
|
116
|
+
timed_out_sub_requests.append(sub_request)
|
|
117
|
+
|
|
118
|
+
if timed_out_sub_requests:
|
|
119
|
+
sub_request_ids = [sr.id for sr in timed_out_sub_requests]
|
|
120
|
+
raise PrivacyRequestError(
|
|
121
|
+
f"Polling timeout exceeded for sub-requests {sub_request_ids} "
|
|
122
|
+
f"in task {polling_task.id}. Timeout interval: {timeout_days} days"
|
|
123
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
|
|
4
|
+
from sqlalchemy.orm import Session
|
|
5
|
+
|
|
6
|
+
from fides.api.models.privacy_request.request_task import AsyncTaskType, RequestTask
|
|
7
|
+
from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
|
|
8
|
+
from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
|
|
9
|
+
from fides.api.service.strategy import Strategy
|
|
10
|
+
from fides.api.util.collection_util import Row
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AsyncDSRStrategy(Strategy):
|
|
14
|
+
"""Abstract base class for async DSR strategies"""
|
|
15
|
+
|
|
16
|
+
type: AsyncTaskType
|
|
17
|
+
session: Session
|
|
18
|
+
|
|
19
|
+
@abstractmethod
|
|
20
|
+
def async_retrieve_data(
|
|
21
|
+
self,
|
|
22
|
+
client: AuthenticatedClient,
|
|
23
|
+
request_task_id: str,
|
|
24
|
+
query_config: SaaSQueryConfig,
|
|
25
|
+
input_data: Dict[str, List[Any]],
|
|
26
|
+
) -> List[Row]:
|
|
27
|
+
"""
|
|
28
|
+
Execute async retrieve data.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def async_mask_data(
|
|
33
|
+
self,
|
|
34
|
+
client: AuthenticatedClient,
|
|
35
|
+
request_task_id: str,
|
|
36
|
+
query_config: SaaSQueryConfig,
|
|
37
|
+
rows: List[Row],
|
|
38
|
+
) -> int:
|
|
39
|
+
"""
|
|
40
|
+
Execute async mask data.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def _get_request_task(self, request_task_id: str) -> RequestTask:
|
|
44
|
+
"""Get request task by ID or raise ValueError if not found."""
|
|
45
|
+
request_task = (
|
|
46
|
+
self.session.query(RequestTask)
|
|
47
|
+
.filter(RequestTask.id == request_task_id)
|
|
48
|
+
.first()
|
|
49
|
+
)
|
|
50
|
+
if not request_task:
|
|
51
|
+
raise ValueError(f"RequestTask with ID {request_task_id} not found")
|
|
52
|
+
return request_task
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
|
|
3
|
+
from loguru import logger
|
|
4
|
+
from sqlalchemy.orm import Session
|
|
5
|
+
|
|
6
|
+
from fides.api.common_exceptions import AwaitingAsyncTask
|
|
7
|
+
from fides.api.models.privacy_request.request_task import AsyncTaskType, RequestTask
|
|
8
|
+
from fides.api.service.async_dsr.strategies.async_dsr_strategy import AsyncDSRStrategy
|
|
9
|
+
from fides.api.service.async_dsr.utils import AsyncPhase, get_async_phase
|
|
10
|
+
from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
|
|
11
|
+
from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
|
|
12
|
+
from fides.api.util.collection_util import Row
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AsyncCallbackStrategy(AsyncDSRStrategy):
|
|
16
|
+
"""
|
|
17
|
+
Enhanced strategy for callback async DSR requests.
|
|
18
|
+
Works for both access and erasure operations with internal phase-based organization.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
type = AsyncTaskType.callback
|
|
22
|
+
|
|
23
|
+
def __init__(self, session: Session):
|
|
24
|
+
self.session = session
|
|
25
|
+
|
|
26
|
+
def async_retrieve_data(
|
|
27
|
+
self,
|
|
28
|
+
client: AuthenticatedClient,
|
|
29
|
+
request_task_id: str,
|
|
30
|
+
query_config: SaaSQueryConfig,
|
|
31
|
+
input_data: Dict[str, List[Any]],
|
|
32
|
+
) -> List[Row]:
|
|
33
|
+
"""Execute async retrieve data with internal phase routing."""
|
|
34
|
+
request_task = self._get_request_task(request_task_id)
|
|
35
|
+
async_phase = get_async_phase(request_task, query_config)
|
|
36
|
+
|
|
37
|
+
if async_phase == AsyncPhase.initial_async:
|
|
38
|
+
return self._initial_request_access(
|
|
39
|
+
client, request_task, query_config, input_data
|
|
40
|
+
)
|
|
41
|
+
if async_phase == AsyncPhase.callback_completion:
|
|
42
|
+
return self._callback_completion_access(request_task)
|
|
43
|
+
|
|
44
|
+
logger.warning(
|
|
45
|
+
f"Unexpected async phase '{async_phase}' for callback access task {request_task.id}"
|
|
46
|
+
)
|
|
47
|
+
return []
|
|
48
|
+
|
|
49
|
+
def async_mask_data(
|
|
50
|
+
self,
|
|
51
|
+
client: AuthenticatedClient,
|
|
52
|
+
request_task_id: str,
|
|
53
|
+
query_config: SaaSQueryConfig,
|
|
54
|
+
rows: List[Row],
|
|
55
|
+
) -> int:
|
|
56
|
+
"""Execute async mask data with internal phase routing."""
|
|
57
|
+
request_task = self._get_request_task(request_task_id)
|
|
58
|
+
async_phase = get_async_phase(request_task, query_config)
|
|
59
|
+
|
|
60
|
+
if async_phase == AsyncPhase.initial_async:
|
|
61
|
+
return self._initial_request_erasure(
|
|
62
|
+
client, request_task, query_config, rows
|
|
63
|
+
)
|
|
64
|
+
if async_phase == AsyncPhase.callback_completion:
|
|
65
|
+
return self._callback_completion_erasure(request_task)
|
|
66
|
+
|
|
67
|
+
logger.warning(
|
|
68
|
+
f"Unexpected async phase '{async_phase}' for callback erasure task {request_task.id}"
|
|
69
|
+
)
|
|
70
|
+
return 0
|
|
71
|
+
|
|
72
|
+
# Private helper methods
|
|
73
|
+
|
|
74
|
+
def _initial_request_access(
|
|
75
|
+
self,
|
|
76
|
+
client: AuthenticatedClient,
|
|
77
|
+
request_task: RequestTask,
|
|
78
|
+
query_config: SaaSQueryConfig,
|
|
79
|
+
input_data: Dict[str, List[Any]],
|
|
80
|
+
) -> List[Row]:
|
|
81
|
+
"""Handle initial setup for access callback requests."""
|
|
82
|
+
logger.info(f"Initial callback request for access task {request_task.id}")
|
|
83
|
+
|
|
84
|
+
read_requests = query_config.get_read_requests_by_identity()
|
|
85
|
+
|
|
86
|
+
# Filter to get only the requests that need async processing
|
|
87
|
+
async_requests_to_process = [
|
|
88
|
+
req for req in read_requests if req.async_config and request_task.id
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
# If there are no async requests, we shouldn't be in this handler.
|
|
92
|
+
if not async_requests_to_process:
|
|
93
|
+
logger.warning(
|
|
94
|
+
f"Async callback handler was called, but no async-configured read requests were found for task {request_task.id}."
|
|
95
|
+
)
|
|
96
|
+
return []
|
|
97
|
+
|
|
98
|
+
# Set async_type once for the request task
|
|
99
|
+
request_task.async_type = AsyncTaskType.callback
|
|
100
|
+
self.session.commit()
|
|
101
|
+
|
|
102
|
+
# For callback strategy, we execute the initial request to trigger the callback
|
|
103
|
+
# then wait for the external system to call us back via webhook.
|
|
104
|
+
# The callback endpoint logic will then queue the request task for it
|
|
105
|
+
# to be executed again with
|
|
106
|
+
# AsyncCallbackStrategy.async_retrieve_data -> _callback_completion_access
|
|
107
|
+
|
|
108
|
+
# Execute the initial callback request to trigger the async process
|
|
109
|
+
privacy_request = request_task.privacy_request
|
|
110
|
+
policy = privacy_request.policy
|
|
111
|
+
|
|
112
|
+
for read_request in async_requests_to_process:
|
|
113
|
+
if read_request.path: # Only execute if there's an actual request to make
|
|
114
|
+
try:
|
|
115
|
+
# Set the current request context
|
|
116
|
+
query_config.current_request = read_request
|
|
117
|
+
prepared_request = query_config.generate_query(input_data, policy)
|
|
118
|
+
# Execute the initial request to trigger the callback
|
|
119
|
+
client.send(prepared_request, read_request.ignore_errors)
|
|
120
|
+
logger.info(
|
|
121
|
+
f"Executed initial callback request for access task {request_task.id}"
|
|
122
|
+
)
|
|
123
|
+
except ValueError as exc:
|
|
124
|
+
if read_request.skip_missing_param_values:
|
|
125
|
+
logger.debug(
|
|
126
|
+
"Skipping optional access callback request: {}",
|
|
127
|
+
exc,
|
|
128
|
+
)
|
|
129
|
+
continue
|
|
130
|
+
raise exc
|
|
131
|
+
|
|
132
|
+
# Asynchronous callback access request detected in saas config.
|
|
133
|
+
# We raise AwaitingAsyncTask to put this task in an awaiting_processing state.
|
|
134
|
+
raise AwaitingAsyncTask(
|
|
135
|
+
f"Awaiting callback from {request_task.dataset_name} for access results"
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
def _initial_request_erasure(
|
|
139
|
+
self,
|
|
140
|
+
client: AuthenticatedClient,
|
|
141
|
+
request_task: RequestTask,
|
|
142
|
+
query_config: SaaSQueryConfig,
|
|
143
|
+
rows: List[Row],
|
|
144
|
+
) -> int:
|
|
145
|
+
"""Handle initial setup for erasure callback requests."""
|
|
146
|
+
logger.info(f"Initial callback request for erasure task {request_task.id}")
|
|
147
|
+
|
|
148
|
+
privacy_request = request_task.privacy_request
|
|
149
|
+
policy = privacy_request.policy
|
|
150
|
+
|
|
151
|
+
# For erasure, we only execute masking requests (delete/update requests)
|
|
152
|
+
masking_request = query_config.get_masking_request()
|
|
153
|
+
|
|
154
|
+
if not masking_request:
|
|
155
|
+
logger.warning(
|
|
156
|
+
f"No masking request found for erasure task {request_task.id}"
|
|
157
|
+
)
|
|
158
|
+
return 0
|
|
159
|
+
|
|
160
|
+
rows_updated = 0
|
|
161
|
+
|
|
162
|
+
# Check if the masking request has async_config and set async_type once
|
|
163
|
+
if masking_request.async_config and request_task.id:
|
|
164
|
+
request_task.async_type = AsyncTaskType.callback
|
|
165
|
+
self.session.commit()
|
|
166
|
+
|
|
167
|
+
if masking_request.path:
|
|
168
|
+
for row in rows:
|
|
169
|
+
try:
|
|
170
|
+
prepared_request = query_config.generate_update_stmt(
|
|
171
|
+
row, policy, privacy_request
|
|
172
|
+
)
|
|
173
|
+
client.send(prepared_request, masking_request.ignore_errors)
|
|
174
|
+
rows_updated += 1
|
|
175
|
+
except ValueError as exc:
|
|
176
|
+
if masking_request.skip_missing_param_values:
|
|
177
|
+
logger.debug(
|
|
178
|
+
"Skipping optional masking request: {}",
|
|
179
|
+
exc,
|
|
180
|
+
)
|
|
181
|
+
continue
|
|
182
|
+
raise exc
|
|
183
|
+
|
|
184
|
+
raise AwaitingAsyncTask("Awaiting erasure callback results")
|
|
185
|
+
|
|
186
|
+
logger.warning(
|
|
187
|
+
f"No async configuration found for erasure task {request_task.id}"
|
|
188
|
+
)
|
|
189
|
+
return rows_updated
|
|
190
|
+
|
|
191
|
+
def _callback_completion_access(self, request_task: RequestTask) -> List[Row]:
|
|
192
|
+
"""Handle completion of access callback requests."""
|
|
193
|
+
logger.info(f"Access callback succeeded for request task '{request_task.id}'")
|
|
194
|
+
return request_task.get_access_data()
|
|
195
|
+
|
|
196
|
+
def _callback_completion_erasure(self, request_task: RequestTask) -> int:
|
|
197
|
+
"""Handle completion of erasure callback requests."""
|
|
198
|
+
logger.info(f"Masking callback succeeded for request task '{request_task.id}'")
|
|
199
|
+
return request_task.rows_masked or 0
|