ethyca-fides 2.59.1rc0__py2.py3-none-any.whl → 2.59.2b1__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.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/METADATA +2 -2
- {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/RECORD +202 -198
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/c9c72b3d550b_data_migration_cookie_asset.py +218 -0
- fides/api/api/v1/endpoints/storage_endpoints.py +5 -4
- fides/api/db/system.py +1 -121
- fides/api/models/asset.py +1 -2
- fides/api/models/fides_user.py +1 -0
- fides/api/models/privacy_notice.py +14 -19
- fides/api/models/sql_models.py +0 -51
- fides/api/schemas/application_config.py +1 -0
- fides/api/schemas/connection_configuration/connection_secrets_datahub.py +3 -3
- fides/api/schemas/connection_configuration/connection_secrets_postgres.py +7 -7
- fides/api/schemas/messaging/messaging.py +9 -2
- fides/api/schemas/storage/storage.py +35 -1
- fides/api/schemas/storage/storage_secrets_docs_only.py +8 -2
- fides/api/schemas/system.py +1 -2
- fides/api/service/connectors/postgres_connector.py +1 -0
- fides/api/service/storage/gcs.py +38 -0
- fides/api/service/storage/storage_authenticator_service.py +28 -0
- fides/api/service/storage/storage_uploader_service.py +25 -1
- fides/api/tasks/storage.py +45 -1
- fides/api/util/storage_util.py +2 -0
- fides/service/messaging/aws_ses_service.py +25 -16
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/4ZsbAUsCLedx18AUPZCUU/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/146-106021bf1ae6e912.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1817-6abbe957a53026d7.js → 1817-11bb237f57d9ad27.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1904-281183a117e26585.js → 1904-3c40738cb0fd2a7c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2479-b4f7a1c7c711cb65.js → 2479-50f431c0e2c0de3c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3244-4b76482dcc5d576f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3702-3d814671c31eaca3.js → 3702-31d37a0217f82615.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3855-237afbbea7f54707.js → 3855-da54ef27afd56c46.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3872-c53d74aebd12cfd3.js → 3872-68b4ceba8f632bc0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/401-49cdd118a89cc343.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4060-bad5f07013c7bb49.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{4121-476f657b03a78965.js → 4121-4914fb77e60d31f4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-7a992683e9191bc9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5480-1623dbacdf4e6794.js → 5480-d177a83facd21738.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5487-9a2aecb0ec63d567.js → 5487-22de631f1d186527.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-1020589bef6dd253.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6277-c46c9eb59177b850.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6372-2aee10b79089521a.js → 6372-0ca1b9521b5489fd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-7d7eb22f19d3806c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6954-127745bfdc5bc0b3.js → 6954-981a8a444780bedb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7751-3913b8c055f599e5.js → 7751-09c6424d673d8aa4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{79-77cfed02164241ca.js → 79-7ca48fb1a0b52f96.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9572-8f5947db1a6da260.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9767-162b0f8524990149.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9951-66aad0602aadfbe2.js → 9951-8ceba69296972ce9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-13a604eb8d39dffc.js → _app-fc9e922ec354be47.js} +46 -46
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a8c51c7bdbb405e2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-78de4bde88e18b0f.js → [id]-7122d8a8c20e7cd2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-c02b14c50b19bd91.js → new-300fd2800c417d0b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-85ddbe3ae50c7527.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-75c2ed6ba3de48cd.js → [id]-5a9269aa00a16596.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-487ae57dc7e2ded2.js → new-78808c75ba86c0be.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-65091908d6296afc.js → privacy-notices-047c409bc5e12d1a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-01d1371e690ae190.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d08a38d4f198691a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-6b3d1fe762c747d8.js → [systemId]-cc5431e4fbd6d39e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-61eafb8444bffb76.js → [monitorId]-f073ddcfb916988e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-e7869f658e3017b9.js → activity-73025c2ac5a00347.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-5aff1d01c6c30ad6.js → new-f3a6dd67f012b005.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-f4d57b3432c57112.js → dataset-3b703775de1ca75e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-b2b1168d0361baa8.js → [id]-b905c75f68786c2f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-c804349a417a888b.js → new-abd92bec98bdbb66.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-0faa9b3c4555e585.js → datastore-connection-52c3f076edb49944.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-e72904e316ede1b0.js → index-1bccf315f995267a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-afcf73fd0337dde0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-2ce76b506ba8404a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-54ea39f203182c53.js → [id]-2fc14bda8d314449.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-3219ddeb37d46398.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-8e17802ab6b2d3fd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-9d71495b42f34038.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-a36cf070c98a6cbd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7986cf3b36456353.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-f6d6e3d9d556387c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-e6c477f2ac098e0b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-255655d6c367faad.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-c01d24583e9485f0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-0b47ff26897c1d9a.js → test-datasets-d5f777510ab8dfd2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{systems-820893393f1516ee.js → systems-e9a111ef0c32161e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-517419b35435604a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-d527d1d1635541df.js → [id]-32ec340d4b390d07.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-facb8c0128a44cb1.js → user-management-c8ca51efbeccf39b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-01277b766c8eb076.js +1 -0
- fides/ui-build/static/admin/_next/static/css/72caf4a266697967.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/ant-poc.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/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].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/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.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/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -0
- fides/ui-build/static/admin/settings/consent.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/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/ui-build/static/admin/_next/static/chunks/1376-92890c17ce39ca0d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/146-d1820217dc36d46d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3244-3d94bf3393366412.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/401-50974f107c2712fc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4060-52fd85fb1e15a2b8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-288d74a33473cff7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-2db5181149073311.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6853-ca5dacd25c9ccb7c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9572-2b9b10e146130c85.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-bf415d0daea960cd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a6926f7ec7ad10cf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-7eeeee3769e73f78.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-7a1976c0d1aca8b6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-75989f9732d90793.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-59d30d48fcae067c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-373fb3a596099fc9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-d889076067104e56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-3355b4803b2916f3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-3ac47981f1e2b0aa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-fe743440d7eb007b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-cdc866af93898716.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-a7dc8113067dff42.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-2f03e981234c40ad.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-5bcc7a6976e01a56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-8fccd670220dbf60.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-03e375f6d6b2c71b.js +0 -1
- fides/ui-build/static/admin/_next/static/css/687135955af5b7e1.css +0 -1
- fides/ui-build/static/admin/_next/static/rE0VXR2bXlzSJjVNbhHjr/_buildManifest.js +0 -1
- {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.59.1rc0.dist-info → ethyca_fides-2.59.2b1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{rE0VXR2bXlzSJjVNbhHjr → 4ZsbAUsCLedx18AUPZCUU}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1100-45c0634b4f51d10c.js → 1100-22c375e757f23150.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3086-d1ba90bc6ac9174b.js → 3086-ffd15c92ea81b3d6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5102-626b9ff42e904276.js → 5102-3acf312a8f0d7720.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5826-1f4f74bf3b5348e4.js → 5826-226c8843e715b6ad.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6395-4224d6d26d1e8bb7.js → 6395-04041b53946664b1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{8433-c4c765833ab9cc07.js → 8433-dd6d8dae02275d66.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{8934-ffa2b0509bc7a845.js → 8934-6881185f0c5c0f6d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9282-1a48b10b114d01f4.js → 9282-23b38e03f897722f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9327-4970d356f7000c0b.js → 9327-fb7ef941b5176077.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-29560aa2e6a60963.js → 404-a3c57a06ff67cf1f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-58e9256e86916ecd.js → manual-c4c0c42bbe0f5548.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2392e3a101fae073.js → multiple-93907c53f342831f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-404f3c9018952800.js → ant-poc-8fcf312148606e7e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7dfe37b9f0ff9a3c.js → add-vendors-5e83ee7792c0f75f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-dba7848b760ba227.js → configure-ea7b2c628260c84c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-f67fda6a71d0a46b.js → properties-893753088b9729a3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-75395dfc224cf44b.js → consent-7e5adfec9134a268.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-fa65c67ec8c4b5e6.js → [projectUrn]-4b2c10ff79e46e50.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-e76a07ee6ee8d55f.js → projects-05bbb01e37766b80.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-38476c697da53480.js → action-center-cf48ed7dc04c3af2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-423172d31de8e9c6.js → datamap-6c63a6295668ed4e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-704553f5329fb9d4.js → [...subfieldNames]-7a99a6c5c2fc2abe.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-06c19dca941edb14.js → [collectionName]-39aab1de4df0660d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-eac517f43d5f53a8.js → [datasetId]-2cf04998a7521a7d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-66f5fbadd8455805.js → [id]-8950b4aff799099c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-d441abb1f045940f.js → add-template-4cad85d5b6d52734.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-eef56c95b08aa24c.js → messaging-57c7aa44af163623.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-b8c94b10ab90b061.js → configure-d8d23d06ce1d9dae.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-f4fb941df069b7bf.js → [id]-6cca2c8ebbff78aa.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-bccb6ffab25aa214.js → add-property-f09f98007725fa51.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-9a7ac623370b7c00.js → properties-9034bab3d7200d9b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-4412a7b468b6d4bf.js → about-92dada8329e89092.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-d9088f5cd9fb2822.js → domain-records-368a4183139ea5e0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-cf09ad896c7396a6.js → email-templates-e4498b6310074705.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-759564ca0ae62840.js → locations-18f56b6b76abb71d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-2dce4501fca920b3.js → regulations-0350314337abff11.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-dd053a3bf2a9ca6c.js → [id]-022910a52efbad76.js} +0 -0
fides/_version.py
CHANGED
@@ -8,11 +8,11 @@ import json
|
|
8
8
|
|
9
9
|
version_json = '''
|
10
10
|
{
|
11
|
-
"date": "2025-04-
|
11
|
+
"date": "2025-04-16T22:35:59-0400",
|
12
12
|
"dirty": false,
|
13
13
|
"error": null,
|
14
|
-
"full-revisionid": "
|
15
|
-
"version": "2.59.
|
14
|
+
"full-revisionid": "f64e628f1502e4a7c7045e517a74550c9d5cd661",
|
15
|
+
"version": "2.59.2b1"
|
16
16
|
}
|
17
17
|
''' # END VERSION_JSON
|
18
18
|
|
@@ -0,0 +1,218 @@
|
|
1
|
+
"""data migration converting existing 'Cookies' resources to 'Asset' resources with type 'Cookie'
|
2
|
+
|
3
|
+
Revision ID: c9c72b3d550b
|
4
|
+
Revises: 9288f729cac4
|
5
|
+
Create Date: 2025-02-18 18:33:56.039924
|
6
|
+
|
7
|
+
"""
|
8
|
+
|
9
|
+
import uuid
|
10
|
+
from typing import Dict, Tuple
|
11
|
+
|
12
|
+
import sqlalchemy as sa
|
13
|
+
from alembic import op
|
14
|
+
from loguru import logger
|
15
|
+
|
16
|
+
from fides.api.models.asset import Asset
|
17
|
+
|
18
|
+
# revision identifiers, used by Alembic.
|
19
|
+
revision = "c9c72b3d550b"
|
20
|
+
down_revision = "9288f729cac4"
|
21
|
+
branch_labels = None
|
22
|
+
depends_on = None
|
23
|
+
|
24
|
+
|
25
|
+
def upgrade():
|
26
|
+
# migrate existing cookies to assets
|
27
|
+
connection = op.get_bind()
|
28
|
+
result = connection.execute(
|
29
|
+
sa.text(
|
30
|
+
"SELECT c.id, c.created_at, c.updated_at, c.name, c.domain, c.system_id, c.path, c.privacy_declaration_id, pd.system_id AS pud_system_id, pd.data_use "
|
31
|
+
"FROM cookies c "
|
32
|
+
"LEFT JOIN privacydeclaration pd ON c.privacy_declaration_id = pd.id"
|
33
|
+
)
|
34
|
+
)
|
35
|
+
|
36
|
+
logger.debug("Converting existing cookies to assets")
|
37
|
+
assets_to_create: Dict[str, Asset] = {}
|
38
|
+
for row in result:
|
39
|
+
if row.privacy_declaration_id is None:
|
40
|
+
identifier = f"{row.name}_{row.system_id}"
|
41
|
+
if identifier not in assets_to_create.keys():
|
42
|
+
assets_to_create[identifier] = Asset(
|
43
|
+
id=str(uuid.uuid4()),
|
44
|
+
created_at=row.created_at,
|
45
|
+
updated_at=row.updated_at,
|
46
|
+
name=row.name,
|
47
|
+
domain=row.domain,
|
48
|
+
system_id=row.system_id,
|
49
|
+
data_uses=[],
|
50
|
+
asset_type="Cookie",
|
51
|
+
)
|
52
|
+
continue
|
53
|
+
|
54
|
+
if row.pud_system_id:
|
55
|
+
system_id = row.pud_system_id
|
56
|
+
data_uses = [row.data_use]
|
57
|
+
else:
|
58
|
+
system_id = row.system_id
|
59
|
+
data_uses = []
|
60
|
+
|
61
|
+
# Asset unique identifier is a composite of name, asset_type, domain, base_url, system_id. All assets here are cookies.
|
62
|
+
identifier = f"{row.name}_{'Cookie'}_{row.domain}_{row.path}_{system_id}"
|
63
|
+
if identifier in assets_to_create.keys():
|
64
|
+
# If the asset already exists, append the data_use to the existing asset
|
65
|
+
assets_to_create[identifier].data_uses.extend(data_uses)
|
66
|
+
else:
|
67
|
+
# If the asset does not exist, create a new asset with the data_use
|
68
|
+
assets_to_create[identifier] = Asset(
|
69
|
+
id=str(uuid.uuid4()),
|
70
|
+
created_at=row.created_at,
|
71
|
+
updated_at=row.updated_at,
|
72
|
+
name=row.name,
|
73
|
+
domain=row.domain,
|
74
|
+
system_id=system_id,
|
75
|
+
data_uses=data_uses,
|
76
|
+
asset_type="Cookie",
|
77
|
+
)
|
78
|
+
|
79
|
+
# Insert the assets into the asset table
|
80
|
+
assets_list = [
|
81
|
+
{
|
82
|
+
"id": asset.id if asset.id else str(uuid.uuid4()),
|
83
|
+
"created_at": asset.created_at,
|
84
|
+
"updated_at": asset.updated_at,
|
85
|
+
"name": asset.name,
|
86
|
+
"domain": asset.domain,
|
87
|
+
"system_id": asset.system_id,
|
88
|
+
"data_uses": asset.data_uses,
|
89
|
+
"asset_type": "Cookie",
|
90
|
+
}
|
91
|
+
for asset in assets_to_create.values()
|
92
|
+
]
|
93
|
+
|
94
|
+
if assets_list:
|
95
|
+
logger.debug("Inserting assets into asset table ")
|
96
|
+
connection.execute(
|
97
|
+
sa.text(
|
98
|
+
"INSERT INTO asset (id, created_at, updated_at, name, domain, system_id, data_uses, asset_type, with_consent) "
|
99
|
+
"VALUES (:id, :created_at, :updated_at, :name, :domain, :system_id, :data_uses, :asset_type, false) "
|
100
|
+
"ON CONFLICT DO NOTHING"
|
101
|
+
),
|
102
|
+
assets_list,
|
103
|
+
)
|
104
|
+
else:
|
105
|
+
logger.debug("No assets to insert into asset table. Skipping.")
|
106
|
+
|
107
|
+
# Delete the cookies table
|
108
|
+
logger.debug("Deleting cookies table")
|
109
|
+
connection.execute(sa.text("DROP TABLE cookies"))
|
110
|
+
|
111
|
+
|
112
|
+
def downgrade():
|
113
|
+
# Recreate the cookies table
|
114
|
+
logger.debug("Recreating cookies table")
|
115
|
+
op.create_table(
|
116
|
+
"cookies",
|
117
|
+
sa.Column("id", sa.String(length=255), nullable=False),
|
118
|
+
sa.Column(
|
119
|
+
"created_at",
|
120
|
+
sa.DateTime(timezone=True),
|
121
|
+
server_default=sa.text("now()"),
|
122
|
+
nullable=True,
|
123
|
+
),
|
124
|
+
sa.Column(
|
125
|
+
"updated_at",
|
126
|
+
sa.DateTime(timezone=True),
|
127
|
+
server_default=sa.text("now()"),
|
128
|
+
nullable=True,
|
129
|
+
),
|
130
|
+
sa.Column("name", sa.String(), nullable=False),
|
131
|
+
sa.Column("domain", sa.String(), nullable=True),
|
132
|
+
sa.Column("path", sa.String(), nullable=True),
|
133
|
+
sa.Column("system_id", sa.String(), nullable=True),
|
134
|
+
sa.Column("privacy_declaration_id", sa.String(), nullable=True),
|
135
|
+
sa.ForeignKeyConstraint(
|
136
|
+
["privacy_declaration_id"], ["privacydeclaration.id"], ondelete="SET NULL"
|
137
|
+
),
|
138
|
+
sa.ForeignKeyConstraint(["system_id"], ["ctl_systems.id"], ondelete="CASCADE"),
|
139
|
+
sa.PrimaryKeyConstraint("id"),
|
140
|
+
sa.UniqueConstraint(
|
141
|
+
"name", "privacy_declaration_id", name="_cookie_name_privacy_declaration_uc"
|
142
|
+
),
|
143
|
+
)
|
144
|
+
op.create_index(op.f("ix_cookies_id"), "cookies", ["id"], unique=False)
|
145
|
+
op.create_index(op.f("ix_cookies_name"), "cookies", ["name"], unique=False)
|
146
|
+
op.create_index(
|
147
|
+
op.f("ix_cookies_privacy_declaration_id"),
|
148
|
+
"cookies",
|
149
|
+
["privacy_declaration_id"],
|
150
|
+
unique=False,
|
151
|
+
)
|
152
|
+
op.create_index(
|
153
|
+
op.f("ix_cookies_system_id"), "cookies", ["system_id"], unique=False
|
154
|
+
)
|
155
|
+
# ### end Alembic commands ###
|
156
|
+
|
157
|
+
connection = op.get_bind()
|
158
|
+
result = connection.execute(
|
159
|
+
sa.text(
|
160
|
+
"SELECT id, name, domain, system_id, data_uses FROM asset WHERE asset_type = 'Cookie'"
|
161
|
+
)
|
162
|
+
)
|
163
|
+
|
164
|
+
# fetch all privacy declarations
|
165
|
+
privacy_declarations = connection.execute(
|
166
|
+
sa.text("SELECT id, system_id, data_use FROM privacydeclaration")
|
167
|
+
).fetchall()
|
168
|
+
# create a mapping of system_id and data_use to privacy_declaration_id
|
169
|
+
privacy_declaration_mapping: Dict[Tuple[str, str], str] = {}
|
170
|
+
for pud in privacy_declarations:
|
171
|
+
privacy_declaration_mapping[(pud.system_id, pud.data_use)] = pud.id
|
172
|
+
|
173
|
+
logger.debug("Migrating existing assets to cookies")
|
174
|
+
for row in result:
|
175
|
+
# Find the privacy declaration ID matching the system ID and data use
|
176
|
+
privacy_declaration_ids = []
|
177
|
+
for data_use in row.data_uses:
|
178
|
+
pud_id = privacy_declaration_mapping.get((row.system_id, data_use), None)
|
179
|
+
if pud_id:
|
180
|
+
privacy_declaration_ids.append(pud_id)
|
181
|
+
|
182
|
+
cookies_to_insert = []
|
183
|
+
|
184
|
+
if len(privacy_declaration_ids) == 0:
|
185
|
+
# If no privacy declaration match we attach to system_id
|
186
|
+
cookies_to_insert.append(
|
187
|
+
{
|
188
|
+
"id": row.id,
|
189
|
+
"name": row.name,
|
190
|
+
"domain": row.domain,
|
191
|
+
"system_id": row.system_id,
|
192
|
+
"privacy_declaration_id": None,
|
193
|
+
}
|
194
|
+
)
|
195
|
+
else:
|
196
|
+
for privacy_declaration_id in privacy_declaration_ids:
|
197
|
+
# Create a cookie for each privacy declaration ID
|
198
|
+
# generate a new ID
|
199
|
+
cookie_id = str(uuid.uuid4())
|
200
|
+
cookies_to_insert.append(
|
201
|
+
{
|
202
|
+
"id": cookie_id,
|
203
|
+
"name": row.name,
|
204
|
+
"domain": row.domain,
|
205
|
+
"system_id": None,
|
206
|
+
"privacy_declaration_id": privacy_declaration_id,
|
207
|
+
}
|
208
|
+
)
|
209
|
+
|
210
|
+
if cookies_to_insert:
|
211
|
+
connection.execute(
|
212
|
+
sa.text(
|
213
|
+
"INSERT INTO cookies (id, created_at, updated_at, name, domain, system_id, privacy_declaration_id) "
|
214
|
+
"VALUES (:id, NOW(), NOW(), :name, :domain, :system_id, :privacy_declaration_id) "
|
215
|
+
"ON CONFLICT DO NOTHING"
|
216
|
+
),
|
217
|
+
cookies_to_insert,
|
218
|
+
)
|
@@ -40,6 +40,7 @@ from fides.api.schemas.storage.storage import (
|
|
40
40
|
FULLY_CONFIGURED_STORAGE_TYPES,
|
41
41
|
AWSAuthMethod,
|
42
42
|
BulkPutStorageConfigResponse,
|
43
|
+
GCSAuthMethod,
|
43
44
|
StorageConfigStatus,
|
44
45
|
StorageConfigStatusMessage,
|
45
46
|
StorageDestination,
|
@@ -418,10 +419,10 @@ def get_storage_status(
|
|
418
419
|
|
419
420
|
|
420
421
|
def _storage_config_requires_secrets(storage_config: StorageConfig) -> bool:
|
421
|
-
return (
|
422
|
-
|
423
|
-
|
424
|
-
|
422
|
+
return storage_config.details.get(StorageDetails.AUTH_METHOD.value, None) in [
|
423
|
+
AWSAuthMethod.SECRET_KEYS.value,
|
424
|
+
GCSAuthMethod.SERVICE_ACCOUNT_KEYS.value,
|
425
|
+
]
|
425
426
|
|
426
427
|
|
427
428
|
@router.put(
|
fides/api/db/system.py
CHANGED
@@ -8,19 +8,15 @@ from typing import Any, Dict, List, Optional, Tuple, Type, Union
|
|
8
8
|
|
9
9
|
from deepdiff import DeepDiff
|
10
10
|
from fastapi import HTTPException
|
11
|
-
from fideslang.models import Cookies as CookieSchema
|
12
11
|
from fideslang.models import System as SystemSchema
|
13
12
|
from fideslang.validation import FidesKey
|
14
13
|
from loguru import logger as log
|
15
|
-
from sqlalchemy import and_, delete, insert, select, update
|
16
14
|
from sqlalchemy.ext.asyncio import AsyncSession
|
17
15
|
from sqlalchemy.orm import Session
|
18
|
-
from sqlalchemy.sql.elements import BinaryExpression
|
19
16
|
from starlette.status import HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND
|
20
17
|
|
21
18
|
from fides.api.db.crud import create_resource, get_resource, update_resource
|
22
19
|
from fides.api.models.sql_models import ( # type: ignore[attr-defined]
|
23
|
-
Cookies,
|
24
20
|
DataCategory,
|
25
21
|
DataSubject,
|
26
22
|
DataUse,
|
@@ -155,7 +151,6 @@ async def upsert_privacy_declarations(
|
|
155
151
|
for privacy_declaration in resource.privacy_declarations:
|
156
152
|
# prepare our 'payload' for either create or update
|
157
153
|
data = privacy_declaration.model_dump(mode="json")
|
158
|
-
privacy_declaration_cookies: List[Dict] = data.pop("cookies", None)
|
159
154
|
data["system_id"] = system.id # include FK back to system
|
160
155
|
|
161
156
|
# if we find matching declaration, remove it from our map
|
@@ -168,102 +163,11 @@ async def upsert_privacy_declarations(
|
|
168
163
|
# otherwise, create a new declaration record
|
169
164
|
declaration = PrivacyDeclaration.create(db, data=data)
|
170
165
|
|
171
|
-
# Upsert cookies for the given privacy declaration
|
172
|
-
await upsert_cookies(
|
173
|
-
db, privacy_declaration_cookies, declaration, system=None
|
174
|
-
)
|
175
|
-
|
176
166
|
# delete any existing privacy declarations that have not been "matched" in the request
|
177
167
|
for existing_declarations in existing_declarations.values():
|
178
168
|
await db.delete(existing_declarations)
|
179
169
|
|
180
170
|
|
181
|
-
async def upsert_cookies(
|
182
|
-
async_session: AsyncSession,
|
183
|
-
cookies: Optional[List[Dict]],
|
184
|
-
privacy_declaration: Optional[PrivacyDeclaration],
|
185
|
-
system: Optional[System],
|
186
|
-
) -> None:
|
187
|
-
"""
|
188
|
-
Upsert cookies for the given system or privacy_declaration. Cookies can be attached at the system-level
|
189
|
-
or the privacy declaration-level.
|
190
|
-
|
191
|
-
Remove any existing cookies that aren't specified here.
|
192
|
-
"""
|
193
|
-
if not (privacy_declaration or system):
|
194
|
-
# Dev-level error
|
195
|
-
raise ValueError(
|
196
|
-
"Either system or privacy declaration must be supplied to upsert cookies"
|
197
|
-
)
|
198
|
-
|
199
|
-
if privacy_declaration and system:
|
200
|
-
# Dev-level error
|
201
|
-
raise ValueError(
|
202
|
-
"Supply either system or privacy declaration, not both, to upsert cookies"
|
203
|
-
)
|
204
|
-
|
205
|
-
parsed_cookies = (
|
206
|
-
[CookieSchema.model_validate(cookie) for cookie in cookies] if cookies else []
|
207
|
-
)
|
208
|
-
|
209
|
-
resource_filter: BinaryExpression = (
|
210
|
-
Cookies.system_id == system.id
|
211
|
-
if system
|
212
|
-
else Cookies.privacy_declaration_id == privacy_declaration.id # type: ignore[union-attr]
|
213
|
-
)
|
214
|
-
|
215
|
-
for cookie_data in parsed_cookies:
|
216
|
-
# Check if cookie exists on the resource
|
217
|
-
result = await async_session.execute(
|
218
|
-
select(Cookies).where(
|
219
|
-
and_(Cookies.name == cookie_data.name, resource_filter)
|
220
|
-
)
|
221
|
-
)
|
222
|
-
row: Optional[Cookies] = result.scalars().first()
|
223
|
-
if row:
|
224
|
-
# Update existing cookie
|
225
|
-
await async_session.execute(
|
226
|
-
update(Cookies)
|
227
|
-
.where(Cookies.id == row.id)
|
228
|
-
.values(cookie_data.model_dump(mode="json"))
|
229
|
-
)
|
230
|
-
|
231
|
-
else:
|
232
|
-
# Insert new cookie
|
233
|
-
await async_session.execute(
|
234
|
-
insert(Cookies).values(
|
235
|
-
{
|
236
|
-
"name": cookie_data.name,
|
237
|
-
"path": cookie_data.path,
|
238
|
-
"domain": cookie_data.domain,
|
239
|
-
"privacy_declaration_id": (
|
240
|
-
privacy_declaration.id if privacy_declaration else None
|
241
|
-
),
|
242
|
-
"system_id": system.id if system else None,
|
243
|
-
}
|
244
|
-
)
|
245
|
-
)
|
246
|
-
|
247
|
-
# Select cookies which are currently on the application resource, but not included in the request
|
248
|
-
delete_result = await async_session.execute(
|
249
|
-
select(Cookies).where(
|
250
|
-
and_(
|
251
|
-
Cookies.name.notin_([cookie.name for cookie in parsed_cookies]),
|
252
|
-
resource_filter,
|
253
|
-
)
|
254
|
-
)
|
255
|
-
)
|
256
|
-
|
257
|
-
# Remove those cookies altogether
|
258
|
-
await async_session.execute(
|
259
|
-
delete(Cookies).where(
|
260
|
-
Cookies.id.in_(
|
261
|
-
[cookie.id for cookie in delete_result.scalars().unique().all()]
|
262
|
-
)
|
263
|
-
)
|
264
|
-
)
|
265
|
-
|
266
|
-
|
267
171
|
async def update_system(
|
268
172
|
resource: SystemSchema, db: AsyncSession, current_user_id: Optional[str] = None
|
269
173
|
) -> Tuple[Dict, bool]:
|
@@ -288,18 +192,10 @@ async def update_system(
|
|
288
192
|
resource, "privacy_declarations"
|
289
193
|
) # remove the attribute on the system since we've already updated declarations
|
290
194
|
|
291
|
-
# Remove system-level cookies from request before updating the system.
|
292
|
-
# Cookies are upserted separately
|
293
|
-
proposed_system_cookies: Optional[List[Cookies]] = resource.cookies
|
294
|
-
delattr(resource, "cookies")
|
295
|
-
|
296
195
|
# perform any updates on the system resource itself
|
297
196
|
updated_system = await update_resource(System, resource.model_dump(), db)
|
298
197
|
|
299
198
|
async with db.begin():
|
300
|
-
await upsert_cookies(
|
301
|
-
db, proposed_system_cookies, privacy_declaration=None, system=updated_system
|
302
|
-
) # Upsert the associated cookies at the System-level
|
303
199
|
|
304
200
|
await db.refresh(updated_system)
|
305
201
|
|
@@ -400,10 +296,6 @@ async def create_system(
|
|
400
296
|
# remove the attribute on the system update since the declarations will be created separately
|
401
297
|
delattr(resource, "privacy_declarations")
|
402
298
|
|
403
|
-
# Remove system-level cookies from request; these will be processed after the system is added
|
404
|
-
proposed_system_cookies: Optional[List[Cookies]] = resource.cookies
|
405
|
-
delattr(resource, "cookies")
|
406
|
-
|
407
299
|
# create the system resource using generic creation
|
408
300
|
# the system must be created before the privacy declarations so that it can be referenced
|
409
301
|
resource_dict = resource.model_dump()
|
@@ -418,27 +310,15 @@ async def create_system(
|
|
418
310
|
privacy_declaration_exception = None
|
419
311
|
try:
|
420
312
|
async with db.begin():
|
421
|
-
await upsert_cookies(
|
422
|
-
db,
|
423
|
-
proposed_system_cookies,
|
424
|
-
privacy_declaration=None,
|
425
|
-
system=created_system,
|
426
|
-
) # Create the associated cookies at the System-level
|
427
313
|
|
428
314
|
# create the specified declarations as records in their own table
|
429
315
|
for privacy_declaration in privacy_declarations:
|
430
316
|
data = privacy_declaration.model_dump(mode="json")
|
431
317
|
data["system_id"] = created_system.id # add FK back to system
|
432
|
-
privacy_declaration_cookies: List[Dict] = data.pop("cookies", [])
|
433
318
|
privacy_declaration = PrivacyDeclaration.create(
|
434
319
|
db, data=data
|
435
320
|
) # create the associated PrivacyDeclaration
|
436
|
-
|
437
|
-
db,
|
438
|
-
privacy_declaration_cookies,
|
439
|
-
privacy_declaration=privacy_declaration,
|
440
|
-
system=None,
|
441
|
-
) # Create the associated cookies on the Privacy Declaration
|
321
|
+
|
442
322
|
except Exception as e:
|
443
323
|
log.error(
|
444
324
|
f"Error adding privacy declarations, reverting system creation: {str(privacy_declaration_exception)}"
|
fides/api/models/asset.py
CHANGED
@@ -25,8 +25,7 @@ from fides.api.models.sql_models import System # type: ignore[attr-defined]
|
|
25
25
|
|
26
26
|
class Asset(Base):
|
27
27
|
"""
|
28
|
-
Web assets associated with a system
|
29
|
-
a migration path and backward compatibility with all `Cookies` related APIs.
|
28
|
+
Web assets associated with a system
|
30
29
|
"""
|
31
30
|
|
32
31
|
# Common attributes
|
fides/api/models/fides_user.py
CHANGED
@@ -23,6 +23,7 @@ from fides.api.db.base_class import Base
|
|
23
23
|
from fides.api.models.audit_log import AuditLog
|
24
24
|
|
25
25
|
# Intentionally importing SystemManager here to build the FidesUser.systems relationship
|
26
|
+
from fides.api.models.system_manager import SystemManager # type: ignore[unused-import]
|
26
27
|
from fides.api.schemas.user import DisabledReason
|
27
28
|
from fides.config import CONFIG
|
28
29
|
|
@@ -20,10 +20,9 @@ from fides.api.models import (
|
|
20
20
|
dry_update_data,
|
21
21
|
update_if_modified,
|
22
22
|
)
|
23
|
+
from fides.api.models.asset import Asset
|
23
24
|
from fides.api.models.location_regulation_selections import DeprecatedNoticeRegion
|
24
25
|
from fides.api.models.sql_models import ( # type: ignore[attr-defined]
|
25
|
-
Cookies,
|
26
|
-
PrivacyDeclaration,
|
27
26
|
System,
|
28
27
|
get_system_data_uses,
|
29
28
|
)
|
@@ -191,24 +190,20 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
191
190
|
raise Exception("Invalid notice consent mechanism.")
|
192
191
|
|
193
192
|
@property
|
194
|
-
def cookies(self) -> List[
|
195
|
-
"""Return relevant cookie
|
193
|
+
def cookies(self) -> List[Asset]:
|
194
|
+
"""Return relevant assets of type 'cookie' (via the data use)"""
|
196
195
|
db = Session.object_session(self)
|
197
|
-
|
198
|
-
|
199
|
-
.
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
.
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
]
|
209
|
-
)
|
210
|
-
)
|
211
|
-
).all()
|
196
|
+
or_queries = [
|
197
|
+
f"array_to_string(data_uses, ',') ILIKE '{data_use}%'"
|
198
|
+
for data_use in self.data_uses
|
199
|
+
]
|
200
|
+
|
201
|
+
query = db.query(Asset).filter(
|
202
|
+
Asset.asset_type == "Cookie",
|
203
|
+
or_(*[text(query) for query in or_queries]),
|
204
|
+
)
|
205
|
+
|
206
|
+
return query.all()
|
212
207
|
|
213
208
|
@property
|
214
209
|
def calculated_systems_applicable(self) -> bool:
|
fides/api/models/sql_models.py
CHANGED
@@ -457,10 +457,6 @@ class System(Base, FidesBase):
|
|
457
457
|
lazy="selectin",
|
458
458
|
)
|
459
459
|
|
460
|
-
cookies = relationship(
|
461
|
-
"Cookies", back_populates="system", lazy="selectin", uselist=True, viewonly=True
|
462
|
-
)
|
463
|
-
|
464
460
|
assets = relationship(
|
465
461
|
"Asset", back_populates="system", lazy="selectin", uselist=True, viewonly=True
|
466
462
|
)
|
@@ -560,9 +556,6 @@ class PrivacyDeclaration(Base):
|
|
560
556
|
system = relationship(
|
561
557
|
System, back_populates="privacy_declarations", lazy="selectin"
|
562
558
|
)
|
563
|
-
cookies = relationship(
|
564
|
-
"Cookies", back_populates="privacy_declaration", lazy="joined", uselist=True
|
565
|
-
)
|
566
559
|
|
567
560
|
@classmethod
|
568
561
|
def create(
|
@@ -866,50 +859,6 @@ class AuditLogResource(Base):
|
|
866
859
|
extra_data = Column(JSON, nullable=True)
|
867
860
|
|
868
861
|
|
869
|
-
class Cookies(Base):
|
870
|
-
"""
|
871
|
-
Stores cookies. Cookies have a FK to system and privacy declaration. If a privacy declaration is deleted,
|
872
|
-
the cookie can still remain linked to the system but unassociated with a data use.
|
873
|
-
"""
|
874
|
-
|
875
|
-
name = Column(String, index=True, nullable=False)
|
876
|
-
path = Column(String)
|
877
|
-
domain = Column(String)
|
878
|
-
|
879
|
-
system_id = Column(
|
880
|
-
String, ForeignKey(System.id_field_path, ondelete="CASCADE"), index=True
|
881
|
-
) # If system is deleted, remove the associated cookies.
|
882
|
-
|
883
|
-
privacy_declaration_id = Column(
|
884
|
-
String,
|
885
|
-
ForeignKey(PrivacyDeclaration.id_field_path, ondelete="CASCADE"),
|
886
|
-
index=True,
|
887
|
-
) # If privacy declaration is deleted, remove the associated cookies.
|
888
|
-
|
889
|
-
system = relationship(
|
890
|
-
"System",
|
891
|
-
back_populates="cookies",
|
892
|
-
cascade="all,delete",
|
893
|
-
uselist=False,
|
894
|
-
lazy="selectin",
|
895
|
-
)
|
896
|
-
|
897
|
-
privacy_declaration = relationship(
|
898
|
-
"PrivacyDeclaration",
|
899
|
-
back_populates="cookies",
|
900
|
-
cascade="all,delete",
|
901
|
-
uselist=False,
|
902
|
-
lazy="joined", # Joined is intentional, instead of selectin
|
903
|
-
)
|
904
|
-
|
905
|
-
__table_args__ = (
|
906
|
-
UniqueConstraint(
|
907
|
-
"name", "privacy_declaration_id", name="_cookie_name_privacy_declaration_uc"
|
908
|
-
),
|
909
|
-
UniqueConstraint("name", "system_id", name="_cookie_name_system_uc"),
|
910
|
-
)
|
911
|
-
|
912
|
-
|
913
862
|
def get_system_data_uses(db: Session, include_parents: bool) -> Set:
|
914
863
|
"""Get data uses across all systems and those data uses' parents if include_parents is True
|
915
864
|
|
@@ -20,11 +20,11 @@ class PeriodicIntegrationFrequency(Enum):
|
|
20
20
|
|
21
21
|
class DatahubSchema(ConnectionConfigSecretsSchema):
|
22
22
|
datahub_server_url: AnyHttpUrlStringRemovesSlash = Field(
|
23
|
-
title="DataHub
|
23
|
+
title="DataHub server URL",
|
24
24
|
description="The URL of your DataHub server.",
|
25
25
|
)
|
26
26
|
datahub_token: str = Field(
|
27
|
-
title="DataHub
|
27
|
+
title="DataHub token",
|
28
28
|
description="The token used to authenticate with your DataHub server.",
|
29
29
|
json_schema_extra={"sensitive": True},
|
30
30
|
)
|
@@ -33,7 +33,7 @@ class DatahubSchema(ConnectionConfigSecretsSchema):
|
|
33
33
|
description="The frequency at which the integration should run. Available options are daily, weekly, and monthly.",
|
34
34
|
)
|
35
35
|
glossary_node: str = Field(
|
36
|
-
title="Glossary
|
36
|
+
title="Glossary node",
|
37
37
|
description="The glossary node name to use on Datahub for Fides Data Categories. (e.g. FidesDataCategories)",
|
38
38
|
)
|
39
39
|
|
@@ -31,7 +31,13 @@ class PostgreSQLSchema(ConnectionConfigSecretsSchema):
|
|
31
31
|
description="The password used to authenticate and access the database.",
|
32
32
|
json_schema_extra={"sensitive": True},
|
33
33
|
)
|
34
|
-
|
34
|
+
ssh_required: bool = Field(
|
35
|
+
False,
|
36
|
+
title="SSH required",
|
37
|
+
description="Indicates whether an SSH tunnel is required for the connection. Enable this option if your PostgreSQL server is behind a firewall and requires SSH tunneling for remote connections.",
|
38
|
+
)
|
39
|
+
dbname: Optional[str] = Field(
|
40
|
+
default=None,
|
35
41
|
title="Database",
|
36
42
|
description="The name of the specific database within the database server that you want to connect to.",
|
37
43
|
)
|
@@ -40,15 +46,9 @@ class PostgreSQLSchema(ConnectionConfigSecretsSchema):
|
|
40
46
|
title="Schema",
|
41
47
|
description="The default schema to be used for the database connection (defaults to public).",
|
42
48
|
)
|
43
|
-
ssh_required: bool = Field(
|
44
|
-
False,
|
45
|
-
title="SSH required",
|
46
|
-
description="Indicates whether an SSH tunnel is required for the connection. Enable this option if your PostgreSQL server is behind a firewall and requires SSH tunneling for remote connections.",
|
47
|
-
)
|
48
49
|
|
49
50
|
_required_components: ClassVar[List[str]] = [
|
50
51
|
"host",
|
51
|
-
"dbname",
|
52
52
|
]
|
53
53
|
|
54
54
|
|
@@ -286,12 +286,19 @@ class MessagingServiceDetailsTwilioEmail(BaseModel):
|
|
286
286
|
class MessagingServiceDetailsAWS_SES(BaseModel):
|
287
287
|
"""The details required to represent an AWS SES email configuration."""
|
288
288
|
|
289
|
-
email_from: str
|
290
|
-
domain: str
|
289
|
+
email_from: Optional[str] = None
|
290
|
+
domain: Optional[str] = None
|
291
291
|
aws_region: str
|
292
292
|
|
293
293
|
model_config = ConfigDict(extra="forbid")
|
294
294
|
|
295
|
+
@model_validator(mode="before")
|
296
|
+
@classmethod
|
297
|
+
def validate_fields(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
298
|
+
if not values.get("domain") and not values.get("email_from"):
|
299
|
+
raise ValueError("Either 'email_from' or 'domain' must be provided.")
|
300
|
+
return values
|
301
|
+
|
295
302
|
|
296
303
|
class MessagingServiceSecrets(Enum):
|
297
304
|
"""Enum for message service secrets"""
|