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
|
@@ -17,6 +17,7 @@ from fides.api.models import (
|
|
|
17
17
|
dry_update_data,
|
|
18
18
|
update_if_modified,
|
|
19
19
|
)
|
|
20
|
+
from fides.api.models.experience_notices import ExperienceNotices
|
|
20
21
|
from fides.api.models.location_regulation_selections import PrivacyNoticeRegion
|
|
21
22
|
from fides.api.models.privacy_notice import PrivacyNotice
|
|
22
23
|
from fides.api.models.property import Property
|
|
@@ -48,6 +49,7 @@ class Layer1ButtonOption(Enum):
|
|
|
48
49
|
ACKNOWLEDGE = "acknowledge"
|
|
49
50
|
OPT_IN_OPT_OUT = "opt_in_opt_out"
|
|
50
51
|
OPT_IN_ONLY = "opt_in_only"
|
|
52
|
+
GPC_CONDITIONAL = "gpc_conditional"
|
|
51
53
|
|
|
52
54
|
|
|
53
55
|
class RejectAllMechanism(Enum):
|
|
@@ -101,6 +103,11 @@ class PrivacyExperienceConfigBase:
|
|
|
101
103
|
nullable=True,
|
|
102
104
|
default=True,
|
|
103
105
|
) # base is nullable for privacy experience config history
|
|
106
|
+
cookie_deletion_based_on_host_domain = Column(
|
|
107
|
+
Boolean,
|
|
108
|
+
nullable=True,
|
|
109
|
+
default=True,
|
|
110
|
+
) # base is nullable for privacy experience config history
|
|
104
111
|
|
|
105
112
|
disabled = Column(Boolean, nullable=False, default=True)
|
|
106
113
|
|
|
@@ -108,6 +115,10 @@ class PrivacyExperienceConfigBase:
|
|
|
108
115
|
|
|
109
116
|
show_layer1_notices = Column(Boolean, nullable=True, default=False)
|
|
110
117
|
|
|
118
|
+
# Vendor/Asset disclosure configuration
|
|
119
|
+
allow_vendor_asset_disclosure = Column(Boolean, nullable=True, default=False)
|
|
120
|
+
asset_disclosure_include_types = Column(ARRAY(String), nullable=True)
|
|
121
|
+
|
|
111
122
|
@declared_attr
|
|
112
123
|
def layer1_button_options(cls) -> Column:
|
|
113
124
|
return Column(
|
|
@@ -139,9 +150,15 @@ class ExperienceConfigTemplate(PrivacyExperienceConfigBase, Base):
|
|
|
139
150
|
auto_subdomain_cookie_deletion = Column(
|
|
140
151
|
Boolean, nullable=False, default=True, server_default="t"
|
|
141
152
|
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
153
|
+
cookie_deletion_based_on_host_domain = Column(
|
|
154
|
+
Boolean, nullable=False, default=True, server_default="t"
|
|
155
|
+
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
142
156
|
dismissable = Column(
|
|
143
157
|
Boolean, nullable=False, default=True, server_default="t"
|
|
144
158
|
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
159
|
+
allow_vendor_asset_disclosure = Column(
|
|
160
|
+
Boolean, nullable=False, default=False, server_default="f"
|
|
161
|
+
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
145
162
|
name = Column(
|
|
146
163
|
String, nullable=False
|
|
147
164
|
) # Overriding PrivacyExperienceConfigBase to make non-nullable
|
|
@@ -210,12 +227,18 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
|
|
|
210
227
|
auto_subdomain_cookie_deletion = Column(
|
|
211
228
|
Boolean, nullable=False, default=True, server_default="t"
|
|
212
229
|
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
230
|
+
cookie_deletion_based_on_host_domain = Column(
|
|
231
|
+
Boolean, nullable=False, default=True, server_default="t"
|
|
232
|
+
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
213
233
|
disabled = Column(
|
|
214
234
|
Boolean, nullable=False, default=True, index=True
|
|
215
235
|
) # Overridding PrivacyExperienceConfigBase to index
|
|
216
236
|
dismissable = Column(
|
|
217
237
|
Boolean, nullable=False, default=True, server_default="t"
|
|
218
238
|
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
239
|
+
allow_vendor_asset_disclosure = Column(
|
|
240
|
+
Boolean, nullable=False, default=False, server_default="f"
|
|
241
|
+
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
219
242
|
name = Column(
|
|
220
243
|
String, nullable=False
|
|
221
244
|
) # Overriding PrivacyExperienceConfigBase to make non-nullable
|
|
@@ -250,6 +273,7 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
|
|
|
250
273
|
secondary="experiencenotices",
|
|
251
274
|
backref="experience_configs",
|
|
252
275
|
lazy="selectin",
|
|
276
|
+
order_by="ExperienceNotices.display_order.asc().nullslast()",
|
|
253
277
|
)
|
|
254
278
|
|
|
255
279
|
translations: RelationshipProperty[List[ExperienceTranslation]] = relationship(
|
|
@@ -727,15 +751,19 @@ def link_notices_to_experience_config(
|
|
|
727
751
|
) -> List[PrivacyNotice]:
|
|
728
752
|
"""
|
|
729
753
|
Link supplied Notices to ExperienceConfig and unlink any notices not supplied.
|
|
754
|
+
|
|
755
|
+
Preserves the order of notices by setting display_order on the junction table records.
|
|
730
756
|
"""
|
|
731
757
|
new_notices: Query = db.query(PrivacyNotice).filter(
|
|
732
758
|
PrivacyNotice.id.in_(notice_ids)
|
|
733
759
|
)
|
|
734
760
|
|
|
761
|
+
# Add new notices
|
|
735
762
|
for notice in new_notices:
|
|
736
763
|
if notice not in experience_config.privacy_notices:
|
|
737
764
|
experience_config.privacy_notices.append(notice)
|
|
738
765
|
|
|
766
|
+
# Remove notices that are no longer in the list
|
|
739
767
|
to_remove: Set[PrivacyNotice] = set(
|
|
740
768
|
notice for notice in experience_config.privacy_notices
|
|
741
769
|
) - set(notice for notice in new_notices)
|
|
@@ -744,6 +772,19 @@ def link_notices_to_experience_config(
|
|
|
744
772
|
experience_config.privacy_notices.remove(privacy_notice)
|
|
745
773
|
|
|
746
774
|
experience_config.save(db)
|
|
775
|
+
|
|
776
|
+
# Update display_order on the junction table records based on the order in notice_ids
|
|
777
|
+
for index, notice_id in enumerate(notice_ids):
|
|
778
|
+
db.query(ExperienceNotices).filter(
|
|
779
|
+
ExperienceNotices.notice_id == notice_id,
|
|
780
|
+
ExperienceNotices.experience_config_id == experience_config.id,
|
|
781
|
+
).update({"display_order": index})
|
|
782
|
+
|
|
783
|
+
db.commit()
|
|
784
|
+
|
|
785
|
+
# Expire the relationship to force reload with correct ordering
|
|
786
|
+
db.expire(experience_config, ["privacy_notices"])
|
|
787
|
+
|
|
747
788
|
return experience_config.privacy_notices
|
|
748
789
|
|
|
749
790
|
|
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import itertools
|
|
3
4
|
import re
|
|
4
5
|
from enum import Enum
|
|
6
|
+
from functools import cached_property
|
|
5
7
|
from typing import Any, Dict, List, Optional, Set, Type
|
|
6
8
|
|
|
7
9
|
from fideslang.validation import FidesKey, validate_fides_key
|
|
8
10
|
from sqlalchemy import Boolean, Column
|
|
9
11
|
from sqlalchemy import Enum as EnumColumn
|
|
10
|
-
from sqlalchemy import
|
|
12
|
+
from sqlalchemy import (
|
|
13
|
+
Float,
|
|
14
|
+
ForeignKey,
|
|
15
|
+
Integer,
|
|
16
|
+
String,
|
|
17
|
+
UniqueConstraint,
|
|
18
|
+
false,
|
|
19
|
+
or_,
|
|
20
|
+
text,
|
|
21
|
+
)
|
|
11
22
|
from sqlalchemy.dialects.postgresql import ARRAY, JSONB
|
|
12
23
|
from sqlalchemy.ext.mutable import MutableList
|
|
13
|
-
from sqlalchemy.orm import RelationshipProperty, Session, relationship
|
|
24
|
+
from sqlalchemy.orm import RelationshipProperty, Session, relationship, selectinload
|
|
14
25
|
from sqlalchemy.orm.dynamic import AppenderQuery
|
|
26
|
+
from sqlalchemy.sql.elements import ColumnElement
|
|
15
27
|
from sqlalchemy.util import hybridproperty
|
|
16
28
|
|
|
17
29
|
from fides.api.db.base_class import Base, FidesBase
|
|
@@ -41,7 +53,7 @@ class UserConsentPreference(Enum):
|
|
|
41
53
|
tcf = "tcf" # Overall preference set for TCF where there are numerous preferences under the single notice
|
|
42
54
|
|
|
43
55
|
|
|
44
|
-
class ConsentMechanism(Enum):
|
|
56
|
+
class ConsentMechanism(str, Enum):
|
|
45
57
|
"""
|
|
46
58
|
Enum is not formalized in the DB because it may be subject to frequent change
|
|
47
59
|
"""
|
|
@@ -159,11 +171,18 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
159
171
|
ForeignKey("privacynotice.id", ondelete="SET NULL"),
|
|
160
172
|
nullable=True,
|
|
161
173
|
)
|
|
174
|
+
display_order = Column(
|
|
175
|
+
Integer,
|
|
176
|
+
nullable=True,
|
|
177
|
+
doc="Optional ordering for child notices within a parent. Lower values appear first.",
|
|
178
|
+
)
|
|
179
|
+
|
|
162
180
|
children: "RelationshipProperty[List[PrivacyNotice]]" = relationship(
|
|
163
181
|
"PrivacyNotice",
|
|
164
182
|
back_populates="parent",
|
|
165
183
|
cascade="all",
|
|
166
184
|
passive_deletes=True,
|
|
185
|
+
order_by=lambda: PrivacyNotice.display_order.asc().nullslast(),
|
|
167
186
|
)
|
|
168
187
|
parent: "RelationshipProperty[Optional[PrivacyNotice]]" = relationship(
|
|
169
188
|
"PrivacyNotice",
|
|
@@ -189,22 +208,150 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
189
208
|
|
|
190
209
|
raise Exception("Invalid notice consent mechanism.")
|
|
191
210
|
|
|
192
|
-
@
|
|
193
|
-
def
|
|
194
|
-
"""
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
211
|
+
@staticmethod
|
|
212
|
+
def _get_cookie_filter_for_data_uses(data_uses: List[str]) -> ColumnElement:
|
|
213
|
+
"""
|
|
214
|
+
Returns the SQLAlchemy filter clause to find cookies for the given data uses.
|
|
215
|
+
This is a helper method to keep the query logic consistent and safe.
|
|
216
|
+
"""
|
|
217
|
+
if not data_uses:
|
|
218
|
+
return false()
|
|
219
|
+
|
|
220
|
+
# Use array overlap operator (&&) for exact matches - GIN index friendly
|
|
221
|
+
exact_matches_condition = Asset.data_uses.op("&&")(data_uses)
|
|
222
|
+
|
|
223
|
+
# For hierarchical children, we still need to check individual elements with LIKE
|
|
224
|
+
# They have to match the data_use and the period separator, so we know it's a hierarchical descendant
|
|
225
|
+
hierarchical_conditions = [
|
|
226
|
+
text(
|
|
227
|
+
f"EXISTS(SELECT 1 FROM unnest(data_uses) AS data_use WHERE data_use LIKE :pattern_{i})"
|
|
228
|
+
).bindparams(**{f"pattern_{i}": f"{data_use}.%"})
|
|
229
|
+
for i, data_use in enumerate(data_uses)
|
|
199
230
|
]
|
|
200
231
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
232
|
+
return or_(exact_matches_condition, *hierarchical_conditions)
|
|
233
|
+
|
|
234
|
+
@classmethod
|
|
235
|
+
def _query_cookie_assets_for_data_uses(
|
|
236
|
+
cls,
|
|
237
|
+
db: Session,
|
|
238
|
+
data_uses: Set[str],
|
|
239
|
+
exclude_cookies_from_systems: Optional[Set[str]] = None,
|
|
240
|
+
) -> List[Asset]:
|
|
241
|
+
"""
|
|
242
|
+
Query cookie Assets for the given set of data uses using the shared filter logic.
|
|
243
|
+
Applies optional exclusion by `System.fides_key` and eagerly loads the `system` relationship.
|
|
244
|
+
"""
|
|
245
|
+
if not data_uses:
|
|
246
|
+
return []
|
|
247
|
+
|
|
248
|
+
cookie_filter = cls._get_cookie_filter_for_data_uses(list(data_uses))
|
|
249
|
+
query = (
|
|
250
|
+
db.query(Asset)
|
|
251
|
+
.options(selectinload("system"))
|
|
252
|
+
.filter(
|
|
253
|
+
Asset.asset_type == "Cookie",
|
|
254
|
+
cookie_filter,
|
|
255
|
+
)
|
|
204
256
|
)
|
|
257
|
+
if exclude_cookies_from_systems:
|
|
258
|
+
query = query.outerjoin(System).filter(
|
|
259
|
+
or_(
|
|
260
|
+
Asset.system_id.is_(None),
|
|
261
|
+
System.fides_key.not_in(exclude_cookies_from_systems),
|
|
262
|
+
)
|
|
263
|
+
)
|
|
205
264
|
|
|
206
265
|
return query.all()
|
|
207
266
|
|
|
267
|
+
@staticmethod
|
|
268
|
+
def _group_cookies_by_data_use(cookies: List[Asset]) -> Dict[str, List[Asset]]:
|
|
269
|
+
"""Build a mapping of data_use -> list of cookie Assets."""
|
|
270
|
+
cookies_by_data_use: Dict[str, List[Asset]] = {}
|
|
271
|
+
for cookie in cookies:
|
|
272
|
+
for data_use in cookie.data_uses or []:
|
|
273
|
+
cookies_by_data_use.setdefault(data_use, []).append(cookie)
|
|
274
|
+
return cookies_by_data_use
|
|
275
|
+
|
|
276
|
+
@staticmethod
|
|
277
|
+
def _select_cookies_for_notice_data_uses(
|
|
278
|
+
notice_data_uses: List[str],
|
|
279
|
+
cookies_by_data_use: Dict[str, List[Asset]],
|
|
280
|
+
) -> List[Asset]:
|
|
281
|
+
"""
|
|
282
|
+
Return cookies that match the notice data uses either exactly or as hierarchical descendants.
|
|
283
|
+
Deduplicate by object identity; ordering is not guaranteed.
|
|
284
|
+
"""
|
|
285
|
+
unique_cookies_by_id: Dict[int, Asset] = {}
|
|
286
|
+
|
|
287
|
+
for notice_data_use in notice_data_uses or []:
|
|
288
|
+
# Exact matches
|
|
289
|
+
for cookie in cookies_by_data_use.get(notice_data_use, []):
|
|
290
|
+
unique_cookies_by_id[id(cookie)] = cookie
|
|
291
|
+
|
|
292
|
+
# Hierarchical descendants: e.g., "analytics" matches "analytics.reporting"
|
|
293
|
+
prefix = f"{notice_data_use}."
|
|
294
|
+
for du_key, cookie_list in cookies_by_data_use.items():
|
|
295
|
+
if du_key.startswith(prefix):
|
|
296
|
+
for cookie in cookie_list:
|
|
297
|
+
unique_cookies_by_id[id(cookie)] = cookie
|
|
298
|
+
|
|
299
|
+
return list(unique_cookies_by_id.values())
|
|
300
|
+
|
|
301
|
+
@cached_property
|
|
302
|
+
def cookies(self) -> List[Asset]:
|
|
303
|
+
"""
|
|
304
|
+
Return relevant assets of type 'cookie' (via the data use)
|
|
305
|
+
|
|
306
|
+
Cookies are matched to the privacy notice if they have at least one data use
|
|
307
|
+
that is either an exact match or a hierarchical descendant of a one of the
|
|
308
|
+
data uses in the privacy notice.
|
|
309
|
+
|
|
310
|
+
This is a cached_property, so the database query is only executed
|
|
311
|
+
once per instance, and the result is cached for subsequent accesses.
|
|
312
|
+
"""
|
|
313
|
+
db = Session.object_session(self)
|
|
314
|
+
cookie_filter = self._get_cookie_filter_for_data_uses(self.data_uses)
|
|
315
|
+
|
|
316
|
+
return (
|
|
317
|
+
db.query(Asset)
|
|
318
|
+
.filter(
|
|
319
|
+
Asset.asset_type == "Cookie",
|
|
320
|
+
cookie_filter,
|
|
321
|
+
)
|
|
322
|
+
.all()
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
@classmethod
|
|
326
|
+
def load_cookie_data_for_notices(
|
|
327
|
+
cls,
|
|
328
|
+
db: Session,
|
|
329
|
+
notices: List["PrivacyNotice"],
|
|
330
|
+
exclude_cookies_from_systems: Optional[Set[str]] = None,
|
|
331
|
+
) -> None:
|
|
332
|
+
"""
|
|
333
|
+
An efficient method to bulk-load cookie data for a list of PrivacyNotice objects.
|
|
334
|
+
This prevents the "N+1" query problem by pre-populating the `cookies`
|
|
335
|
+
cached_property for each notice.
|
|
336
|
+
"""
|
|
337
|
+
if not notices:
|
|
338
|
+
return
|
|
339
|
+
|
|
340
|
+
all_data_uses = set(itertools.chain.from_iterable(n.data_uses for n in notices))
|
|
341
|
+
all_relevant_cookies = cls._query_cookie_assets_for_data_uses(
|
|
342
|
+
db, all_data_uses, exclude_cookies_from_systems
|
|
343
|
+
)
|
|
344
|
+
cookies_by_data_use = cls._group_cookies_by_data_use(all_relevant_cookies)
|
|
345
|
+
|
|
346
|
+
for notice in notices:
|
|
347
|
+
matching_cookies = cls._select_cookies_for_notice_data_uses(
|
|
348
|
+
notice.data_uses, cookies_by_data_use
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
# Pre-populate the cache of the 'cookies' cached_property.
|
|
352
|
+
# This directly sets the attribute that the decorator would otherwise compute.
|
|
353
|
+
setattr(notice, "cookies", matching_cookies)
|
|
354
|
+
|
|
208
355
|
@property
|
|
209
356
|
def calculated_systems_applicable(self) -> bool:
|
|
210
357
|
"""Convenience property to return if any systems overlap with this notice's data uses
|
|
@@ -244,6 +391,26 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
244
391
|
res = [result for result in experience_regions_cursor_result]
|
|
245
392
|
return res[0]["regions"] if res else []
|
|
246
393
|
|
|
394
|
+
@staticmethod
|
|
395
|
+
def _set_child_notice_display_order(
|
|
396
|
+
child_notices: List[Dict[str, Any]],
|
|
397
|
+
existing_notices: List[PrivacyNotice],
|
|
398
|
+
) -> None:
|
|
399
|
+
"""
|
|
400
|
+
Sets display_order on child notice objects based on their position in the child_notices list.
|
|
401
|
+
|
|
402
|
+
Args:
|
|
403
|
+
child_notices: List of dictionaries containing notice IDs in the desired order
|
|
404
|
+
existing_notices: List of PrivacyNotice objects to update
|
|
405
|
+
"""
|
|
406
|
+
notice_id_to_index = {
|
|
407
|
+
child_notice["id"]: index
|
|
408
|
+
for index, child_notice in enumerate(child_notices)
|
|
409
|
+
}
|
|
410
|
+
for child_notice_obj in existing_notices:
|
|
411
|
+
if child_notice_obj.id in notice_id_to_index:
|
|
412
|
+
child_notice_obj.display_order = notice_id_to_index[child_notice_obj.id]
|
|
413
|
+
|
|
247
414
|
@classmethod
|
|
248
415
|
def fetch_and_validate_notices(
|
|
249
416
|
cls,
|
|
@@ -311,6 +478,10 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
311
478
|
|
|
312
479
|
# automatically links and unlinks at the DB level with this assignment
|
|
313
480
|
created.children = existing_notices
|
|
481
|
+
|
|
482
|
+
# Set display_order on children based on their position in the ORIGINAL child_notices list
|
|
483
|
+
cls._set_child_notice_display_order(child_notices, existing_notices)
|
|
484
|
+
|
|
314
485
|
db.commit()
|
|
315
486
|
|
|
316
487
|
data.pop(
|
|
@@ -350,6 +521,9 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
350
521
|
# automatically links and unlinks at the DB level with this assignment
|
|
351
522
|
self.children = existing_notices
|
|
352
523
|
|
|
524
|
+
# Set display_order on children based on their position in the ORIGINAL child_notices list
|
|
525
|
+
self._set_child_notice_display_order(child_notices, existing_notices)
|
|
526
|
+
|
|
353
527
|
# Performs a patch update of the base privacy notice
|
|
354
528
|
base_notice_updated: bool = update_if_modified(self, db=db, data=data)
|
|
355
529
|
|
|
@@ -399,6 +573,10 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
399
573
|
# to prevent the dry update from being added to Session.new
|
|
400
574
|
updated_attributes.pop("translations", [])
|
|
401
575
|
updated_attributes.pop("children", [])
|
|
576
|
+
# The source PrivacyNotice may have cached/computed attributes (e.g., @cached_property)
|
|
577
|
+
# stored on the instance dict. These should not be included in historical payloads.
|
|
578
|
+
# For example, 'cookies' is cached on the PrivacyNotice instance when accessed.
|
|
579
|
+
updated_attributes.pop("cookies", None)
|
|
402
580
|
|
|
403
581
|
# create a new object with the updated attribute data to keep this
|
|
404
582
|
# ORM object (i.e., `self`) pristine
|
|
@@ -545,6 +723,11 @@ def create_historical_record_for_notice_and_translation(
|
|
|
545
723
|
history_data: dict = create_historical_data_from_record(privacy_notice)
|
|
546
724
|
history_data.pop("translations", None)
|
|
547
725
|
history_data.pop("parent_id", None)
|
|
726
|
+
history_data.pop("display_order", None)
|
|
727
|
+
# The source PrivacyNotice may have cached/computed attributes (e.g., @cached_property)
|
|
728
|
+
# stored on the instance dict. These should not be included in historical payloads.
|
|
729
|
+
# For example, 'cookies' is cached on the PrivacyNotice instance when accessed.
|
|
730
|
+
history_data.pop("cookies", None)
|
|
548
731
|
|
|
549
732
|
updated_translation_data: dict = create_historical_data_from_record(
|
|
550
733
|
notice_translation
|
|
@@ -44,6 +44,7 @@ class RequestOrigin(Enum):
|
|
|
44
44
|
banner_and_modal = "banner_and_modal"
|
|
45
45
|
api = "api"
|
|
46
46
|
tcf_overlay = "tcf_overlay"
|
|
47
|
+
headless = "headless"
|
|
47
48
|
|
|
48
49
|
|
|
49
50
|
class ConsentMethod(Enum):
|
|
@@ -58,6 +59,7 @@ class ConsentMethod(Enum):
|
|
|
58
59
|
gpc = "gpc"
|
|
59
60
|
individual_notice = "individual_notice"
|
|
60
61
|
acknowledge = "acknowledge"
|
|
62
|
+
external_provider = "external_provider"
|
|
61
63
|
|
|
62
64
|
|
|
63
65
|
class ServingComponent(Enum):
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import json
|
|
3
|
+
import uuid
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
from sqlalchemy import Boolean, Column, Text
|
|
7
|
+
from sqlalchemy.dialects.postgresql import UUID
|
|
8
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
9
|
+
from sqlalchemy.orm import Session, relationship
|
|
10
|
+
|
|
11
|
+
from fides.api.db.base_class import Base # type: ignore[attr-defined]
|
|
12
|
+
from fides.config.duplicate_detection_settings import DuplicateDetectionSettings
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from fides.api.models.privacy_request.privacy_request import PrivacyRequest
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def generate_deterministic_uuid(rule_version: str, dedup_key: str) -> uuid.UUID:
|
|
19
|
+
"""Overrides the base class method to generate a deterministic group id.
|
|
20
|
+
|
|
21
|
+
The actual rule version is a hash of the duplicate detection settings config,
|
|
22
|
+
using simple examples here for illustration:
|
|
23
|
+
- under rule "email", duplicate@example.com → group A,
|
|
24
|
+
- under rule "email|phone", duplicate@example.com|1234567890 → group B.
|
|
25
|
+
- ... and so on.
|
|
26
|
+
|
|
27
|
+
No collisions, no overlap.
|
|
28
|
+
"""
|
|
29
|
+
# Combine the rule version and the key into a stable hash
|
|
30
|
+
hash_input = f"{rule_version}:{dedup_key}".encode("utf-8")
|
|
31
|
+
return uuid.UUID(hashlib.md5(hash_input).hexdigest())
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def generate_rule_version(config: DuplicateDetectionSettings) -> str:
|
|
35
|
+
"""Generate a stable short hash for the dedup rule config."""
|
|
36
|
+
normalized = json.dumps(config.model_dump(), sort_keys=True)
|
|
37
|
+
return hashlib.sha256(normalized.encode("utf-8")).hexdigest()[:8]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class DuplicateGroup(Base):
|
|
41
|
+
"""
|
|
42
|
+
A table for storing duplicate request group information.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
@declared_attr
|
|
46
|
+
def __tablename__(self) -> str:
|
|
47
|
+
return "duplicate_group"
|
|
48
|
+
|
|
49
|
+
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
50
|
+
rule_version = Column(Text, nullable=False)
|
|
51
|
+
# TODO: The is_active column is not used yet since we are defaulting to just email for
|
|
52
|
+
# duplicate detection. When we allow users to configure the duplicate detection settings,
|
|
53
|
+
# we will need to add a way to activate/deactivate duplicate groups.
|
|
54
|
+
# This should be done by getting the previous rule version and deactivating all groups with
|
|
55
|
+
# that rule version. New groups will be created with the new rule version.
|
|
56
|
+
is_active = Column(Boolean, default=True, nullable=False)
|
|
57
|
+
dedup_key = Column(Text, nullable=False)
|
|
58
|
+
privacy_requests = relationship(
|
|
59
|
+
"PrivacyRequest",
|
|
60
|
+
back_populates="duplicate_group",
|
|
61
|
+
lazy="dynamic",
|
|
62
|
+
primaryjoin="and_(DuplicateGroup.id == PrivacyRequest.duplicate_request_group_id)",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def create(
|
|
67
|
+
cls, db: Session, *, data: dict[str, Any], check_name: bool = False
|
|
68
|
+
) -> "DuplicateGroup":
|
|
69
|
+
"""Create a new duplicate group.
|
|
70
|
+
Override the base class method to generate a deterministic group id.
|
|
71
|
+
If the group already exists, update the is_active column to True and return the group.
|
|
72
|
+
"""
|
|
73
|
+
group_id = generate_deterministic_uuid(data["rule_version"], data["dedup_key"])
|
|
74
|
+
# If the group already exists, update the is_active column to True and return the group
|
|
75
|
+
duplicate_group = (
|
|
76
|
+
db.query(DuplicateGroup).filter(DuplicateGroup.id == group_id).one_or_none()
|
|
77
|
+
)
|
|
78
|
+
if duplicate_group:
|
|
79
|
+
duplicate_group.update(db, data={"is_active": True})
|
|
80
|
+
return duplicate_group
|
|
81
|
+
|
|
82
|
+
# If the group does not exist, create a new one
|
|
83
|
+
data["id"] = group_id
|
|
84
|
+
return super().create(db, data=data, check_name=check_name)
|