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
|
@@ -8,7 +8,12 @@ from fides.api.api.v1.endpoints import API_PREFIX
|
|
|
8
8
|
from fides.api.db.database import configure_db, migrate_db, reset_db
|
|
9
9
|
from fides.api.oauth.utils import verify_oauth_client_prod
|
|
10
10
|
from fides.api.util.api_router import APIRouter
|
|
11
|
+
from fides.api.util.memory_watchdog import (
|
|
12
|
+
_capture_heap_dump,
|
|
13
|
+
get_memory_watchdog_enabled,
|
|
14
|
+
)
|
|
11
15
|
from fides.common.api import scope_registry
|
|
16
|
+
from fides.common.api.scope_registry import HEAP_DUMP_EXEC
|
|
12
17
|
from fides.config import CONFIG
|
|
13
18
|
|
|
14
19
|
ADMIN_ROUTER = APIRouter(prefix=API_PREFIX, tags=["Admin"])
|
|
@@ -82,3 +87,37 @@ def db_action(action: DBActions, revision: Optional[str] = "head") -> Dict:
|
|
|
82
87
|
"message": f"Fides database action performed successfully: {action_text}"
|
|
83
88
|
}
|
|
84
89
|
}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@ADMIN_ROUTER.post(
|
|
93
|
+
"/admin/heap-dump",
|
|
94
|
+
tags=["Admin"],
|
|
95
|
+
dependencies=[Security(verify_oauth_client_prod, scopes=[HEAP_DUMP_EXEC])],
|
|
96
|
+
status_code=status.HTTP_200_OK,
|
|
97
|
+
)
|
|
98
|
+
def trigger_heap_dump() -> Dict:
|
|
99
|
+
"""
|
|
100
|
+
Trigger a heap dump for memory diagnostics.
|
|
101
|
+
|
|
102
|
+
Captures and logs detailed memory profiling information including:
|
|
103
|
+
- Process memory stats (RSS, VMS)
|
|
104
|
+
- Top object type counts
|
|
105
|
+
- Garbage collector stats
|
|
106
|
+
- Uncollectable objects (memory leaks)
|
|
107
|
+
|
|
108
|
+
The full heap dump report is logged to error logs.
|
|
109
|
+
"""
|
|
110
|
+
if not get_memory_watchdog_enabled():
|
|
111
|
+
raise HTTPException(
|
|
112
|
+
status_code=status.HTTP_405_METHOD_NOT_ALLOWED,
|
|
113
|
+
detail="Heap dump functionality is not enabled. Set memory_watchdog_enabled to true in application configuration.",
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
logger.warning("Manual heap dump triggered via API")
|
|
117
|
+
_capture_heap_dump()
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
"data": {
|
|
121
|
+
"message": "Heap dump captured successfully. Check server logs for detailed report."
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
from io import BytesIO
|
|
2
|
+
from typing import List
|
|
3
|
+
from zipfile import BadZipFile, ZipFile
|
|
4
|
+
|
|
5
|
+
from fastapi import Body, Depends, HTTPException
|
|
6
|
+
from fastapi.params import Security
|
|
7
|
+
from fastapi.responses import JSONResponse, Response
|
|
8
|
+
from loguru import logger
|
|
9
|
+
from sqlalchemy.orm import Session
|
|
10
|
+
from starlette.status import HTTP_404_NOT_FOUND
|
|
11
|
+
|
|
12
|
+
from fides.api.api import deps
|
|
13
|
+
from fides.api.oauth.utils import verify_oauth_client
|
|
14
|
+
from fides.api.schemas.saas.connector_template import ConnectorTemplateListResponse
|
|
15
|
+
from fides.api.service.connectors.saas.connector_registry_service import (
|
|
16
|
+
ConnectorRegistry,
|
|
17
|
+
CustomConnectorTemplateLoader,
|
|
18
|
+
)
|
|
19
|
+
from fides.api.util.api_router import APIRouter
|
|
20
|
+
from fides.common.api.scope_registry import (
|
|
21
|
+
CONNECTOR_TEMPLATE_READ,
|
|
22
|
+
CONNECTOR_TEMPLATE_REGISTER,
|
|
23
|
+
)
|
|
24
|
+
from fides.common.api.v1.urn_registry import (
|
|
25
|
+
CONNECTOR_TEMPLATES,
|
|
26
|
+
CONNECTOR_TEMPLATES_CONFIG,
|
|
27
|
+
CONNECTOR_TEMPLATES_DATASET,
|
|
28
|
+
CONNECTOR_TEMPLATES_REGISTER,
|
|
29
|
+
REGISTER_CONNECTOR_TEMPLATE,
|
|
30
|
+
V1_URL_PREFIX,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
router = APIRouter(tags=["Connector Templates"], prefix=V1_URL_PREFIX)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@router.get(
|
|
37
|
+
CONNECTOR_TEMPLATES,
|
|
38
|
+
dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_READ])],
|
|
39
|
+
response_model=List[ConnectorTemplateListResponse],
|
|
40
|
+
)
|
|
41
|
+
def get_all_connector_templates() -> List[ConnectorTemplateListResponse]:
|
|
42
|
+
"""
|
|
43
|
+
Returns a list of all available connector templates with summary information.
|
|
44
|
+
|
|
45
|
+
Each template includes:
|
|
46
|
+
- **type**: The unique identifier for the connector (used in other endpoints)
|
|
47
|
+
- **name**: Human-readable name of the connector
|
|
48
|
+
- **supported_actions**: List of actions this connector supports (e.g., access, erasure)
|
|
49
|
+
- **category**: Optional category classification for the connector
|
|
50
|
+
- **custom**: Whether this is a custom connector (true) or built-in (false)
|
|
51
|
+
"""
|
|
52
|
+
logger.info("Retrieving all connector templates")
|
|
53
|
+
return ConnectorRegistry.get_all_connector_templates_summary()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@router.post(
|
|
57
|
+
CONNECTOR_TEMPLATES_REGISTER,
|
|
58
|
+
dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_REGISTER])],
|
|
59
|
+
)
|
|
60
|
+
def register_connector_template(
|
|
61
|
+
file: bytes = Body(..., media_type="application/zip"),
|
|
62
|
+
db: Session = Depends(deps.get_db),
|
|
63
|
+
) -> JSONResponse:
|
|
64
|
+
"""
|
|
65
|
+
Registers a custom connector template from a zip file uploaded by the user.
|
|
66
|
+
|
|
67
|
+
The endpoint performs the following steps:
|
|
68
|
+
1. Validates the uploaded file is a proper zip file.
|
|
69
|
+
2. Uses the CustomConnectorTemplateLoader to validate, register, and save the template to the database.
|
|
70
|
+
|
|
71
|
+
If the uploaded file is not a valid zip file or there are any validation errors
|
|
72
|
+
when creating the ConnectorTemplates an HTTP 400 status code with error details is returned.
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
with ZipFile(BytesIO(file), "r") as zip_file:
|
|
76
|
+
CustomConnectorTemplateLoader.save_template(db=db, zip_file=zip_file)
|
|
77
|
+
except BadZipFile:
|
|
78
|
+
raise HTTPException(status_code=400, detail="Invalid zip file")
|
|
79
|
+
except Exception as exc:
|
|
80
|
+
logger.exception("Error loading connector template from zip file.")
|
|
81
|
+
raise HTTPException(status_code=400, detail=str(exc))
|
|
82
|
+
|
|
83
|
+
return JSONResponse(
|
|
84
|
+
content={"message": "Connector template successfully registered."}
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@router.post(
|
|
89
|
+
REGISTER_CONNECTOR_TEMPLATE,
|
|
90
|
+
dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_REGISTER])],
|
|
91
|
+
deprecated=True,
|
|
92
|
+
)
|
|
93
|
+
def register_custom_connector_template_deprecated(
|
|
94
|
+
file: bytes = Body(..., media_type="application/zip"),
|
|
95
|
+
db: Session = Depends(deps.get_db),
|
|
96
|
+
) -> JSONResponse:
|
|
97
|
+
"""
|
|
98
|
+
**DEPRECATED**: Use `POST /connector-templates/register` instead.
|
|
99
|
+
|
|
100
|
+
Registers a custom connector template from a zip file uploaded by the user.
|
|
101
|
+
This endpoint is maintained for backward compatibility only.
|
|
102
|
+
"""
|
|
103
|
+
return register_connector_template(file=file, db=db)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@router.get(
|
|
107
|
+
CONNECTOR_TEMPLATES_CONFIG,
|
|
108
|
+
dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_READ])],
|
|
109
|
+
)
|
|
110
|
+
def get_connector_template_config(
|
|
111
|
+
connector_template_type: str,
|
|
112
|
+
) -> Response:
|
|
113
|
+
"""
|
|
114
|
+
Retrieves the SaaS config YAML for a connector template by its type.
|
|
115
|
+
|
|
116
|
+
The `connector_template_type` parameter comes from the `type` field
|
|
117
|
+
returned by the `GET /connector-templates` endpoint.
|
|
118
|
+
|
|
119
|
+
Returns the raw YAML configuration that can be used to understand
|
|
120
|
+
or customize the connector template.
|
|
121
|
+
"""
|
|
122
|
+
logger.info("Finding connector template with type '{}'", connector_template_type)
|
|
123
|
+
template = ConnectorRegistry.get_connector_template(connector_template_type)
|
|
124
|
+
|
|
125
|
+
if not template:
|
|
126
|
+
raise HTTPException(
|
|
127
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
128
|
+
detail=f"No connector template found with type '{connector_template_type}'",
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
return Response(
|
|
132
|
+
content=template.config,
|
|
133
|
+
media_type="text/yaml",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@router.get(
|
|
138
|
+
CONNECTOR_TEMPLATES_DATASET,
|
|
139
|
+
dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_READ])],
|
|
140
|
+
)
|
|
141
|
+
def get_connector_template_dataset(
|
|
142
|
+
connector_template_type: str,
|
|
143
|
+
) -> Response:
|
|
144
|
+
"""
|
|
145
|
+
Retrieves the dataset YAML for a connector template by its type.
|
|
146
|
+
|
|
147
|
+
The `connector_template_type` parameter comes from the `type` field
|
|
148
|
+
returned by the `GET /connector-templates` endpoint.
|
|
149
|
+
|
|
150
|
+
Returns the raw dataset YAML configuration that defines the data structure
|
|
151
|
+
for the connector template.
|
|
152
|
+
"""
|
|
153
|
+
logger.info(
|
|
154
|
+
"Finding connector template dataset with type '{}'", connector_template_type
|
|
155
|
+
)
|
|
156
|
+
template = ConnectorRegistry.get_connector_template(connector_template_type)
|
|
157
|
+
|
|
158
|
+
if not template:
|
|
159
|
+
raise HTTPException(
|
|
160
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
161
|
+
detail=f"No connector template found with type '{connector_template_type}'",
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
return Response(
|
|
165
|
+
content=template.dataset,
|
|
166
|
+
media_type="text/yaml",
|
|
167
|
+
)
|
|
@@ -370,10 +370,10 @@ async def create_data_use(
|
|
|
370
370
|
return taxonomy_service.create_or_update_element(
|
|
371
371
|
"data_use", data_use.model_dump()
|
|
372
372
|
)
|
|
373
|
-
except KeyOrNameAlreadyExists:
|
|
373
|
+
except KeyOrNameAlreadyExists as e:
|
|
374
374
|
raise HTTPException(
|
|
375
375
|
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
376
|
-
detail=
|
|
376
|
+
detail=str(e),
|
|
377
377
|
)
|
|
378
378
|
except (ValidationError, PydanticValidationError) as e:
|
|
379
379
|
raise HTTPException(
|
|
@@ -401,10 +401,10 @@ async def create_data_category(
|
|
|
401
401
|
return taxonomy_service.create_or_update_element(
|
|
402
402
|
"data_category", data_category.model_dump()
|
|
403
403
|
)
|
|
404
|
-
except KeyOrNameAlreadyExists:
|
|
404
|
+
except KeyOrNameAlreadyExists as e:
|
|
405
405
|
raise HTTPException(
|
|
406
406
|
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
407
|
-
detail=
|
|
407
|
+
detail=str(e),
|
|
408
408
|
)
|
|
409
409
|
except (ValidationError, PydanticValidationError) as e:
|
|
410
410
|
raise HTTPException(
|
|
@@ -432,10 +432,10 @@ async def create_data_subject(
|
|
|
432
432
|
return taxonomy_service.create_or_update_element(
|
|
433
433
|
"data_subject", data_subject.model_dump()
|
|
434
434
|
)
|
|
435
|
-
except KeyOrNameAlreadyExists:
|
|
435
|
+
except KeyOrNameAlreadyExists as e:
|
|
436
436
|
raise HTTPException(
|
|
437
437
|
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
438
|
-
detail=
|
|
438
|
+
detail=str(e),
|
|
439
439
|
)
|
|
440
440
|
except (ValidationError, PydanticValidationError) as e:
|
|
441
441
|
raise HTTPException(
|
|
@@ -90,7 +90,7 @@ def get_pre_approval_webhook_detail(
|
|
|
90
90
|
],
|
|
91
91
|
response_model=List[schemas.PreApprovalWebhookResponse],
|
|
92
92
|
)
|
|
93
|
-
def
|
|
93
|
+
def create_or_update_pre_approval_webhooks(
|
|
94
94
|
*,
|
|
95
95
|
db: Session = Depends(deps.get_db),
|
|
96
96
|
webhooks: Annotated[List[schemas.PreApprovalWebhookCreate], Field(max_length=50)], # type: ignore
|
|
@@ -148,7 +148,7 @@ def create_or_update_pre_execution_webhooks(
|
|
|
148
148
|
webhooks_to_remove.delete()
|
|
149
149
|
|
|
150
150
|
logger.info(
|
|
151
|
-
"Creating/updating Policy Pre-
|
|
151
|
+
"Creating/updating Policy Pre-Approval Webhooks: {}", staged_webhook_keys
|
|
152
152
|
)
|
|
153
153
|
# Committing to database now, as a last step, once we've verified that all the webhooks
|
|
154
154
|
# in the request are free of issues.
|
|
@@ -164,7 +164,7 @@ def create_or_update_pre_execution_webhooks(
|
|
|
164
164
|
],
|
|
165
165
|
response_model=schemas.PreApprovalWebhookResponse,
|
|
166
166
|
)
|
|
167
|
-
def
|
|
167
|
+
def update_pre_approval_webhook(
|
|
168
168
|
*,
|
|
169
169
|
db: Session = Depends(deps.get_db),
|
|
170
170
|
webhook_key: FidesKey,
|
|
@@ -193,7 +193,7 @@ def update_pre_execution_webhook(
|
|
|
193
193
|
detail=exc.args[0],
|
|
194
194
|
)
|
|
195
195
|
|
|
196
|
-
# Pre
|
|
196
|
+
# Pre Approval Webhooks are not committed by default, so we commit at the end.
|
|
197
197
|
db.commit()
|
|
198
198
|
return schemas.PreApprovalWebhookResponse(
|
|
199
199
|
connection_config=loaded_webhook.connection_config,
|
|
@@ -207,7 +207,7 @@ def update_pre_execution_webhook(
|
|
|
207
207
|
status_code=HTTP_200_OK,
|
|
208
208
|
dependencies=[Security(verify_oauth_client, scopes=[scopes.WEBHOOK_DELETE])],
|
|
209
209
|
)
|
|
210
|
-
def
|
|
210
|
+
def delete_pre_approval_webhook(
|
|
211
211
|
*,
|
|
212
212
|
db: Session = Depends(deps.get_db),
|
|
213
213
|
webhook_key: FidesKey,
|
|
@@ -29,7 +29,7 @@ from loguru import logger
|
|
|
29
29
|
from pydantic import Field
|
|
30
30
|
from pydantic import ValidationError as PydanticValidationError
|
|
31
31
|
from sqlalchemy import cast, column, null, or_, select
|
|
32
|
-
from sqlalchemy.orm import Query, Session
|
|
32
|
+
from sqlalchemy.orm import Query, Session, selectinload
|
|
33
33
|
from sqlalchemy.sql.expression import nullslast
|
|
34
34
|
from starlette.responses import StreamingResponse
|
|
35
35
|
from starlette.status import (
|
|
@@ -88,9 +88,11 @@ from fides.api.schemas.dataset import CollectionAddressResponse, DryRunDatasetRe
|
|
|
88
88
|
from fides.api.schemas.external_https import PrivacyRequestResumeFormat
|
|
89
89
|
from fides.api.schemas.policy import ActionType, CurrentStep
|
|
90
90
|
from fides.api.schemas.privacy_request import (
|
|
91
|
+
BULK_PRIVACY_REQUEST_BATCH_SIZE,
|
|
91
92
|
BulkPostPrivacyRequests,
|
|
92
93
|
BulkReviewResponse,
|
|
93
94
|
BulkSoftDeletePrivacyRequests,
|
|
95
|
+
CancelPrivacyRequests,
|
|
94
96
|
CheckpointActionRequired,
|
|
95
97
|
DenyPrivacyRequests,
|
|
96
98
|
ExecutionLogDetailResponse,
|
|
@@ -147,6 +149,7 @@ from fides.common.api.v1.urn_registry import (
|
|
|
147
149
|
PRIVACY_REQUEST_BULK_FINALIZE,
|
|
148
150
|
PRIVACY_REQUEST_BULK_RETRY,
|
|
149
151
|
PRIVACY_REQUEST_BULK_SOFT_DELETE,
|
|
152
|
+
PRIVACY_REQUEST_CANCEL,
|
|
150
153
|
PRIVACY_REQUEST_DENY,
|
|
151
154
|
PRIVACY_REQUEST_FILTERED_RESULTS,
|
|
152
155
|
PRIVACY_REQUEST_FINALIZE,
|
|
@@ -223,7 +226,9 @@ def create_privacy_request(
|
|
|
223
226
|
privacy_request_service: PrivacyRequestService = Depends(
|
|
224
227
|
get_privacy_request_service
|
|
225
228
|
),
|
|
226
|
-
data: Annotated[
|
|
229
|
+
data: Annotated[
|
|
230
|
+
List[PrivacyRequestCreate], Field(max_length=BULK_PRIVACY_REQUEST_BATCH_SIZE)
|
|
231
|
+
], # type: ignore
|
|
227
232
|
) -> BulkPostPrivacyRequests:
|
|
228
233
|
"""
|
|
229
234
|
Given a list of privacy request data elements, create corresponding PrivacyRequest objects
|
|
@@ -249,7 +254,9 @@ def create_privacy_request_authenticated(
|
|
|
249
254
|
verify_oauth_client,
|
|
250
255
|
scopes=[PRIVACY_REQUEST_CREATE],
|
|
251
256
|
),
|
|
252
|
-
data: Annotated[
|
|
257
|
+
data: Annotated[
|
|
258
|
+
List[PrivacyRequestCreate], Field(max_length=BULK_PRIVACY_REQUEST_BATCH_SIZE)
|
|
259
|
+
], # type: ignore
|
|
253
260
|
) -> BulkPostPrivacyRequests:
|
|
254
261
|
"""
|
|
255
262
|
Given a list of privacy request data elements, create corresponding PrivacyRequest objects
|
|
@@ -270,7 +277,10 @@ def privacy_request_csv_download(
|
|
|
270
277
|
f = io.StringIO()
|
|
271
278
|
csv_file = csv.writer(f)
|
|
272
279
|
|
|
273
|
-
|
|
280
|
+
# Execute query once and convert to list to avoid multiple iterations
|
|
281
|
+
privacy_requests: List[PrivacyRequest] = privacy_request_query.all()
|
|
282
|
+
privacy_request_ids: List[str] = [r.id for r in privacy_requests]
|
|
283
|
+
|
|
274
284
|
denial_audit_log_query: Query = db.query(AuditLog).filter(
|
|
275
285
|
AuditLog.action == AuditLogAction.denied,
|
|
276
286
|
AuditLog.privacy_request_id.in_(privacy_request_ids),
|
|
@@ -279,7 +289,7 @@ def privacy_request_csv_download(
|
|
|
279
289
|
r.privacy_request_id: r.message for r in denial_audit_log_query
|
|
280
290
|
}
|
|
281
291
|
|
|
282
|
-
identity_columns, custom_field_columns = get_variable_columns(
|
|
292
|
+
identity_columns, custom_field_columns = get_variable_columns(privacy_requests)
|
|
283
293
|
|
|
284
294
|
csv_file.writerow(
|
|
285
295
|
[
|
|
@@ -299,7 +309,7 @@ def privacy_request_csv_download(
|
|
|
299
309
|
)
|
|
300
310
|
|
|
301
311
|
pr: PrivacyRequest
|
|
302
|
-
for pr in
|
|
312
|
+
for pr in privacy_requests:
|
|
303
313
|
denial_reason = (
|
|
304
314
|
denial_audit_logs[pr.id]
|
|
305
315
|
if pr.status == PrivacyRequestStatus.denied and pr.id in denial_audit_logs
|
|
@@ -344,12 +354,12 @@ def privacy_request_csv_download(
|
|
|
344
354
|
|
|
345
355
|
|
|
346
356
|
def get_variable_columns(
|
|
347
|
-
|
|
357
|
+
privacy_requests: List[PrivacyRequest],
|
|
348
358
|
) -> tuple[List[str], Dict[str, str]]:
|
|
349
359
|
identity_columns: Set[str] = set()
|
|
350
360
|
custom_field_columns: Dict[str, str] = {}
|
|
351
361
|
|
|
352
|
-
for pr in
|
|
362
|
+
for pr in privacy_requests:
|
|
353
363
|
identity_columns.update(
|
|
354
364
|
extract_identity_column_names(pr.get_persisted_identity().model_dump())
|
|
355
365
|
)
|
|
@@ -486,7 +496,7 @@ def _filter_privacy_request_queryset(
|
|
|
486
496
|
errored_gt: Optional[datetime] = None,
|
|
487
497
|
external_id: Optional[str] = None,
|
|
488
498
|
location: Optional[str] = None,
|
|
489
|
-
action_type: Optional[ActionType] = None,
|
|
499
|
+
action_type: Optional[Union[ActionType, List[ActionType]]] = None,
|
|
490
500
|
include_consent_webhook_requests: Optional[bool] = False,
|
|
491
501
|
include_deleted_requests: Optional[bool] = False,
|
|
492
502
|
) -> Query:
|
|
@@ -676,9 +686,11 @@ def _filter_privacy_request_queryset(
|
|
|
676
686
|
PrivacyRequest.finished_processing_at > errored_gt,
|
|
677
687
|
)
|
|
678
688
|
if action_type:
|
|
689
|
+
if isinstance(action_type, ActionType):
|
|
690
|
+
action_type = [action_type]
|
|
679
691
|
policy_ids_for_action_type = (
|
|
680
692
|
db.query(Rule)
|
|
681
|
-
.filter(Rule.action_type
|
|
693
|
+
.filter(Rule.action_type.in_(action_type))
|
|
682
694
|
.with_entities(Rule.policy_id)
|
|
683
695
|
.distinct()
|
|
684
696
|
)
|
|
@@ -792,7 +804,7 @@ def _shared_privacy_request_search(
|
|
|
792
804
|
errored_gt: Optional[datetime] = None,
|
|
793
805
|
external_id: Optional[str] = None,
|
|
794
806
|
location: Optional[str] = None,
|
|
795
|
-
action_type: Optional[ActionType] = None,
|
|
807
|
+
action_type: Optional[Union[ActionType, List[ActionType]]] = None,
|
|
796
808
|
verbose: Optional[bool] = False,
|
|
797
809
|
include_identities: Optional[bool] = False,
|
|
798
810
|
include_custom_privacy_request_fields: Optional[bool] = False,
|
|
@@ -811,7 +823,8 @@ def _shared_privacy_request_search(
|
|
|
811
823
|
|
|
812
824
|
logger.debug("Finding all request statuses with pagination params {}", params)
|
|
813
825
|
|
|
814
|
-
|
|
826
|
+
# Use query_without_large_columns to prevent OOM errors when loading many privacy requests
|
|
827
|
+
query = PrivacyRequest.query_without_large_columns(db)
|
|
815
828
|
query = _filter_privacy_request_queryset(
|
|
816
829
|
db,
|
|
817
830
|
query,
|
|
@@ -843,10 +856,29 @@ def _shared_privacy_request_search(
|
|
|
843
856
|
|
|
844
857
|
if download_csv:
|
|
845
858
|
_validate_result_size(query)
|
|
859
|
+
# Eager load relationships needed for CSV export to avoid N+1 queries
|
|
860
|
+
query = query.options(
|
|
861
|
+
selectinload(PrivacyRequest.provided_identities), # type: ignore[attr-defined]
|
|
862
|
+
selectinload(PrivacyRequest.custom_fields), # type: ignore[attr-defined]
|
|
863
|
+
selectinload(PrivacyRequest.policy).selectinload(Policy.rules), # type: ignore[attr-defined]
|
|
864
|
+
)
|
|
846
865
|
# Returning here if download_csv param was specified
|
|
847
866
|
logger.info("Downloading privacy requests as csv")
|
|
848
867
|
return privacy_request_csv_download(db, query)
|
|
849
868
|
|
|
869
|
+
# Eager load relationships for regular list view to avoid N+1 queries
|
|
870
|
+
if include_identities or include_custom_privacy_request_fields:
|
|
871
|
+
eager_load_options = []
|
|
872
|
+
if include_identities:
|
|
873
|
+
eager_load_options.append(
|
|
874
|
+
selectinload(PrivacyRequest.provided_identities) # type: ignore[attr-defined]
|
|
875
|
+
)
|
|
876
|
+
if include_custom_privacy_request_fields:
|
|
877
|
+
eager_load_options.append(
|
|
878
|
+
selectinload(PrivacyRequest.custom_fields) # type: ignore[attr-defined]
|
|
879
|
+
)
|
|
880
|
+
query = query.options(*eager_load_options)
|
|
881
|
+
|
|
850
882
|
# Conditionally embed execution log details in the response.
|
|
851
883
|
if verbose:
|
|
852
884
|
logger.info("Finding execution and audit log details")
|
|
@@ -1283,15 +1315,26 @@ def validate_manual_input(
|
|
|
1283
1315
|
],
|
|
1284
1316
|
)
|
|
1285
1317
|
def bulk_restart_privacy_request_from_failure(
|
|
1286
|
-
privacy_request_ids:
|
|
1318
|
+
privacy_request_ids: Annotated[
|
|
1319
|
+
List[str], Field(max_length=BULK_PRIVACY_REQUEST_BATCH_SIZE)
|
|
1320
|
+
],
|
|
1287
1321
|
*,
|
|
1288
1322
|
db: Session = Depends(deps.get_db),
|
|
1289
1323
|
) -> BulkPostPrivacyRequests:
|
|
1290
|
-
"""Bulk restart
|
|
1324
|
+
"""Bulk restart privacy requests from failure."""
|
|
1291
1325
|
succeeded: List[PrivacyRequestResponse] = []
|
|
1292
1326
|
failed: List[Dict[str, Any]] = []
|
|
1327
|
+
|
|
1328
|
+
# Fetch all privacy requests in one query to avoid N+1
|
|
1329
|
+
privacy_requests_dict = {
|
|
1330
|
+
pr.id: pr
|
|
1331
|
+
for pr in PrivacyRequest.query_without_large_columns(db)
|
|
1332
|
+
.filter(PrivacyRequest.id.in_(privacy_request_ids))
|
|
1333
|
+
.all()
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1293
1336
|
for privacy_request_id in privacy_request_ids:
|
|
1294
|
-
privacy_request =
|
|
1337
|
+
privacy_request = privacy_requests_dict.get(privacy_request_id)
|
|
1295
1338
|
|
|
1296
1339
|
if not privacy_request:
|
|
1297
1340
|
failed.append(
|
|
@@ -1357,10 +1400,10 @@ def restart_privacy_request_from_failure(
|
|
|
1357
1400
|
)
|
|
1358
1401
|
|
|
1359
1402
|
# Automatically resubmit the request if the cache has expired
|
|
1403
|
+
|
|
1360
1404
|
if (
|
|
1361
|
-
not privacy_request.
|
|
1362
|
-
and privacy_request.status
|
|
1363
|
-
not in [PrivacyRequestStatus.complete, PrivacyRequestStatus.pending]
|
|
1405
|
+
not privacy_request.verify_cache_for_identity_data()
|
|
1406
|
+
and privacy_request.status != PrivacyRequestStatus.complete
|
|
1364
1407
|
):
|
|
1365
1408
|
logger.info(
|
|
1366
1409
|
f"Cached data for privacy request {privacy_request.id} has expired, automatically resubmitting request"
|
|
@@ -1477,10 +1520,37 @@ def deny_privacy_request(
|
|
|
1477
1520
|
)
|
|
1478
1521
|
|
|
1479
1522
|
|
|
1523
|
+
@router.patch(
|
|
1524
|
+
PRIVACY_REQUEST_CANCEL,
|
|
1525
|
+
status_code=HTTP_200_OK,
|
|
1526
|
+
response_model=BulkReviewResponse,
|
|
1527
|
+
)
|
|
1528
|
+
def cancel_privacy_request(
|
|
1529
|
+
*,
|
|
1530
|
+
client: ClientDetail = Security(
|
|
1531
|
+
verify_oauth_client,
|
|
1532
|
+
scopes=[PRIVACY_REQUEST_REVIEW],
|
|
1533
|
+
),
|
|
1534
|
+
privacy_request_service: PrivacyRequestService = Depends(
|
|
1535
|
+
get_privacy_request_service
|
|
1536
|
+
),
|
|
1537
|
+
privacy_requests: CancelPrivacyRequests,
|
|
1538
|
+
) -> BulkReviewResponse:
|
|
1539
|
+
"""Cancel a list of privacy requests and/or report failure"""
|
|
1540
|
+
|
|
1541
|
+
return privacy_request_service.cancel_privacy_requests(
|
|
1542
|
+
privacy_requests.request_ids, privacy_requests.reason, user_id=client.user_id
|
|
1543
|
+
)
|
|
1544
|
+
|
|
1545
|
+
|
|
1480
1546
|
def _validate_privacy_request_pending_or_error(
|
|
1481
1547
|
db: Session, privacy_request_id: str
|
|
1482
1548
|
) -> None:
|
|
1483
|
-
privacy_request =
|
|
1549
|
+
privacy_request = (
|
|
1550
|
+
PrivacyRequest.query_without_large_columns(db)
|
|
1551
|
+
.filter(PrivacyRequest.id == privacy_request_id)
|
|
1552
|
+
.first()
|
|
1553
|
+
)
|
|
1484
1554
|
if not privacy_request:
|
|
1485
1555
|
raise HTTPException(
|
|
1486
1556
|
status_code=HTTP_404_NOT_FOUND,
|
|
@@ -2184,8 +2254,18 @@ def bulk_soft_delete_privacy_requests(
|
|
|
2184
2254
|
if client.id == CONFIG.security.oauth_root_client_id:
|
|
2185
2255
|
user_id = "root"
|
|
2186
2256
|
|
|
2187
|
-
|
|
2188
|
-
|
|
2257
|
+
request_ids = privacy_requests.request_ids
|
|
2258
|
+
|
|
2259
|
+
# Fetch all privacy requests in one query to avoid N+1
|
|
2260
|
+
privacy_requests_dict = {
|
|
2261
|
+
pr.id: pr
|
|
2262
|
+
for pr in PrivacyRequest.query_without_large_columns(db)
|
|
2263
|
+
.filter(PrivacyRequest.id.in_(request_ids))
|
|
2264
|
+
.all()
|
|
2265
|
+
}
|
|
2266
|
+
|
|
2267
|
+
for privacy_request_id in request_ids:
|
|
2268
|
+
privacy_request = privacy_requests_dict.get(privacy_request_id)
|
|
2189
2269
|
|
|
2190
2270
|
if not privacy_request:
|
|
2191
2271
|
failed.append(
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
from io import BytesIO
|
|
2
1
|
from typing import Optional
|
|
3
|
-
from zipfile import BadZipFile, ZipFile
|
|
4
2
|
|
|
5
|
-
from fastapi import
|
|
3
|
+
from fastapi import Depends, HTTPException, Request
|
|
6
4
|
from fastapi.encoders import jsonable_encoder
|
|
7
5
|
from fastapi.params import Security
|
|
8
|
-
from fastapi.responses import JSONResponse
|
|
9
6
|
from fideslang.validation import FidesKey
|
|
10
7
|
from loguru import logger
|
|
11
8
|
from pydantic import ValidationError
|
|
@@ -48,15 +45,11 @@ from fides.api.service.authentication.authentication_strategy import (
|
|
|
48
45
|
from fides.api.service.authentication.authentication_strategy_oauth2_authorization_code import (
|
|
49
46
|
OAuth2AuthorizationCodeAuthenticationStrategy,
|
|
50
47
|
)
|
|
51
|
-
from fides.api.service.connectors.saas.connector_registry_service import (
|
|
52
|
-
CustomConnectorTemplateLoader,
|
|
53
|
-
)
|
|
54
48
|
from fides.api.util.api_router import APIRouter
|
|
55
49
|
from fides.api.util.connection_util import validate_secrets_error_message
|
|
56
50
|
from fides.api.util.event_audit_util import generate_connection_audit_event_details
|
|
57
51
|
from fides.common.api.scope_registry import (
|
|
58
52
|
CONNECTION_AUTHORIZE,
|
|
59
|
-
CONNECTOR_TEMPLATE_REGISTER,
|
|
60
53
|
SAAS_CONFIG_CREATE_OR_UPDATE,
|
|
61
54
|
SAAS_CONFIG_DELETE,
|
|
62
55
|
SAAS_CONFIG_READ,
|
|
@@ -64,7 +57,6 @@ from fides.common.api.scope_registry import (
|
|
|
64
57
|
)
|
|
65
58
|
from fides.common.api.v1.urn_registry import (
|
|
66
59
|
AUTHORIZE,
|
|
67
|
-
REGISTER_CONNECTOR_TEMPLATE,
|
|
68
60
|
SAAS_CONFIG,
|
|
69
61
|
SAAS_CONFIG_VALIDATE,
|
|
70
62
|
SAAS_CONNECTOR_FROM_TEMPLATE,
|
|
@@ -312,11 +304,11 @@ def authorize_connection(
|
|
|
312
304
|
response_model=SaasConnectionTemplateResponse,
|
|
313
305
|
)
|
|
314
306
|
def instantiate_connection_from_template(
|
|
315
|
-
|
|
307
|
+
connector_template_type: str,
|
|
316
308
|
template_values: SaasConnectionTemplateValues,
|
|
317
309
|
db: Session = Depends(deps.get_db),
|
|
318
310
|
) -> SaasConnectionTemplateResponse:
|
|
319
|
-
return instantiate_connection(db,
|
|
311
|
+
return instantiate_connection(db, connector_template_type, template_values)
|
|
320
312
|
|
|
321
313
|
|
|
322
314
|
def instantiate_connection(
|
|
@@ -373,36 +365,3 @@ def instantiate_connection(
|
|
|
373
365
|
return SaasConnectionTemplateResponse(
|
|
374
366
|
connection=connection_config, dataset=dataset_config.ctl_dataset
|
|
375
367
|
)
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
@router.post(
|
|
379
|
-
REGISTER_CONNECTOR_TEMPLATE,
|
|
380
|
-
dependencies=[Security(verify_oauth_client, scopes=[CONNECTOR_TEMPLATE_REGISTER])],
|
|
381
|
-
)
|
|
382
|
-
def register_custom_connector_template(
|
|
383
|
-
file: bytes = Body(..., media_type="application/zip"),
|
|
384
|
-
db: Session = Depends(deps.get_db),
|
|
385
|
-
) -> JSONResponse:
|
|
386
|
-
"""
|
|
387
|
-
Registers a custom connector template from a zip file uploaded by the user.
|
|
388
|
-
The endpoint performs the following steps:
|
|
389
|
-
|
|
390
|
-
1. Validates the uploaded file is a proper zip file.
|
|
391
|
-
2. Uses the CustomConnectorTemplateLoader to validate, register, and save the template to the database.
|
|
392
|
-
|
|
393
|
-
If the uploaded file is not a valid zip file or there are any validation errors
|
|
394
|
-
when creating the ConnectorTemplates an HTTP 400 status code with error details is returned.
|
|
395
|
-
"""
|
|
396
|
-
|
|
397
|
-
try:
|
|
398
|
-
with ZipFile(BytesIO(file), "r") as zip_file:
|
|
399
|
-
CustomConnectorTemplateLoader.save_template(db=db, zip_file=zip_file)
|
|
400
|
-
except BadZipFile:
|
|
401
|
-
raise HTTPException(status_code=400, detail="Invalid zip file")
|
|
402
|
-
except Exception as exc:
|
|
403
|
-
logger.exception("Error loading connector template from zip file.")
|
|
404
|
-
raise HTTPException(status_code=400, detail=str(exc))
|
|
405
|
-
|
|
406
|
-
return JSONResponse(
|
|
407
|
-
content={"message": "Connector template successfully registered."}
|
|
408
|
-
)
|
|
@@ -95,7 +95,11 @@ def upload_data(
|
|
|
95
95
|
"""
|
|
96
96
|
logger.info("Finding privacy request with id '{}'", request_id)
|
|
97
97
|
|
|
98
|
-
privacy_request =
|
|
98
|
+
privacy_request = (
|
|
99
|
+
PrivacyRequest.query_without_large_columns(db)
|
|
100
|
+
.filter(PrivacyRequest.id == request_id)
|
|
101
|
+
.first()
|
|
102
|
+
)
|
|
99
103
|
if not privacy_request:
|
|
100
104
|
raise HTTPException(
|
|
101
105
|
status_code=HTTP_404_NOT_FOUND,
|
|
@@ -557,7 +557,7 @@ async def get(
|
|
|
557
557
|
)
|
|
558
558
|
def instantiate_connection_from_template(
|
|
559
559
|
fides_key: str,
|
|
560
|
-
|
|
560
|
+
connector_template_type: str,
|
|
561
561
|
template_values: SaasConnectionTemplateValues,
|
|
562
562
|
db: Session = Depends(deps.get_db),
|
|
563
563
|
) -> SaasConnectionTemplateResponse:
|
|
@@ -567,4 +567,4 @@ def instantiate_connection_from_template(
|
|
|
567
567
|
"""
|
|
568
568
|
|
|
569
569
|
system = get_system(db, fides_key)
|
|
570
|
-
return instantiate_connection(db,
|
|
570
|
+
return instantiate_connection(db, connector_template_type, template_values, system)
|