ethyca-fides 2.73.2b0__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.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/METADATA +2 -1
- {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/RECORD +349 -336
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/303287c70600_migrate_resource_type_from_enum_to_.py +99 -0
- fides/api/alembic/migrations/versions/795f46f656c0_migrate_field_type_from_enum_to_string.py +61 -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/connector_template_endpoints.py +167 -0
- fides/api/api/v1/endpoints/generic_overrides.py +6 -6
- fides/api/api/v1/endpoints/pre_approval_webhook_endpoints.py +5 -5
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +101 -21
- fides/api/api/v1/endpoints/saas_config_endpoints.py +3 -44
- fides/api/api/v1/endpoints/storage_endpoints.py +5 -1
- fides/api/api/v1/endpoints/system.py +2 -2
- fides/api/api/v1/endpoints/user_endpoints.py +10 -4
- fides/api/db/base.py +1 -0
- fides/api/db/database.py +228 -1
- fides/api/db/seed.py +1 -1
- fides/api/email_templates/templates/external_user_welcome.html +9 -5
- fides/api/migrations/post_upgrade_index_creation.py +10 -0
- fides/api/models/connectionconfig.py +4 -1
- fides/api/models/detection_discovery/__init__.py +2 -0
- fides/api/models/detection_discovery/core.py +10 -0
- fides/api/models/detection_discovery/staged_resource_error.py +25 -0
- fides/api/models/experience_notices.py +6 -1
- fides/api/models/identity_definition.py +2 -1
- fides/api/models/location_regulation_selections.py +22 -0
- fides/api/models/manual_webhook.py +17 -6
- fides/api/models/messaging_template.py +7 -0
- fides/api/models/policy.py +3 -0
- fides/api/models/privacy_experience.py +20 -0
- fides/api/models/privacy_notice.py +45 -1
- fides/api/models/privacy_preference.py +1 -0
- fides/api/models/privacy_request/duplicate_group.py +84 -0
- fides/api/models/privacy_request/privacy_request.py +84 -9
- fides/api/models/privacy_request/provided_identity.py +22 -1
- fides/api/models/saas_template_dataset.py +63 -0
- fides/api/models/sql_models.py +150 -7
- fides/api/models/taxonomy.py +61 -1
- fides/api/oauth/roles.py +2 -0
- fides/api/schemas/connection_configuration/connection_secrets_mssql.py +5 -0
- fides/api/schemas/messaging/messaging.py +1 -0
- fides/api/schemas/oauth.py +2 -1
- fides/api/schemas/privacy_request.py +38 -6
- fides/api/schemas/saas/connector_template.py +14 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +19 -7
- fides/api/service/connectors/base_erasure_email_connector.py +7 -0
- fides/api/service/connectors/microsoft_sql_server_connector.py +6 -1
- fides/api/service/connectors/saas/connector_registry_service.py +45 -1
- fides/api/service/messaging/message_dispatch_service.py +44 -4
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +3 -3
- 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 +31 -5
- fides/api/service/privacy_request/request_service.py +4 -2
- fides/api/service/saas_request/saas_request_override_factory.py +7 -2
- 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/util.py +111 -0
- fides/api/task/execute_request_tasks.py +17 -4
- fides/api/task/manual/manual_task_conditional_evaluation.py +32 -27
- fides/api/task/manual/manual_task_graph_task.py +4 -1
- fides/api/task/manual/manual_task_utils.py +63 -20
- fides/api/tasks/__init__.py +14 -0
- fides/api/util/cache.py +4 -0
- fides/api/util/connection_util.py +2 -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/memory_watchdog.py +118 -0
- fides/api/util/saas_config_updater.py +12 -2
- fides/api/worker/__init__.py +4 -0
- fides/common/api/scope_registry.py +6 -0
- fides/common/api/v1/urn_registry.py +11 -2
- fides/config/__init__.py +8 -2
- fides/config/celery_settings.py +42 -0
- fides/service/messaging/messaging_service.py +75 -74
- fides/service/privacy_request/privacy_request_service.py +151 -19
- 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-26393b586775ea29.js → 1115-7fd171dac1eb0e51.js} +1 -1
- 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.afe8cad52f904fcf.js → 1975.bef017bc80e2012c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2040-7eed8491ca7276ed.js → 2040-70972e15960d9afe.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2121.321b0fd3932164d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{2397-083fc511acb6105d.js → 2397-3434603a97f3f5d6.js} +1 -1
- 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-7c345d019bb9bcbd.js → 401-582d9970d89deefe.js} +1 -1
- 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/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-e7f8b81dd3dfbe0b.js → 5185-96423702fba70ced.js} +1 -1
- 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/{5783-21775c232dce7af7.js → 5783-016dfcee8e49bf61.js} +1 -1
- 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-de9905d28e5b19b3.js → 6853-882889659769d7b4.js} +1 -1
- 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-c9bc628d078c2170.js → 7245-1cdafb35f289861b.js} +1 -1
- 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-393420e5a9751791.js → 8212-348ddd2b6933db70.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.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.7d029a5383595b69.js → 9676.1f395eeb9cc34968.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9826-a737a9956c1d0905.js → 9826-1078e46f3ac0b688.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-eb019192ce498f32.js → 404-800be6996aaa999c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-ee588a308812715d.js → _app-de4b578c904df772.js} +70 -70
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-7081e0e49f67716c.js → manual-f12020b82dd4bd1a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-a188f84239f4b2a8.js → multiple-a911b7990371704d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-ee9df33ebd471099.js → add-systems-ad585b79953c2753.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-4f9cf087fcee87e6.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]-1b02a4991201b7e4.js → [id]-c32f381af358149b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-6efb3c069d8b47dd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-b08abefec298ccf1.js → privacy-experience-1975c529905eea9b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-8c164c4b8310214e.js → [id]-b05331178928ab52.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-db789002d84c8829.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-5cba30eba1e97e56.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-614af0a2c2ba966c.js → consent-b63d1e395d879b86.js} +1 -1
- 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]-676177e2f3c9c2a2.js +1 -0
- 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/[systemId]/resources-81d1b50585468fb0.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/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-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]-b072cf25aefc98f6.js → [resourceUrn]-1a50d421897d3da1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-fd3e8817d8e6dee4.js → detection-49509414a15e8393.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-146624cf59792bf7.js → [resourceUrn]-1a1bb80b586d0c0f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-9695cc9c85592ec5.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]-5f88280db168083e.js → [...subfieldNames]-415015aebab60436.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-bfbcf19c28c794ae.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-1343fa525a206571.js → index-8d67cd2872cb682a.js} +1 -1
- 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]-63b3be660fb12c0f.js → [id]-92e01822ecde8fb8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/{new-d3b577962dd33266.js → new-1256cf6d3f6794e0.js} +1 -1
- 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]-720cde29f81db47f.js → [key]-2d976fe5e8ba0a3a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/{new-3668866076b53016.js → new-7766ba497b863740.js} +1 -1
- 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]-8063dceb32310c85.js → [id]-669f585c3458faff.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/{add-template-4931c70bee62232f.js → add-template-c79e7724e4bc3899.js} +1 -1
- 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-93af719dab3bd053.js → notifications-40c8148244c5d347.js} +1 -1
- 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-fa82cffba448ccd8.js → configure-c08ca6ad21c99799.js} +1 -1
- 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]-bc1c289647e52c48.js → [id]-74ccea4868408e3d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-cbfaa23d96f5ed0b.js → add-property-7d9f09bfe9d44dfc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-a15a3fd0ed88f39c.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/consent/[configuration_id]/{[purpose_id]-19de0024418a4924.js → [purpose_id]-ae789892343c24f5.js} +1 -1
- 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-3b87002753b23ca5.js → domain-records-df06f7e2f668c540.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-aacd9d0ad47082d4.js → domains-da0c77bd510c6c51.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-3cdd0b39901190ba.js → email-templates-950b0c115bf673d8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-61076eedbfd137b9.js → locations-7e36cb4756973a9d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-b07b11d6002f8c8c.js → organization-a0e5ed486d24ccf3.js} +1 -1
- 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-b7c0d3b1b754e70f.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]-59c89489fa32a4cb.js → [id]-7d042497a57a3788.js} +1 -1
- 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-7dce2916cc589c54.js → new-efc4af017723e57a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-5d5a68e555d18693.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/3d66bb57ddcb0978.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1e4be9466578ef1.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 -1
- fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -1
- 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 -1
- fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -1
- 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 +2 -2
- fides/ui-build/static/admin/lib/fides.js +2 -2
- 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 -1
- fides/ui-build/static/admin/notifications/digests/[id].html +1 -1
- fides/ui-build/static/admin/notifications/digests/new.html +1 -1
- fides/ui-build/static/admin/notifications/digests.html +1 -1
- fides/ui-build/static/admin/notifications/providers/[key].html +1 -1
- fides/ui-build/static/admin/notifications/providers/new.html +1 -1
- fides/ui-build/static/admin/notifications/providers.html +1 -1
- fides/ui-build/static/admin/notifications/templates/[id].html +1 -1
- fides/ui-build/static/admin/notifications/templates/add-template.html +1 -1
- fides/ui-build/static/admin/notifications/templates.html +1 -1
- fides/ui-build/static/admin/notifications.html +1 -1
- 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 -1
- 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 -1
- fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
- 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/privacy_request/dsr_package/templates/welcome.html +0 -66
- fides/ui-build/static/admin/_next/static/chunks/1099-31f9d973bc287df8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1437-8b1f6c8797c68bfd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/155-f6302d32cba4cab6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-2d5cf537a2992c79.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2121.1de2fa060eae34aa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2921-34a43f2f8f5e5e69.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2962-342ad1b4ab402ded.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3377-988ac2f3a2e8d5d4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3446-f40c352c43ac950c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3696-6f90e41a53d22920.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3700-f695f2f6b8251971.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3772-9f1713f9d5f97a10.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3873-d18e47b327445db5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3923-f0a85dc5c3684fa0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4496-4ff19366c597ec16.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4817-1f3e6ea38625d8d5.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-62d6bc19add60aa6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5279-bd6cccabdd6ca447.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/549-28537a6de666944b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5643-3459282d296a3c59.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-3759894435cb8569.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6315-e2fb5ea77179a871.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6344-ca66a6e10d128179.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6419-11d67f7fd4e2f247.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-84789a4e4fb04eb9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7059-2bb7c38578549703.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7202.3febe9e89640c712.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-a02d970ea4d3f7d0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7488-cf92601852e3c509.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-a11610c2b31ab2ca.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7773-9ae233109bc64ec2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-e36d610066135f8c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8011-75af8b480fa114e6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8373-22b4d20e8cc06b3a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-d9c6498368b993d1.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/9330-f753636a31c4ea04.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9682-d1a3afa1394f8304.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9899-d6437facac926264.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9965-25621dd507e0cfd6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-9af75caefc74eaca.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-6528eb24165aceb6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-11f1683aa15e1a62.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-32bd7a7c990e5bf6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-d60761c20382b259.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-07e7d38ce34e1e6c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-b07a0707f8c2ec0d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-aed94957009eb3fd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-127c114dd8f102ed.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-5aa7a9fa96160de8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-899bf30dde8b3292.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-73085f50abb775c0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-823d0dd77e66585b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-24a82e07a0008516.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-3b100c44ea9e3988.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-6fbe2b584a509226.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-3d1e48f4b95d7f6b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-d3c6ecf7f29bea6e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-0a4aa42be2da0255.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-14313e441a13192c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f139d1ce26404f30.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-b2d3d28b10a758e6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-a733e5d7c3ce9bb8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-df0c95e408c54c7e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-aed9afd988a48acf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-36a0ac36062abd02.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-a14c876b49422597.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-9cfb469de7b4aeab.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-e715cc654fb6a5cd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-72ae299bcb6adae6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-2337f8c81a766eb0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0af454f55494f6fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-d1b90ffa996fbd89.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-19724b9e0581b96d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-cdd3754289a28317.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-cc41ae605f2b55ae.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-6e4c535b6d614596.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-632b3ee563d070f2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-afe921f6e2a526fb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-5b6807dced8d03c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-8634aae3259def37.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-2d9dcca17965dc57.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-7dce52bfc1b2652c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-084a2b4431d35322.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-b72d36243a0a545c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-cfaa37a0df83674b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-56a5434969cbe9ba.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management-e6a211d8a0401086.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-c2c11809187b9f84.js +0 -1
- fides/ui-build/static/admin/_next/static/css/d41a048a166d50e4.css +0 -1
- fides/ui-build/static/admin/_next/static/css/d78390d6134d8328.css +0 -1
- fides/ui-build/static/admin/_next/static/wCNFtmYQhEDMaMPeBB4BM/_buildManifest.js +0 -1
- fides/ui-build/static/admin/poc/table-migration.html +0 -1
- {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.73.2b0.dist-info → ethyca_fides-2.76.0rc2.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{wCNFtmYQhEDMaMPeBB4BM → l2vgGUHB04Fi4oEVlVMrc}/_ssgManifest.js +0 -0
fides/api/models/taxonomy.py
CHANGED
|
@@ -17,7 +17,7 @@ from sqlalchemy.ext.associationproxy import association_proxy
|
|
|
17
17
|
from sqlalchemy.ext.declarative import declared_attr
|
|
18
18
|
from sqlalchemy.orm import RelationshipProperty, Session, relationship
|
|
19
19
|
|
|
20
|
-
from fides.api.common_exceptions import ValidationError
|
|
20
|
+
from fides.api.common_exceptions import KeyOrNameAlreadyExists, ValidationError
|
|
21
21
|
from fides.api.db.base_class import Base
|
|
22
22
|
from fides.api.models.sql_models import FidesBase # type: ignore[attr-defined]
|
|
23
23
|
|
|
@@ -254,6 +254,66 @@ class TaxonomyElement(Base, FidesBase):
|
|
|
254
254
|
remote_side="TaxonomyElement.fides_key",
|
|
255
255
|
)
|
|
256
256
|
|
|
257
|
+
@classmethod
|
|
258
|
+
def create(
|
|
259
|
+
cls: Type["TaxonomyElement"],
|
|
260
|
+
db: Session,
|
|
261
|
+
*,
|
|
262
|
+
data: dict[str, Any],
|
|
263
|
+
check_name: bool = True,
|
|
264
|
+
) -> "TaxonomyElement":
|
|
265
|
+
"""
|
|
266
|
+
Override create to skip name uniqueness check for hierarchical taxonomy.
|
|
267
|
+
|
|
268
|
+
TaxonomyElement is hierarchical - fides_key provides sufficient uniqueness.
|
|
269
|
+
Multiple elements can share the same name as long as their keys differ.
|
|
270
|
+
"""
|
|
271
|
+
# Check if taxonomy element with same fides_key already exists within the same taxonomy_type
|
|
272
|
+
if "fides_key" in data and data["fides_key"] and "taxonomy_type" in data:
|
|
273
|
+
existing_by_key = (
|
|
274
|
+
db.query(cls)
|
|
275
|
+
.filter(
|
|
276
|
+
cls.fides_key == data["fides_key"],
|
|
277
|
+
cls.taxonomy_type == data["taxonomy_type"],
|
|
278
|
+
)
|
|
279
|
+
.first()
|
|
280
|
+
)
|
|
281
|
+
if existing_by_key:
|
|
282
|
+
raise KeyOrNameAlreadyExists(
|
|
283
|
+
f'Taxonomy element with fides_key "{data["fides_key"]}" already exists in taxonomy "{data["taxonomy_type"]}".'
|
|
284
|
+
)
|
|
285
|
+
# Always skip name check - fides_key uniqueness is sufficient
|
|
286
|
+
return super().create(db=db, data=data, check_name=False)
|
|
287
|
+
|
|
288
|
+
def update(self, db: Session, *, data: dict[str, Any]) -> "TaxonomyElement":
|
|
289
|
+
"""
|
|
290
|
+
Override update to check for existing taxonomy elements with the same fides_key
|
|
291
|
+
within the same taxonomy_type when fides_key is being changed.
|
|
292
|
+
"""
|
|
293
|
+
# Check if fides_key is being changed and if it conflicts with an existing element
|
|
294
|
+
if (
|
|
295
|
+
"fides_key" in data
|
|
296
|
+
and data["fides_key"]
|
|
297
|
+
and data["fides_key"] != self.fides_key
|
|
298
|
+
):
|
|
299
|
+
# Ensure taxonomy_type is available (either in data or from self)
|
|
300
|
+
taxonomy_type = data.get("taxonomy_type") or self.taxonomy_type
|
|
301
|
+
if taxonomy_type:
|
|
302
|
+
existing_by_key = (
|
|
303
|
+
db.query(TaxonomyElement)
|
|
304
|
+
.filter(
|
|
305
|
+
TaxonomyElement.fides_key == data["fides_key"],
|
|
306
|
+
TaxonomyElement.taxonomy_type == taxonomy_type,
|
|
307
|
+
TaxonomyElement.id != self.id, # Exclude current element
|
|
308
|
+
)
|
|
309
|
+
.first()
|
|
310
|
+
)
|
|
311
|
+
if existing_by_key:
|
|
312
|
+
raise KeyOrNameAlreadyExists(
|
|
313
|
+
f'Taxonomy element with fides_key "{data["fides_key"]}" already exists in taxonomy "{taxonomy_type}".'
|
|
314
|
+
)
|
|
315
|
+
return super().update(db=db, data=data) # type: ignore[return-value]
|
|
316
|
+
|
|
257
317
|
|
|
258
318
|
class TaxonomyUsage(Base):
|
|
259
319
|
"""
|
fides/api/oauth/roles.py
CHANGED
|
@@ -16,6 +16,7 @@ from fides.common.api.scope_registry import (
|
|
|
16
16
|
DATA_USE_READ,
|
|
17
17
|
DATASET_READ,
|
|
18
18
|
EVALUATION_READ,
|
|
19
|
+
HEAP_DUMP_EXEC,
|
|
19
20
|
MASKING_EXEC,
|
|
20
21
|
MASKING_READ,
|
|
21
22
|
MESSAGING_CREATE_OR_UPDATE,
|
|
@@ -145,6 +146,7 @@ not_contributor_scopes = [
|
|
|
145
146
|
PRIVACY_REQUEST_NOTIFICATIONS_CREATE_OR_UPDATE,
|
|
146
147
|
PRIVACY_REQUEST_EMAIL_INTEGRATIONS_SEND,
|
|
147
148
|
USER_PERMISSION_ASSIGN_OWNERS,
|
|
149
|
+
HEAP_DUMP_EXEC,
|
|
148
150
|
]
|
|
149
151
|
|
|
150
152
|
ROLES_TO_SCOPES_MAPPING: Dict[str, List] = {
|
|
@@ -39,6 +39,11 @@ class MicrosoftSQLServerSchema(ConnectionConfigSecretsSchema):
|
|
|
39
39
|
title="Database",
|
|
40
40
|
description="The name of the specific database within the database server that you want to connect to.",
|
|
41
41
|
)
|
|
42
|
+
read_only_connection: Optional[bool] = Field(
|
|
43
|
+
default=False,
|
|
44
|
+
title="Read Only Connection",
|
|
45
|
+
description="Whether to connect to the database in read-only mode.",
|
|
46
|
+
)
|
|
42
47
|
|
|
43
48
|
_required_components: ClassVar[List[str]] = [
|
|
44
49
|
"host",
|
|
@@ -103,6 +103,7 @@ CONFIGURABLE_MESSAGING_ACTION_TYPES: Tuple[str, ...] = (
|
|
|
103
103
|
MessagingActionType.PRIVACY_REQUEST_REVIEW_DENY.value,
|
|
104
104
|
MessagingActionType.PRIVACY_REQUEST_REVIEW_APPROVE.value,
|
|
105
105
|
MessagingActionType.MANUAL_TASK_DIGEST.value,
|
|
106
|
+
MessagingActionType.EXTERNAL_USER_WELCOME.value,
|
|
106
107
|
)
|
|
107
108
|
|
|
108
109
|
|
fides/api/schemas/oauth.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Dict, Optional
|
|
1
|
+
from typing import Dict, Literal, Optional
|
|
2
2
|
|
|
3
3
|
from fastapi import Form
|
|
4
4
|
from fastapi.openapi.models import OAuthFlows
|
|
@@ -14,6 +14,7 @@ class AccessToken(BaseModel):
|
|
|
14
14
|
"""A wrapper for the access_code returned upon successful authentication"""
|
|
15
15
|
|
|
16
16
|
access_token: str
|
|
17
|
+
token_type: Literal["Bearer"] = "Bearer"
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
# NOTE: Adapted from
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
2
|
from enum import Enum as EnumType
|
|
3
3
|
from typing import Any, Dict, List, Optional, Type, Union
|
|
4
|
+
from uuid import UUID
|
|
4
5
|
|
|
5
6
|
from fideslang.validation import FidesKey
|
|
6
|
-
from pydantic import ConfigDict, Field, field_serializer, field_validator
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
|
|
7
8
|
|
|
8
9
|
from fides.api.custom_types import SafeStr
|
|
9
10
|
from fides.api.graph.config import CollectionAddress
|
|
@@ -13,7 +14,11 @@ from fides.api.schemas.api import BulkResponse, BulkUpdateFailed
|
|
|
13
14
|
from fides.api.schemas.base_class import FidesSchema
|
|
14
15
|
from fides.api.schemas.policy import ActionType, CurrentStep
|
|
15
16
|
from fides.api.schemas.policy import PolicyResponse as PolicySchema
|
|
16
|
-
from fides.api.schemas.redis_cache import
|
|
17
|
+
from fides.api.schemas.redis_cache import (
|
|
18
|
+
CustomPrivacyRequestField,
|
|
19
|
+
Identity,
|
|
20
|
+
MultiValue,
|
|
21
|
+
)
|
|
17
22
|
from fides.api.schemas.user import PrivacyRequestUser
|
|
18
23
|
from fides.api.util.collection_util import Row
|
|
19
24
|
from fides.api.util.encryption.aes_gcm_encryption_scheme import verify_encryption_key
|
|
@@ -309,6 +314,22 @@ class PrivacyRequestStatus(str, EnumType):
|
|
|
309
314
|
duplicate = "duplicate" # Request identified as duplicate of another request
|
|
310
315
|
|
|
311
316
|
|
|
317
|
+
class IdentityValue(BaseModel):
|
|
318
|
+
"""Represents an identity value with a label in API responses.
|
|
319
|
+
|
|
320
|
+
The value field accepts MultiValue types which match what LabeledIdentity supports:
|
|
321
|
+
- int
|
|
322
|
+
- str
|
|
323
|
+
- List[Union[int, str]]
|
|
324
|
+
|
|
325
|
+
This allows the schema to accept list values that were previously causing
|
|
326
|
+
validation errors.
|
|
327
|
+
"""
|
|
328
|
+
|
|
329
|
+
label: str
|
|
330
|
+
value: Optional[MultiValue] = None
|
|
331
|
+
|
|
332
|
+
|
|
312
333
|
class PrivacyRequestResponse(FidesSchema):
|
|
313
334
|
"""Schema to check the status of a PrivacyRequest"""
|
|
314
335
|
|
|
@@ -329,7 +350,7 @@ class PrivacyRequestResponse(FidesSchema):
|
|
|
329
350
|
# as it is an API response field, and we don't want to reveal any more
|
|
330
351
|
# about our PII structure than is explicitly stored in the cache on request
|
|
331
352
|
# creation.
|
|
332
|
-
identity: Optional[Dict[str, Union[Optional[str],
|
|
353
|
+
identity: Optional[Dict[str, Union[Optional[str], IdentityValue]]] = None
|
|
333
354
|
custom_privacy_request_fields: Optional[Dict[str, Any]] = None
|
|
334
355
|
policy: PolicySchema
|
|
335
356
|
action_required_details: Optional[CheckpointActionRequiredDetails] = None
|
|
@@ -343,7 +364,7 @@ class PrivacyRequestResponse(FidesSchema):
|
|
|
343
364
|
deleted_by: Optional[str] = None
|
|
344
365
|
finalized_at: Optional[datetime] = None
|
|
345
366
|
finalized_by: Optional[str] = None
|
|
346
|
-
duplicate_request_group_id: Optional[
|
|
367
|
+
duplicate_request_group_id: Optional[UUID] = None
|
|
347
368
|
|
|
348
369
|
model_config = ConfigDict(from_attributes=True, use_enum_values=True)
|
|
349
370
|
|
|
@@ -358,10 +379,15 @@ class PrivacyRequestVerboseResponse(PrivacyRequestResponse):
|
|
|
358
379
|
model_config = ConfigDict(populate_by_name=True)
|
|
359
380
|
|
|
360
381
|
|
|
382
|
+
# Batch size for bulk privacy request operations. Used for request validation and
|
|
383
|
+
# automatic batching to avoid memory issues with large request lists.
|
|
384
|
+
BULK_PRIVACY_REQUEST_BATCH_SIZE = 50
|
|
385
|
+
|
|
386
|
+
|
|
361
387
|
class ReviewPrivacyRequestIds(FidesSchema):
|
|
362
388
|
"""Pass in a list of privacy request ids"""
|
|
363
389
|
|
|
364
|
-
request_ids: List[str] = Field(..., max_length=
|
|
390
|
+
request_ids: List[str] = Field(..., max_length=BULK_PRIVACY_REQUEST_BATCH_SIZE)
|
|
365
391
|
|
|
366
392
|
|
|
367
393
|
class DenyPrivacyRequests(ReviewPrivacyRequestIds):
|
|
@@ -370,6 +396,12 @@ class DenyPrivacyRequests(ReviewPrivacyRequestIds):
|
|
|
370
396
|
reason: Optional[SafeStr] = None
|
|
371
397
|
|
|
372
398
|
|
|
399
|
+
class CancelPrivacyRequests(ReviewPrivacyRequestIds):
|
|
400
|
+
"""Pass in a list of privacy request ids and cancellation reason"""
|
|
401
|
+
|
|
402
|
+
reason: Optional[SafeStr] = None
|
|
403
|
+
|
|
404
|
+
|
|
373
405
|
class BulkPostPrivacyRequests(BulkResponse):
|
|
374
406
|
"""Schema with mixed success/failure responses for Bulk Create of PrivacyRequest responses."""
|
|
375
407
|
|
|
@@ -458,7 +490,7 @@ class PrivacyRequestFilter(FidesSchema):
|
|
|
458
490
|
errored_gt: Optional[datetime] = None
|
|
459
491
|
external_id: Optional[str] = None
|
|
460
492
|
location: Optional[str] = None
|
|
461
|
-
action_type: Optional[ActionType] = None
|
|
493
|
+
action_type: Optional[Union[ActionType, List[ActionType]]] = None
|
|
462
494
|
verbose: Optional[bool] = False
|
|
463
495
|
include_identities: Optional[bool] = False
|
|
464
496
|
include_custom_privacy_request_fields: Optional[bool] = False
|
|
@@ -4,6 +4,7 @@ from fideslang.models import Dataset
|
|
|
4
4
|
from pydantic import BaseModel, field_validator
|
|
5
5
|
|
|
6
6
|
from fides.api.models.datasetconfig import validate_masking_strategy_override
|
|
7
|
+
from fides.api.schemas.base_class import FidesSchema
|
|
7
8
|
from fides.api.schemas.enums.connection_category import ConnectionCategory
|
|
8
9
|
from fides.api.schemas.enums.integration_feature import IntegrationFeature
|
|
9
10
|
from fides.api.schemas.policy import ActionType
|
|
@@ -50,3 +51,16 @@ class ConnectorTemplate(BaseModel):
|
|
|
50
51
|
"Hard-coded fides_key detected in the dataset, replace all instances of it with <instance_fides_key>"
|
|
51
52
|
)
|
|
52
53
|
return dataset
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class ConnectorTemplateListResponse(FidesSchema):
|
|
57
|
+
"""
|
|
58
|
+
Response schema for listing connector templates.
|
|
59
|
+
Provides summary information about available connector templates.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
type: str
|
|
63
|
+
name: str
|
|
64
|
+
supported_actions: List[ActionType]
|
|
65
|
+
category: Optional[ConnectionCategory] = None
|
|
66
|
+
custom: bool
|
|
@@ -310,7 +310,7 @@ class AsyncPollingStrategy(AsyncDSRStrategy):
|
|
|
310
310
|
logger.info(f"Prepared requests: {len(prepared_requests)}")
|
|
311
311
|
|
|
312
312
|
for next_request, param_value_map in prepared_requests:
|
|
313
|
-
response = client.send(next_request)
|
|
313
|
+
response = client.send(next_request, read_request.ignore_errors)
|
|
314
314
|
|
|
315
315
|
if not response.ok:
|
|
316
316
|
raise FidesopsException(
|
|
@@ -365,6 +365,11 @@ class AsyncPollingStrategy(AsyncDSRStrategy):
|
|
|
365
365
|
)
|
|
366
366
|
response = client.send(prepared_request, request.ignore_errors)
|
|
367
367
|
|
|
368
|
+
if not response.ok:
|
|
369
|
+
raise FidesopsException(
|
|
370
|
+
f"Initial erasure request failed with status code {response.status_code}: {response.text}"
|
|
371
|
+
)
|
|
372
|
+
|
|
368
373
|
# Extract correlation ID from response (required, like access requests)
|
|
369
374
|
try:
|
|
370
375
|
response_data = response.json()
|
|
@@ -551,13 +556,20 @@ class AsyncPollingStrategy(AsyncDSRStrategy):
|
|
|
551
556
|
self.result_request.result_path,
|
|
552
557
|
)
|
|
553
558
|
|
|
554
|
-
#
|
|
555
|
-
if
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
559
|
+
# Checks if we have a polling result, response could be empty in case there was no data to access
|
|
560
|
+
if polling_result:
|
|
561
|
+
# Ensure we have the expected polling result type
|
|
562
|
+
if not isinstance(polling_result, PollingResult):
|
|
563
|
+
raise PrivacyRequestError(
|
|
564
|
+
"Polling result must be PollingResult instance"
|
|
565
|
+
)
|
|
560
566
|
|
|
567
|
+
# Store results on the sub-request
|
|
568
|
+
self._store_sub_request_result(polling_result, sub_request, polling_task)
|
|
569
|
+
else:
|
|
570
|
+
logger.info(
|
|
571
|
+
f"No result response for sub-request {sub_request.id} for task {polling_task.id}"
|
|
572
|
+
)
|
|
561
573
|
# Mark as complete using existing method
|
|
562
574
|
sub_request.update_status(self.session, ExecutionLogStatus.complete.value)
|
|
563
575
|
|
|
@@ -59,11 +59,18 @@ class BaseErasureEmailConnector(BaseEmailConnector):
|
|
|
59
59
|
self, user_identities: Dict[str, Any], privacy_request: PrivacyRequest
|
|
60
60
|
) -> bool:
|
|
61
61
|
"""Schedules an erasure email for erasure privacy requests containing the required identities"""
|
|
62
|
+
|
|
63
|
+
# do not send erasure emails if there is more than 1 action type for the request.
|
|
64
|
+
# we use consent + erasure types to facilitate Do Not Sell features.
|
|
65
|
+
multiple_action_types = len(privacy_request.policy.get_all_action_types()) > 1
|
|
66
|
+
|
|
62
67
|
erasure_rules: List[Rule] = privacy_request.policy.get_rules_for_action(
|
|
63
68
|
action_type=ActionType.erasure
|
|
64
69
|
)
|
|
70
|
+
|
|
65
71
|
return bool(
|
|
66
72
|
erasure_rules
|
|
73
|
+
and not multiple_action_types
|
|
67
74
|
and filter_user_identities_for_connector(self.config, user_identities)
|
|
68
75
|
)
|
|
69
76
|
|
|
@@ -25,7 +25,7 @@ class MicrosoftSQLServerConnector(SQLConnector):
|
|
|
25
25
|
def build_uri(self) -> URL:
|
|
26
26
|
"""
|
|
27
27
|
Build URI of format
|
|
28
|
-
mssql+pymssql://[username]:[password]@[host]:[port]/[dbname]
|
|
28
|
+
mssql+pymssql://[username]:[password]@[host]:[port]/[dbname]?read_only=[read_only_connection]
|
|
29
29
|
Returns URL obj, since SQLAlchemy's create_engine method accepts either a URL obj or a string
|
|
30
30
|
"""
|
|
31
31
|
|
|
@@ -38,6 +38,11 @@ class MicrosoftSQLServerConnector(SQLConnector):
|
|
|
38
38
|
host=config.host,
|
|
39
39
|
port=config.port,
|
|
40
40
|
database=config.dbname,
|
|
41
|
+
query=(
|
|
42
|
+
{"read_only": str(config.read_only_connection)}
|
|
43
|
+
if config.read_only_connection
|
|
44
|
+
else None
|
|
45
|
+
),
|
|
41
46
|
)
|
|
42
47
|
|
|
43
48
|
return url
|
|
@@ -13,7 +13,11 @@ from fides.api.api.deps import get_api_session
|
|
|
13
13
|
from fides.api.common_exceptions import ValidationError
|
|
14
14
|
from fides.api.cryptography.cryptographic_util import str_to_b64_str
|
|
15
15
|
from fides.api.models.custom_connector_template import CustomConnectorTemplate
|
|
16
|
-
from fides.api.
|
|
16
|
+
from fides.api.models.saas_template_dataset import SaasTemplateDataset
|
|
17
|
+
from fides.api.schemas.saas.connector_template import (
|
|
18
|
+
ConnectorTemplate,
|
|
19
|
+
ConnectorTemplateListResponse,
|
|
20
|
+
)
|
|
17
21
|
from fides.api.schemas.saas.saas_config import SaaSConfig
|
|
18
22
|
from fides.api.service.authentication.authentication_strategy_oauth2_authorization_code import (
|
|
19
23
|
OAuth2AuthorizationCodeAuthenticationStrategy,
|
|
@@ -118,6 +122,11 @@ class CustomConnectorTemplateLoader(ConnectorTemplateLoader):
|
|
|
118
122
|
f"Replacing {template.key} connector template with newer version."
|
|
119
123
|
)
|
|
120
124
|
template.delete(db=db)
|
|
125
|
+
template_dataset = SaasTemplateDataset.get_by(
|
|
126
|
+
db=db, field="connection_type", value=template.key
|
|
127
|
+
)
|
|
128
|
+
if template_dataset:
|
|
129
|
+
template_dataset.delete(db=db)
|
|
121
130
|
continue
|
|
122
131
|
try:
|
|
123
132
|
CustomConnectorTemplateLoader._register_template(template)
|
|
@@ -284,6 +293,15 @@ class CustomConnectorTemplateLoader(ConnectorTemplateLoader):
|
|
|
284
293
|
},
|
|
285
294
|
)
|
|
286
295
|
|
|
296
|
+
# Store the original template dataset (with placeholders) instead of the modified version
|
|
297
|
+
template_dataset_json = load_dataset_from_string(template.dataset)
|
|
298
|
+
|
|
299
|
+
SaasTemplateDataset.get_or_create(
|
|
300
|
+
db=db,
|
|
301
|
+
connector_type=connector_type,
|
|
302
|
+
dataset_json=template_dataset_json,
|
|
303
|
+
)
|
|
304
|
+
|
|
287
305
|
|
|
288
306
|
class ConnectorRegistry:
|
|
289
307
|
@classmethod
|
|
@@ -309,3 +327,29 @@ class ConnectorRegistry:
|
|
|
309
327
|
Returns an object containing the various SaaS connector artifacts
|
|
310
328
|
"""
|
|
311
329
|
return cls._get_combined_templates().get(connector_type)
|
|
330
|
+
|
|
331
|
+
@classmethod
|
|
332
|
+
def get_all_connector_templates_summary(cls) -> List[ConnectorTemplateListResponse]:
|
|
333
|
+
"""
|
|
334
|
+
Returns summary information for all connector templates.
|
|
335
|
+
Includes connector_type, name, supported_actions, category, and whether it's custom.
|
|
336
|
+
"""
|
|
337
|
+
custom_templates = CustomConnectorTemplateLoader.get_connector_templates() # type: ignore
|
|
338
|
+
combined_templates = cls._get_combined_templates()
|
|
339
|
+
|
|
340
|
+
summaries: List[ConnectorTemplateListResponse] = []
|
|
341
|
+
for connector_type, template in combined_templates.items():
|
|
342
|
+
# Determine if the template is custom by checking if it exists in CustomConnectorTemplateLoader
|
|
343
|
+
is_custom = connector_type in custom_templates
|
|
344
|
+
|
|
345
|
+
summaries.append(
|
|
346
|
+
ConnectorTemplateListResponse(
|
|
347
|
+
type=connector_type,
|
|
348
|
+
name=template.human_readable,
|
|
349
|
+
supported_actions=template.supported_actions,
|
|
350
|
+
category=template.category,
|
|
351
|
+
custom=is_custom,
|
|
352
|
+
)
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
return summaries
|
|
@@ -6,6 +6,7 @@ from typing import Any, Callable, Dict, List, Optional, Union
|
|
|
6
6
|
import requests
|
|
7
7
|
import sendgrid
|
|
8
8
|
from loguru import logger
|
|
9
|
+
from requests.exceptions import RequestException, Timeout
|
|
9
10
|
from sendgrid.helpers.mail import Content, Email, Mail, Personalization, TemplateId, To
|
|
10
11
|
from sqlalchemy.orm import Session
|
|
11
12
|
from twilio.base.exceptions import TwilioRestException
|
|
@@ -53,7 +54,18 @@ EMAIL_JOIN_STRING = ", "
|
|
|
53
54
|
EMAIL_TEMPLATE_NAME = "fides"
|
|
54
55
|
|
|
55
56
|
|
|
56
|
-
@celery_app.task(
|
|
57
|
+
@celery_app.task(
|
|
58
|
+
base=DatabaseTask,
|
|
59
|
+
bind=True,
|
|
60
|
+
autoretry_for=(
|
|
61
|
+
Timeout,
|
|
62
|
+
RequestException,
|
|
63
|
+
TwilioRestException,
|
|
64
|
+
),
|
|
65
|
+
retry_kwargs={"max_retries": 3},
|
|
66
|
+
retry_backoff=2,
|
|
67
|
+
retry_jitter=True,
|
|
68
|
+
)
|
|
57
69
|
def dispatch_message_task(
|
|
58
70
|
self: DatabaseTask,
|
|
59
71
|
message_meta: Dict[str, Any],
|
|
@@ -62,7 +74,14 @@ def dispatch_message_task(
|
|
|
62
74
|
property_id: Optional[str],
|
|
63
75
|
) -> None:
|
|
64
76
|
"""
|
|
65
|
-
A wrapper function to dispatch a message task into the Celery queues
|
|
77
|
+
A wrapper function to dispatch a message task into the Celery queues.
|
|
78
|
+
|
|
79
|
+
This task will automatically retry up to 3 times on transient network failures
|
|
80
|
+
(timeouts, connection errors, temporary service unavailability) with exponential
|
|
81
|
+
backoff (2s, 4s, 8s) and jitter to prevent thundering herd issues.
|
|
82
|
+
|
|
83
|
+
Permanent errors (missing config, invalid identities, etc.) will fail immediately
|
|
84
|
+
without retry to provide fast feedback and avoid wasting worker resources.
|
|
66
85
|
"""
|
|
67
86
|
schema = FidesopsMessage.model_validate(message_meta)
|
|
68
87
|
with self.get_new_session() as db:
|
|
@@ -467,7 +486,6 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
|
|
|
467
486
|
),
|
|
468
487
|
)
|
|
469
488
|
if action_type == MessagingActionType.EXTERNAL_USER_WELCOME:
|
|
470
|
-
base_template = get_email_template(action_type)
|
|
471
489
|
# Generate display name for personalization
|
|
472
490
|
display_name = body_params.username
|
|
473
491
|
if body_params.first_name:
|
|
@@ -490,8 +508,26 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
|
|
|
490
508
|
"access_token": body_params.access_token,
|
|
491
509
|
}
|
|
492
510
|
|
|
511
|
+
# Start with default subject
|
|
512
|
+
subject = "Welcome to our Privacy Center"
|
|
513
|
+
|
|
514
|
+
# If messaging template exists, extract customizable content
|
|
515
|
+
if messaging_template:
|
|
516
|
+
# Use custom subject if provided
|
|
517
|
+
if "subject" in messaging_template.content:
|
|
518
|
+
subject = _render(messaging_template.content["subject"], variables)
|
|
519
|
+
|
|
520
|
+
# Use custom body content to replace the intro text in HTML template
|
|
521
|
+
custom_body = messaging_template.content.get("body", "")
|
|
522
|
+
if custom_body.strip():
|
|
523
|
+
# Replace the default intro text with the custom body content
|
|
524
|
+
rendered_custom_body = _render(custom_body, variables)
|
|
525
|
+
variables["custom_intro"] = rendered_custom_body
|
|
526
|
+
|
|
527
|
+
# Always use the HTML template
|
|
528
|
+
base_template = get_email_template(action_type)
|
|
493
529
|
return EmailForActionType(
|
|
494
|
-
subject=
|
|
530
|
+
subject=subject,
|
|
495
531
|
body=base_template.render(variables),
|
|
496
532
|
template_variables=variables,
|
|
497
533
|
)
|
|
@@ -600,6 +636,7 @@ def _mailchimp_transactional_dispatcher(
|
|
|
600
636
|
"https://mandrillapp.com/api/1.0/messages/send",
|
|
601
637
|
headers={"Content-Type": "application/json"},
|
|
602
638
|
data=data,
|
|
639
|
+
timeout=10,
|
|
603
640
|
)
|
|
604
641
|
if not response.ok:
|
|
605
642
|
logger.error("Email failed to send with status code: %s", response.status_code)
|
|
@@ -647,6 +684,7 @@ def _mailgun_dispatcher(
|
|
|
647
684
|
"api",
|
|
648
685
|
messaging_config.secrets[MessagingServiceSecrets.MAILGUN_API_KEY.value],
|
|
649
686
|
),
|
|
687
|
+
timeout=10,
|
|
650
688
|
)
|
|
651
689
|
|
|
652
690
|
data = {
|
|
@@ -671,6 +709,7 @@ def _mailgun_dispatcher(
|
|
|
671
709
|
],
|
|
672
710
|
),
|
|
673
711
|
data=data,
|
|
712
|
+
timeout=10,
|
|
674
713
|
)
|
|
675
714
|
|
|
676
715
|
if not response.ok:
|
|
@@ -691,6 +730,7 @@ def _mailgun_dispatcher(
|
|
|
691
730
|
],
|
|
692
731
|
),
|
|
693
732
|
data=data,
|
|
733
|
+
timeout=10,
|
|
694
734
|
)
|
|
695
735
|
if not response.ok:
|
|
696
736
|
logger.error(
|
|
@@ -45,7 +45,7 @@ class DSRReportBuilder:
|
|
|
45
45
|
pages to a zip file in a way that the pages can be navigated between.
|
|
46
46
|
|
|
47
47
|
The zip file is structured as follows:
|
|
48
|
-
-
|
|
48
|
+
- clickme.html: the main index page
|
|
49
49
|
- data/dataset_name/index.html: the index page for the dataset
|
|
50
50
|
- data/dataset_name/collection_name/index.html: the index page for the collection
|
|
51
51
|
- data/dataset_name/collection_name/item_index.html: the detail page for the item
|
|
@@ -565,9 +565,9 @@ class DSRReportBuilder:
|
|
|
565
565
|
|
|
566
566
|
# create the main index once all the datasets have been added
|
|
567
567
|
self._add_file(
|
|
568
|
-
"
|
|
568
|
+
"clickme.html",
|
|
569
569
|
self._populate_template(
|
|
570
|
-
"templates/
|
|
570
|
+
"templates/clickme.html", "DSR Report", None, self.main_links
|
|
571
571
|
),
|
|
572
572
|
)
|
|
573
573
|
finally:
|
|
@@ -1,35 +1,46 @@
|
|
|
1
1
|
<html>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
<head>
|
|
3
|
+
<link
|
|
4
|
+
rel="stylesheet"
|
|
5
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600"
|
|
6
|
+
/>
|
|
7
|
+
<link rel="stylesheet" href="../data/main.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div class="container">
|
|
11
|
+
<div class="header"></div>
|
|
12
|
+
<div class="content">
|
|
13
|
+
<div class="button-container">
|
|
14
|
+
<a href="../clickme.html">
|
|
15
|
+
<div class="button"><img src="../data/back.svg" /></div>
|
|
16
|
+
<span>Back to main page</span>
|
|
17
|
+
</a>
|
|
18
|
+
</div>
|
|
19
|
+
<h1>Attachments</h1>
|
|
20
|
+
{% if not enable_streaming %}
|
|
21
|
+
<p class="expiration-notice">
|
|
22
|
+
Note: All download links will expire in {{ download_link_ttl_days }}
|
|
23
|
+
days.
|
|
24
|
+
</p>
|
|
25
|
+
{% endif %}
|
|
26
|
+
<div class="table table-hover">
|
|
27
|
+
<div class="table-row">
|
|
28
|
+
<div class="table-cell" style="text-align: left">File Name</div>
|
|
29
|
+
<div class="table-cell" style="text-align: left">Size</div>
|
|
30
|
+
</div>
|
|
31
|
+
{% for name, info in data.items() %}
|
|
32
|
+
<a href="{{ info.url }}" class="table-row" target="_blank">
|
|
33
|
+
<div class="table-cell" style="text-align: left">
|
|
34
|
+
{% if enable_streaming %}{{ name }}{% else %}{{ info.original_name
|
|
35
|
+
}}{% endif %}
|
|
15
36
|
</div>
|
|
16
|
-
<
|
|
17
|
-
|
|
18
|
-
<p class="expiration-notice">Note: All download links will expire in {{ download_link_ttl_days }} days.</p>
|
|
19
|
-
{% endif %}
|
|
20
|
-
<div class="table table-hover">
|
|
21
|
-
<div class="table-row">
|
|
22
|
-
<div class="table-cell" style="text-align: left;">File Name</div>
|
|
23
|
-
<div class="table-cell" style="text-align: left;">Size</div>
|
|
24
|
-
</div>
|
|
25
|
-
{% for name, info in data.items() %}
|
|
26
|
-
<a href="{{ info.url }}" class="table-row" target="_blank">
|
|
27
|
-
<div class="table-cell" style="text-align: left;">{% if enable_streaming %}{{ name }}{% else %}{{ info.original_name }}{% endif %}</div>
|
|
28
|
-
<div class="table-cell" style="text-align: left;">{{ info.size }}</div>
|
|
29
|
-
</a>
|
|
30
|
-
{% endfor %}
|
|
37
|
+
<div class="table-cell" style="text-align: left">
|
|
38
|
+
{{ info.size }}
|
|
31
39
|
</div>
|
|
32
|
-
|
|
40
|
+
</a>
|
|
41
|
+
{% endfor %}
|
|
42
|
+
</div>
|
|
33
43
|
</div>
|
|
34
|
-
|
|
44
|
+
</div>
|
|
45
|
+
</body>
|
|
35
46
|
</html>
|