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
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from enum import Enum
|
|
4
4
|
from typing import List, Optional
|
|
5
5
|
|
|
6
|
-
from sqlalchemy import ARRAY, Column
|
|
6
|
+
from sqlalchemy import ARRAY, Boolean, Column
|
|
7
7
|
from sqlalchemy import Enum as SQLAlchemyEnum
|
|
8
8
|
from sqlalchemy import ForeignKey, String
|
|
9
9
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
@@ -25,6 +25,7 @@ class MonitorTaskType(Enum):
|
|
|
25
25
|
|
|
26
26
|
DETECTION = "detection"
|
|
27
27
|
CLASSIFICATION = "classification"
|
|
28
|
+
LLM_CLASSIFICATION = "llm_classification"
|
|
28
29
|
PROMOTION = "promotion"
|
|
29
30
|
REMOVAL_PROMOTION = "removal_promotion"
|
|
30
31
|
|
|
@@ -51,6 +52,7 @@ class MonitorTask(WorkerTask, Base):
|
|
|
51
52
|
)
|
|
52
53
|
staged_resource_urns = Column(ARRAY(String), nullable=True)
|
|
53
54
|
child_resource_urns = Column(ARRAY(String), nullable=True)
|
|
55
|
+
dismissed = Column(Boolean, nullable=False, default=False)
|
|
54
56
|
|
|
55
57
|
monitor_config = relationship(MonitorConfig, cascade="all, delete")
|
|
56
58
|
execution_logs = relationship(
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Module for staged resource error tracking."""
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import Column, DateTime, ForeignKey, String
|
|
4
|
+
|
|
5
|
+
from fides.api.db.base_class import Base, FidesBase
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class StagedResourceError(Base):
|
|
9
|
+
"""
|
|
10
|
+
DB model for tracking errors associated with staged resources.
|
|
11
|
+
Linked to StagedResource via FK with cascade delete.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
|
15
|
+
staged_resource_urn = Column(
|
|
16
|
+
String,
|
|
17
|
+
ForeignKey("stagedresource.urn", ondelete="CASCADE"),
|
|
18
|
+
nullable=False,
|
|
19
|
+
index=True,
|
|
20
|
+
)
|
|
21
|
+
message = Column(String, nullable=False)
|
|
22
|
+
timestamp = Column(DateTime(timezone=True), nullable=False)
|
|
23
|
+
error_type = Column(String, nullable=False)
|
|
24
|
+
diff_status = Column(String, nullable=False) # Phase where error occurred
|
|
25
|
+
task_id = Column(String, nullable=True, index=True)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from typing import Any, Optional
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import Boolean, Column, String, insert, select
|
|
4
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
5
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
6
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
7
|
+
|
|
8
|
+
from fides.api.db.base_class import Base
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class WebMonitorGroupJob(Base):
|
|
12
|
+
"""SQL model for storing data returned from a web monitor group job"""
|
|
13
|
+
|
|
14
|
+
@declared_attr
|
|
15
|
+
def __tablename__(self) -> str:
|
|
16
|
+
return "web_monitor_group_job"
|
|
17
|
+
|
|
18
|
+
# The id for the web monitor group on the web monitor service
|
|
19
|
+
group_id = Column(String, nullable=False, unique=True)
|
|
20
|
+
|
|
21
|
+
# The raw experiences data obtained for that group from the web monitor service
|
|
22
|
+
raw_experiences_data = Column(JSONB, nullable=True)
|
|
23
|
+
# The processed experiences data, used to calculate an StagedResource's consent status
|
|
24
|
+
processed_experiences_data = Column(JSONB, nullable=True)
|
|
25
|
+
|
|
26
|
+
# Whether this data is from a test_website monitor rather than a real one
|
|
27
|
+
is_test_run = Column(Boolean, nullable=False, default=False)
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
async def create_async(
|
|
31
|
+
cls,
|
|
32
|
+
async_session: AsyncSession,
|
|
33
|
+
*,
|
|
34
|
+
group_id: str,
|
|
35
|
+
is_test_run: Optional[bool] = False,
|
|
36
|
+
raw_experiences_data: Optional[dict[str, Any]] = None,
|
|
37
|
+
processed_experiences_data: Optional[dict[str, Any]] = None,
|
|
38
|
+
) -> "WebMonitorGroupJob":
|
|
39
|
+
"""Create a new WebMonitorGroupJob"""
|
|
40
|
+
values = {
|
|
41
|
+
"group_id": group_id,
|
|
42
|
+
"is_test_run": is_test_run,
|
|
43
|
+
"raw_experiences_data": raw_experiences_data,
|
|
44
|
+
"processed_experiences_data": processed_experiences_data,
|
|
45
|
+
}
|
|
46
|
+
stmt = insert(cls.__table__).values(**values).returning(*cls.__table__.columns)
|
|
47
|
+
result = await async_session.execute(stmt)
|
|
48
|
+
row = result.first()
|
|
49
|
+
return cls(**dict(row))
|
|
50
|
+
|
|
51
|
+
@classmethod
|
|
52
|
+
async def get_by_group_id_async(
|
|
53
|
+
cls, async_session: AsyncSession, group_id: str
|
|
54
|
+
) -> Optional["WebMonitorGroupJob"]:
|
|
55
|
+
"""Get a WebMonitorGroupJob by group_id"""
|
|
56
|
+
stmt = select(*cls.__table__.columns).where(
|
|
57
|
+
cls.__table__.c.group_id == group_id
|
|
58
|
+
)
|
|
59
|
+
result = await async_session.execute(stmt)
|
|
60
|
+
row = result.first()
|
|
61
|
+
return cls(**dict(row)) if row else None
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Digest models package."""
|
|
2
|
+
|
|
3
|
+
from fides.api.models.digest.conditional_dependencies import (
|
|
4
|
+
DigestCondition,
|
|
5
|
+
DigestConditionType,
|
|
6
|
+
)
|
|
7
|
+
from fides.api.models.digest.digest_config import DigestConfig, DigestType
|
|
8
|
+
from fides.api.models.digest.digest_execution import DigestTaskExecution
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"DigestConfig",
|
|
12
|
+
"DigestType",
|
|
13
|
+
"DigestCondition",
|
|
14
|
+
"DigestConditionType",
|
|
15
|
+
"DigestTaskExecution",
|
|
16
|
+
]
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
|
3
|
+
|
|
4
|
+
from sqlalchemy import Column, ForeignKey, Index, String, text
|
|
5
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
6
|
+
from sqlalchemy.orm import Session, relationship
|
|
7
|
+
|
|
8
|
+
from fides.api.db.base_class import FidesBase
|
|
9
|
+
from fides.api.db.util import EnumColumn
|
|
10
|
+
from fides.api.models.conditional_dependency.conditional_dependency_base import (
|
|
11
|
+
ConditionalDependencyBase,
|
|
12
|
+
ConditionalDependencyError,
|
|
13
|
+
)
|
|
14
|
+
from fides.api.task.conditional_dependencies.schemas import (
|
|
15
|
+
Condition,
|
|
16
|
+
ConditionGroup,
|
|
17
|
+
ConditionLeaf,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from fides.api.models.digest.digest_config import DigestConfig
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DigestConditionType(str, Enum):
|
|
25
|
+
"""Types of digest conditions - each can have their own tree.
|
|
26
|
+
|
|
27
|
+
Types:
|
|
28
|
+
- RECEIVER: Conditions that determine who gets the digest
|
|
29
|
+
- CONTENT: Conditions that determine what gets included in the digest
|
|
30
|
+
- PRIORITY: Conditions that determine what is considered high priority for the digest
|
|
31
|
+
- This could be used to determine sending the digest at a different time or how
|
|
32
|
+
often it should be sent. It could also be used to format content.
|
|
33
|
+
- Example:
|
|
34
|
+
- DSRs that are due within the next week
|
|
35
|
+
- Privacy requests that are due within the next week
|
|
36
|
+
- Privacy requests for certain geographic regions
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
RECEIVER = "receiver"
|
|
40
|
+
CONTENT = "content"
|
|
41
|
+
PRIORITY = "priority"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class DigestCondition(ConditionalDependencyBase):
|
|
45
|
+
"""Digest conditional dependencies - multi-type hierarchies.
|
|
46
|
+
|
|
47
|
+
- Multi-type hierarchy means one digest_config can have multiple independent
|
|
48
|
+
condition trees, each with a different digest_condition_type (RECEIVER, CONTENT, PRIORITY)
|
|
49
|
+
- Within each tree, all nodes must have the same digest_condition_type
|
|
50
|
+
- This enables separate condition logic for different aspects of digest processing
|
|
51
|
+
|
|
52
|
+
Ensures that all conditions within the same tree have the same digest_condition_type.
|
|
53
|
+
This prevents logical errors where different condition types are mixed in a single
|
|
54
|
+
condition tree structure.
|
|
55
|
+
|
|
56
|
+
Example Tree Structure:
|
|
57
|
+
DigestConfig (e.g., "Weekly Privacy Digest")
|
|
58
|
+
├── RECEIVER Dependency Condition Tree (who gets the digest)
|
|
59
|
+
│ └── Group (AND)
|
|
60
|
+
│ ├── Leaf: user.role == "admin"
|
|
61
|
+
│ └── Leaf: user.department == "privacy"
|
|
62
|
+
├── CONTENT Dependency Condition Tree (what gets included)
|
|
63
|
+
│ └── Group (OR)
|
|
64
|
+
│ ├── Leaf: task.priority == "high"
|
|
65
|
+
│ └── Leaf: task.overdue == true
|
|
66
|
+
└── PRIORITY Dependency Condition Tree (when to send)
|
|
67
|
+
└── Leaf: task.count >= 5
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
@declared_attr
|
|
71
|
+
def __tablename__(cls) -> str:
|
|
72
|
+
return "digest_condition"
|
|
73
|
+
|
|
74
|
+
# We need to redefine it here so that self-referential relationships
|
|
75
|
+
# can properly reference the `id` column instead of the built-in Python function.
|
|
76
|
+
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
|
77
|
+
|
|
78
|
+
# Foreign key relationships
|
|
79
|
+
digest_config_id = Column(
|
|
80
|
+
String(255),
|
|
81
|
+
ForeignKey("digest_config.id", ondelete="CASCADE"),
|
|
82
|
+
nullable=False,
|
|
83
|
+
index=True,
|
|
84
|
+
)
|
|
85
|
+
parent_id = Column(
|
|
86
|
+
String(255),
|
|
87
|
+
ForeignKey("digest_condition.id", ondelete="CASCADE"),
|
|
88
|
+
nullable=True,
|
|
89
|
+
index=True,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Digest-specific: condition category
|
|
93
|
+
digest_condition_type = Column(
|
|
94
|
+
EnumColumn(DigestConditionType), nullable=False, index=True
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Relationships
|
|
98
|
+
digest_config = relationship("DigestConfig", back_populates="conditions")
|
|
99
|
+
parent = relationship(
|
|
100
|
+
"DigestCondition",
|
|
101
|
+
remote_side=[id],
|
|
102
|
+
back_populates="children",
|
|
103
|
+
foreign_keys=[parent_id],
|
|
104
|
+
)
|
|
105
|
+
children = relationship(
|
|
106
|
+
"DigestCondition",
|
|
107
|
+
back_populates="parent",
|
|
108
|
+
cascade="all, delete-orphan",
|
|
109
|
+
foreign_keys=[parent_id],
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# Ensure only one root condition per digest_condition_type per digest_config
|
|
113
|
+
__table_args__ = (
|
|
114
|
+
Index(
|
|
115
|
+
"ix_digest_condition_unique_root_per_type",
|
|
116
|
+
"digest_config_id",
|
|
117
|
+
"digest_condition_type",
|
|
118
|
+
unique=True,
|
|
119
|
+
postgresql_where=text("parent_id IS NULL"),
|
|
120
|
+
),
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
@staticmethod
|
|
124
|
+
def _validate_condition_type_consistency(db: Session, data: dict[str, Any]) -> None:
|
|
125
|
+
"""Validate that a condition's digest_condition_type matches its parent's type.
|
|
126
|
+
|
|
127
|
+
Since each parent was validated when created, checking against the immediate parent
|
|
128
|
+
is sufficient to ensure tree-wide consistency.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
db: Database session for querying
|
|
132
|
+
data: Dictionary containing condition data to validate (must include both parent_id and digest_condition_type)
|
|
133
|
+
|
|
134
|
+
Raises:
|
|
135
|
+
ValueError: If parent doesn't exist or digest_condition_type doesn't match parent's type
|
|
136
|
+
"""
|
|
137
|
+
parent_id = data.get("parent_id")
|
|
138
|
+
digest_condition_type = data.get("digest_condition_type")
|
|
139
|
+
|
|
140
|
+
if not parent_id:
|
|
141
|
+
# Root condition - no validation needed
|
|
142
|
+
return
|
|
143
|
+
|
|
144
|
+
# Get the parent condition
|
|
145
|
+
parent = (
|
|
146
|
+
db.query(DigestCondition).filter(DigestCondition.id == parent_id).first()
|
|
147
|
+
)
|
|
148
|
+
if not parent:
|
|
149
|
+
raise ValueError(f"Parent condition with id '{parent_id}' does not exist")
|
|
150
|
+
|
|
151
|
+
# Validate that the new condition matches the parent's digest_condition_type
|
|
152
|
+
if parent.digest_condition_type != digest_condition_type:
|
|
153
|
+
raise ValueError(
|
|
154
|
+
f"Cannot create condition with type '{digest_condition_type}' under parent "
|
|
155
|
+
f"with type '{parent.digest_condition_type}'. All conditions in the same tree "
|
|
156
|
+
f"must have the same digest_condition_type."
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
@classmethod
|
|
160
|
+
def create(
|
|
161
|
+
cls,
|
|
162
|
+
db: Session,
|
|
163
|
+
*,
|
|
164
|
+
data: dict[str, Any],
|
|
165
|
+
check_name: bool = True,
|
|
166
|
+
) -> "DigestCondition":
|
|
167
|
+
"""Create a new DigestCondition with validation."""
|
|
168
|
+
# Validate condition type consistency
|
|
169
|
+
cls._validate_condition_type_consistency(db, data)
|
|
170
|
+
try:
|
|
171
|
+
return super().create(db=db, data=data, check_name=check_name)
|
|
172
|
+
except Exception as e:
|
|
173
|
+
raise ConditionalDependencyError(str(e))
|
|
174
|
+
|
|
175
|
+
def update(self, db: Session, *, data: dict[str, Any]) -> "DigestCondition":
|
|
176
|
+
"""Update DigestCondition with validation."""
|
|
177
|
+
# Ensure validation data includes current values for fields not being updated
|
|
178
|
+
validation_data = {
|
|
179
|
+
"parent_id": data.get("parent_id", self.parent_id),
|
|
180
|
+
"digest_condition_type": data.get(
|
|
181
|
+
"digest_condition_type", self.digest_condition_type
|
|
182
|
+
),
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# Validate before updating
|
|
186
|
+
self._validate_condition_type_consistency(db, validation_data)
|
|
187
|
+
return super().update(db=db, data=data) # type: ignore[return-value]
|
|
188
|
+
|
|
189
|
+
def save(self, db: Session) -> "DigestCondition":
|
|
190
|
+
"""Save DigestCondition with validation."""
|
|
191
|
+
# Extract current object data for validation
|
|
192
|
+
data = {
|
|
193
|
+
"parent_id": self.parent_id,
|
|
194
|
+
"digest_condition_type": self.digest_condition_type,
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
# Validate before saving (only if this has a parent)
|
|
198
|
+
if self.parent_id:
|
|
199
|
+
self._validate_condition_type_consistency(db, data)
|
|
200
|
+
return super().save(db=db) # type: ignore[return-value]
|
|
201
|
+
|
|
202
|
+
@classmethod
|
|
203
|
+
def get_root_condition(
|
|
204
|
+
cls,
|
|
205
|
+
db: Session,
|
|
206
|
+
**kwargs: Any,
|
|
207
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
208
|
+
"""Get the root condition tree for a specific digest condition type.
|
|
209
|
+
|
|
210
|
+
Implementation of the abstract base method for DigestCondition's multi-type hierarchy.
|
|
211
|
+
Each digest_config can have separate condition trees for RECEIVER, CONTENT, and PRIORITY
|
|
212
|
+
types. This method retrieves the root of one specific tree.
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
db: SQLAlchemy database session for querying
|
|
216
|
+
**kwargs: Keyword arguments containing:
|
|
217
|
+
digest_config_id: ID of the digest config
|
|
218
|
+
digest_condition_type: DigestConditionType enum value
|
|
219
|
+
Must be one of: RECEIVER, CONTENT, PRIORITY
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Optional[Union[ConditionLeaf, ConditionGroup]]: Root condition tree for the specified
|
|
223
|
+
type, or None if no conditions exist
|
|
224
|
+
|
|
225
|
+
Raises:
|
|
226
|
+
ValueError: If required parameters are missing
|
|
227
|
+
|
|
228
|
+
Example:
|
|
229
|
+
>>> # Get receiver conditions for a digest
|
|
230
|
+
>>> receiver_conditions = DigestCondition.get_root_condition(
|
|
231
|
+
... db, digest_config_id=digest_config.id,
|
|
232
|
+
... digest_condition_type=DigestConditionType.RECEIVER
|
|
233
|
+
... )
|
|
234
|
+
>>> # Get content conditions for the same digest
|
|
235
|
+
>>> content_conditions = DigestCondition.get_root_condition(
|
|
236
|
+
... db, digest_config_id=digest_config.id,
|
|
237
|
+
... digest_condition_type=DigestConditionType.CONTENT
|
|
238
|
+
... )
|
|
239
|
+
"""
|
|
240
|
+
digest_config_id = kwargs.get("digest_config_id")
|
|
241
|
+
digest_condition_type = kwargs.get("digest_condition_type")
|
|
242
|
+
|
|
243
|
+
if not digest_config_id or not digest_condition_type:
|
|
244
|
+
raise ValueError(
|
|
245
|
+
"digest_config_id and digest_condition_type are required keyword arguments"
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
root = (
|
|
249
|
+
db.query(cls)
|
|
250
|
+
.filter(
|
|
251
|
+
cls.digest_config_id == digest_config_id,
|
|
252
|
+
cls.digest_condition_type == digest_condition_type,
|
|
253
|
+
cls.parent_id.is_(None),
|
|
254
|
+
)
|
|
255
|
+
.one_or_none()
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
if not root:
|
|
259
|
+
return None
|
|
260
|
+
|
|
261
|
+
return root.to_correct_condition_type()
|
|
262
|
+
|
|
263
|
+
@classmethod
|
|
264
|
+
def get_all_root_conditions(
|
|
265
|
+
cls, db: Session, digest_config_id: str
|
|
266
|
+
) -> dict[DigestConditionType, Optional[Condition]]:
|
|
267
|
+
"""Get root conditions for all digest condition types"""
|
|
268
|
+
return {
|
|
269
|
+
condition_type: cls.get_root_condition(
|
|
270
|
+
db,
|
|
271
|
+
digest_config_id=digest_config_id,
|
|
272
|
+
digest_condition_type=condition_type,
|
|
273
|
+
)
|
|
274
|
+
for condition_type in DigestConditionType
|
|
275
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import TYPE_CHECKING, Optional, Union
|
|
3
|
+
|
|
4
|
+
from sqlalchemy import Boolean, Column, DateTime, String, Text
|
|
5
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
6
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
7
|
+
from sqlalchemy.orm import Session, relationship
|
|
8
|
+
|
|
9
|
+
from fides.api.db.base_class import Base
|
|
10
|
+
from fides.api.db.util import EnumColumn
|
|
11
|
+
from fides.api.models.digest.conditional_dependencies import (
|
|
12
|
+
DigestCondition,
|
|
13
|
+
DigestConditionType,
|
|
14
|
+
)
|
|
15
|
+
from fides.api.schemas.messaging.messaging import MessagingMethod
|
|
16
|
+
from fides.api.task.conditional_dependencies.schemas import (
|
|
17
|
+
Condition,
|
|
18
|
+
ConditionGroup,
|
|
19
|
+
ConditionLeaf,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from fides.api.models.digest.digest_execution import DigestTaskExecution
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DigestType(str, Enum):
|
|
27
|
+
"""Types of digests that can be configured."""
|
|
28
|
+
|
|
29
|
+
MANUAL_TASKS = "manual_tasks"
|
|
30
|
+
PRIVACY_REQUESTS = "privacy_requests"
|
|
31
|
+
# More types can be added here
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class DigestConfig(Base):
|
|
35
|
+
"""Generic configuration for any type of digest."""
|
|
36
|
+
|
|
37
|
+
@declared_attr
|
|
38
|
+
def __tablename__(cls) -> str:
|
|
39
|
+
return "digest_config"
|
|
40
|
+
|
|
41
|
+
# Digest identification
|
|
42
|
+
digest_type = Column(EnumColumn(DigestType), nullable=False, index=True)
|
|
43
|
+
name = Column(String(255), nullable=False)
|
|
44
|
+
description = Column(Text, nullable=True)
|
|
45
|
+
|
|
46
|
+
# Configuration
|
|
47
|
+
enabled = Column(Boolean, nullable=False, default=True, index=True)
|
|
48
|
+
messaging_service_type = Column(
|
|
49
|
+
EnumColumn(MessagingMethod),
|
|
50
|
+
nullable=False,
|
|
51
|
+
default=MessagingMethod.EMAIL,
|
|
52
|
+
index=True,
|
|
53
|
+
)
|
|
54
|
+
cron_expression = Column(String(100), nullable=False, default="0 9 * * 1")
|
|
55
|
+
timezone = Column(String(50), nullable=False, default="US/Eastern")
|
|
56
|
+
last_sent_at = Column(DateTime(timezone=True), nullable=True)
|
|
57
|
+
next_scheduled_at = Column(DateTime(timezone=True), nullable=True, index=True)
|
|
58
|
+
config_metadata = Column(JSONB, nullable=True, default={})
|
|
59
|
+
|
|
60
|
+
# Relationships
|
|
61
|
+
conditions = relationship(
|
|
62
|
+
"DigestCondition",
|
|
63
|
+
back_populates="digest_config",
|
|
64
|
+
cascade="all, delete-orphan",
|
|
65
|
+
)
|
|
66
|
+
executions = relationship(
|
|
67
|
+
"DigestTaskExecution",
|
|
68
|
+
back_populates="digest_config",
|
|
69
|
+
cascade="all, delete-orphan",
|
|
70
|
+
order_by="DigestTaskExecution.created_at.desc()",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def get_receiver_condition(
|
|
74
|
+
self, db: Session
|
|
75
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
76
|
+
"""Get receiver conditions for this digest config."""
|
|
77
|
+
return DigestCondition.get_root_condition(
|
|
78
|
+
db,
|
|
79
|
+
digest_config_id=self.id,
|
|
80
|
+
digest_condition_type=DigestConditionType.RECEIVER,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def get_content_condition(
|
|
84
|
+
self, db: Session
|
|
85
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
86
|
+
"""Get content conditions for this digest config."""
|
|
87
|
+
|
|
88
|
+
return DigestCondition.get_root_condition(
|
|
89
|
+
db,
|
|
90
|
+
digest_config_id=self.id,
|
|
91
|
+
digest_condition_type=DigestConditionType.CONTENT,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def get_priority_condition(
|
|
95
|
+
self, db: Session
|
|
96
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
97
|
+
"""Get priority conditions for this digest config."""
|
|
98
|
+
|
|
99
|
+
return DigestCondition.get_root_condition(
|
|
100
|
+
db,
|
|
101
|
+
digest_config_id=self.id,
|
|
102
|
+
digest_condition_type=DigestConditionType.PRIORITY,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
def get_all_conditions(
|
|
106
|
+
self, db: Session
|
|
107
|
+
) -> dict["DigestConditionType", Optional[Condition]]:
|
|
108
|
+
"""Get all condition types for this digest config."""
|
|
109
|
+
|
|
110
|
+
return DigestCondition.get_all_root_conditions(db, self.id)
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Text
|
|
4
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
5
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
6
|
+
from sqlalchemy.orm import Session, relationship
|
|
7
|
+
from sqlalchemy.orm.attributes import flag_modified
|
|
8
|
+
from sqlalchemy.sql import func
|
|
9
|
+
|
|
10
|
+
from fides.api.db.base_class import Base
|
|
11
|
+
from fides.api.models.worker_task import ExecutionLogStatus, WorkerTask
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from fides.api.models.digest.digest_config import DigestConfig
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class DigestTaskExecution(
|
|
18
|
+
WorkerTask, Base
|
|
19
|
+
): # pylint: disable=too-many-instance-attributes
|
|
20
|
+
"""
|
|
21
|
+
Model for tracking digest task execution state and progress.
|
|
22
|
+
|
|
23
|
+
This model enables graceful resumption of digest tasks after worker
|
|
24
|
+
interruptions by persisting execution state and progress information.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@declared_attr
|
|
28
|
+
def __tablename__(cls) -> str:
|
|
29
|
+
return "digest_task_execution"
|
|
30
|
+
|
|
31
|
+
# Foreign key to digest config
|
|
32
|
+
digest_config_id = Column(
|
|
33
|
+
String,
|
|
34
|
+
ForeignKey("digest_config.id", ondelete="CASCADE"),
|
|
35
|
+
nullable=False,
|
|
36
|
+
index=True,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# Celery task tracking
|
|
40
|
+
celery_task_id = Column(String, nullable=True, index=True)
|
|
41
|
+
|
|
42
|
+
# Progress tracking
|
|
43
|
+
total_recipients = Column(Integer, nullable=True)
|
|
44
|
+
processed_recipients = Column(Integer, nullable=False, default=0)
|
|
45
|
+
successful_communications = Column(Integer, nullable=False, default=0)
|
|
46
|
+
failed_communications = Column(Integer, nullable=False, default=0)
|
|
47
|
+
|
|
48
|
+
# State persistence for resumption
|
|
49
|
+
execution_state = Column(JSONB, nullable=True, default={})
|
|
50
|
+
processed_user_ids = Column(JSONB, nullable=True, default=[])
|
|
51
|
+
|
|
52
|
+
# Timing information
|
|
53
|
+
started_at = Column(DateTime(timezone=True), nullable=True)
|
|
54
|
+
completed_at = Column(DateTime(timezone=True), nullable=True)
|
|
55
|
+
last_checkpoint_at = Column(DateTime(timezone=True), nullable=True)
|
|
56
|
+
|
|
57
|
+
# Error information
|
|
58
|
+
error_message = Column(Text, nullable=True)
|
|
59
|
+
|
|
60
|
+
# Relationships
|
|
61
|
+
digest_config = relationship("DigestConfig", back_populates="executions")
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def allowed_action_types(cls) -> List[str]:
|
|
65
|
+
"""Return allowed action types for digest task execution."""
|
|
66
|
+
return ["digest_processing"]
|
|
67
|
+
|
|
68
|
+
def mark_started(self, db: Session, celery_task_id: str) -> None:
|
|
69
|
+
"""Mark the execution as started."""
|
|
70
|
+
self.status = ExecutionLogStatus.in_processing
|
|
71
|
+
self.celery_task_id = celery_task_id
|
|
72
|
+
self.started_at = func.now()
|
|
73
|
+
self.save(db)
|
|
74
|
+
|
|
75
|
+
def mark_awaiting_processing(self, db: Session) -> None:
|
|
76
|
+
"""Mark the execution as awaiting processing."""
|
|
77
|
+
self.status = ExecutionLogStatus.awaiting_processing
|
|
78
|
+
self.save(db)
|
|
79
|
+
|
|
80
|
+
def update_progress(
|
|
81
|
+
self,
|
|
82
|
+
db: Session,
|
|
83
|
+
processed_count: int,
|
|
84
|
+
successful_count: int,
|
|
85
|
+
failed_count: int,
|
|
86
|
+
processed_user_ids: List[str],
|
|
87
|
+
execution_state: Optional[Dict[str, Any]] = None,
|
|
88
|
+
) -> None:
|
|
89
|
+
"""Update execution progress and create checkpoint."""
|
|
90
|
+
self.processed_recipients = processed_count
|
|
91
|
+
self.successful_communications = successful_count
|
|
92
|
+
self.failed_communications = failed_count
|
|
93
|
+
self.processed_user_ids = processed_user_ids
|
|
94
|
+
self.last_checkpoint_at = func.now()
|
|
95
|
+
|
|
96
|
+
# Mark JSONB fields as modified so SQLAlchemy knows they changed
|
|
97
|
+
flag_modified(self, "processed_user_ids")
|
|
98
|
+
|
|
99
|
+
if execution_state:
|
|
100
|
+
self.execution_state = execution_state
|
|
101
|
+
flag_modified(self, "execution_state")
|
|
102
|
+
|
|
103
|
+
self.save(db)
|
|
104
|
+
|
|
105
|
+
def mark_completed(self, db: Session) -> None:
|
|
106
|
+
"""Mark the execution as completed."""
|
|
107
|
+
self.status = ExecutionLogStatus.complete
|
|
108
|
+
self.completed_at = func.now()
|
|
109
|
+
self.save(db)
|
|
110
|
+
|
|
111
|
+
def mark_failed(self, db: Session, error_message: str) -> None:
|
|
112
|
+
"""Mark the execution as failed."""
|
|
113
|
+
self.status = ExecutionLogStatus.error
|
|
114
|
+
self.error_message = error_message
|
|
115
|
+
self.completed_at = func.now()
|
|
116
|
+
self.save(db)
|
|
117
|
+
|
|
118
|
+
def can_resume(self) -> bool:
|
|
119
|
+
"""Check if this execution can be resumed."""
|
|
120
|
+
return (
|
|
121
|
+
self.status
|
|
122
|
+
in [
|
|
123
|
+
ExecutionLogStatus.in_processing,
|
|
124
|
+
ExecutionLogStatus.awaiting_processing,
|
|
125
|
+
]
|
|
126
|
+
and self.processed_user_ids is not None
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
def get_remaining_work(self) -> Dict[str, Any]:
|
|
130
|
+
"""Get information about remaining work for resumption."""
|
|
131
|
+
# Ensure processed_user_ids is always a list
|
|
132
|
+
raw_processed_user_ids = self.processed_user_ids or []
|
|
133
|
+
processed_user_ids = (
|
|
134
|
+
raw_processed_user_ids if isinstance(raw_processed_user_ids, list) else []
|
|
135
|
+
)
|
|
136
|
+
return {
|
|
137
|
+
"processed_user_ids": processed_user_ids,
|
|
138
|
+
"execution_state": self.execution_state or {},
|
|
139
|
+
"processed_count": self.processed_recipients or 0,
|
|
140
|
+
"successful_count": self.successful_communications,
|
|
141
|
+
"failed_count": self.failed_communications,
|
|
142
|
+
}
|