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
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
# pylint: disable=too-many-lines
|
|
1
2
|
from datetime import datetime
|
|
2
3
|
from typing import Any, Dict, List, Optional
|
|
3
4
|
|
|
4
5
|
from loguru import logger
|
|
5
|
-
from sqlalchemy.orm import Session
|
|
6
|
+
from sqlalchemy.orm import Session, selectinload
|
|
6
7
|
|
|
7
8
|
from fides.api.common_exceptions import (
|
|
8
9
|
FidesopsException,
|
|
@@ -33,6 +34,7 @@ from fides.api.schemas.privacy_center_config import (
|
|
|
33
34
|
PrivacyCenterConfig as PrivacyCenterConfigSchema,
|
|
34
35
|
)
|
|
35
36
|
from fides.api.schemas.privacy_request import (
|
|
37
|
+
BULK_PRIVACY_REQUEST_BATCH_SIZE,
|
|
36
38
|
BulkPostPrivacyRequests,
|
|
37
39
|
BulkReviewResponse,
|
|
38
40
|
CheckpointActionRequired,
|
|
@@ -43,6 +45,7 @@ from fides.api.schemas.privacy_request import (
|
|
|
43
45
|
PrivacyRequestStatus,
|
|
44
46
|
)
|
|
45
47
|
from fides.api.service.messaging.message_dispatch_service import message_send_enabled
|
|
48
|
+
from fides.api.service.privacy_request.duplication_detection import check_for_duplicates
|
|
46
49
|
from fides.api.service.privacy_request.request_service import (
|
|
47
50
|
build_required_privacy_request_kwargs,
|
|
48
51
|
cache_data,
|
|
@@ -55,7 +58,6 @@ from fides.service.messaging.messaging_service import (
|
|
|
55
58
|
MessagingService,
|
|
56
59
|
check_and_dispatch_error_notifications,
|
|
57
60
|
send_privacy_request_receipt_message_to_user,
|
|
58
|
-
send_verification_code_to_user,
|
|
59
61
|
)
|
|
60
62
|
|
|
61
63
|
|
|
@@ -71,13 +73,52 @@ class PrivacyRequestService:
|
|
|
71
73
|
self.messaging_service = messaging_service
|
|
72
74
|
|
|
73
75
|
def get_privacy_request(self, privacy_request_id: str) -> Optional[PrivacyRequest]:
|
|
74
|
-
privacy_request: Optional[PrivacyRequest] =
|
|
75
|
-
self.db
|
|
76
|
+
privacy_request: Optional[PrivacyRequest] = (
|
|
77
|
+
PrivacyRequest.query_without_large_columns(self.db)
|
|
78
|
+
.filter(PrivacyRequest.id == privacy_request_id)
|
|
79
|
+
.first()
|
|
76
80
|
)
|
|
77
81
|
if not privacy_request:
|
|
78
82
|
logger.info(f"Privacy request with ID {privacy_request_id} was not found.")
|
|
79
83
|
return privacy_request
|
|
80
84
|
|
|
85
|
+
def _validate_privacy_request_for_bulk_operation(
|
|
86
|
+
self,
|
|
87
|
+
privacy_request: Optional[PrivacyRequest],
|
|
88
|
+
request_id: str,
|
|
89
|
+
) -> PrivacyRequest:
|
|
90
|
+
"""
|
|
91
|
+
Common validation logic for bulk operations.
|
|
92
|
+
Raises a PrivacyRequestError if the request is not found or deleted.
|
|
93
|
+
|
|
94
|
+
Returns the validated privacy request.
|
|
95
|
+
"""
|
|
96
|
+
if not privacy_request:
|
|
97
|
+
raise PrivacyRequestError(
|
|
98
|
+
f"No privacy request found with id '{request_id}'",
|
|
99
|
+
{"privacy_request_id": request_id},
|
|
100
|
+
)
|
|
101
|
+
if privacy_request.deleted_at is not None:
|
|
102
|
+
raise PrivacyRequestError(
|
|
103
|
+
"Cannot transition status for a deleted request",
|
|
104
|
+
PrivacyRequestResponse.model_validate(privacy_request).model_dump(
|
|
105
|
+
mode="json"
|
|
106
|
+
),
|
|
107
|
+
)
|
|
108
|
+
return privacy_request
|
|
109
|
+
|
|
110
|
+
def _fetch_privacy_requests_for_bulk_operation(
|
|
111
|
+
self, request_ids: List[str]
|
|
112
|
+
) -> Dict[str, PrivacyRequest]:
|
|
113
|
+
"""Fetch privacy requests in a single query to avoid N+1. Eager loads custom_fields."""
|
|
114
|
+
privacy_requests = (
|
|
115
|
+
PrivacyRequest.query_without_large_columns(self.db)
|
|
116
|
+
.options(selectinload(PrivacyRequest.custom_fields)) # type: ignore[attr-defined]
|
|
117
|
+
.filter(PrivacyRequest.id.in_(request_ids))
|
|
118
|
+
.all()
|
|
119
|
+
)
|
|
120
|
+
return {pr.id: pr for pr in privacy_requests}
|
|
121
|
+
|
|
81
122
|
def _validate_required_location_fields(
|
|
82
123
|
self, privacy_request_data: PrivacyRequestCreate
|
|
83
124
|
) -> None:
|
|
@@ -90,67 +131,122 @@ class PrivacyRequestService:
|
|
|
90
131
|
if privacy_request_data.location:
|
|
91
132
|
return
|
|
92
133
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
134
|
+
config_dict = self._resolve_privacy_center_config_dict(
|
|
135
|
+
privacy_request_data.property_id
|
|
136
|
+
)
|
|
137
|
+
if not config_dict:
|
|
138
|
+
return
|
|
97
139
|
|
|
98
|
-
|
|
99
|
-
|
|
140
|
+
privacy_center_config = self._parse_privacy_center_config(config_dict)
|
|
141
|
+
if not privacy_center_config:
|
|
100
142
|
return
|
|
101
143
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
144
|
+
action = self._get_matching_action(
|
|
145
|
+
privacy_center_config, privacy_request_data.policy_key
|
|
146
|
+
)
|
|
147
|
+
if not action or not action.custom_privacy_request_fields:
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
missing_required = self._is_required_location_missing(
|
|
151
|
+
action, privacy_request_data
|
|
152
|
+
)
|
|
153
|
+
if missing_required:
|
|
154
|
+
# Find the first location field name to reference in the error for clarity
|
|
155
|
+
first_location_field = next(
|
|
156
|
+
(
|
|
157
|
+
name
|
|
158
|
+
for name, cfg in action.custom_privacy_request_fields.items()
|
|
159
|
+
if isinstance(cfg, LocationCustomPrivacyRequestField)
|
|
160
|
+
and getattr(cfg, "required", False)
|
|
161
|
+
),
|
|
162
|
+
"location",
|
|
106
163
|
)
|
|
107
|
-
|
|
164
|
+
raise PrivacyRequestError(
|
|
165
|
+
f"Location is required for field '{first_location_field}' but was not provided",
|
|
166
|
+
privacy_request_data.model_dump(mode="json"),
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def _resolve_privacy_center_config_dict(
|
|
170
|
+
self, property_id: Optional[str]
|
|
171
|
+
) -> Optional[Dict[str, Any]]:
|
|
172
|
+
"""Return the applicable Privacy Center config as a dict using precedence.
|
|
173
|
+
|
|
174
|
+
Precedence:
|
|
175
|
+
1) The request's property config (if provided)
|
|
176
|
+
2) The default property's config (if available)
|
|
177
|
+
3) The single-row Privacy Center config table (legacy/global)
|
|
178
|
+
"""
|
|
179
|
+
# 1) Request's property config
|
|
180
|
+
if property_id:
|
|
181
|
+
prop = Property.get_by(self.db, field="id", value=property_id)
|
|
182
|
+
if prop and getattr(prop, "privacy_center_config", None):
|
|
183
|
+
return prop.privacy_center_config # type: ignore[return-value]
|
|
184
|
+
|
|
185
|
+
# 2) Default property config
|
|
186
|
+
default_prop = Property.get_by(self.db, field="is_default", value=True)
|
|
187
|
+
if default_prop and getattr(default_prop, "privacy_center_config", None):
|
|
188
|
+
return default_prop.privacy_center_config # type: ignore[return-value]
|
|
189
|
+
|
|
190
|
+
# 3) Single-row global config
|
|
191
|
+
privacy_center_config_record = PrivacyCenterConfigModel.filter(
|
|
192
|
+
db=self.db, conditions=PrivacyCenterConfigModel.single_row # type: ignore[arg-type]
|
|
193
|
+
).first()
|
|
194
|
+
if privacy_center_config_record:
|
|
195
|
+
return privacy_center_config_record.config # type: ignore[return-value]
|
|
196
|
+
return None
|
|
197
|
+
|
|
198
|
+
def _parse_privacy_center_config(
|
|
199
|
+
self, config_dict: Dict[str, Any]
|
|
200
|
+
) -> Optional[PrivacyCenterConfigSchema]:
|
|
201
|
+
"""Parse a config dict into a schema instance, logging and skipping on error."""
|
|
202
|
+
try:
|
|
203
|
+
return PrivacyCenterConfigSchema.model_validate(config_dict)
|
|
204
|
+
except Exception as exc: # pylint: disable=broad-except
|
|
108
205
|
logger.warning(
|
|
109
206
|
f"Could not parse Privacy Center config for location validation: {exc}"
|
|
110
207
|
)
|
|
111
|
-
return
|
|
208
|
+
return None
|
|
112
209
|
|
|
113
|
-
|
|
114
|
-
|
|
210
|
+
@staticmethod
|
|
211
|
+
def _get_matching_action(
|
|
212
|
+
privacy_center_config: PrivacyCenterConfigSchema, policy_key: str
|
|
213
|
+
) -> Optional[Any]:
|
|
214
|
+
"""Return the action entry matching the given policy key, if any."""
|
|
115
215
|
for action in privacy_center_config.actions:
|
|
116
|
-
if action.policy_key ==
|
|
117
|
-
|
|
118
|
-
|
|
216
|
+
if action.policy_key == policy_key:
|
|
217
|
+
return action
|
|
218
|
+
return None
|
|
219
|
+
|
|
220
|
+
@staticmethod
|
|
221
|
+
def _is_required_location_missing(
|
|
222
|
+
action: Any, privacy_request_data: PrivacyRequestCreate
|
|
223
|
+
) -> bool:
|
|
224
|
+
"""Check if any required location fields exist without values in the request."""
|
|
225
|
+
if not getattr(action, "custom_privacy_request_fields", None):
|
|
226
|
+
return False
|
|
227
|
+
|
|
228
|
+
custom_fields = action.custom_privacy_request_fields
|
|
229
|
+
for field_name, field_config in custom_fields.items():
|
|
230
|
+
if not isinstance(field_config, LocationCustomPrivacyRequestField):
|
|
231
|
+
continue
|
|
232
|
+
if not getattr(field_config, "required", False):
|
|
233
|
+
continue
|
|
119
234
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
235
|
+
# Check if this location field has a value in the request custom fields
|
|
236
|
+
field_has_value = False
|
|
237
|
+
if privacy_request_data.custom_privacy_request_fields:
|
|
238
|
+
field_data = privacy_request_data.custom_privacy_request_fields.get(
|
|
239
|
+
field_name
|
|
240
|
+
)
|
|
241
|
+
if field_data and getattr(field_data, "value", None):
|
|
242
|
+
field_has_value = True
|
|
243
|
+
|
|
244
|
+
if not field_has_value:
|
|
245
|
+
return True
|
|
246
|
+
|
|
247
|
+
return False
|
|
123
248
|
|
|
124
|
-
|
|
125
|
-
for (
|
|
126
|
-
field_name,
|
|
127
|
-
field_config,
|
|
128
|
-
) in matching_action.custom_privacy_request_fields.items():
|
|
129
|
-
if isinstance(field_config, LocationCustomPrivacyRequestField):
|
|
130
|
-
# This is a location field - check if it's required
|
|
131
|
-
if field_config.required:
|
|
132
|
-
# Check if this field has a value in the request
|
|
133
|
-
field_has_value = False
|
|
134
|
-
if privacy_request_data.custom_privacy_request_fields:
|
|
135
|
-
field_data = (
|
|
136
|
-
privacy_request_data.custom_privacy_request_fields.get(
|
|
137
|
-
field_name
|
|
138
|
-
)
|
|
139
|
-
)
|
|
140
|
-
if (
|
|
141
|
-
field_data
|
|
142
|
-
and hasattr(field_data, "value")
|
|
143
|
-
and field_data.value
|
|
144
|
-
):
|
|
145
|
-
field_has_value = True
|
|
146
|
-
|
|
147
|
-
if not field_has_value:
|
|
148
|
-
raise PrivacyRequestError(
|
|
149
|
-
f"Location is required for field '{field_name}' but was not provided",
|
|
150
|
-
privacy_request_data.model_dump(mode="json"),
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
# pylint: disable=too-many-branches
|
|
249
|
+
# pylint: disable=too-many-branches, too-many-statements
|
|
154
250
|
def create_privacy_request(
|
|
155
251
|
self,
|
|
156
252
|
privacy_request_data: PrivacyRequestCreate,
|
|
@@ -289,8 +385,12 @@ class PrivacyRequestService:
|
|
|
289
385
|
privacy_request_data,
|
|
290
386
|
policy,
|
|
291
387
|
authenticated,
|
|
388
|
+
self.messaging_service,
|
|
292
389
|
)
|
|
293
390
|
|
|
391
|
+
if not isinstance(privacy_request_data, PrivacyRequestResubmit):
|
|
392
|
+
check_for_duplicates(db=self.db, privacy_request=privacy_request)
|
|
393
|
+
|
|
294
394
|
return privacy_request
|
|
295
395
|
|
|
296
396
|
except RedisNotConfigured as exc:
|
|
@@ -360,10 +460,7 @@ class PrivacyRequestService:
|
|
|
360
460
|
if not existing_privacy_request:
|
|
361
461
|
return None
|
|
362
462
|
|
|
363
|
-
if existing_privacy_request.status
|
|
364
|
-
PrivacyRequestStatus.complete,
|
|
365
|
-
PrivacyRequestStatus.pending,
|
|
366
|
-
]:
|
|
463
|
+
if existing_privacy_request.status == PrivacyRequestStatus.complete:
|
|
367
464
|
raise FidesopsException(
|
|
368
465
|
f"Cannot resubmit a {existing_privacy_request.status} privacy request"
|
|
369
466
|
)
|
|
@@ -437,33 +534,35 @@ class PrivacyRequestService:
|
|
|
437
534
|
reviewed_by: Optional[str] = None,
|
|
438
535
|
suppress_notification: Optional[bool] = False,
|
|
439
536
|
) -> BulkReviewResponse:
|
|
537
|
+
"""Approve privacy requests."""
|
|
538
|
+
if len(request_ids) > BULK_PRIVACY_REQUEST_BATCH_SIZE:
|
|
539
|
+
raise ValueError(
|
|
540
|
+
f"Bulk operations are limited to {BULK_PRIVACY_REQUEST_BATCH_SIZE} requests. "
|
|
541
|
+
f"Received {len(request_ids)}. Batch requests at the caller level."
|
|
542
|
+
)
|
|
543
|
+
|
|
440
544
|
succeeded: List[PrivacyRequest] = []
|
|
441
545
|
failed: List[BulkUpdateFailed] = []
|
|
442
546
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
failed.append(
|
|
448
|
-
BulkUpdateFailed(
|
|
449
|
-
message=f"No privacy request found with id '{request_id}'",
|
|
450
|
-
data={"privacy_request_id": request_id},
|
|
451
|
-
)
|
|
452
|
-
)
|
|
453
|
-
continue
|
|
547
|
+
# Fetch all privacy requests in one query to avoid N+1
|
|
548
|
+
privacy_requests_dict = self._fetch_privacy_requests_for_bulk_operation(
|
|
549
|
+
request_ids
|
|
550
|
+
)
|
|
454
551
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
privacy_request
|
|
461
|
-
).model_dump(mode="json"),
|
|
462
|
-
)
|
|
552
|
+
for request_id in request_ids:
|
|
553
|
+
privacy_request = privacy_requests_dict.get(request_id)
|
|
554
|
+
try:
|
|
555
|
+
privacy_request = self._validate_privacy_request_for_bulk_operation(
|
|
556
|
+
privacy_request, request_id
|
|
463
557
|
)
|
|
558
|
+
except PrivacyRequestError as exc:
|
|
559
|
+
failed.append(BulkUpdateFailed(message=exc.message, data=exc.data))
|
|
464
560
|
continue
|
|
465
561
|
|
|
466
|
-
if privacy_request.status
|
|
562
|
+
if privacy_request.status not in [
|
|
563
|
+
PrivacyRequestStatus.pending,
|
|
564
|
+
PrivacyRequestStatus.duplicate,
|
|
565
|
+
]:
|
|
467
566
|
failed.append(
|
|
468
567
|
BulkUpdateFailed(
|
|
469
568
|
message="Cannot transition status",
|
|
@@ -523,33 +622,35 @@ class PrivacyRequestService:
|
|
|
523
622
|
*,
|
|
524
623
|
user_id: Optional[str] = None,
|
|
525
624
|
) -> BulkReviewResponse:
|
|
625
|
+
"""Deny privacy requests."""
|
|
626
|
+
if len(request_ids) > BULK_PRIVACY_REQUEST_BATCH_SIZE:
|
|
627
|
+
raise ValueError(
|
|
628
|
+
f"Bulk operations are limited to {BULK_PRIVACY_REQUEST_BATCH_SIZE} requests. "
|
|
629
|
+
f"Received {len(request_ids)}. Batch requests at the caller level."
|
|
630
|
+
)
|
|
631
|
+
|
|
526
632
|
succeeded: List[PrivacyRequest] = []
|
|
527
633
|
failed: List[BulkUpdateFailed] = []
|
|
528
634
|
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
failed.append(
|
|
534
|
-
BulkUpdateFailed(
|
|
535
|
-
message=f"No privacy request found with id '{request_id}'",
|
|
536
|
-
data={"privacy_request_id": request_id},
|
|
537
|
-
)
|
|
538
|
-
)
|
|
539
|
-
continue
|
|
635
|
+
# Fetch all privacy requests in one query to avoid N+1
|
|
636
|
+
privacy_requests_dict = self._fetch_privacy_requests_for_bulk_operation(
|
|
637
|
+
request_ids
|
|
638
|
+
)
|
|
540
639
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
privacy_request
|
|
547
|
-
).model_dump(mode="json"),
|
|
548
|
-
)
|
|
640
|
+
for request_id in request_ids:
|
|
641
|
+
privacy_request = privacy_requests_dict.get(request_id)
|
|
642
|
+
try:
|
|
643
|
+
privacy_request = self._validate_privacy_request_for_bulk_operation(
|
|
644
|
+
privacy_request, request_id
|
|
549
645
|
)
|
|
646
|
+
except PrivacyRequestError as exc:
|
|
647
|
+
failed.append(BulkUpdateFailed(message=exc.message, data=exc.data))
|
|
550
648
|
continue
|
|
551
649
|
|
|
552
|
-
if privacy_request.status
|
|
650
|
+
if privacy_request.status not in [
|
|
651
|
+
PrivacyRequestStatus.pending,
|
|
652
|
+
PrivacyRequestStatus.duplicate,
|
|
653
|
+
]:
|
|
553
654
|
failed.append(
|
|
554
655
|
BulkUpdateFailed(
|
|
555
656
|
message="Cannot transition status",
|
|
@@ -591,6 +692,147 @@ class PrivacyRequestService:
|
|
|
591
692
|
|
|
592
693
|
return BulkReviewResponse(succeeded=succeeded, failed=failed)
|
|
593
694
|
|
|
695
|
+
def cancel_privacy_requests(
|
|
696
|
+
self,
|
|
697
|
+
request_ids: List[str],
|
|
698
|
+
cancel_reason: Optional[str],
|
|
699
|
+
*,
|
|
700
|
+
user_id: Optional[str] = None,
|
|
701
|
+
) -> BulkReviewResponse:
|
|
702
|
+
"""Cancel a list of privacy requests and/or report failure"""
|
|
703
|
+
if len(request_ids) > BULK_PRIVACY_REQUEST_BATCH_SIZE:
|
|
704
|
+
raise ValueError(
|
|
705
|
+
f"Bulk operations are limited to {BULK_PRIVACY_REQUEST_BATCH_SIZE} requests. "
|
|
706
|
+
f"Received {len(request_ids)}. Batch requests at the caller level."
|
|
707
|
+
)
|
|
708
|
+
|
|
709
|
+
succeeded: List[PrivacyRequest] = []
|
|
710
|
+
failed: List[BulkUpdateFailed] = []
|
|
711
|
+
|
|
712
|
+
# Terminal states that cannot be canceled
|
|
713
|
+
terminal_states = [
|
|
714
|
+
PrivacyRequestStatus.complete,
|
|
715
|
+
PrivacyRequestStatus.denied,
|
|
716
|
+
PrivacyRequestStatus.canceled,
|
|
717
|
+
PrivacyRequestStatus.error,
|
|
718
|
+
]
|
|
719
|
+
|
|
720
|
+
# Fetch all privacy requests in one query to avoid N+1
|
|
721
|
+
privacy_requests_dict = self._fetch_privacy_requests_for_bulk_operation(
|
|
722
|
+
request_ids
|
|
723
|
+
)
|
|
724
|
+
|
|
725
|
+
for request_id in request_ids:
|
|
726
|
+
privacy_request = privacy_requests_dict.get(request_id)
|
|
727
|
+
try:
|
|
728
|
+
privacy_request = self._validate_privacy_request_for_bulk_operation(
|
|
729
|
+
privacy_request, request_id
|
|
730
|
+
)
|
|
731
|
+
except PrivacyRequestError as exc:
|
|
732
|
+
failed.append(BulkUpdateFailed(message=exc.message, data=exc.data))
|
|
733
|
+
continue
|
|
734
|
+
|
|
735
|
+
if privacy_request.status in terminal_states:
|
|
736
|
+
failed.append(
|
|
737
|
+
BulkUpdateFailed(
|
|
738
|
+
message=f"Cannot cancel privacy request in {privacy_request.status.value} status",
|
|
739
|
+
data=PrivacyRequestResponse.model_validate(
|
|
740
|
+
privacy_request
|
|
741
|
+
).model_dump(mode="json"),
|
|
742
|
+
)
|
|
743
|
+
)
|
|
744
|
+
continue
|
|
745
|
+
|
|
746
|
+
try:
|
|
747
|
+
privacy_request.cancel_processing(
|
|
748
|
+
db=self.db, cancel_reason=cancel_reason
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
succeeded.append(privacy_request)
|
|
752
|
+
except Exception:
|
|
753
|
+
failed.append(
|
|
754
|
+
BulkUpdateFailed(
|
|
755
|
+
message="Privacy request could not be canceled",
|
|
756
|
+
data=PrivacyRequestResponse.model_validate(
|
|
757
|
+
privacy_request
|
|
758
|
+
).model_dump(mode="json"),
|
|
759
|
+
)
|
|
760
|
+
)
|
|
761
|
+
|
|
762
|
+
return BulkReviewResponse(succeeded=succeeded, failed=failed)
|
|
763
|
+
|
|
764
|
+
def finalize_privacy_requests(
|
|
765
|
+
self,
|
|
766
|
+
request_ids: List[str],
|
|
767
|
+
*,
|
|
768
|
+
user_id: Optional[str] = None,
|
|
769
|
+
) -> BulkReviewResponse:
|
|
770
|
+
"""Finalize privacy requests."""
|
|
771
|
+
if len(request_ids) > BULK_PRIVACY_REQUEST_BATCH_SIZE:
|
|
772
|
+
raise ValueError(
|
|
773
|
+
f"Bulk operations are limited to {BULK_PRIVACY_REQUEST_BATCH_SIZE} requests. "
|
|
774
|
+
f"Received {len(request_ids)}. Batch requests at the caller level."
|
|
775
|
+
)
|
|
776
|
+
|
|
777
|
+
succeeded: List[PrivacyRequest] = []
|
|
778
|
+
failed: List[BulkUpdateFailed] = []
|
|
779
|
+
|
|
780
|
+
# Fetch all privacy requests in one query to avoid N+1
|
|
781
|
+
privacy_requests_dict = self._fetch_privacy_requests_for_bulk_operation(
|
|
782
|
+
request_ids
|
|
783
|
+
)
|
|
784
|
+
|
|
785
|
+
for request_id in request_ids:
|
|
786
|
+
privacy_request = privacy_requests_dict.get(request_id)
|
|
787
|
+
try:
|
|
788
|
+
privacy_request = self._validate_privacy_request_for_bulk_operation(
|
|
789
|
+
privacy_request, request_id
|
|
790
|
+
)
|
|
791
|
+
except PrivacyRequestError as exc:
|
|
792
|
+
failed.append(BulkUpdateFailed(message=exc.message, data=exc.data))
|
|
793
|
+
continue
|
|
794
|
+
|
|
795
|
+
if (
|
|
796
|
+
privacy_request.status
|
|
797
|
+
!= PrivacyRequestStatus.requires_manual_finalization
|
|
798
|
+
):
|
|
799
|
+
failed.append(
|
|
800
|
+
BulkUpdateFailed(
|
|
801
|
+
message=f"Cannot manually finalize privacy request: status is {privacy_request.status}, not requires_manual_finalization",
|
|
802
|
+
data=PrivacyRequestResponse.model_validate(
|
|
803
|
+
privacy_request
|
|
804
|
+
).model_dump(mode="json"),
|
|
805
|
+
)
|
|
806
|
+
)
|
|
807
|
+
continue
|
|
808
|
+
|
|
809
|
+
try:
|
|
810
|
+
# Set finalized_by and finalized_at here, so the request runner service knows not to
|
|
811
|
+
# put the request back into the requires_finalization state.
|
|
812
|
+
privacy_request.finalized_at = datetime.utcnow()
|
|
813
|
+
privacy_request.finalized_by = user_id
|
|
814
|
+
privacy_request.save(db=self.db)
|
|
815
|
+
|
|
816
|
+
# Queue the privacy request for finalization
|
|
817
|
+
queue_privacy_request(
|
|
818
|
+
privacy_request_id=privacy_request.id,
|
|
819
|
+
from_step=CurrentStep.finalization.value,
|
|
820
|
+
)
|
|
821
|
+
|
|
822
|
+
succeeded.append(privacy_request)
|
|
823
|
+
except Exception as exc:
|
|
824
|
+
logger.exception(exc)
|
|
825
|
+
failed.append(
|
|
826
|
+
BulkUpdateFailed(
|
|
827
|
+
message="Privacy request could not be finalized",
|
|
828
|
+
data=PrivacyRequestResponse.model_validate(
|
|
829
|
+
privacy_request
|
|
830
|
+
).model_dump(mode="json"),
|
|
831
|
+
)
|
|
832
|
+
)
|
|
833
|
+
|
|
834
|
+
return BulkReviewResponse(succeeded=succeeded, failed=failed)
|
|
835
|
+
|
|
594
836
|
|
|
595
837
|
@log_context(capture_args={"privacy_request_id": LoggerContextKeys.privacy_request_id})
|
|
596
838
|
def queue_privacy_request(
|
|
@@ -651,6 +893,7 @@ def _handle_notifications_and_processing(
|
|
|
651
893
|
privacy_request_data: PrivacyRequestCreate,
|
|
652
894
|
policy: Policy,
|
|
653
895
|
authenticated: bool,
|
|
896
|
+
messaging_service: MessagingService,
|
|
654
897
|
) -> None:
|
|
655
898
|
"""Handle notifications and request processing after creation"""
|
|
656
899
|
if not authenticated and message_send_enabled(
|
|
@@ -659,8 +902,7 @@ def _handle_notifications_and_processing(
|
|
|
659
902
|
MessagingActionType.SUBJECT_IDENTITY_VERIFICATION,
|
|
660
903
|
config_proxy.execution.subject_identity_verification_required,
|
|
661
904
|
):
|
|
662
|
-
|
|
663
|
-
db,
|
|
905
|
+
messaging_service.send_verification_code(
|
|
664
906
|
privacy_request,
|
|
665
907
|
privacy_request_data.identity,
|
|
666
908
|
privacy_request.property_id,
|
|
@@ -794,6 +1036,9 @@ def handle_approval(
|
|
|
794
1036
|
db: Session, config_proxy: ConfigProxy, privacy_request: PrivacyRequest
|
|
795
1037
|
) -> None:
|
|
796
1038
|
"""Evaluate manual approval and handle processing or pre-approval webhooks."""
|
|
1039
|
+
check_for_duplicates(db=db, privacy_request=privacy_request)
|
|
1040
|
+
if privacy_request.status == PrivacyRequestStatus.duplicate:
|
|
1041
|
+
return
|
|
797
1042
|
if _manual_approval_required(config_proxy, privacy_request):
|
|
798
1043
|
_trigger_pre_approval_webhooks(db, privacy_request)
|
|
799
1044
|
else:
|
|
File without changes
|