ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.74.0rc1__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.
Potentially problematic release.
This version of ethyca-fides might be problematic. Click here for more details.
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/METADATA +3 -2
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/RECORD +377 -327
- fides/_version.py +3 -3
- fides/api/alembic/alembic.ini +5 -1
- fides/api/alembic/migrations/env.py +7 -1
- fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
- fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
- fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
- fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
- fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
- fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
- fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
- fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
- fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
- fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
- fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
- fides/api/api/v1/endpoints/generic_overrides.py +75 -6
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +60 -6
- fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
- fides/api/api/v1/endpoints/system.py +11 -43
- fides/api/api/v1/endpoints/user_endpoints.py +8 -1
- fides/api/app_setup.py +1 -3
- fides/api/common_exceptions.py +8 -0
- fides/api/db/base.py +2 -0
- fides/api/db/database.py +257 -2
- fides/api/email_templates/get_email_template.py +3 -0
- fides/api/email_templates/template_names.py +1 -0
- fides/api/email_templates/templates/manual_task_digest.html +316 -0
- fides/api/main.py +2 -2
- fides/api/models/attachment.py +1 -0
- fides/api/models/detection_discovery/__init__.py +2 -0
- fides/api/models/detection_discovery/core.py +10 -0
- fides/api/models/detection_discovery/monitor_task.py +1 -0
- fides/api/models/detection_discovery/staged_resource_error.py +25 -0
- fides/api/models/digest/__init__.py +2 -0
- fides/api/models/digest/digest_config.py +10 -1
- fides/api/models/digest/digest_execution.py +142 -0
- fides/api/models/event_audit.py +17 -0
- fides/api/models/identity_definition.py +65 -0
- fides/api/models/messaging_template.py +7 -0
- fides/api/models/privacy_experience.py +11 -0
- fides/api/models/privacy_preference.py +2 -0
- fides/api/models/privacy_request/duplicate_group.py +84 -0
- fides/api/models/privacy_request/privacy_request.py +56 -8
- fides/api/models/privacy_request/request_task.py +98 -1
- fides/api/models/sql_models.py +3 -0
- fides/api/models/taxonomy.py +14 -4
- fides/api/models/v3/__init__.py +0 -0
- fides/api/models/v3/privacy_preferences.py +85 -0
- fides/api/models/worker_task.py +8 -0
- fides/api/schemas/application_config.py +28 -0
- fides/api/schemas/connection_configuration/connection_config.py +1 -30
- fides/api/schemas/messaging/messaging.py +15 -0
- fides/api/schemas/privacy_request.py +17 -3
- fides/api/schemas/saas/async_polling_configuration.py +81 -0
- fides/api/schemas/saas/saas_config.py +10 -3
- fides/api/schemas/saas/strategy_configuration.py +0 -12
- fides/api/schemas/taxonomy_extensions.py +8 -0
- fides/api/service/async_dsr/handlers/__init__.py +0 -0
- fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
- fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
- fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
- fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
- fides/api/service/async_dsr/strategies/__init__.py +0 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +686 -0
- fides/api/service/async_dsr/utils.py +130 -0
- fides/api/service/connectors/bigquery_connector.py +34 -16
- fides/api/service/connectors/fides/fides_client.py +63 -1
- fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
- fides/api/service/connectors/saas/connector_registry_service.py +1 -138
- fides/api/service/connectors/saas_connector.py +116 -94
- fides/api/service/connectors/sql_connector.py +14 -4
- fides/api/service/deps.py +8 -0
- fides/api/service/messaging/message_dispatch_service.py +38 -1
- fides/api/service/privacy_request/attachment_handling.py +9 -2
- fides/api/service/privacy_request/duplication_detection.py +424 -0
- fides/api/service/privacy_request/request_runner_service.py +46 -84
- fides/api/service/privacy_request/request_service.py +47 -74
- fides/api/service/saas_request/saas_request_override_factory.py +71 -1
- fides/api/task/execute_request_tasks.py +17 -9
- fides/api/task/filter_results.py +35 -2
- fides/api/task/graph_task.py +37 -8
- fides/api/tasks/__init__.py +0 -1
- fides/api/util/connection_util.py +99 -215
- fides/api/util/event_audit_util.py +230 -0
- fides/api/util/logger_context_utils.py +3 -1
- fides/api/util/masking_util.py +31 -0
- fides/api/util/memory_watchdog.py +118 -0
- fides/api/util/saas_config_updater.py +66 -0
- fides/api/util/saas_util.py +28 -1
- fides/common/api/scope_registry.py +0 -7
- fides/common/api/v1/urn_registry.py +2 -0
- fides/config/__init__.py +10 -1
- fides/config/celery_settings.py +42 -0
- fides/config/config_proxy.py +10 -0
- fides/config/duplicate_detection_settings.py +31 -0
- fides/config/execution_settings.py +7 -3
- fides/config/utils.py +5 -0
- fides/data/language/languages.yml +2 -0
- fides/service/connection/__init__.py +0 -0
- fides/service/connection/connection_service.py +651 -0
- fides/service/event_audit_service.py +16 -22
- fides/service/privacy_request/privacy_request_service.py +162 -43
- fides/service/taxonomy/handlers/legacy_handler.py +3 -3
- fides/service/taxonomy/taxonomy_service.py +15 -15
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/FZTEUgamBvOhgPWce135w/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-0da062111df309bf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-508b16628e8eb225.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1840-5bbe6d878ed73fb4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.afe8cad52f904fcf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-fe1a06d82c0413f1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2397-40b8db1cb2f23e2a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2921-b10bbc3a9104933b.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-eb5cd82b3ee6ab0c.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-93ecd09f1cb9dbef.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-6db05a35ae806825.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-44255a63d6d80ff5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/401-fe8db8b5d8f600de.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/4277-13bcf4516326d474.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4496-bed72bd5639075be.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4817-d29f40d4ce729f37.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-b2ac9fecc00b67e7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-4672eae0656430f9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-8dedd1ca94fbba54.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/549-6e2442db533a711e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5643-55d758444a8d7162.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5724-1e40975cefa405f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-6055edba275155ca.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-82e2df433fe5ba85.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6344-3e21444374f8059f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6362-12e3fd23130ccf15.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6372-a8d0f08dac1ebd0e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6780-3db5133c1f4c6f1e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6853-1adbdf6418ec3d62.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-aa0c60ee1092be8e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7059-12be23a345a94c1e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7079-6e6efc3396ff1ebb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7218-d297a4a06f924b09.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7245-686665c197b58e68.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-a43c046c24de37cc.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-c654c61ba98d8c74.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7654-716cf37a020b3d11.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-e83ace3c6ab99ac7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/8212-b9e8295ca883c9f8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8939-4925751c57c51f87.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9046-e4daf28840a69fd6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-550bd50d538c5f79.js} +3 -3
- fides/ui-build/static/admin/_next/static/chunks/9330-e519adec48222d45.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9341-bfc0e59bcc56c604.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.7d029a5383595b69.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9682-da69ac5d06f281da.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-657652d55936a8c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9965-56c5e4fc9cd3b3a5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-d079b8bf35250874.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-e64fd8510033a27c.js} +63 -63
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ddd9d7d40847fc28.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-b4d18c1f4d414f5f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d451bc8932330141.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-c24663cd5dec57db.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-d93418688bd258eb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-9b1f2b1c06968166.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-115a085e5d42de45.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d9b7b311195df29e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-3de34624829cbce8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-dc95e7ed278d1a29.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cdfc9bb19f47c709.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-0b995b01dc4dbd1f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-e3ad3a55624e302a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-b37ed76849330edd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-dd82729296dee5c5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-49e5477eb1a11b92.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-dfc1ead4a12c9ffa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-8442eb219958ac7e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-feda358d1801c18d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d16acb6fc07aad46.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-c51a1e98c45d231a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-bcfe38eebca30f8c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-f66d0655897c4400.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6f1e012cd641da19.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-581d6248fcf98d17.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-ddc1c1641e1e9430.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-2b48f7e524743b2b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-862b67418600251e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-0ffec855f5df262c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a030ab8c2e2b0db.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-6cb66f649b8ca4bf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-0b008dad90b00aaa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-5566edf9a9d1be2d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4ca1f485b6e9e02.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-85dee7e81dc4bafb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-e905e018a2cab35d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-912723bc86299b1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f1f0affc18327033.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-b74d1e8608ae5b5d.js → index-692d27dbe9392c9f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-1b94e2d769a182b2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adfe6c5ac5b703d0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-f9be7080ebbb7445.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-caaa8602a1d449b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-9b106b1d2d93985b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-6a1ded8cdde836c4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-f94e3accf9507ebf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-5e83220ff1f2a250.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-a03cbd698a23e5b3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-3cde574b3c8447c0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-0448bb4ae8536c58.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-1621a4b87c432117.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/notifications-4ea28f6b1dd63642.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-e02516d9fd314528.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-fec08bea801b4918.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d911e5fbf5a4a888.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-91b1adcac6a57b2d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-de309d8813b1ebfb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-f2943c1309062284.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-03eda417711ae909.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1fe486f3af832c80.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-ea6f78fa8b2d3f6c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-bda7b474493e7128.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-2c0ec8fed16c20ae.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-30d298a47e85709f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-438084cca0d0f10d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-17fd44d98f5bd5b6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-baf77d34a3b3bece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-8c80391025ca7339.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7c19810858b708cc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee8820fe0fa14c77.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{[id]-bd1042a0e9be6aff.js → [id]-8eb862182f19a6c2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{new-469ad83c8cfa1290.js → new-37c29ef618e9fe3c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-1db425150dcb1b6b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-e334b43fa5c5b1e6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-9d18eb5c38d85522.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-cb937ed7c4b1e5a8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-835281251f0785cd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-7fd050c92866938c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-59ea66130fca0d05.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-b0fe1051d908f366.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f108bf5015144d2f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-0e7c7228d01290ea.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-adc13b542e10a37d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-23dd250da26511c5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-aed30fb22ae7c9ec.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-6b88ca3e02ee67c9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-6f97ebe373e7ef6b.js +1 -0
- fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
- fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
- fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
- fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
- fides/ui-build/static/admin/_next/static/css/65ae906f224cd8ae.css +1 -0
- fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
- fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
- fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
- fides/ui-build/static/admin/_next/static/css/d5701118537cbdd2.css +1 -0
- fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
- fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
- fides/ui-build/static/admin/lib/fides.js +3 -3
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/new-privacy-requests.html +1 -0
- fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
- fides/ui-build/static/admin/notifications/digests/new.html +1 -0
- fides/ui-build/static/admin/notifications/digests.html +1 -0
- fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
- fides/ui-build/static/admin/notifications/providers/new.html +1 -0
- fides/ui-build/static/admin/notifications/providers.html +1 -0
- fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
- fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
- fides/ui-build/static/admin/notifications/templates.html +1 -0
- fides/ui-build/static/admin/notifications.html +1 -0
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/poc/table-migration.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -0
- fides/ui-build/static/admin/settings/about/alpha.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -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/async_dsr/async_dsr_service.py +0 -195
- fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
- fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
- fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
- fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
- fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.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-b4337d0826d5addc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2921-66f65496c3a09316.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-ffe4e8436e1eceb9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5185-51eaa78e3ed6bfb7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.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-10a36584c399526c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-7004a8c420b1ca02.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-4b24e1731c1cc3b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-d0d3a0fe3f95e971.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.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-b6616ba7b59d947e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-2ca59996860a33c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-92182be6603c2842.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-ab54b19609bff325.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-e8d2140787045acd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-e3f93462a08251bf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-b5f7d6afdecd013d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-248ad9f65a872442.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-aedb66a62042b10a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-018df38b7cd77fdb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6ca9099d03aab817.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0f2c90786ea005a4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-200b51a725f8b2d1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-f3e6e74e0efb005c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a3275554ffe8e640.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-77239269acc2d31a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-8bf1821722b082e9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-2deb6becece69d46.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +0 -1
- fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
- fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
- fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
- fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
- fides/ui-build/static/admin/messaging/[id].html +0 -1
- fides/ui-build/static/admin/messaging/add-template.html +0 -1
- fides/ui-build/static/admin/messaging.html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers/[key].html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers/new.html +0 -1
- fides/ui-build/static/admin/settings/messaging-providers.html +0 -1
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → FZTEUgamBvOhgPWce135w}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-7dce2916cc589c54.js} +0 -0
|
@@ -58,6 +58,13 @@ DEFAULT_MESSAGING_TEMPLATES: Dict[str, Any] = {
|
|
|
58
58
|
"body": "Your erasure request has been completed.",
|
|
59
59
|
},
|
|
60
60
|
},
|
|
61
|
+
MessagingActionType.MANUAL_TASK_DIGEST.value: {
|
|
62
|
+
"label": "Manual task digest",
|
|
63
|
+
"content": {
|
|
64
|
+
"subject": "Weekly DSR Summary from __ORGANIZATION_NAME__",
|
|
65
|
+
"body": "This is your weekly summary of open data subject requests tasks from __ORGANIZATION_NAME__ that require your attention. Please review the tasks in our Privacy Center to ensure timely completion.",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
61
68
|
}
|
|
62
69
|
|
|
63
70
|
|
|
@@ -101,6 +101,11 @@ class PrivacyExperienceConfigBase:
|
|
|
101
101
|
nullable=True,
|
|
102
102
|
default=True,
|
|
103
103
|
) # base is nullable for privacy experience config history
|
|
104
|
+
cookie_deletion_based_on_host_domain = Column(
|
|
105
|
+
Boolean,
|
|
106
|
+
nullable=True,
|
|
107
|
+
default=True,
|
|
108
|
+
) # base is nullable for privacy experience config history
|
|
104
109
|
|
|
105
110
|
disabled = Column(Boolean, nullable=False, default=True)
|
|
106
111
|
|
|
@@ -143,6 +148,9 @@ class ExperienceConfigTemplate(PrivacyExperienceConfigBase, Base):
|
|
|
143
148
|
auto_subdomain_cookie_deletion = Column(
|
|
144
149
|
Boolean, nullable=False, default=True, server_default="t"
|
|
145
150
|
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
151
|
+
cookie_deletion_based_on_host_domain = Column(
|
|
152
|
+
Boolean, nullable=False, default=True, server_default="t"
|
|
153
|
+
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
146
154
|
dismissable = Column(
|
|
147
155
|
Boolean, nullable=False, default=True, server_default="t"
|
|
148
156
|
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
@@ -217,6 +225,9 @@ class PrivacyExperienceConfig(PrivacyExperienceConfigBase, Base):
|
|
|
217
225
|
auto_subdomain_cookie_deletion = Column(
|
|
218
226
|
Boolean, nullable=False, default=True, server_default="t"
|
|
219
227
|
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
228
|
+
cookie_deletion_based_on_host_domain = Column(
|
|
229
|
+
Boolean, nullable=False, default=True, server_default="t"
|
|
230
|
+
) # Overrides PrivacyExperienceConfigBase to make non-nullable
|
|
220
231
|
disabled = Column(
|
|
221
232
|
Boolean, nullable=False, default=True, index=True
|
|
222
233
|
) # Overridding PrivacyExperienceConfigBase to index
|
|
@@ -44,6 +44,7 @@ class RequestOrigin(Enum):
|
|
|
44
44
|
banner_and_modal = "banner_and_modal"
|
|
45
45
|
api = "api"
|
|
46
46
|
tcf_overlay = "tcf_overlay"
|
|
47
|
+
headless = "headless"
|
|
47
48
|
|
|
48
49
|
|
|
49
50
|
class ConsentMethod(Enum):
|
|
@@ -58,6 +59,7 @@ class ConsentMethod(Enum):
|
|
|
58
59
|
gpc = "gpc"
|
|
59
60
|
individual_notice = "individual_notice"
|
|
60
61
|
acknowledge = "acknowledge"
|
|
62
|
+
external_provider = "external_provider"
|
|
61
63
|
|
|
62
64
|
|
|
63
65
|
class ServingComponent(Enum):
|
|
@@ -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,12 +4,12 @@ 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
15
|
from sqlalchemy.orm import Query, RelationshipProperty, Session, backref, relationship
|
|
@@ -69,6 +69,7 @@ from fides.api.models.pre_approval_webhook import (
|
|
|
69
69
|
PreApprovalWebhook,
|
|
70
70
|
PreApprovalWebhookReply,
|
|
71
71
|
)
|
|
72
|
+
from fides.api.models.privacy_request.duplicate_group import DuplicateGroup
|
|
72
73
|
from fides.api.models.privacy_request.execution_log import (
|
|
73
74
|
COMPLETED_EXECUTION_LOG_STATUSES,
|
|
74
75
|
EXITED_EXECUTION_LOG_STATUSES,
|
|
@@ -224,6 +225,18 @@ class PrivacyRequest(
|
|
|
224
225
|
source = Column(EnumColumn(PrivacyRequestSource), nullable=True)
|
|
225
226
|
location = Column(String, nullable=True)
|
|
226
227
|
|
|
228
|
+
# Duplicate detection - group ID to link duplicates together
|
|
229
|
+
duplicate_request_group_id = Column(
|
|
230
|
+
UUID(as_uuid=True),
|
|
231
|
+
ForeignKey("duplicate_group.id"),
|
|
232
|
+
nullable=True,
|
|
233
|
+
)
|
|
234
|
+
duplicate_group = relationship(
|
|
235
|
+
DuplicateGroup,
|
|
236
|
+
back_populates="privacy_requests",
|
|
237
|
+
uselist=False,
|
|
238
|
+
)
|
|
239
|
+
|
|
227
240
|
# A PrivacyRequest can be soft deleted, so we store when it was deleted
|
|
228
241
|
deleted_at = Column(DateTime(timezone=True), nullable=True)
|
|
229
242
|
# and who deleted it
|
|
@@ -369,7 +382,7 @@ class PrivacyRequest(
|
|
|
369
382
|
return {
|
|
370
383
|
"id": self.id,
|
|
371
384
|
"external_id": self.external_id,
|
|
372
|
-
"status": self.status.value,
|
|
385
|
+
"status": self.status.value if self.status is not None else None,
|
|
373
386
|
"requested_at": (
|
|
374
387
|
self.requested_at.isoformat() if self.requested_at else None
|
|
375
388
|
),
|
|
@@ -601,7 +614,10 @@ class PrivacyRequest(
|
|
|
601
614
|
"""Verify the identification code supplied by the user
|
|
602
615
|
If verified, change the status of the request to "pending", and set the datetime the identity was verified.
|
|
603
616
|
"""
|
|
604
|
-
if not self.status
|
|
617
|
+
if not self.status in [
|
|
618
|
+
PrivacyRequestStatus.identity_unverified,
|
|
619
|
+
PrivacyRequestStatus.duplicate,
|
|
620
|
+
]:
|
|
605
621
|
raise IdentityVerificationException(
|
|
606
622
|
f"Invalid identity verification request. Privacy request '{self.id}' status = {self.status.value}." # type: ignore # pylint: disable=no-member
|
|
607
623
|
)
|
|
@@ -679,12 +695,29 @@ class PrivacyRequest(
|
|
|
679
695
|
},
|
|
680
696
|
)
|
|
681
697
|
|
|
682
|
-
def
|
|
683
|
-
"""
|
|
698
|
+
def identity_prefix_cache_and_keys(self) -> Tuple[str, FidesopsRedis, List[str]]:
|
|
699
|
+
"""Returns the prefix and cache keys for the identity data for this request"""
|
|
684
700
|
prefix = f"id-{self.id}-identity-*"
|
|
685
701
|
cache: FidesopsRedis = get_cache()
|
|
686
702
|
keys = cache.keys(prefix)
|
|
687
|
-
|
|
703
|
+
return prefix, cache, keys
|
|
704
|
+
|
|
705
|
+
def verify_cache_for_identity_data(self) -> bool:
|
|
706
|
+
"""Verifies if the identity data is cached for this request"""
|
|
707
|
+
_, _, keys = self.identity_prefix_cache_and_keys()
|
|
708
|
+
return len(keys) > 0
|
|
709
|
+
|
|
710
|
+
def get_cached_identity_data(self) -> Dict[str, Any]:
|
|
711
|
+
"""Retrieves any identity data pertaining to this request from the cache"""
|
|
712
|
+
result: Dict[str, Any] = {}
|
|
713
|
+
prefix, cache, keys = self.identity_prefix_cache_and_keys()
|
|
714
|
+
|
|
715
|
+
if not keys:
|
|
716
|
+
logger.debug(f"Cache miss for request {self.id}, falling back to DB")
|
|
717
|
+
identity = self.get_persisted_identity()
|
|
718
|
+
self.cache_identity(identity)
|
|
719
|
+
keys = cache.keys(prefix)
|
|
720
|
+
|
|
688
721
|
for key in keys:
|
|
689
722
|
value = cache.get(key)
|
|
690
723
|
if value:
|
|
@@ -702,10 +735,25 @@ class PrivacyRequest(
|
|
|
702
735
|
|
|
703
736
|
def get_cached_custom_privacy_request_fields(self) -> Dict[str, Any]:
|
|
704
737
|
"""Retrieves any custom fields pertaining to this request from the cache"""
|
|
738
|
+
result: Dict[str, Any] = {}
|
|
705
739
|
prefix = f"id-{self.id}-custom-privacy-request-field-*"
|
|
740
|
+
|
|
706
741
|
cache: FidesopsRedis = get_cache()
|
|
707
742
|
keys = cache.keys(prefix)
|
|
708
|
-
|
|
743
|
+
|
|
744
|
+
if not keys:
|
|
745
|
+
logger.debug(f"Cache miss for request {self.id}, falling back to DB")
|
|
746
|
+
custom_privacy_request_fields = (
|
|
747
|
+
self.get_persisted_custom_privacy_request_fields()
|
|
748
|
+
)
|
|
749
|
+
self.cache_custom_privacy_request_fields(
|
|
750
|
+
{
|
|
751
|
+
key: CustomPrivacyRequestFieldSchema(**value)
|
|
752
|
+
for key, value in custom_privacy_request_fields.items()
|
|
753
|
+
}
|
|
754
|
+
)
|
|
755
|
+
keys = cache.keys(prefix)
|
|
756
|
+
|
|
709
757
|
for key in keys:
|
|
710
758
|
value = cache.get(key)
|
|
711
759
|
if value:
|
|
@@ -8,8 +8,9 @@ from typing import TYPE_CHECKING, List, Optional, Tuple
|
|
|
8
8
|
from loguru import logger
|
|
9
9
|
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
|
|
10
10
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
11
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
11
12
|
from sqlalchemy.ext.mutable import MutableDict, MutableList
|
|
12
|
-
from sqlalchemy.orm import Query, Session, relationship
|
|
13
|
+
from sqlalchemy.orm import Query, RelationshipProperty, Session, relationship
|
|
13
14
|
from sqlalchemy_utils.types.encrypted.encrypted_type import (
|
|
14
15
|
AesGcmEngine,
|
|
15
16
|
StringEncryptedType,
|
|
@@ -183,6 +184,14 @@ class RequestTask(WorkerTask, Base):
|
|
|
183
184
|
uselist=False,
|
|
184
185
|
)
|
|
185
186
|
|
|
187
|
+
# Stores the sub-requests data for async polling tasks
|
|
188
|
+
sub_requests: "RelationshipProperty[List[RequestTaskSubRequest]]" = relationship(
|
|
189
|
+
"RequestTaskSubRequest",
|
|
190
|
+
back_populates="request_task",
|
|
191
|
+
cascade="all, delete-orphan",
|
|
192
|
+
order_by="RequestTaskSubRequest.created_at",
|
|
193
|
+
)
|
|
194
|
+
|
|
186
195
|
@property
|
|
187
196
|
def request_task_address(self) -> CollectionAddress:
|
|
188
197
|
"""Convert the collection_address into Collection Address format"""
|
|
@@ -318,3 +327,91 @@ class RequestTask(WorkerTask, Base):
|
|
|
318
327
|
)
|
|
319
328
|
|
|
320
329
|
return task_in_flight
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
class RequestTaskSubRequest(Base):
|
|
333
|
+
"""
|
|
334
|
+
Model for storing individual sub-request data during the execution of a request task.
|
|
335
|
+
Supports 1:N relationship - each RequestTask can have multiple sub-requests.
|
|
336
|
+
Currently used for storing request data for polling tasks.
|
|
337
|
+
"""
|
|
338
|
+
|
|
339
|
+
@declared_attr
|
|
340
|
+
def __tablename__(cls) -> str:
|
|
341
|
+
"""Overriding base class method to set the table name."""
|
|
342
|
+
return "request_task_sub_request"
|
|
343
|
+
|
|
344
|
+
request_task_id = Column(
|
|
345
|
+
String(255),
|
|
346
|
+
ForeignKey(
|
|
347
|
+
"requesttask.id",
|
|
348
|
+
name="request_task_sub_request_request_task_id_fkey",
|
|
349
|
+
ondelete="CASCADE",
|
|
350
|
+
),
|
|
351
|
+
nullable=False,
|
|
352
|
+
index=True,
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
request_task = relationship(
|
|
356
|
+
"RequestTask",
|
|
357
|
+
back_populates="sub_requests",
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
# Individual sub-request data (e.g., request_id, status, result data)
|
|
361
|
+
# Additional fields for enhanced sub-request tracking
|
|
362
|
+
param_values = Column( # An encrypted JSON String - saved as a dict
|
|
363
|
+
StringEncryptedType(
|
|
364
|
+
type_in=JSONTypeOverride,
|
|
365
|
+
key=CONFIG.security.app_encryption_key,
|
|
366
|
+
engine=AesGcmEngine,
|
|
367
|
+
padding="pkcs5",
|
|
368
|
+
),
|
|
369
|
+
nullable=False,
|
|
370
|
+
)
|
|
371
|
+
status = Column(String, nullable=False)
|
|
372
|
+
|
|
373
|
+
# Raw data retrieved from an access request is stored here. This contains all of the
|
|
374
|
+
# intermediate data we retrieved, needed for downstream tasks, but hasn't been filtered
|
|
375
|
+
# by data category for the end user.
|
|
376
|
+
_access_data = Column( # An encrypted JSON String - saved as a list of Rows
|
|
377
|
+
"access_data",
|
|
378
|
+
StringEncryptedType(
|
|
379
|
+
type_in=JSONTypeOverride,
|
|
380
|
+
key=CONFIG.security.app_encryption_key,
|
|
381
|
+
engine=AesGcmEngine,
|
|
382
|
+
padding="pkcs5",
|
|
383
|
+
),
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
# Use descriptors for automatic external storage handling
|
|
387
|
+
access_data = EncryptedLargeDataDescriptor(
|
|
388
|
+
field_name="access_data", empty_default=[]
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
# Written after an erasure is completed
|
|
392
|
+
rows_masked = Column(Integer)
|
|
393
|
+
|
|
394
|
+
def get_correlation_id(self) -> Optional[str]:
|
|
395
|
+
"""Helper method to extract correlation_id from param_values."""
|
|
396
|
+
if self.param_values and "request_id" in self.param_values:
|
|
397
|
+
return self.param_values["request_id"]
|
|
398
|
+
return None
|
|
399
|
+
|
|
400
|
+
def update_status(self, db: Session, status: str) -> None:
|
|
401
|
+
"""Helper method to update the status of this sub-request."""
|
|
402
|
+
self.status = status
|
|
403
|
+
self.save(db)
|
|
404
|
+
|
|
405
|
+
def cleanup_external_storage(self) -> None:
|
|
406
|
+
"""Clean up all external storage files for this sub-request"""
|
|
407
|
+
# Access the descriptor from the class to call cleanup
|
|
408
|
+
RequestTaskSubRequest.access_data.cleanup(self)
|
|
409
|
+
|
|
410
|
+
def get_access_data(self) -> List[Row]:
|
|
411
|
+
"""Helper to retrieve access data or default to empty list"""
|
|
412
|
+
return self.access_data or []
|
|
413
|
+
|
|
414
|
+
def delete(self, db: Session) -> None:
|
|
415
|
+
"""Override delete to cleanup external storage first"""
|
|
416
|
+
self.cleanup_external_storage()
|
|
417
|
+
super().delete(db)
|
fides/api/models/sql_models.py
CHANGED
|
@@ -184,6 +184,9 @@ class DataCategory(Base, FidesBase):
|
|
|
184
184
|
version_deprecated = Column(Text)
|
|
185
185
|
replaced_by = Column(Text)
|
|
186
186
|
|
|
187
|
+
# LLM Classification
|
|
188
|
+
tagging_instructions = Column(Text, nullable=True)
|
|
189
|
+
|
|
187
190
|
children: "RelationshipProperty[List[DataCategory]]" = relationship(
|
|
188
191
|
"DataCategory",
|
|
189
192
|
back_populates="parent",
|
fides/api/models/taxonomy.py
CHANGED
|
@@ -21,7 +21,15 @@ from fides.api.common_exceptions import ValidationError
|
|
|
21
21
|
from fides.api.db.base_class import Base
|
|
22
22
|
from fides.api.models.sql_models import FidesBase # type: ignore[attr-defined]
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
# Legacy Fideslang taxonomy keys
|
|
25
|
+
LEGACY_TAXONOMY_KEYS = {
|
|
26
|
+
"data_category",
|
|
27
|
+
"data_use",
|
|
28
|
+
"data_subject",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Taxonomies that are managed by Fides (legacy taxonomies and system group)
|
|
32
|
+
MANAGED_TAXONOMY_KEYS = {"data_category", "data_use", "data_subject", "system_group"}
|
|
25
33
|
|
|
26
34
|
|
|
27
35
|
class TargetType(str, Enum):
|
|
@@ -81,7 +89,9 @@ class Taxonomy(Base, FidesBase):
|
|
|
81
89
|
"""Create a new Taxonomy with proper handling of applies_to."""
|
|
82
90
|
# Disallow creating taxonomies that represent legacy types
|
|
83
91
|
fides_key = data.get("fides_key")
|
|
84
|
-
|
|
92
|
+
# Specifically exclude system_group to allow for creation during tests
|
|
93
|
+
# We already have unique constraints on fides_key to prevent duplicates on DB level
|
|
94
|
+
if fides_key in MANAGED_TAXONOMY_KEYS:
|
|
85
95
|
raise ValidationError(
|
|
86
96
|
f"Cannot create taxonomy '{fides_key}'. This is a taxonomy managed by the system."
|
|
87
97
|
)
|
|
@@ -166,7 +176,7 @@ class TaxonomyAllowedUsage(Base):
|
|
|
166
176
|
|
|
167
177
|
target_type can be either:
|
|
168
178
|
- A generic type: "system", "privacy_declaration", "taxonomy"
|
|
169
|
-
- A taxonomy key: "
|
|
179
|
+
- A taxonomy key: "data_category", "data_use", etc.
|
|
170
180
|
"""
|
|
171
181
|
|
|
172
182
|
@declared_attr
|
|
@@ -193,7 +203,7 @@ class TaxonomyAllowedUsage(Base):
|
|
|
193
203
|
)
|
|
194
204
|
target_type: Column[str] = Column(
|
|
195
205
|
String, primary_key=True
|
|
196
|
-
) # Can be "system", "dataset", OR a taxonomy key like "
|
|
206
|
+
) # Can be "system", "dataset", OR a taxonomy key like "data_category"
|
|
197
207
|
|
|
198
208
|
|
|
199
209
|
class TaxonomyElement(Base, FidesBase):
|
|
File without changes
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""SQLAlchemy model for the v3 privacy_preferences table."""
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import ( # type: ignore[attr-defined]
|
|
4
|
+
BigInteger,
|
|
5
|
+
Boolean,
|
|
6
|
+
Column,
|
|
7
|
+
DateTime,
|
|
8
|
+
Identity,
|
|
9
|
+
Text,
|
|
10
|
+
text,
|
|
11
|
+
)
|
|
12
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
13
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
14
|
+
from sqlalchemy_utils.types.encrypted.encrypted_type import (
|
|
15
|
+
AesGcmEngine,
|
|
16
|
+
StringEncryptedType,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from fides.api.cryptography.cryptographic_util import hash_value_with_salt
|
|
20
|
+
from fides.api.cryptography.identity_salt import get_identity_salt
|
|
21
|
+
from fides.api.db.base_class import Base
|
|
22
|
+
from fides.api.schemas.redis_cache import MultiValue
|
|
23
|
+
from fides.config import CONFIG
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class PrivacyPreferences(Base):
|
|
27
|
+
"""
|
|
28
|
+
Model for the v3 privacy_preferences table.
|
|
29
|
+
This is used for the v3 privacy preferences API.
|
|
30
|
+
|
|
31
|
+
This table stores privacy preference records with a partitioning scheme
|
|
32
|
+
based on the is_latest flag, splitting records into current and historic partitions.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
@declared_attr
|
|
36
|
+
def __tablename__(self) -> str:
|
|
37
|
+
return "privacy_preferences"
|
|
38
|
+
|
|
39
|
+
# Override the default id column from Base (which is a String UUID)
|
|
40
|
+
# with a BigInteger identity column for this table
|
|
41
|
+
id = Column(
|
|
42
|
+
BigInteger, # type: ignore[arg-type]
|
|
43
|
+
Identity(start=1, increment=1, always=True),
|
|
44
|
+
primary_key=True,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Searchable/queryable data stored as JSONB
|
|
48
|
+
search_data = Column(JSONB, nullable=True)
|
|
49
|
+
|
|
50
|
+
# Full record data stored as encrypted text (contains PII)
|
|
51
|
+
record_data = Column(
|
|
52
|
+
StringEncryptedType(
|
|
53
|
+
type_in=Text(),
|
|
54
|
+
key=CONFIG.security.app_encryption_key,
|
|
55
|
+
engine=AesGcmEngine,
|
|
56
|
+
padding="pkcs5",
|
|
57
|
+
),
|
|
58
|
+
nullable=True,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Partition key - determines if record goes to _current or _historic partition
|
|
62
|
+
is_latest = Column(
|
|
63
|
+
Boolean, nullable=False, server_default=text("false"), primary_key=True
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Override base class timestamp columns to match migration
|
|
67
|
+
created_at = Column(
|
|
68
|
+
DateTime(timezone=True), nullable=False, server_default=text("now()")
|
|
69
|
+
)
|
|
70
|
+
updated_at = Column(DateTime(timezone=True), nullable=True)
|
|
71
|
+
|
|
72
|
+
@classmethod
|
|
73
|
+
def hash_value(
|
|
74
|
+
cls,
|
|
75
|
+
value: MultiValue,
|
|
76
|
+
encoding: str = "UTF-8",
|
|
77
|
+
) -> str:
|
|
78
|
+
"""Utility function to hash the value with a generated salt"""
|
|
79
|
+
salt = get_identity_salt()
|
|
80
|
+
value_str = str(value)
|
|
81
|
+
hashed_value = hash_value_with_salt(
|
|
82
|
+
value_str.encode(encoding),
|
|
83
|
+
salt.encode(encoding),
|
|
84
|
+
)
|
|
85
|
+
return hashed_value
|
fides/api/models/worker_task.py
CHANGED
|
@@ -17,6 +17,14 @@ class ExecutionLogStatus(enum.Enum):
|
|
|
17
17
|
awaiting_processing = "paused" # "paused" in the database to avoid a migration, but use "awaiting_processing" in the app
|
|
18
18
|
retrying = "retrying"
|
|
19
19
|
skipped = "skipped"
|
|
20
|
+
polling = "polling"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Statuses that can be resumed
|
|
24
|
+
RESUMABLE_EXECUTION_LOG_STATUSES = [
|
|
25
|
+
ExecutionLogStatus.pending,
|
|
26
|
+
ExecutionLogStatus.polling,
|
|
27
|
+
]
|
|
20
28
|
|
|
21
29
|
|
|
22
30
|
class WorkerTask:
|
|
@@ -101,6 +101,31 @@ class ConsentConfig(FidesSchema):
|
|
|
101
101
|
model_config = ConfigDict(extra="forbid")
|
|
102
102
|
|
|
103
103
|
|
|
104
|
+
class DuplicateDetectionApplicationConfig(FidesSchema):
|
|
105
|
+
"""
|
|
106
|
+
API model - configuration settings for duplicate privacy request detection.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
enabled: Optional[bool] = Field(
|
|
110
|
+
default=False,
|
|
111
|
+
description="Whether duplicate detection is enabled. Disabled by default.",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
time_window_days: Optional[int] = Field(
|
|
115
|
+
default=365,
|
|
116
|
+
description="Time window in days for duplicate detection. Default is 1 year.",
|
|
117
|
+
ge=1,
|
|
118
|
+
le=3650, # Max 10 years
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
match_identity_fields: Optional[List[str]] = Field(
|
|
122
|
+
default=["email"],
|
|
123
|
+
description="Identity field names to match on for duplicate detection (e.g., 'email', 'phone_number'). Default is email only.",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
model_config = ConfigDict(extra="forbid")
|
|
127
|
+
|
|
128
|
+
|
|
104
129
|
class SecurityApplicationConfig(FidesSchema):
|
|
105
130
|
# only valid URLs should be set as cors_origins
|
|
106
131
|
# for advanced usage of non-URLs, e.g. wildcards (`*`), the related
|
|
@@ -129,6 +154,9 @@ class ApplicationConfig(FidesSchema):
|
|
|
129
154
|
consent: Optional[ConsentConfig] = None
|
|
130
155
|
admin_ui: Optional[AdminUIConfig] = None
|
|
131
156
|
privacy_center: Optional[PrivacyCenterConfig] = None
|
|
157
|
+
privacy_request_duplicate_detection: Optional[
|
|
158
|
+
DuplicateDetectionApplicationConfig
|
|
159
|
+
] = None
|
|
132
160
|
|
|
133
161
|
@model_validator(mode="before")
|
|
134
162
|
@classmethod
|
|
@@ -13,6 +13,7 @@ from fides.api.schemas.connection_configuration import connection_secrets_schema
|
|
|
13
13
|
from fides.api.schemas.policy import ActionType
|
|
14
14
|
from fides.api.schemas.saas.saas_config import SaaSConfigBase
|
|
15
15
|
from fides.api.util.connection_type import get_connection_type_secret_schema
|
|
16
|
+
from fides.api.util.masking_util import mask_sensitive_fields
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
class CreateConnectionConfiguration(BaseModel):
|
|
@@ -41,36 +42,6 @@ class CreateConnectionConfigurationWithSecrets(CreateConnectionConfiguration):
|
|
|
41
42
|
model_config = ConfigDict(from_attributes=True, extra="ignore")
|
|
42
43
|
|
|
43
44
|
|
|
44
|
-
def mask_sensitive_fields(
|
|
45
|
-
connection_secrets: Dict[str, Any], secret_schema: Dict[str, Any]
|
|
46
|
-
) -> Dict[str, Any]:
|
|
47
|
-
"""
|
|
48
|
-
Mask sensitive fields in the given secrets based on the provided schema.
|
|
49
|
-
This function traverses the given secrets dictionary and uses the provided schema to
|
|
50
|
-
identify fields that have been marked as sensitive. The function replaces the sensitive
|
|
51
|
-
field values with a mask string ('********').
|
|
52
|
-
Args:
|
|
53
|
-
connection_secrets (Dict[str, Any]): The secrets to be masked.
|
|
54
|
-
secret_schema (Dict[str, Any]): The schema defining which fields are sensitive.
|
|
55
|
-
Returns:
|
|
56
|
-
Dict[str, Any]: The secrets dictionary with sensitive fields masked.
|
|
57
|
-
"""
|
|
58
|
-
if connection_secrets is None:
|
|
59
|
-
return connection_secrets
|
|
60
|
-
|
|
61
|
-
secret_schema_properties = secret_schema["properties"]
|
|
62
|
-
new_connection_secrets = {}
|
|
63
|
-
|
|
64
|
-
for key, value in connection_secrets.items():
|
|
65
|
-
if key in secret_schema_properties:
|
|
66
|
-
if secret_schema_properties.get(key, {}).get("sensitive", False):
|
|
67
|
-
new_connection_secrets[key] = "**********"
|
|
68
|
-
else:
|
|
69
|
-
new_connection_secrets[key] = value
|
|
70
|
-
|
|
71
|
-
return new_connection_secrets
|
|
72
|
-
|
|
73
|
-
|
|
74
45
|
class ConnectionConfigSecretsMixin(BaseModel):
|
|
75
46
|
"""
|
|
76
47
|
A schema mixin to declare a connection config `secrets` attribute
|
|
@@ -89,6 +89,7 @@ class MessagingActionType(str, Enum):
|
|
|
89
89
|
PRIVACY_REQUEST_REVIEW_APPROVE = "privacy_request_review_approve"
|
|
90
90
|
USER_INVITE = "user_invite"
|
|
91
91
|
EXTERNAL_USER_WELCOME = "external_user_welcome"
|
|
92
|
+
MANUAL_TASK_DIGEST = "manual_task_digest"
|
|
92
93
|
TEST_MESSAGE = "test_message"
|
|
93
94
|
|
|
94
95
|
|
|
@@ -101,6 +102,7 @@ CONFIGURABLE_MESSAGING_ACTION_TYPES: Tuple[str, ...] = (
|
|
|
101
102
|
MessagingActionType.PRIVACY_REQUEST_COMPLETE_DELETION.value,
|
|
102
103
|
MessagingActionType.PRIVACY_REQUEST_REVIEW_DENY.value,
|
|
103
104
|
MessagingActionType.PRIVACY_REQUEST_REVIEW_APPROVE.value,
|
|
105
|
+
MessagingActionType.MANUAL_TASK_DIGEST.value,
|
|
104
106
|
)
|
|
105
107
|
|
|
106
108
|
|
|
@@ -219,6 +221,18 @@ class ExternalUserWelcomeBodyParams(BaseModel):
|
|
|
219
221
|
org_name: str
|
|
220
222
|
|
|
221
223
|
|
|
224
|
+
class ManualTaskDigestBodyParams(BaseModel):
|
|
225
|
+
"""Body params required to send manual task digest emails"""
|
|
226
|
+
|
|
227
|
+
vendor_contact_name: str
|
|
228
|
+
organization_name: str
|
|
229
|
+
portal_url: str
|
|
230
|
+
imminent_task_count: int
|
|
231
|
+
upcoming_task_count: int
|
|
232
|
+
total_task_count: int
|
|
233
|
+
company_logo_url: Optional[str] = None
|
|
234
|
+
|
|
235
|
+
|
|
222
236
|
class FidesopsMessage(
|
|
223
237
|
BaseModel,
|
|
224
238
|
):
|
|
@@ -256,6 +270,7 @@ class FidesopsMessage(
|
|
|
256
270
|
MessagingActionType.PRIVACY_REQUEST_ERROR_NOTIFICATION: ErrorNotificationBodyParams,
|
|
257
271
|
MessagingActionType.USER_INVITE: UserInviteBodyParams,
|
|
258
272
|
MessagingActionType.EXTERNAL_USER_WELCOME: ExternalUserWelcomeBodyParams,
|
|
273
|
+
MessagingActionType.MANUAL_TASK_DIGEST: ManualTaskDigestBodyParams,
|
|
259
274
|
}
|
|
260
275
|
|
|
261
276
|
valid_body_params = valid_body_params_for_action_type.get(
|