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
|
@@ -133,8 +133,9 @@ def poll_for_exited_privacy_request_tasks(self: DatabaseTask) -> Set[str]:
|
|
|
133
133
|
# Privacy Requests that didn't need approval are "In Processing".
|
|
134
134
|
# Privacy Requests in these states should be examined to see if all of its Request Tasks have had a chance
|
|
135
135
|
# to complete.
|
|
136
|
+
# Use query_without_large_columns to prevent OOM errors when processing many privacy requests
|
|
136
137
|
in_progress_privacy_requests = (
|
|
137
|
-
|
|
138
|
+
PrivacyRequest.query_without_large_columns(db)
|
|
138
139
|
.filter(
|
|
139
140
|
PrivacyRequest.status.in_(
|
|
140
141
|
[
|
|
@@ -528,8 +529,9 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
|
|
|
528
529
|
logger.debug("Starting check for interrupted tasks to requeue")
|
|
529
530
|
|
|
530
531
|
# Get all in-progress privacy requests that haven't been updated in the last 5 minutes
|
|
532
|
+
# Use query_without_large_columns to prevent OOM errors when processing many privacy requests
|
|
531
533
|
in_progress_requests = (
|
|
532
|
-
|
|
534
|
+
PrivacyRequest.query_without_large_columns(db)
|
|
533
535
|
.filter(
|
|
534
536
|
PrivacyRequest.status.in_(
|
|
535
537
|
[
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
2
|
from inspect import Signature, signature
|
|
3
|
-
from typing import TYPE_CHECKING, Callable, Dict, List, Union
|
|
3
|
+
from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Union
|
|
4
4
|
|
|
5
5
|
from loguru import logger
|
|
6
6
|
|
|
@@ -319,7 +319,12 @@ def validate_polling_result_override_function(f: Callable) -> None:
|
|
|
319
319
|
|
|
320
320
|
# Check return type annotation - handle both direct class and string literals
|
|
321
321
|
return_annotation = sig.return_annotation
|
|
322
|
-
if return_annotation not in (
|
|
322
|
+
if return_annotation not in (
|
|
323
|
+
PollingResult,
|
|
324
|
+
"PollingResult",
|
|
325
|
+
Optional[PollingResult],
|
|
326
|
+
"Optional[PollingResult]",
|
|
327
|
+
):
|
|
323
328
|
raise InvalidSaaSRequestOverrideException(
|
|
324
329
|
"Polling result override function must return a PollingResult"
|
|
325
330
|
)
|
|
File without changes
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
from typing import Any, Optional
|
|
2
|
+
|
|
3
|
+
from fides.api.models.location_regulation_selections import get_location_by_id
|
|
4
|
+
from fides.api.models.policy import Policy
|
|
5
|
+
from fides.api.schemas.policy import ActionType
|
|
6
|
+
from fides.api.task.conditional_dependencies.privacy_request.schemas import (
|
|
7
|
+
ConditionalDependencyFieldInfo,
|
|
8
|
+
ConditionalDependencyFieldType,
|
|
9
|
+
PrivacyRequestConvenienceFields,
|
|
10
|
+
PrivacyRequestLocationConvenienceFields,
|
|
11
|
+
PrivacyRequestPolicyConvenienceFields,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def build_convenience_field_list() -> list[ConditionalDependencyFieldInfo]:
|
|
16
|
+
"""Builds a list of ConditionalDependencyFieldInfo objects for convenience fields."""
|
|
17
|
+
return [
|
|
18
|
+
# Policy convenience fields
|
|
19
|
+
ConditionalDependencyFieldInfo(
|
|
20
|
+
field_path=PrivacyRequestConvenienceFields.rule_action_types.value,
|
|
21
|
+
field_type=ConditionalDependencyFieldType.array,
|
|
22
|
+
description="List of action types from policy rules (e.g., ['access', 'erasure']). Use with list_contains operator.",
|
|
23
|
+
is_convenience_field=True,
|
|
24
|
+
),
|
|
25
|
+
ConditionalDependencyFieldInfo(
|
|
26
|
+
field_path=PrivacyRequestConvenienceFields.has_access_rule.value,
|
|
27
|
+
field_type=ConditionalDependencyFieldType.boolean,
|
|
28
|
+
description="Whether the policy has at least one rule with action_type 'access'.",
|
|
29
|
+
is_convenience_field=True,
|
|
30
|
+
),
|
|
31
|
+
ConditionalDependencyFieldInfo(
|
|
32
|
+
field_path=PrivacyRequestConvenienceFields.has_erasure_rule.value,
|
|
33
|
+
field_type=ConditionalDependencyFieldType.boolean,
|
|
34
|
+
description="Whether the policy has at least one rule with action_type 'erasure'.",
|
|
35
|
+
is_convenience_field=True,
|
|
36
|
+
),
|
|
37
|
+
ConditionalDependencyFieldInfo(
|
|
38
|
+
field_path=PrivacyRequestConvenienceFields.has_consent_rule.value,
|
|
39
|
+
field_type=ConditionalDependencyFieldType.boolean,
|
|
40
|
+
description="Whether the policy has at least one rule with action_type 'consent'.",
|
|
41
|
+
is_convenience_field=True,
|
|
42
|
+
),
|
|
43
|
+
ConditionalDependencyFieldInfo(
|
|
44
|
+
field_path=PrivacyRequestConvenienceFields.has_update_rule.value,
|
|
45
|
+
field_type=ConditionalDependencyFieldType.boolean,
|
|
46
|
+
description="Whether the policy has at least one rule with action_type 'update'.",
|
|
47
|
+
is_convenience_field=True,
|
|
48
|
+
),
|
|
49
|
+
ConditionalDependencyFieldInfo(
|
|
50
|
+
field_path=PrivacyRequestConvenienceFields.rule_count.value,
|
|
51
|
+
field_type=ConditionalDependencyFieldType.integer,
|
|
52
|
+
description="Number of rules in the policy.",
|
|
53
|
+
is_convenience_field=True,
|
|
54
|
+
),
|
|
55
|
+
ConditionalDependencyFieldInfo(
|
|
56
|
+
field_path=PrivacyRequestConvenienceFields.rule_names.value,
|
|
57
|
+
field_type=ConditionalDependencyFieldType.array,
|
|
58
|
+
description="List of rule names from the policy. Use with list_contains operator.",
|
|
59
|
+
is_convenience_field=True,
|
|
60
|
+
),
|
|
61
|
+
ConditionalDependencyFieldInfo(
|
|
62
|
+
field_path=PrivacyRequestConvenienceFields.has_storage_destination.value,
|
|
63
|
+
field_type=ConditionalDependencyFieldType.boolean,
|
|
64
|
+
description="Whether any rule in the policy has a storage destination configured.",
|
|
65
|
+
is_convenience_field=True,
|
|
66
|
+
),
|
|
67
|
+
# Location hierarchy convenience fields
|
|
68
|
+
ConditionalDependencyFieldInfo(
|
|
69
|
+
field_path=PrivacyRequestConvenienceFields.location_country.value,
|
|
70
|
+
field_type=ConditionalDependencyFieldType.string,
|
|
71
|
+
description="The country code for the location (e.g., 'us' for 'us_ca', 'fr' for France). Use with eq operator to check if a location is in a specific country.",
|
|
72
|
+
is_convenience_field=True,
|
|
73
|
+
),
|
|
74
|
+
ConditionalDependencyFieldInfo(
|
|
75
|
+
field_path=PrivacyRequestConvenienceFields.location_groups.value,
|
|
76
|
+
field_type=ConditionalDependencyFieldType.array,
|
|
77
|
+
description="List of location groups this location belongs to (e.g., ['us'] for US states, ['eea'] for EU countries). Use with list_contains operator.",
|
|
78
|
+
is_convenience_field=True,
|
|
79
|
+
),
|
|
80
|
+
ConditionalDependencyFieldInfo(
|
|
81
|
+
field_path=PrivacyRequestConvenienceFields.location_regulations.value,
|
|
82
|
+
field_type=ConditionalDependencyFieldType.array,
|
|
83
|
+
description="List of regulations applicable to this location (e.g., ['ccpa'] for California, ['gdpr'] for EU). Use with list_contains operator.",
|
|
84
|
+
is_convenience_field=True,
|
|
85
|
+
),
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def get_policy_convenience_fields(
|
|
90
|
+
policy: Policy,
|
|
91
|
+
) -> dict[str, Any]:
|
|
92
|
+
"""Gets convenience fields for a policy."""
|
|
93
|
+
extra_fields: dict[str, Any] = {}
|
|
94
|
+
extra_fields["id"] = policy.id
|
|
95
|
+
|
|
96
|
+
# Get rules for convenience field derivation
|
|
97
|
+
rules = policy.rules if hasattr(policy, "rules") and policy.rules else []
|
|
98
|
+
action_types = policy.get_all_action_types()
|
|
99
|
+
|
|
100
|
+
# Add convenience fields for rules
|
|
101
|
+
extra_fields[PrivacyRequestPolicyConvenienceFields.rule_action_types.value] = [
|
|
102
|
+
action_type.value for action_type in action_types if action_type
|
|
103
|
+
]
|
|
104
|
+
for action_type in ActionType:
|
|
105
|
+
extra_fields[f"has_{action_type.value}_rule"] = action_type in action_types
|
|
106
|
+
extra_fields[PrivacyRequestPolicyConvenienceFields.rule_count.value] = (
|
|
107
|
+
len(rules) if rules else 0
|
|
108
|
+
)
|
|
109
|
+
extra_fields[PrivacyRequestPolicyConvenienceFields.rule_names.value] = [
|
|
110
|
+
rule.name for rule in rules if hasattr(rule, "name") and rule.name
|
|
111
|
+
]
|
|
112
|
+
extra_fields[
|
|
113
|
+
PrivacyRequestPolicyConvenienceFields.has_storage_destination.value
|
|
114
|
+
] = any(
|
|
115
|
+
hasattr(rule, "storage_destination") and rule.storage_destination is not None
|
|
116
|
+
for rule in rules
|
|
117
|
+
)
|
|
118
|
+
return extra_fields
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def get_location_convenience_fields(location: Optional[str]) -> dict[str, Any]:
|
|
122
|
+
"""Gets convenience fields for a location to support hierarchy-based conditions."""
|
|
123
|
+
extra_fields: dict[str, Any] = {
|
|
124
|
+
PrivacyRequestLocationConvenienceFields.location_country.value: None,
|
|
125
|
+
PrivacyRequestLocationConvenienceFields.location_groups.value: [],
|
|
126
|
+
PrivacyRequestLocationConvenienceFields.location_regulations.value: [],
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if not location:
|
|
130
|
+
return extra_fields
|
|
131
|
+
|
|
132
|
+
location_data = get_location_by_id(location)
|
|
133
|
+
if not location_data:
|
|
134
|
+
return extra_fields
|
|
135
|
+
|
|
136
|
+
# If location has parent groups, the first one is typically the country
|
|
137
|
+
# (e.g., us_ca belongs to [us])
|
|
138
|
+
belongs_to = location_data.belongs_to or []
|
|
139
|
+
extra_fields[PrivacyRequestLocationConvenienceFields.location_groups.value] = (
|
|
140
|
+
belongs_to
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# Set location_country to the first parent if the location is a subdivision
|
|
144
|
+
# This helps with conditions like "is this a US state?"
|
|
145
|
+
if belongs_to and not location_data.is_country:
|
|
146
|
+
extra_fields[PrivacyRequestLocationConvenienceFields.location_country.value] = (
|
|
147
|
+
belongs_to[0]
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Add regulations applicable to this location
|
|
151
|
+
extra_fields[PrivacyRequestLocationConvenienceFields.location_regulations.value] = (
|
|
152
|
+
location_data.regulation or []
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
return extra_fields
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
from typing import Any, Optional
|
|
2
|
+
|
|
3
|
+
from pydantic.v1.utils import deep_update
|
|
4
|
+
|
|
5
|
+
from fides.api.models.policy import Policy
|
|
6
|
+
from fides.api.models.privacy_request import PrivacyRequest
|
|
7
|
+
from fides.api.schemas.policy import Policy as PolicySchema
|
|
8
|
+
from fides.api.task.conditional_dependencies.privacy_request.convenience_fields import (
|
|
9
|
+
get_location_convenience_fields,
|
|
10
|
+
get_policy_convenience_fields,
|
|
11
|
+
)
|
|
12
|
+
from fides.api.task.conditional_dependencies.privacy_request.schemas import (
|
|
13
|
+
PrivacyRequestLocationConvenienceFields,
|
|
14
|
+
)
|
|
15
|
+
from fides.api.task.conditional_dependencies.util import (
|
|
16
|
+
extract_nested_field_value,
|
|
17
|
+
set_nested_value,
|
|
18
|
+
transform_value_for_evaluation,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PrivacyRequestDataTransformer:
|
|
23
|
+
"""
|
|
24
|
+
Transforms a PrivacyRequest ORM object into a dictionary structure for condition evaluation.
|
|
25
|
+
|
|
26
|
+
- This class extracts the fields referenced in conditions and builds a minimal nested structure
|
|
27
|
+
for evaluation. Privacy request fields must be prefixed with the "privacy_request" namespace.
|
|
28
|
+
- This class is used to get the privacy request data for condition evaluation.
|
|
29
|
+
- The task.conditional_dependencies.evaluator expects the data to be in a nested dictionary structure
|
|
30
|
+
and uses the operators defined in the task.conditional_dependencies.operators.py which have defined
|
|
31
|
+
data type compatibility.
|
|
32
|
+
|
|
33
|
+
Note: Privacy request relationships are eager loaded in the execute_request_tasks.py file.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, privacy_request: PrivacyRequest):
|
|
37
|
+
self.privacy_request = privacy_request
|
|
38
|
+
self.policy_data = self._transform_policy_object(privacy_request.policy)
|
|
39
|
+
self.identity_data = self.privacy_request.get_persisted_identity()
|
|
40
|
+
self.custom_privacy_request_fields_data = (
|
|
41
|
+
self.privacy_request.get_persisted_custom_privacy_request_fields()
|
|
42
|
+
)
|
|
43
|
+
self.location_convenience_fields = get_location_convenience_fields(
|
|
44
|
+
privacy_request.location
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def to_evaluation_data(self, field_addresses: set[str]) -> dict[str, Any]:
|
|
48
|
+
"""
|
|
49
|
+
Transforms the PrivacyRequest into an evaluation-ready dictionary structure.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
field_addresses: Set of field addresses referenced in conditions
|
|
53
|
+
"""
|
|
54
|
+
if not field_addresses:
|
|
55
|
+
return {}
|
|
56
|
+
|
|
57
|
+
result: dict[str, Any] = {"privacy_request": {}}
|
|
58
|
+
field_paths: set[str] = {addr.replace(":", ".") for addr in field_addresses}
|
|
59
|
+
|
|
60
|
+
# Extract each field dynamically based on its path
|
|
61
|
+
for field_path in field_paths:
|
|
62
|
+
value = self._extract_value_by_path(field_path)
|
|
63
|
+
privacy_request_data: Optional[dict[str, Any]] = set_nested_value(
|
|
64
|
+
field_path.split("."), value
|
|
65
|
+
)
|
|
66
|
+
if privacy_request_data:
|
|
67
|
+
result = deep_update(result, privacy_request_data)
|
|
68
|
+
|
|
69
|
+
return result
|
|
70
|
+
|
|
71
|
+
def _extract_value_by_path(self, field_address: str) -> Any:
|
|
72
|
+
"""
|
|
73
|
+
Extracts a value from PrivacyRequest by following the field address path.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
field_address: The field address path (e.g., "privacy_request.location", "privacy_request.policy.rules")
|
|
77
|
+
|
|
78
|
+
"""
|
|
79
|
+
# first part will always be privacy_request
|
|
80
|
+
parts: list[str] = field_address.split(".")[1:]
|
|
81
|
+
current: Any = self.privacy_request
|
|
82
|
+
is_labeled_field = False
|
|
83
|
+
|
|
84
|
+
# Handle location convenience fields - these are derived fields, not direct attributes
|
|
85
|
+
# Check if we're accessing a location convenience field before trying to extract from privacy_request
|
|
86
|
+
|
|
87
|
+
if len(parts) == 1 and parts[0] in [
|
|
88
|
+
e.value for e in PrivacyRequestLocationConvenienceFields
|
|
89
|
+
]:
|
|
90
|
+
return self.location_convenience_fields.get(parts[0])
|
|
91
|
+
|
|
92
|
+
# Route to the appropriate data source based on the first path component
|
|
93
|
+
if parts[0] == "policy":
|
|
94
|
+
current = self.policy_data
|
|
95
|
+
parts.pop(0)
|
|
96
|
+
elif parts[0] == "identity":
|
|
97
|
+
current = self.identity_data
|
|
98
|
+
# Identity fields may contain LabeledIdentity objects with label/value structure
|
|
99
|
+
is_labeled_field = True
|
|
100
|
+
parts.pop(0)
|
|
101
|
+
elif parts[0] == "custom_privacy_request_fields":
|
|
102
|
+
current = self.custom_privacy_request_fields_data
|
|
103
|
+
# Custom fields are stored as {"label": ..., "value": ...} dicts
|
|
104
|
+
is_labeled_field = True
|
|
105
|
+
parts.pop(0)
|
|
106
|
+
|
|
107
|
+
current = extract_nested_field_value(current, parts)
|
|
108
|
+
|
|
109
|
+
# If we started with an Identity object and didn't extract any field from it
|
|
110
|
+
# (current is still the identity object), return None
|
|
111
|
+
# Otherwise, transform the value (which could be a BaseModel like LabeledIdentity)
|
|
112
|
+
if current is self.identity_data:
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
# Transform the value first (converts LabeledIdentity to dict, handles other types)
|
|
116
|
+
current = transform_value_for_evaluation(current)
|
|
117
|
+
|
|
118
|
+
# For labeled fields (custom privacy request fields and identity fields with labels),
|
|
119
|
+
# extract just the value from the {"label": ..., "value": ...} structure
|
|
120
|
+
if is_labeled_field and isinstance(current, dict) and "value" in current:
|
|
121
|
+
current = current["value"]
|
|
122
|
+
|
|
123
|
+
return current
|
|
124
|
+
|
|
125
|
+
def _transform_policy_object(self, policy: Policy) -> dict[str, Any]:
|
|
126
|
+
"""
|
|
127
|
+
Transforms a Policy ORM object to a dictionary using existing Pydantic schema
|
|
128
|
+
and adds convenience fields.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
policy: The Policy ORM object
|
|
132
|
+
"""
|
|
133
|
+
if not policy:
|
|
134
|
+
return {}
|
|
135
|
+
extra_fields = get_policy_convenience_fields(policy)
|
|
136
|
+
|
|
137
|
+
# Convert Policy ORM object to dictionary using Pydantic schema
|
|
138
|
+
policy_dict = PolicySchema.model_validate(policy).model_dump()
|
|
139
|
+
policy_dict.update(extra_fields)
|
|
140
|
+
return policy_dict
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Optional, Union
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field, field_validator
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PrivacyRequestTopLevelFields(Enum):
|
|
8
|
+
"""Top level fields for privacy request."""
|
|
9
|
+
|
|
10
|
+
privacy_request = "privacy_request"
|
|
11
|
+
policy = "privacy_request.policy"
|
|
12
|
+
identity = "privacy_request.identity"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class PrivacyRequestPolicyConvenienceFields(Enum):
|
|
16
|
+
"""Convenience fields for privacy request policy."""
|
|
17
|
+
|
|
18
|
+
rule_action_types = "rule_action_types"
|
|
19
|
+
has_access_rule = "has_access_rule"
|
|
20
|
+
has_erasure_rule = "has_erasure_rule"
|
|
21
|
+
has_consent_rule = "has_consent_rule"
|
|
22
|
+
has_update_rule = "has_update_rule"
|
|
23
|
+
rule_count = "rule_count"
|
|
24
|
+
rule_names = "rule_names"
|
|
25
|
+
has_storage_destination = "has_storage_destination"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class PrivacyRequestLocationConvenienceFields(Enum):
|
|
29
|
+
"""Convenience fields for privacy request location."""
|
|
30
|
+
|
|
31
|
+
location_country = "location_country"
|
|
32
|
+
location_groups = "location_groups"
|
|
33
|
+
location_regulations = "location_regulations"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class PrivacyRequestConvenienceFields(Enum):
|
|
37
|
+
"""Convenience fields for privacy request."""
|
|
38
|
+
|
|
39
|
+
# Policy convenience fields
|
|
40
|
+
rule_action_types = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.rule_action_types.value}"
|
|
41
|
+
has_access_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_access_rule.value}"
|
|
42
|
+
has_erasure_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_erasure_rule.value}"
|
|
43
|
+
has_consent_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_consent_rule.value}"
|
|
44
|
+
has_update_rule = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_update_rule.value}"
|
|
45
|
+
rule_count = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.rule_count.value}"
|
|
46
|
+
rule_names = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.rule_names.value}"
|
|
47
|
+
has_storage_destination = f"{PrivacyRequestTopLevelFields.policy.value}.{PrivacyRequestPolicyConvenienceFields.has_storage_destination.value}"
|
|
48
|
+
# Location hierarchy convenience fields
|
|
49
|
+
location_country = f"{PrivacyRequestTopLevelFields.privacy_request.value}.{PrivacyRequestLocationConvenienceFields.location_country.value}"
|
|
50
|
+
location_groups = f"{PrivacyRequestTopLevelFields.privacy_request.value}.{PrivacyRequestLocationConvenienceFields.location_groups.value}"
|
|
51
|
+
location_regulations = f"{PrivacyRequestTopLevelFields.privacy_request.value}.{PrivacyRequestLocationConvenienceFields.location_regulations.value}"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class PrivacyRequestFields(Enum):
|
|
55
|
+
"""Fields for privacy request."""
|
|
56
|
+
|
|
57
|
+
created_at = f"{PrivacyRequestTopLevelFields.privacy_request.value}.created_at"
|
|
58
|
+
due_date = f"{PrivacyRequestTopLevelFields.privacy_request.value}.due_date"
|
|
59
|
+
identity_verified_at = (
|
|
60
|
+
f"{PrivacyRequestTopLevelFields.privacy_request.value}.identity_verified_at"
|
|
61
|
+
)
|
|
62
|
+
location = f"{PrivacyRequestTopLevelFields.privacy_request.value}.location"
|
|
63
|
+
origin = f"{PrivacyRequestTopLevelFields.privacy_request.value}.origin"
|
|
64
|
+
requested_at = f"{PrivacyRequestTopLevelFields.privacy_request.value}.requested_at"
|
|
65
|
+
source = f"{PrivacyRequestTopLevelFields.privacy_request.value}.source"
|
|
66
|
+
submitted_by = f"{PrivacyRequestTopLevelFields.privacy_request.value}.submitted_by"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class PolicyFields(Enum):
|
|
70
|
+
"""Fields for policy."""
|
|
71
|
+
|
|
72
|
+
id = "privacy_request.policy.id"
|
|
73
|
+
name = f"{PrivacyRequestTopLevelFields.policy.value}.name"
|
|
74
|
+
key = f"{PrivacyRequestTopLevelFields.policy.value}.key"
|
|
75
|
+
description = f"{PrivacyRequestTopLevelFields.policy.value}.description"
|
|
76
|
+
execution_timeframe = (
|
|
77
|
+
f"{PrivacyRequestTopLevelFields.policy.value}.execution_timeframe"
|
|
78
|
+
)
|
|
79
|
+
rules = f"{PrivacyRequestTopLevelFields.policy.value}.rules"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class IdentityFields(Enum):
|
|
83
|
+
"""Fields for identity."""
|
|
84
|
+
|
|
85
|
+
email = f"{PrivacyRequestTopLevelFields.identity.value}.email"
|
|
86
|
+
phone_number = f"{PrivacyRequestTopLevelFields.identity.value}.phone_number"
|
|
87
|
+
external_id = f"{PrivacyRequestTopLevelFields.identity.value}.external_id"
|
|
88
|
+
fides_user_device_id = (
|
|
89
|
+
f"{PrivacyRequestTopLevelFields.identity.value}.fides_user_device_id"
|
|
90
|
+
)
|
|
91
|
+
ljt_readerID = f"{PrivacyRequestTopLevelFields.identity.value}.ljt_readerID"
|
|
92
|
+
ga_client_id = f"{PrivacyRequestTopLevelFields.identity.value}.ga_client_id"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class ConditionalDependencyFieldType(Enum):
|
|
96
|
+
"""Type of the field for conditional dependencies."""
|
|
97
|
+
|
|
98
|
+
string = "string"
|
|
99
|
+
boolean = "boolean"
|
|
100
|
+
array = "array"
|
|
101
|
+
integer = "integer"
|
|
102
|
+
float = "float"
|
|
103
|
+
date = "date"
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class CustomFieldPathPrefix(Enum):
|
|
107
|
+
"""Valid path prefixes for custom fields in privacy request conditional dependencies.
|
|
108
|
+
|
|
109
|
+
Custom privacy request fields are dynamically created based on privacy center
|
|
110
|
+
configuration and are stored on the privacy request itself (not the policy).
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
custom_privacy_request_fields = "privacy_request.custom_privacy_request_fields"
|
|
114
|
+
|
|
115
|
+
@classmethod
|
|
116
|
+
def is_valid_custom_field_path(cls, field_path: str) -> bool:
|
|
117
|
+
"""Check if a field path is a valid custom field path.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
field_path: The field path to validate
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
True if the path starts with a valid custom field prefix, False otherwise
|
|
124
|
+
"""
|
|
125
|
+
return any(field_path.startswith(prefix.value + ".") for prefix in cls)
|
|
126
|
+
|
|
127
|
+
@classmethod
|
|
128
|
+
def get_custom_field_name(cls, field_path: str) -> Optional[str]:
|
|
129
|
+
"""Extract the custom field name from a valid custom field path.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
field_path: The field path to extract the field name from
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
The custom field name if the path is valid, None otherwise
|
|
136
|
+
"""
|
|
137
|
+
for prefix in cls:
|
|
138
|
+
if field_path.startswith(prefix.value + "."):
|
|
139
|
+
return field_path[len(prefix.value) + 1 :]
|
|
140
|
+
return None
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
# Union type for all valid field paths
|
|
144
|
+
# Pydantic will validate against enum values for standard fields
|
|
145
|
+
# Custom field paths (dynamically created, validated at runtime) follow the pattern:
|
|
146
|
+
# privacy_request.custom_privacy_request_fields.{field_name}
|
|
147
|
+
ConditionalDependencyFieldPath = Union[
|
|
148
|
+
PrivacyRequestFields,
|
|
149
|
+
PolicyFields,
|
|
150
|
+
IdentityFields,
|
|
151
|
+
PrivacyRequestConvenienceFields,
|
|
152
|
+
str, # Custom field paths (must match prefix pattern, validated below)
|
|
153
|
+
]
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class ConditionalDependencyFieldInfo(BaseModel):
|
|
157
|
+
"""Information about a field available for conditional dependencies."""
|
|
158
|
+
|
|
159
|
+
field_path: ConditionalDependencyFieldPath = Field(
|
|
160
|
+
...,
|
|
161
|
+
description="Path to the field in the PrivacyRequest. Must be one of the standard field paths or a valid custom field path.",
|
|
162
|
+
)
|
|
163
|
+
field_type: ConditionalDependencyFieldType = Field(
|
|
164
|
+
..., description="Type of the field from ConditionalDependencyFieldType"
|
|
165
|
+
)
|
|
166
|
+
description: Optional[str] = Field(None, description="Description of the field")
|
|
167
|
+
is_convenience_field: bool = Field(
|
|
168
|
+
False,
|
|
169
|
+
description="Whether this is a convenience field (derived from other fields)",
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
@field_validator("field_path")
|
|
173
|
+
@classmethod
|
|
174
|
+
def validate_field_path(cls, value: Union[Enum, str]) -> Union[Enum, str]:
|
|
175
|
+
"""Validate that field_path is either an enum value or a valid custom field path.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
value: The field path to validate (can be an enum member or string)
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
The validated field path
|
|
182
|
+
|
|
183
|
+
Raises:
|
|
184
|
+
ValueError: If the field path is not valid
|
|
185
|
+
"""
|
|
186
|
+
# If it's already an enum member, it's valid
|
|
187
|
+
if isinstance(value, Enum):
|
|
188
|
+
return value
|
|
189
|
+
|
|
190
|
+
# If it's a string, check if it matches an enum value or is a valid custom field path
|
|
191
|
+
if isinstance(value, str):
|
|
192
|
+
# Check if it matches any enum value
|
|
193
|
+
all_enum_values = (
|
|
194
|
+
{field.value for field in PrivacyRequestFields}
|
|
195
|
+
| {field.value for field in PolicyFields}
|
|
196
|
+
| {field.value for field in IdentityFields}
|
|
197
|
+
| {field.value for field in PrivacyRequestConvenienceFields}
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
if value in all_enum_values:
|
|
201
|
+
return value
|
|
202
|
+
|
|
203
|
+
# If it doesn't match an enum value, it must be a valid custom field path
|
|
204
|
+
if not CustomFieldPathPrefix.is_valid_custom_field_path(value):
|
|
205
|
+
raise ValueError(
|
|
206
|
+
f"Invalid field_path '{value}'. Must be one of the standard field paths "
|
|
207
|
+
f"or a valid custom field path starting with one of: "
|
|
208
|
+
f"{', '.join(prefix.value for prefix in CustomFieldPathPrefix)}"
|
|
209
|
+
)
|
|
210
|
+
return value
|
|
211
|
+
|
|
212
|
+
return value
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Any
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# pylint: disable=too-many-return-statements
|
|
9
|
+
def transform_value_for_evaluation(value: Any) -> Any:
|
|
10
|
+
"""
|
|
11
|
+
Transforms a value to its evaluation-ready form.
|
|
12
|
+
|
|
13
|
+
Handles various data types defensively to ensure compatibility with
|
|
14
|
+
the operators defined in task.conditional_dependencies.operators.py
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
value: The value to transform
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
The transformed value compatible with evaluation operators
|
|
21
|
+
"""
|
|
22
|
+
if value is None:
|
|
23
|
+
return None
|
|
24
|
+
|
|
25
|
+
# Handle Pydantic models first (before checking for other attributes)
|
|
26
|
+
if isinstance(value, BaseModel):
|
|
27
|
+
return value.model_dump(mode="json")
|
|
28
|
+
|
|
29
|
+
# Handle enums (must come before other checks as enums might have other attributes)
|
|
30
|
+
if hasattr(value, "value") and not isinstance(value, BaseModel):
|
|
31
|
+
return value.value
|
|
32
|
+
|
|
33
|
+
# Handle date/time types
|
|
34
|
+
if isinstance(value, datetime):
|
|
35
|
+
return value.isoformat()
|
|
36
|
+
|
|
37
|
+
# Handle UUIDs
|
|
38
|
+
if isinstance(value, UUID):
|
|
39
|
+
return str(value)
|
|
40
|
+
|
|
41
|
+
# Handle bytes types - convert to strings for string operators
|
|
42
|
+
if isinstance(value, (bytes, bytearray)):
|
|
43
|
+
try:
|
|
44
|
+
return value.decode("utf-8")
|
|
45
|
+
except UnicodeDecodeError:
|
|
46
|
+
# If decode fails, use repr for a string representation
|
|
47
|
+
return repr(value)
|
|
48
|
+
|
|
49
|
+
# Handle complex numbers - convert to string as they can't be compared with < > etc
|
|
50
|
+
if isinstance(value, complex):
|
|
51
|
+
return str(value)
|
|
52
|
+
|
|
53
|
+
# Handle set/frozenset/tuple - convert to lists for list operators
|
|
54
|
+
# (operators.py list operations check isinstance(x, list))
|
|
55
|
+
if isinstance(value, (set, frozenset, tuple)):
|
|
56
|
+
return list(value)
|
|
57
|
+
|
|
58
|
+
# Return value as-is if no transformation needed
|
|
59
|
+
return value
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def extract_nested_field_value(data: Any, field_path: list[str]) -> Any:
|
|
63
|
+
"""
|
|
64
|
+
Extracts a value from a dictionary by following the path.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
data: The dictionary to extract from
|
|
68
|
+
field_path: The path to extract the value from
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
The extracted value
|
|
72
|
+
"""
|
|
73
|
+
current: Any = data
|
|
74
|
+
for part in field_path:
|
|
75
|
+
if current is None:
|
|
76
|
+
return None
|
|
77
|
+
if hasattr(current, part):
|
|
78
|
+
current = getattr(current, part)
|
|
79
|
+
elif isinstance(current, list) and part.isdigit():
|
|
80
|
+
if 0 <= int(part) < len(current):
|
|
81
|
+
current = current[int(part)]
|
|
82
|
+
else:
|
|
83
|
+
return None
|
|
84
|
+
elif isinstance(current, dict) and part in current:
|
|
85
|
+
current = current[part]
|
|
86
|
+
else:
|
|
87
|
+
# If we can't find the part, return None
|
|
88
|
+
return None
|
|
89
|
+
return current
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def set_nested_value(path: list[str], value: Any) -> dict[str, Any]:
|
|
93
|
+
"""
|
|
94
|
+
Returns a dictionary with a nested value set at the path.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
path: List of keys to traverse (e.g., ["policy", "key"])
|
|
98
|
+
value: The value to set at the end of the path
|
|
99
|
+
"""
|
|
100
|
+
result: dict[str, Any] = {}
|
|
101
|
+
final_key = path[-1]
|
|
102
|
+
current = result
|
|
103
|
+
|
|
104
|
+
for key in path[:-1]:
|
|
105
|
+
if key not in current:
|
|
106
|
+
current[key] = {}
|
|
107
|
+
current = current[key]
|
|
108
|
+
|
|
109
|
+
# Set the final value
|
|
110
|
+
current[final_key] = value
|
|
111
|
+
return result
|