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
|
@@ -9,7 +9,16 @@ from typing import Any, Dict, List, Optional, Set, Type
|
|
|
9
9
|
from fideslang.validation import FidesKey, validate_fides_key
|
|
10
10
|
from sqlalchemy import Boolean, Column
|
|
11
11
|
from sqlalchemy import Enum as EnumColumn
|
|
12
|
-
from sqlalchemy import
|
|
12
|
+
from sqlalchemy import (
|
|
13
|
+
Float,
|
|
14
|
+
ForeignKey,
|
|
15
|
+
Integer,
|
|
16
|
+
String,
|
|
17
|
+
UniqueConstraint,
|
|
18
|
+
false,
|
|
19
|
+
or_,
|
|
20
|
+
text,
|
|
21
|
+
)
|
|
13
22
|
from sqlalchemy.dialects.postgresql import ARRAY, JSONB
|
|
14
23
|
from sqlalchemy.ext.mutable import MutableList
|
|
15
24
|
from sqlalchemy.orm import RelationshipProperty, Session, relationship, selectinload
|
|
@@ -162,11 +171,18 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
162
171
|
ForeignKey("privacynotice.id", ondelete="SET NULL"),
|
|
163
172
|
nullable=True,
|
|
164
173
|
)
|
|
174
|
+
display_order = Column(
|
|
175
|
+
Integer,
|
|
176
|
+
nullable=True,
|
|
177
|
+
doc="Optional ordering for child notices within a parent. Lower values appear first.",
|
|
178
|
+
)
|
|
179
|
+
|
|
165
180
|
children: "RelationshipProperty[List[PrivacyNotice]]" = relationship(
|
|
166
181
|
"PrivacyNotice",
|
|
167
182
|
back_populates="parent",
|
|
168
183
|
cascade="all",
|
|
169
184
|
passive_deletes=True,
|
|
185
|
+
order_by=lambda: PrivacyNotice.display_order.asc().nullslast(),
|
|
170
186
|
)
|
|
171
187
|
parent: "RelationshipProperty[Optional[PrivacyNotice]]" = relationship(
|
|
172
188
|
"PrivacyNotice",
|
|
@@ -375,6 +391,26 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
375
391
|
res = [result for result in experience_regions_cursor_result]
|
|
376
392
|
return res[0]["regions"] if res else []
|
|
377
393
|
|
|
394
|
+
@staticmethod
|
|
395
|
+
def _set_child_notice_display_order(
|
|
396
|
+
child_notices: List[Dict[str, Any]],
|
|
397
|
+
existing_notices: List[PrivacyNotice],
|
|
398
|
+
) -> None:
|
|
399
|
+
"""
|
|
400
|
+
Sets display_order on child notice objects based on their position in the child_notices list.
|
|
401
|
+
|
|
402
|
+
Args:
|
|
403
|
+
child_notices: List of dictionaries containing notice IDs in the desired order
|
|
404
|
+
existing_notices: List of PrivacyNotice objects to update
|
|
405
|
+
"""
|
|
406
|
+
notice_id_to_index = {
|
|
407
|
+
child_notice["id"]: index
|
|
408
|
+
for index, child_notice in enumerate(child_notices)
|
|
409
|
+
}
|
|
410
|
+
for child_notice_obj in existing_notices:
|
|
411
|
+
if child_notice_obj.id in notice_id_to_index:
|
|
412
|
+
child_notice_obj.display_order = notice_id_to_index[child_notice_obj.id]
|
|
413
|
+
|
|
378
414
|
@classmethod
|
|
379
415
|
def fetch_and_validate_notices(
|
|
380
416
|
cls,
|
|
@@ -442,6 +478,10 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
442
478
|
|
|
443
479
|
# automatically links and unlinks at the DB level with this assignment
|
|
444
480
|
created.children = existing_notices
|
|
481
|
+
|
|
482
|
+
# Set display_order on children based on their position in the ORIGINAL child_notices list
|
|
483
|
+
cls._set_child_notice_display_order(child_notices, existing_notices)
|
|
484
|
+
|
|
445
485
|
db.commit()
|
|
446
486
|
|
|
447
487
|
data.pop(
|
|
@@ -481,6 +521,9 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
481
521
|
# automatically links and unlinks at the DB level with this assignment
|
|
482
522
|
self.children = existing_notices
|
|
483
523
|
|
|
524
|
+
# Set display_order on children based on their position in the ORIGINAL child_notices list
|
|
525
|
+
self._set_child_notice_display_order(child_notices, existing_notices)
|
|
526
|
+
|
|
484
527
|
# Performs a patch update of the base privacy notice
|
|
485
528
|
base_notice_updated: bool = update_if_modified(self, db=db, data=data)
|
|
486
529
|
|
|
@@ -680,6 +723,7 @@ def create_historical_record_for_notice_and_translation(
|
|
|
680
723
|
history_data: dict = create_historical_data_from_record(privacy_notice)
|
|
681
724
|
history_data.pop("translations", None)
|
|
682
725
|
history_data.pop("parent_id", None)
|
|
726
|
+
history_data.pop("display_order", None)
|
|
683
727
|
# The source PrivacyNotice may have cached/computed attributes (e.g., @cached_property)
|
|
684
728
|
# stored on the instance dict. These should not be included in historical payloads.
|
|
685
729
|
# For example, 'cookies' is cached on the PrivacyNotice instance when accessed.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import json
|
|
3
|
+
import uuid
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
from sqlalchemy import Boolean, Column, Text
|
|
7
|
+
from sqlalchemy.dialects.postgresql import UUID
|
|
8
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
9
|
+
from sqlalchemy.orm import Session, relationship
|
|
10
|
+
|
|
11
|
+
from fides.api.db.base_class import Base # type: ignore[attr-defined]
|
|
12
|
+
from fides.config.duplicate_detection_settings import DuplicateDetectionSettings
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from fides.api.models.privacy_request.privacy_request import PrivacyRequest
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def generate_deterministic_uuid(rule_version: str, dedup_key: str) -> uuid.UUID:
|
|
19
|
+
"""Overrides the base class method to generate a deterministic group id.
|
|
20
|
+
|
|
21
|
+
The actual rule version is a hash of the duplicate detection settings config,
|
|
22
|
+
using simple examples here for illustration:
|
|
23
|
+
- under rule "email", duplicate@example.com → group A,
|
|
24
|
+
- under rule "email|phone", duplicate@example.com|1234567890 → group B.
|
|
25
|
+
- ... and so on.
|
|
26
|
+
|
|
27
|
+
No collisions, no overlap.
|
|
28
|
+
"""
|
|
29
|
+
# Combine the rule version and the key into a stable hash
|
|
30
|
+
hash_input = f"{rule_version}:{dedup_key}".encode("utf-8")
|
|
31
|
+
return uuid.UUID(hashlib.md5(hash_input).hexdigest())
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def generate_rule_version(config: DuplicateDetectionSettings) -> str:
|
|
35
|
+
"""Generate a stable short hash for the dedup rule config."""
|
|
36
|
+
normalized = json.dumps(config.model_dump(), sort_keys=True)
|
|
37
|
+
return hashlib.sha256(normalized.encode("utf-8")).hexdigest()[:8]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class DuplicateGroup(Base):
|
|
41
|
+
"""
|
|
42
|
+
A table for storing duplicate request group information.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
@declared_attr
|
|
46
|
+
def __tablename__(self) -> str:
|
|
47
|
+
return "duplicate_group"
|
|
48
|
+
|
|
49
|
+
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
50
|
+
rule_version = Column(Text, nullable=False)
|
|
51
|
+
# TODO: The is_active column is not used yet since we are defaulting to just email for
|
|
52
|
+
# duplicate detection. When we allow users to configure the duplicate detection settings,
|
|
53
|
+
# we will need to add a way to activate/deactivate duplicate groups.
|
|
54
|
+
# This should be done by getting the previous rule version and deactivating all groups with
|
|
55
|
+
# that rule version. New groups will be created with the new rule version.
|
|
56
|
+
is_active = Column(Boolean, default=True, nullable=False)
|
|
57
|
+
dedup_key = Column(Text, nullable=False)
|
|
58
|
+
privacy_requests = relationship(
|
|
59
|
+
"PrivacyRequest",
|
|
60
|
+
back_populates="duplicate_group",
|
|
61
|
+
lazy="dynamic",
|
|
62
|
+
primaryjoin="and_(DuplicateGroup.id == PrivacyRequest.duplicate_request_group_id)",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def create(
|
|
67
|
+
cls, db: Session, *, data: dict[str, Any], check_name: bool = False
|
|
68
|
+
) -> "DuplicateGroup":
|
|
69
|
+
"""Create a new duplicate group.
|
|
70
|
+
Override the base class method to generate a deterministic group id.
|
|
71
|
+
If the group already exists, update the is_active column to True and return the group.
|
|
72
|
+
"""
|
|
73
|
+
group_id = generate_deterministic_uuid(data["rule_version"], data["dedup_key"])
|
|
74
|
+
# If the group already exists, update the is_active column to True and return the group
|
|
75
|
+
duplicate_group = (
|
|
76
|
+
db.query(DuplicateGroup).filter(DuplicateGroup.id == group_id).one_or_none()
|
|
77
|
+
)
|
|
78
|
+
if duplicate_group:
|
|
79
|
+
duplicate_group.update(db, data={"is_active": True})
|
|
80
|
+
return duplicate_group
|
|
81
|
+
|
|
82
|
+
# If the group does not exist, create a new one
|
|
83
|
+
data["id"] = group_id
|
|
84
|
+
return super().create(db, data=data, check_name=check_name)
|
|
@@ -4,15 +4,22 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
6
|
from datetime import datetime, timedelta
|
|
7
|
-
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Union
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple, Union
|
|
8
8
|
|
|
9
9
|
from celery.result import AsyncResult
|
|
10
10
|
from loguru import logger
|
|
11
11
|
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String
|
|
12
|
-
from sqlalchemy.dialects.postgresql import JSONB
|
|
12
|
+
from sqlalchemy.dialects.postgresql import JSONB, UUID
|
|
13
13
|
from sqlalchemy.ext.declarative import declared_attr
|
|
14
14
|
from sqlalchemy.ext.mutable import MutableDict, MutableList
|
|
15
|
-
from sqlalchemy.orm import
|
|
15
|
+
from sqlalchemy.orm import (
|
|
16
|
+
Query,
|
|
17
|
+
RelationshipProperty,
|
|
18
|
+
Session,
|
|
19
|
+
backref,
|
|
20
|
+
defer,
|
|
21
|
+
relationship,
|
|
22
|
+
)
|
|
16
23
|
from sqlalchemy.orm.dynamic import AppenderQuery
|
|
17
24
|
from sqlalchemy_utils.types.encrypted.encrypted_type import (
|
|
18
25
|
AesGcmEngine,
|
|
@@ -69,6 +76,7 @@ from fides.api.models.pre_approval_webhook import (
|
|
|
69
76
|
PreApprovalWebhook,
|
|
70
77
|
PreApprovalWebhookReply,
|
|
71
78
|
)
|
|
79
|
+
from fides.api.models.privacy_request.duplicate_group import DuplicateGroup
|
|
72
80
|
from fides.api.models.privacy_request.execution_log import (
|
|
73
81
|
COMPLETED_EXECUTION_LOG_STATUSES,
|
|
74
82
|
EXITED_EXECUTION_LOG_STATUSES,
|
|
@@ -225,7 +233,16 @@ class PrivacyRequest(
|
|
|
225
233
|
location = Column(String, nullable=True)
|
|
226
234
|
|
|
227
235
|
# Duplicate detection - group ID to link duplicates together
|
|
228
|
-
duplicate_request_group_id = Column(
|
|
236
|
+
duplicate_request_group_id = Column(
|
|
237
|
+
UUID(as_uuid=True),
|
|
238
|
+
ForeignKey("duplicate_group.id"),
|
|
239
|
+
nullable=True,
|
|
240
|
+
)
|
|
241
|
+
duplicate_group = relationship(
|
|
242
|
+
DuplicateGroup,
|
|
243
|
+
back_populates="privacy_requests",
|
|
244
|
+
uselist=False,
|
|
245
|
+
)
|
|
229
246
|
|
|
230
247
|
# A PrivacyRequest can be soft deleted, so we store when it was deleted
|
|
231
248
|
deleted_at = Column(DateTime(timezone=True), nullable=True)
|
|
@@ -364,6 +381,29 @@ class PrivacyRequest(
|
|
|
364
381
|
|
|
365
382
|
return super().create(db=db, data=data, check_name=check_name)
|
|
366
383
|
|
|
384
|
+
@classmethod
|
|
385
|
+
def query_without_large_columns(cls, db: Session) -> Query:
|
|
386
|
+
"""
|
|
387
|
+
Returns a query for PrivacyRequest with large columns deferred to prevent OOM errors.
|
|
388
|
+
|
|
389
|
+
This excludes the large columns (_filtered_final_upload and access_result_urls)
|
|
390
|
+
which can be very large (MBs per request). Use this method for list views, bulk
|
|
391
|
+
operations, and background tasks that don't need the filtered results.
|
|
392
|
+
|
|
393
|
+
The large columns can still be accessed later if needed by accessing them directly
|
|
394
|
+
on individual PrivacyRequest instances.
|
|
395
|
+
|
|
396
|
+
Args:
|
|
397
|
+
db: Database session
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
Query with large columns deferred
|
|
401
|
+
"""
|
|
402
|
+
return db.query(cls).options(
|
|
403
|
+
defer(cls._filtered_final_upload),
|
|
404
|
+
defer(cls.access_result_urls),
|
|
405
|
+
)
|
|
406
|
+
|
|
367
407
|
def to_safe_dict(self) -> Dict[str, Any]:
|
|
368
408
|
"""
|
|
369
409
|
Return a dict representation of the PrivacyRequest, excluding any fields
|
|
@@ -604,7 +644,10 @@ class PrivacyRequest(
|
|
|
604
644
|
"""Verify the identification code supplied by the user
|
|
605
645
|
If verified, change the status of the request to "pending", and set the datetime the identity was verified.
|
|
606
646
|
"""
|
|
607
|
-
if not self.status
|
|
647
|
+
if not self.status in [
|
|
648
|
+
PrivacyRequestStatus.identity_unverified,
|
|
649
|
+
PrivacyRequestStatus.duplicate,
|
|
650
|
+
]:
|
|
608
651
|
raise IdentityVerificationException(
|
|
609
652
|
f"Invalid identity verification request. Privacy request '{self.id}' status = {self.status.value}." # type: ignore # pylint: disable=no-member
|
|
610
653
|
)
|
|
@@ -682,12 +725,29 @@ class PrivacyRequest(
|
|
|
682
725
|
},
|
|
683
726
|
)
|
|
684
727
|
|
|
685
|
-
def
|
|
686
|
-
"""
|
|
728
|
+
def identity_prefix_cache_and_keys(self) -> Tuple[str, FidesopsRedis, List[str]]:
|
|
729
|
+
"""Returns the prefix and cache keys for the identity data for this request"""
|
|
687
730
|
prefix = f"id-{self.id}-identity-*"
|
|
688
731
|
cache: FidesopsRedis = get_cache()
|
|
689
732
|
keys = cache.keys(prefix)
|
|
690
|
-
|
|
733
|
+
return prefix, cache, keys
|
|
734
|
+
|
|
735
|
+
def verify_cache_for_identity_data(self) -> bool:
|
|
736
|
+
"""Verifies if the identity data is cached for this request"""
|
|
737
|
+
_, _, keys = self.identity_prefix_cache_and_keys()
|
|
738
|
+
return len(keys) > 0
|
|
739
|
+
|
|
740
|
+
def get_cached_identity_data(self) -> Dict[str, Any]:
|
|
741
|
+
"""Retrieves any identity data pertaining to this request from the cache"""
|
|
742
|
+
result: Dict[str, Any] = {}
|
|
743
|
+
prefix, cache, keys = self.identity_prefix_cache_and_keys()
|
|
744
|
+
|
|
745
|
+
if not keys:
|
|
746
|
+
logger.debug(f"Cache miss for request {self.id}, falling back to DB")
|
|
747
|
+
identity = self.get_persisted_identity()
|
|
748
|
+
self.cache_identity(identity)
|
|
749
|
+
keys = cache.keys(prefix)
|
|
750
|
+
|
|
691
751
|
for key in keys:
|
|
692
752
|
value = cache.get(key)
|
|
693
753
|
if value:
|
|
@@ -705,10 +765,25 @@ class PrivacyRequest(
|
|
|
705
765
|
|
|
706
766
|
def get_cached_custom_privacy_request_fields(self) -> Dict[str, Any]:
|
|
707
767
|
"""Retrieves any custom fields pertaining to this request from the cache"""
|
|
768
|
+
result: Dict[str, Any] = {}
|
|
708
769
|
prefix = f"id-{self.id}-custom-privacy-request-field-*"
|
|
770
|
+
|
|
709
771
|
cache: FidesopsRedis = get_cache()
|
|
710
772
|
keys = cache.keys(prefix)
|
|
711
|
-
|
|
773
|
+
|
|
774
|
+
if not keys:
|
|
775
|
+
logger.debug(f"Cache miss for request {self.id}, falling back to DB")
|
|
776
|
+
custom_privacy_request_fields = (
|
|
777
|
+
self.get_persisted_custom_privacy_request_fields()
|
|
778
|
+
)
|
|
779
|
+
self.cache_custom_privacy_request_fields(
|
|
780
|
+
{
|
|
781
|
+
key: CustomPrivacyRequestFieldSchema(**value)
|
|
782
|
+
for key, value in custom_privacy_request_fields.items()
|
|
783
|
+
}
|
|
784
|
+
)
|
|
785
|
+
keys = cache.keys(prefix)
|
|
786
|
+
|
|
712
787
|
for key in keys:
|
|
713
788
|
value = cache.get(key)
|
|
714
789
|
if value:
|
|
@@ -5,7 +5,8 @@ from __future__ import annotations
|
|
|
5
5
|
from enum import Enum as EnumType
|
|
6
6
|
from typing import TYPE_CHECKING
|
|
7
7
|
|
|
8
|
-
from sqlalchemy import Column, ForeignKey, String
|
|
8
|
+
from sqlalchemy import Column, ForeignKey, Index, String
|
|
9
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
9
10
|
from sqlalchemy.ext.mutable import MutableDict
|
|
10
11
|
from sqlalchemy.orm import relationship
|
|
11
12
|
from sqlalchemy_utils.types.encrypted.encrypted_type import (
|
|
@@ -46,6 +47,26 @@ class ProvidedIdentity(HashMigrationMixin, Base): # pylint: disable=R0904
|
|
|
46
47
|
creation time.
|
|
47
48
|
"""
|
|
48
49
|
|
|
50
|
+
@declared_attr
|
|
51
|
+
def __table_args__(cls) -> tuple: # type: ignore[override]
|
|
52
|
+
"""Define table-level constructs including indexes."""
|
|
53
|
+
return (
|
|
54
|
+
# Index on foreign key for better join performance and N+1 prevention
|
|
55
|
+
# Created via migration 3ff6449c099e
|
|
56
|
+
Index(
|
|
57
|
+
"ix_providedidentity_privacy_request_id",
|
|
58
|
+
"privacy_request_id",
|
|
59
|
+
),
|
|
60
|
+
# Hash migration tracking index from HashMigrationMixin
|
|
61
|
+
Index(
|
|
62
|
+
"idx_providedidentity_unmigrated",
|
|
63
|
+
"is_hash_migrated",
|
|
64
|
+
postgresql_where=cls.is_hash_migrated.is_( # type: ignore[attr-defined] # pylint: disable=no-member
|
|
65
|
+
False
|
|
66
|
+
),
|
|
67
|
+
),
|
|
68
|
+
)
|
|
69
|
+
|
|
49
70
|
privacy_request_id = Column(
|
|
50
71
|
String,
|
|
51
72
|
ForeignKey("privacyrequest.id", ondelete="CASCADE", onupdate="CASCADE"),
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from typing import Dict
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import Column, String
|
|
4
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
5
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
6
|
+
from sqlalchemy.orm import Session
|
|
7
|
+
|
|
8
|
+
from fides.api.db.base_class import Base
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SaasTemplateDataset(Base):
|
|
12
|
+
"""
|
|
13
|
+
Stores the latest template dataset for each SaaS connection type.
|
|
14
|
+
|
|
15
|
+
This table maintains a record of the template datasets that come with
|
|
16
|
+
Fides for each SaaS connector type. It's used as a baseline for
|
|
17
|
+
detecting customer modifications to datasets.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
@declared_attr
|
|
21
|
+
def __tablename__(self) -> str:
|
|
22
|
+
return "saas_template_dataset"
|
|
23
|
+
|
|
24
|
+
connection_type = Column(String, nullable=False, unique=True, index=True)
|
|
25
|
+
dataset_json = Column(JSONB, nullable=False)
|
|
26
|
+
|
|
27
|
+
def __repr__(self) -> str:
|
|
28
|
+
return f"<SaasTemplateDataset(connection_type='{self.connection_type}')>"
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def get_or_create( # type: ignore[override]
|
|
32
|
+
cls,
|
|
33
|
+
db: Session,
|
|
34
|
+
connector_type: str,
|
|
35
|
+
dataset_json: Dict,
|
|
36
|
+
) -> tuple[bool, "SaasTemplateDataset"]:
|
|
37
|
+
"""
|
|
38
|
+
Get existing SaasTemplateDataset by connector_type or create if it doesn't exist.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
db: Database session
|
|
42
|
+
connector_type: The connection type identifier
|
|
43
|
+
dataset_json: The dataset JSON to use if creating
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
Existing or newly created SaasTemplateDataset instance
|
|
47
|
+
"""
|
|
48
|
+
created = False
|
|
49
|
+
template_dataset = cls.get_by(
|
|
50
|
+
db=db, field="connection_type", value=connector_type
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if not template_dataset:
|
|
54
|
+
template_dataset = cls.create(
|
|
55
|
+
db=db,
|
|
56
|
+
data={
|
|
57
|
+
"connection_type": connector_type,
|
|
58
|
+
"dataset_json": dataset_json,
|
|
59
|
+
},
|
|
60
|
+
)
|
|
61
|
+
created = True
|
|
62
|
+
|
|
63
|
+
return created, template_dataset
|
fides/api/models/sql_models.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# type: ignore
|
|
2
|
-
# pylint: disable=comparison-with-callable
|
|
2
|
+
# pylint: disable=comparison-with-callable, too-many-lines
|
|
3
3
|
"""
|
|
4
4
|
Contains all of the SqlAlchemy models for the Fides resources.
|
|
5
5
|
"""
|
|
@@ -15,9 +15,10 @@ from fideslang.models import DataCategory as FideslangDataCategory
|
|
|
15
15
|
from fideslang.models import Dataset as FideslangDataset
|
|
16
16
|
from fideslang.models import DatasetCollection as FideslangDatasetCollection
|
|
17
17
|
from pydantic import BaseModel
|
|
18
|
-
from sqlalchemy import BOOLEAN, JSON, Column
|
|
19
|
-
from sqlalchemy import Enum as EnumColumn
|
|
20
18
|
from sqlalchemy import (
|
|
19
|
+
BOOLEAN,
|
|
20
|
+
JSON,
|
|
21
|
+
Column,
|
|
21
22
|
ForeignKey,
|
|
22
23
|
Index,
|
|
23
24
|
Integer,
|
|
@@ -200,6 +201,54 @@ class DataCategory(Base, FidesBase):
|
|
|
200
201
|
remote_side=[fides_key],
|
|
201
202
|
)
|
|
202
203
|
|
|
204
|
+
@classmethod
|
|
205
|
+
def create(
|
|
206
|
+
cls: Type["DataCategory"],
|
|
207
|
+
db: Session,
|
|
208
|
+
*,
|
|
209
|
+
data: dict[str, Any],
|
|
210
|
+
check_name: bool = True,
|
|
211
|
+
) -> "DataCategory":
|
|
212
|
+
"""
|
|
213
|
+
Override create to skip name uniqueness check for hierarchical taxonomy.
|
|
214
|
+
|
|
215
|
+
DataCategory is hierarchical - fides_key provides sufficient uniqueness.
|
|
216
|
+
Multiple categories can share the same name as long as their keys differ.
|
|
217
|
+
"""
|
|
218
|
+
# Check if data category with same fides_key already exists
|
|
219
|
+
if "fides_key" in data and data["fides_key"]:
|
|
220
|
+
existing_by_key = (
|
|
221
|
+
db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
|
|
222
|
+
)
|
|
223
|
+
if existing_by_key:
|
|
224
|
+
raise KeyOrNameAlreadyExists(
|
|
225
|
+
f'Data category with fides_key "{data["fides_key"]}" already exists.'
|
|
226
|
+
)
|
|
227
|
+
# Always skip name check - fides_key uniqueness is sufficient
|
|
228
|
+
return super().create(db=db, data=data, check_name=False)
|
|
229
|
+
|
|
230
|
+
def update(self, db: Session, *, data: dict[str, Any]) -> "DataCategory":
|
|
231
|
+
"""
|
|
232
|
+
Override update to check for existing data categories with the same fides_key
|
|
233
|
+
when fides_key is being changed.
|
|
234
|
+
"""
|
|
235
|
+
# Check if fides_key is being changed and if it conflicts with an existing category
|
|
236
|
+
if (
|
|
237
|
+
"fides_key" in data
|
|
238
|
+
and data["fides_key"]
|
|
239
|
+
and data["fides_key"] != self.fides_key
|
|
240
|
+
):
|
|
241
|
+
existing_by_key = (
|
|
242
|
+
db.query(DataCategory)
|
|
243
|
+
.filter(DataCategory.fides_key == data["fides_key"])
|
|
244
|
+
.first()
|
|
245
|
+
)
|
|
246
|
+
if existing_by_key:
|
|
247
|
+
raise KeyOrNameAlreadyExists(
|
|
248
|
+
f'Data category with fides_key "{data["fides_key"]}" already exists.'
|
|
249
|
+
)
|
|
250
|
+
return super().update(db=db, data=data)
|
|
251
|
+
|
|
203
252
|
@classmethod
|
|
204
253
|
def from_fideslang_obj(
|
|
205
254
|
cls, data_category: FideslangDataCategory
|
|
@@ -231,6 +280,54 @@ class DataSubject(Base, FidesBase):
|
|
|
231
280
|
version_deprecated = Column(Text)
|
|
232
281
|
replaced_by = Column(Text)
|
|
233
282
|
|
|
283
|
+
@classmethod
|
|
284
|
+
def create(
|
|
285
|
+
cls: Type["DataSubject"],
|
|
286
|
+
db: Session,
|
|
287
|
+
*,
|
|
288
|
+
data: dict[str, Any],
|
|
289
|
+
check_name: bool = True,
|
|
290
|
+
) -> "DataSubject":
|
|
291
|
+
"""
|
|
292
|
+
Override create to skip name uniqueness check for data subjects.
|
|
293
|
+
|
|
294
|
+
DataSubject allows duplicate names - fides_key provides sufficient uniqueness.
|
|
295
|
+
Multiple subjects can share the same name as long as their keys differ.
|
|
296
|
+
"""
|
|
297
|
+
# Check if data subject with same fides_key already exists
|
|
298
|
+
if "fides_key" in data and data["fides_key"]:
|
|
299
|
+
existing_by_key = (
|
|
300
|
+
db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
|
|
301
|
+
)
|
|
302
|
+
if existing_by_key:
|
|
303
|
+
raise KeyOrNameAlreadyExists(
|
|
304
|
+
f'Data subject with fides_key "{data["fides_key"]}" already exists.'
|
|
305
|
+
)
|
|
306
|
+
# Always skip name check - fides_key uniqueness is sufficient
|
|
307
|
+
return super().create(db=db, data=data, check_name=False)
|
|
308
|
+
|
|
309
|
+
def update(self, db: Session, *, data: dict[str, Any]) -> "DataSubject":
|
|
310
|
+
"""
|
|
311
|
+
Override update to check for existing data subjects with the same fides_key
|
|
312
|
+
when fides_key is being changed.
|
|
313
|
+
"""
|
|
314
|
+
# Check if fides_key is being changed and if it conflicts with an existing subject
|
|
315
|
+
if (
|
|
316
|
+
"fides_key" in data
|
|
317
|
+
and data["fides_key"]
|
|
318
|
+
and data["fides_key"] != self.fides_key
|
|
319
|
+
):
|
|
320
|
+
existing_by_key = (
|
|
321
|
+
db.query(DataSubject)
|
|
322
|
+
.filter(DataSubject.fides_key == data["fides_key"])
|
|
323
|
+
.first()
|
|
324
|
+
)
|
|
325
|
+
if existing_by_key:
|
|
326
|
+
raise KeyOrNameAlreadyExists(
|
|
327
|
+
f'Data subject with fides_key "{data["fides_key"]}" already exists.'
|
|
328
|
+
)
|
|
329
|
+
return super().update(db=db, data=data)
|
|
330
|
+
|
|
234
331
|
|
|
235
332
|
class DataUse(Base, FidesBase):
|
|
236
333
|
"""
|
|
@@ -264,6 +361,52 @@ class DataUse(Base, FidesBase):
|
|
|
264
361
|
remote_side=[fides_key],
|
|
265
362
|
)
|
|
266
363
|
|
|
364
|
+
@classmethod
|
|
365
|
+
def create(
|
|
366
|
+
cls: Type["DataUse"],
|
|
367
|
+
db: Session,
|
|
368
|
+
*,
|
|
369
|
+
data: dict[str, Any],
|
|
370
|
+
check_name: bool = True,
|
|
371
|
+
) -> "DataUse":
|
|
372
|
+
"""
|
|
373
|
+
Override create to skip name uniqueness check for hierarchical taxonomy.
|
|
374
|
+
|
|
375
|
+
DataUse is hierarchical - fides_key provides sufficient uniqueness.
|
|
376
|
+
Multiple uses can share the same name as long as their keys differ.
|
|
377
|
+
"""
|
|
378
|
+
# Check if data use with same fides_key already exists
|
|
379
|
+
if "fides_key" in data and data["fides_key"]:
|
|
380
|
+
existing_by_key = (
|
|
381
|
+
db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
|
|
382
|
+
)
|
|
383
|
+
if existing_by_key:
|
|
384
|
+
raise KeyOrNameAlreadyExists(
|
|
385
|
+
f'Data use with fides_key "{data["fides_key"]}" already exists.'
|
|
386
|
+
)
|
|
387
|
+
# Always skip name check - fides_key uniqueness is sufficient
|
|
388
|
+
return super().create(db=db, data=data, check_name=False)
|
|
389
|
+
|
|
390
|
+
def update(self, db: Session, *, data: dict[str, Any]) -> "DataUse":
|
|
391
|
+
"""
|
|
392
|
+
Override update to check for existing data uses with the same fides_key
|
|
393
|
+
when fides_key is being changed.
|
|
394
|
+
"""
|
|
395
|
+
# Check if fides_key is being changed and if it conflicts with an existing use
|
|
396
|
+
if (
|
|
397
|
+
"fides_key" in data
|
|
398
|
+
and data["fides_key"]
|
|
399
|
+
and data["fides_key"] != self.fides_key
|
|
400
|
+
):
|
|
401
|
+
existing_by_key = (
|
|
402
|
+
db.query(DataUse).filter(DataUse.fides_key == data["fides_key"]).first()
|
|
403
|
+
)
|
|
404
|
+
if existing_by_key:
|
|
405
|
+
raise KeyOrNameAlreadyExists(
|
|
406
|
+
f'DataUse with fides_key "{data["fides_key"]}" already exists.'
|
|
407
|
+
)
|
|
408
|
+
return super().update(db=db, data=data)
|
|
409
|
+
|
|
267
410
|
@staticmethod
|
|
268
411
|
def get_parent_uses_from_key(data_use_key: str) -> Set[str]:
|
|
269
412
|
"""
|
|
@@ -311,7 +454,7 @@ class Dataset(Base, FidesBase):
|
|
|
311
454
|
Duplicate names are allowed.
|
|
312
455
|
"""
|
|
313
456
|
# Check if dataset with same fides_key already exists
|
|
314
|
-
if "fides_key" in data:
|
|
457
|
+
if "fides_key" in data and data["fides_key"]:
|
|
315
458
|
existing_by_key = (
|
|
316
459
|
db.query(cls).filter(cls.fides_key == data["fides_key"]).first()
|
|
317
460
|
)
|
|
@@ -775,11 +918,11 @@ class CustomFieldDefinition(Base):
|
|
|
775
918
|
name = Column(String, index=True, nullable=False)
|
|
776
919
|
description = Column(String)
|
|
777
920
|
field_type = Column(
|
|
778
|
-
|
|
921
|
+
String,
|
|
779
922
|
nullable=False,
|
|
780
923
|
)
|
|
781
924
|
allow_list_id = Column(String, ForeignKey(CustomFieldValueList.id), nullable=True)
|
|
782
|
-
resource_type = Column(
|
|
925
|
+
resource_type = Column(String, nullable=False)
|
|
783
926
|
field_definition = Column(String)
|
|
784
927
|
custom_field = relationship(
|
|
785
928
|
"CustomField",
|
|
@@ -843,7 +986,7 @@ class CustomField(Base):
|
|
|
843
986
|
|
|
844
987
|
__tablename__ = "plus_custom_field"
|
|
845
988
|
|
|
846
|
-
resource_type = Column(
|
|
989
|
+
resource_type = Column(String, nullable=False)
|
|
847
990
|
resource_id = Column(String, index=True, nullable=False)
|
|
848
991
|
custom_field_definition_id = Column(
|
|
849
992
|
String, ForeignKey(CustomFieldDefinition.id), nullable=False
|