ethyca-fides 2.68.1b1__py2.py3-none-any.whl → 2.68.1b3__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.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/METADATA +3 -1
- {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/RECORD +247 -224
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/3baf42d251a6_add_generic_taxonomy_models.py +239 -0
- fides/api/alembic/migrations/versions/90502bcda282_update_request_tasks_add_polling_async.py +35 -0
- fides/api/api/v1/endpoints/generic_overrides.py +64 -167
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +1 -1
- fides/api/common_exceptions.py +12 -3
- fides/api/db/base.py +6 -0
- fides/api/models/detection_discovery/core.py +6 -0
- fides/api/models/privacy_request/request_task.py +25 -0
- fides/api/models/taxonomy.py +275 -0
- fides/api/schemas/privacy_center_config.py +48 -19
- fides/api/schemas/storage/storage.py +2 -0
- fides/api/service/async_dsr/__init__.py +0 -0
- fides/api/service/async_dsr/async_dsr_service.py +75 -0
- fides/api/service/connectors/saas_connector.py +5 -6
- fides/api/service/deps.py +5 -0
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +6 -4
- fides/api/service/privacy_request/request_service.py +56 -3
- fides/api/service/storage/storage_uploader_service.py +80 -5
- fides/api/service/storage/streaming/__init__.py +42 -0
- fides/api/service/storage/streaming/base_storage_client.py +61 -0
- fides/api/service/storage/streaming/dsr_storage.py +98 -0
- fides/api/service/storage/streaming/retry.py +282 -0
- fides/api/service/storage/streaming/s3/__init__.py +5 -0
- fides/api/service/storage/streaming/s3/s3_storage_client.py +113 -0
- fides/api/service/storage/streaming/s3/streaming_s3.py +196 -0
- fides/api/service/storage/streaming/schemas.py +173 -0
- fides/api/service/storage/streaming/smart_open_client.py +265 -0
- fides/api/service/storage/streaming/smart_open_streaming_storage.py +998 -0
- fides/api/service/storage/streaming/storage_client_factory.py +60 -0
- fides/api/task/graph_task.py +4 -4
- fides/api/task/manual/manual_task_graph_task.py +14 -4
- fides/api/util/connection_type.py +68 -33
- fides/config/execution_settings.py +4 -0
- fides/data/sample_project/docker-compose.yml +3 -3
- fides/service/privacy_request/privacy_request_service.py +1 -9
- fides/service/taxonomy/__init__.py +0 -0
- fides/service/taxonomy/handlers/__init__.py +11 -0
- fides/service/taxonomy/handlers/base.py +42 -0
- fides/service/taxonomy/handlers/legacy_handler.py +95 -0
- fides/service/taxonomy/taxonomy_service.py +261 -0
- fides/service/taxonomy/utils.py +160 -0
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/_BLI2ArqQzY5XnXbrcxa2/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1099-7b2085a3931da9e4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1138-0d846ffef62c580f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1345-ab756811e19ff4fc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1817-c90365325f8a3d75.js → 1817-fd21f1f5ef0faffa.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1975.e5cc7a1ccd477671.js → 1975.16126463309143e3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2921-46f9465c2852a46b.js → 2921-0e5cc63a82e31830.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3620-6cceae71bae5b531.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3729-7d2d52400f1f7413.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3855-64541570e2f838fb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3872-7a18d18a5e287e4e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3923-a33633feba5e655e.js → 3923-5c87b3d7f1626678.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{401-741bb31b586b7c96.js → 401-3902e3e98790d401.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4121-94354b50a41f8497.js → 4121-64ef70ef906bbdd0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4608-70521532195124de.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4786-53ef1662f2d0d98c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4808-8713433c84a62efe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4844-351f99b6644b654e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5258-c6f96dc740eb5fb1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5487-338800277d36b8d7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/549-e6453a3526023e85.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/602-80d113e801d7407d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6084-02abe12327fc3dbc.js → 6084-da63f20d9416a982.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6853-270261ef5537a106.js → 6853-1d947b75eb07188c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-24f9a4f27d67b732.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7476-a0dd03bfccf60d0c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7630-9fbe06cfb98266fe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{787-5ba991cad1f7664a.js → 787-3dd31844cf7fec55.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/79-dcd20e8b09501c17.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/796-8773e04b64ce2260.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8002-dcd02da6e5649a1c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9046-57eab238570b8bf4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9676.bf0a8a6ff6dfd2af.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9826-8c81c97a72510fcf.js → 9826-756c958aecab59a2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9951-cdf73904a3adb27b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-9174cdb70126c2c5.js → 404-dd625a559ada46ca.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-65723cd4b8fc36ac.js → _app-b6b09b2878b77b21.js} +136 -135
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-621416493c89ef01.js → manual-92cf5e313be1f9e2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-0b9908c3e1dfe49e.js → multiple-d6c525ee731a2993.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-5664a3ea796e5ffb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-5bb1b31ae8752250.js → add-vendors-78f13de90111fd80.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-0fc678f3d6d2fcec.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-4e4d9426743b5cb4.js → [id]-126db59dc25ca326.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-d72460348fadcab8.js → privacy-experience-289605267d6cce7e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-3e7ddc252da00c98.js → [id]-e9fd9b28ac9705af.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-35a7c305beee9428.js → new-28c003b6043bd16c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-c643eff04525298e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-ab96939421639153.js → properties-3ef5d01779a26455.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-baa4a2f8f08ac224.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-13240e3ca77acfeb.js → consent-8d4be9e7ec7d2a35.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-aad6047a4604b945.js → [resourceUrn]-f27ec4578c674181.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-bd37b407c80c6986.js → [projectUrn]-27b6c255bd9e73b6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-0f66dac32040519c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-b6b98cea25dd94fa.js → [resourceUrn]-3b938562df81c4b0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-ebf5e7fa4e2ffb49.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b27c660039d951c9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-8ce5d24af470888e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-8e35e33928abbcdc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-21c141279e66237a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-31e6c54794a9883e.js → [resourceUrn]-3bc6a207693fd175.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-2822a423a7ad0550.js → detection-da16e73df395ad1d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-f98dd251babb7e28.js → [resourceUrn]-04b242632a114405.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-56eb4c014f0d96a3.js → discovery-900fe50183a40d72.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-8f88dc31c5144ea8.js → datamap-4f1f7c3a9531a8f4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-343294dcb10d9532.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-1c097a0809fa5b6f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b47fa2498b534719.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-a31f881cab25704a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-858c59c9e67e318d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-67a7fe58b96ea739.js → [id]-16c28d272225afb6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-90a8df230cb89877.js → new-68f502d8b0b5792c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-1eb9acb17b133fd1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-876bfd7210040cec.js → index-fec557d99211f577.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-766e57bcf38b5b1e.js → [id]-e613543818d6cbd2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-8069f7c33695fd45.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-6e796c3fe632280b.js → [id]-4a08ca7762a19700.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-fa0f3841c5bdfdeb.js → add-template-343a965dcdb3d11e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-3ade4c54b1c8a11e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-9103bfb854f71410.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-11503454a62d8d7b.js → AntForm-3b97029bd4d3c3ea.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-a504941807bdb7f1.js → FormikAntFormItem-9d9beb8f0d8a278c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-0119403c8ff97f83.js → FormikControlled-84a4d8fc60f839ed.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-94f6d57d6c94ddf7.js → FormikField-1fccf542ab2e33bf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-ed1a3ae09d72df89.js → forms-aa75263ae1ba67bb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-db334a1cbb102255.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-11c1e4545c8f528c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-192a986f61c23268.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-9216ac993d71387e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-e55ec84d5380401d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-48f447b31c786b80.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-41976b28503623cd.js → [id]-a74b51b704b80cb2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-cb438d8f5ec6007a.js → add-property-8d23f0c55ff6510a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-b6db7036993709b3.js → properties-77acceac4f99e7af.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-4bc3e281409265cc.js → datamap-e60d398e255f4e00.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-6aad3f563ed03b3f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-c1b8f3606d160bb1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-d9f7f78810d58d08.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee2c7dde99b1dafb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-a4dad8ca9de2d07b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-386368bf7cb31771.js → domain-records-31c270d228e00581.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-996b3f250dd3ea1f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-ee94981326ddcbf4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-b41fb5ad277088ab.js → locations-0b831c58966782b8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-94271ba4a224a353.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-a94dfeea43fbca7d.js → regulations-41b8136e50320fd3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-52b45569cbc82e60.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-18b316e2dad73731.js → [id]-36d74e93e54aabaf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-24dfc8e2279ced2e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-d9675cf5e6083b27.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-3237881945acc0ee.js → [id]-866826d7959df487.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-a3a50d9d79066935.js → user-management-e63b61a8f99ccd57.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{webpack-69658aeaf6155d89.js → webpack-6d0a487039bcf30c.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/92441453b27e9c34.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/[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/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
- fides/ui-build/static/admin/lib/fides.js +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/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/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/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.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/203-0c6cadcda98bdd33.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3450-9314e1b15df8a8da.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-4267fd8193e7f525.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-ac5feefd40b61ae3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/409-5bc4369b80a8c11d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4230-1ebc8c0ab293a077.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-a34d7ceff17c2169.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-557fb24665b2e4bf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5309-ffdec884eec79d29.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5574-831167a8da90e2e6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6662-499c189f932a35aa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6780-7d28e030f6516e5d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6882-7cc1d14e27a80c10.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-7784e8d5ad6b8110.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-4de465016d3433b4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-2a5c57787632693d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7725-c79513b04113112b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-98cfab20bb831137.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-0b768155bf20505f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8735-f84afcc50885883c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-97a972cc8a8ed24d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9226-318dadf1c050ecda.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9676.9e6828b42ef05e06.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9951-4df2b67e0def5500.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-18e96ce81dab51a4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-54d7c7310763c66d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-6bc3b73a21576869.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-fe3d6887fecf0f86.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-e4770acf7044e2f5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-0db635c3483c9da8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-0c0e0a7798345541.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-3c56e5fe072a44c6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-53a763e49ce34a74.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-6a90131dcecd694c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-145fe9e4cfcb231d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-8a1e5d140785c1e9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-227b5db4b472a6a7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-8401f17fe5d9a1dc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7d77b3ad069be268.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cfb25b02abb8da71.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-3fdc55d4c129e618.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-8f9c006b6166f002.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-6ba7ae4f26c06cb0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-e8db3ad525e7ddbd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-c14dd24592369467.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-100d7d03930629a8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6f8d1b3ec83cfcf0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-3ce15577435d47cb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-f43a988542813110.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-1ea40fcd6b4268bf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-65c7600fadc6e55a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-33dab986141b3663.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-1195042727c399ed.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-71b98858ecb4e097.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-cf427e04f862b5d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-eabeeec5bf2773c6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-ee56698ae3a6a78b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0e2e98cc38ee5499.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-c32589c86081b750.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-a8f09bf8f3204ca7.js +0 -1
- fides/ui-build/static/admin/_next/static/css/e1628f15dd5f019b.css +0 -1
- fides/ui-build/static/admin/_next/static/tzF4yti8NslASlGnxnZ8m/_buildManifest.js +0 -1
- {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.68.1b1.dist-info → ethyca_fides-2.68.1b3.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{tzF4yti8NslASlGnxnZ8m → _BLI2ArqQzY5XnXbrcxa2}/_ssgManifest.js +0 -0
fides/api/db/base.py
CHANGED
|
@@ -76,6 +76,12 @@ from fides.api.models.storage import StorageConfig
|
|
|
76
76
|
from fides.api.models.system_compass_sync import SystemCompassSync
|
|
77
77
|
from fides.api.models.system_history import SystemHistory
|
|
78
78
|
from fides.api.models.system_manager import SystemManager
|
|
79
|
+
from fides.api.models.taxonomy import (
|
|
80
|
+
Taxonomy,
|
|
81
|
+
TaxonomyAllowedUsage,
|
|
82
|
+
TaxonomyElement,
|
|
83
|
+
TaxonomyUsage,
|
|
84
|
+
)
|
|
79
85
|
from fides.api.models.tcf_publisher_restrictions import (
|
|
80
86
|
TCFConfiguration,
|
|
81
87
|
TCFPublisherRestriction,
|
|
@@ -432,11 +432,17 @@ class StagedResourceAncestor(Base):
|
|
|
432
432
|
|
|
433
433
|
# Execute batch when it reaches the desired size
|
|
434
434
|
if len(current_batch) >= batch_size:
|
|
435
|
+
logger.debug(
|
|
436
|
+
f"Inserting batch of {len(current_batch)} staged resource ancestor links"
|
|
437
|
+
)
|
|
435
438
|
db.execute(stmt_text, current_batch)
|
|
436
439
|
current_batch = []
|
|
437
440
|
|
|
438
441
|
# Execute any remaining items in the final batch
|
|
439
442
|
if current_batch:
|
|
443
|
+
logger.debug(
|
|
444
|
+
f"Inserting batch of {len(current_batch)} staged resource ancestor links"
|
|
445
|
+
)
|
|
440
446
|
db.execute(stmt_text, current_batch)
|
|
441
447
|
|
|
442
448
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from enum import Enum as EnumType
|
|
5
6
|
from typing import TYPE_CHECKING, List, Optional, Tuple
|
|
6
7
|
|
|
7
8
|
from loguru import logger
|
|
@@ -15,6 +16,7 @@ from sqlalchemy_utils.types.encrypted.encrypted_type import (
|
|
|
15
16
|
)
|
|
16
17
|
|
|
17
18
|
from fides.api.db.base_class import Base, JSONTypeOverride # type: ignore[attr-defined]
|
|
19
|
+
from fides.api.db.util import EnumColumn
|
|
18
20
|
from fides.api.graph.config import (
|
|
19
21
|
ROOT_COLLECTION_ADDRESS,
|
|
20
22
|
TERMINATOR_ADDRESS,
|
|
@@ -67,6 +69,24 @@ class TraversalDetails(FidesSchema):
|
|
|
67
69
|
)
|
|
68
70
|
|
|
69
71
|
|
|
72
|
+
class AsyncTaskType(EnumType):
|
|
73
|
+
"""
|
|
74
|
+
Enum for asynchronous RequestTask types
|
|
75
|
+
|
|
76
|
+
These tasks differ from our regular tasks in that they are not finished on the same process that they are created,
|
|
77
|
+
but rather are put into a pause state and then triggered to completion by a different process
|
|
78
|
+
|
|
79
|
+
manual: A task that is manually triggered by the user
|
|
80
|
+
polling: A task that is triggered by a polling mechanism
|
|
81
|
+
callback: A task that is triggered by a callback from an external system
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
manual = "manual"
|
|
86
|
+
polling = "polling"
|
|
87
|
+
callback = "callback"
|
|
88
|
+
|
|
89
|
+
|
|
70
90
|
# TODO: At some point we will refactor this model to store all task types in a common table that links to tables with specific task attributes.
|
|
71
91
|
class RequestTask(WorkerTask, Base):
|
|
72
92
|
"""
|
|
@@ -145,6 +165,11 @@ class RequestTask(WorkerTask, Base):
|
|
|
145
165
|
|
|
146
166
|
# For async tasks awaiting callback
|
|
147
167
|
callback_succeeded = Column(Boolean)
|
|
168
|
+
# to recognize Polling async task
|
|
169
|
+
async_type = Column(
|
|
170
|
+
EnumColumn(AsyncTaskType, native_enum=True),
|
|
171
|
+
nullable=True,
|
|
172
|
+
)
|
|
148
173
|
|
|
149
174
|
# Stores a serialized collection that can be transformed back into a Collection to help
|
|
150
175
|
# execute the current task
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# pylint: disable=protected-access
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Any, Dict, List, Optional, Type
|
|
6
|
+
|
|
7
|
+
from sqlalchemy import (
|
|
8
|
+
BOOLEAN,
|
|
9
|
+
Column,
|
|
10
|
+
ForeignKey,
|
|
11
|
+
ForeignKeyConstraint,
|
|
12
|
+
String,
|
|
13
|
+
Text,
|
|
14
|
+
UniqueConstraint,
|
|
15
|
+
)
|
|
16
|
+
from sqlalchemy.ext.associationproxy import association_proxy
|
|
17
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
18
|
+
from sqlalchemy.orm import RelationshipProperty, Session, relationship
|
|
19
|
+
|
|
20
|
+
from fides.api.common_exceptions import ValidationError
|
|
21
|
+
from fides.api.db.base_class import Base
|
|
22
|
+
from fides.api.models.sql_models import FidesBase # type: ignore[attr-defined]
|
|
23
|
+
|
|
24
|
+
LEGACY_TAXONOMIES = {"data_categories", "data_uses", "data_subjects"}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TargetType(str, Enum):
|
|
28
|
+
"""Enumeration of target types that taxonomies can apply to."""
|
|
29
|
+
|
|
30
|
+
SYSTEM = "system"
|
|
31
|
+
PRIVACY_DECLARATION = "privacy_declaration"
|
|
32
|
+
TAXONOMY = "taxonomy" # For taxonomy-to-taxonomy relationships
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Taxonomy(Base, FidesBase):
|
|
36
|
+
"""The SQL model for taxonomy resources.
|
|
37
|
+
|
|
38
|
+
This is a generic taxonomy model that can be used to create any taxonomy.
|
|
39
|
+
For now we seed the database with the legacy taxonomies (data_category, data use, data subject)
|
|
40
|
+
so that these legacy taxonomy types can be used for allowed usage relationships.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
# Overriding the id definition from Base so we don't treat this as the primary key
|
|
44
|
+
id = Column(
|
|
45
|
+
String(255),
|
|
46
|
+
nullable=False,
|
|
47
|
+
index=False,
|
|
48
|
+
unique=True,
|
|
49
|
+
default=FidesBase.generate_uuid,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# The fides_key is inherited from FidesBase and acts as the primary key
|
|
53
|
+
|
|
54
|
+
# This is private to encourage the use of applies_to (see comment below)
|
|
55
|
+
_allowed_usages: RelationshipProperty[List[TaxonomyAllowedUsage]] = relationship(
|
|
56
|
+
"TaxonomyAllowedUsage",
|
|
57
|
+
back_populates="source_taxonomy",
|
|
58
|
+
cascade="all, delete-orphan",
|
|
59
|
+
lazy="selectin",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Association proxy to simplify access to target_type values
|
|
63
|
+
# This allows getting a list of strings while the actual storage
|
|
64
|
+
# is handled through the TaxonomyAllowedUsage model
|
|
65
|
+
# Updates should be done through the create/update methods
|
|
66
|
+
applies_to: List[str] = association_proxy(
|
|
67
|
+
"_allowed_usages",
|
|
68
|
+
"target_type",
|
|
69
|
+
# Allow setting via strings, the relationship backref will set FK
|
|
70
|
+
creator=lambda target_type: TaxonomyAllowedUsage(target_type=target_type),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def create(
|
|
75
|
+
cls: Type["Taxonomy"],
|
|
76
|
+
db: Session,
|
|
77
|
+
*,
|
|
78
|
+
data: Dict[str, Any],
|
|
79
|
+
check_name: bool = True,
|
|
80
|
+
) -> "Taxonomy":
|
|
81
|
+
"""Create a new Taxonomy with proper handling of applies_to."""
|
|
82
|
+
# Disallow creating taxonomies that represent legacy types
|
|
83
|
+
fides_key = data.get("fides_key")
|
|
84
|
+
if fides_key in LEGACY_TAXONOMIES:
|
|
85
|
+
raise ValidationError(
|
|
86
|
+
f"Cannot create taxonomy '{fides_key}'. This is a taxonomy managed by the system."
|
|
87
|
+
)
|
|
88
|
+
applies_to = data.pop("applies_to", [])
|
|
89
|
+
|
|
90
|
+
# Create the taxonomy
|
|
91
|
+
taxonomy: Taxonomy = super().create(db=db, data=data, check_name=check_name)
|
|
92
|
+
|
|
93
|
+
# Reconcile allowed usages if applies_to was provided
|
|
94
|
+
if applies_to:
|
|
95
|
+
taxonomy._reconcile_allowed_usages(db, applies_to)
|
|
96
|
+
|
|
97
|
+
return cls.persist_obj(db, taxonomy)
|
|
98
|
+
|
|
99
|
+
def update(self, db: Session, *, data: Dict[str, Any]) -> "Taxonomy":
|
|
100
|
+
"""Update a Taxonomy with proper handling of applies_to."""
|
|
101
|
+
applies_to = data.pop("applies_to", None)
|
|
102
|
+
|
|
103
|
+
# Update the base fields
|
|
104
|
+
super().update(db=db, data=data)
|
|
105
|
+
|
|
106
|
+
# If applies_to was provided, reconcile allowed usages
|
|
107
|
+
if applies_to is not None:
|
|
108
|
+
self._reconcile_allowed_usages(db, applies_to)
|
|
109
|
+
|
|
110
|
+
return self
|
|
111
|
+
|
|
112
|
+
def save(self, db: Session) -> "Taxonomy":
|
|
113
|
+
"""Override save to reconcile any direct `applies_to` edits before persisting.
|
|
114
|
+
|
|
115
|
+
This allows callers to mutate `applies_to` via the association proxy and then call save.
|
|
116
|
+
"""
|
|
117
|
+
# Ensure no duplicate target types and reconcile relationship objects to the current values
|
|
118
|
+
self._reconcile_allowed_usages(db, list(self.applies_to))
|
|
119
|
+
return super().save(db) # type: ignore[return-value]
|
|
120
|
+
|
|
121
|
+
def _reconcile_allowed_usages(self, db: Session, applies_to: List[str]) -> None:
|
|
122
|
+
"""Ensure `_allowed_usages` matches the provided `applies_to` list.
|
|
123
|
+
|
|
124
|
+
- Deletes usages not in the provided list
|
|
125
|
+
- Creates usages missing from the relationship
|
|
126
|
+
- Deduplicates by target_type
|
|
127
|
+
"""
|
|
128
|
+
existing_usages = {usage.target_type: usage for usage in self._allowed_usages}
|
|
129
|
+
desired_types = set(applies_to)
|
|
130
|
+
|
|
131
|
+
# Delete usages that should no longer exist
|
|
132
|
+
for target_type in set(existing_usages.keys()) - desired_types:
|
|
133
|
+
# Remove from relationship; delete-orphan cascade will handle DB delete
|
|
134
|
+
self._allowed_usages.remove(existing_usages[target_type])
|
|
135
|
+
|
|
136
|
+
# Add missing usages
|
|
137
|
+
for target_type in desired_types - set(existing_usages.keys()):
|
|
138
|
+
self._allowed_usages.append(TaxonomyAllowedUsage(target_type=target_type))
|
|
139
|
+
|
|
140
|
+
# Deduplicate any accidental duplicates in-memory
|
|
141
|
+
seen: set[str] = set()
|
|
142
|
+
for usage in list(self._allowed_usages):
|
|
143
|
+
if usage.target_type in seen:
|
|
144
|
+
# Remove duplicate from relationship; delete-orphan will handle DB
|
|
145
|
+
self._allowed_usages.remove(usage)
|
|
146
|
+
else:
|
|
147
|
+
seen.add(usage.target_type)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class TaxonomyAllowedUsage(Base):
|
|
151
|
+
"""
|
|
152
|
+
The SQL model for taxonomy allowed usage.
|
|
153
|
+
Defines what types of targets a taxonomy can be applied to.
|
|
154
|
+
|
|
155
|
+
target_type can be either:
|
|
156
|
+
- A generic type: "system", "privacy_declaration", "taxonomy"
|
|
157
|
+
- A taxonomy key: "data_categories", "data_uses", etc.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
@declared_attr
|
|
161
|
+
def __tablename__(self) -> str:
|
|
162
|
+
return "taxonomy_allowed_usage"
|
|
163
|
+
|
|
164
|
+
id = Column(
|
|
165
|
+
String(255),
|
|
166
|
+
nullable=False,
|
|
167
|
+
index=False,
|
|
168
|
+
unique=True,
|
|
169
|
+
default=FidesBase.generate_uuid,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
source_taxonomy: RelationshipProperty[Taxonomy] = relationship(
|
|
173
|
+
"Taxonomy",
|
|
174
|
+
back_populates="_allowed_usages",
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
source_taxonomy_key: Column[str] = Column(
|
|
178
|
+
String,
|
|
179
|
+
ForeignKey("taxonomy.fides_key", ondelete="CASCADE"),
|
|
180
|
+
primary_key=True,
|
|
181
|
+
)
|
|
182
|
+
target_type: Column[str] = Column(
|
|
183
|
+
String, primary_key=True
|
|
184
|
+
) # Can be "system", "dataset", OR a taxonomy key like "data_categories"
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class TaxonomyElement(Base, FidesBase):
|
|
188
|
+
"""
|
|
189
|
+
The SQL model for taxonomy elements.
|
|
190
|
+
|
|
191
|
+
This is a generic taxonomy element model that can be used to create any taxonomy element.
|
|
192
|
+
|
|
193
|
+
As of now the legacy taxonomy elements still exist in their own tables (ctl_data_categories, ctl_data_uses, ctl_data_subjects),
|
|
194
|
+
but we can migrate them to this model in the future if needed.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
@declared_attr
|
|
198
|
+
def __tablename__(self) -> str:
|
|
199
|
+
return "taxonomy_element"
|
|
200
|
+
|
|
201
|
+
id = Column(
|
|
202
|
+
String(255),
|
|
203
|
+
nullable=False,
|
|
204
|
+
index=False,
|
|
205
|
+
unique=True,
|
|
206
|
+
default=FidesBase.generate_uuid,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# Which taxonomy this element belongs to
|
|
210
|
+
taxonomy_type = Column(
|
|
211
|
+
String,
|
|
212
|
+
ForeignKey("taxonomy.fides_key", ondelete="CASCADE"),
|
|
213
|
+
nullable=False,
|
|
214
|
+
index=True,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
parent_key = Column(
|
|
218
|
+
Text, ForeignKey("taxonomy_element.fides_key", ondelete="RESTRICT"), index=True
|
|
219
|
+
)
|
|
220
|
+
active = Column(BOOLEAN, default=True, nullable=False, index=True)
|
|
221
|
+
|
|
222
|
+
children: RelationshipProperty[List[TaxonomyElement]] = relationship(
|
|
223
|
+
"TaxonomyElement",
|
|
224
|
+
back_populates="parent",
|
|
225
|
+
cascade="save-update, merge, refresh-expire", # intentionally do not cascade deletes
|
|
226
|
+
passive_deletes="all",
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
parent: RelationshipProperty[Optional[TaxonomyElement]] = relationship(
|
|
230
|
+
"TaxonomyElement",
|
|
231
|
+
back_populates="children",
|
|
232
|
+
remote_side="TaxonomyElement.fides_key",
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class TaxonomyUsage(Base):
|
|
237
|
+
"""
|
|
238
|
+
The SQL model for taxonomy usage.
|
|
239
|
+
Tracks the application of taxonomy elements to other taxonomy elements.
|
|
240
|
+
|
|
241
|
+
Example: Applying a "high" tag (from sensitivity taxonomy) to "user.contact.email" (from data_categories taxonomy).
|
|
242
|
+
"""
|
|
243
|
+
|
|
244
|
+
@declared_attr
|
|
245
|
+
def __tablename__(self) -> str:
|
|
246
|
+
return "taxonomy_usage"
|
|
247
|
+
|
|
248
|
+
# The taxonomy element being applied (e.g., risk)
|
|
249
|
+
source_element_key = Column(String, nullable=False, index=True)
|
|
250
|
+
|
|
251
|
+
# The taxonomy element it's being applied to (e.g., a data category)
|
|
252
|
+
target_element_key = Column(String, nullable=False, index=True)
|
|
253
|
+
|
|
254
|
+
# Denormalized taxonomy types for validation and performance
|
|
255
|
+
source_taxonomy = Column(String, nullable=False, index=True)
|
|
256
|
+
target_taxonomy = Column(String, nullable=False, index=True)
|
|
257
|
+
|
|
258
|
+
__table_args__ = (
|
|
259
|
+
# Validate that this type of usage is allowed
|
|
260
|
+
ForeignKeyConstraint(
|
|
261
|
+
["source_taxonomy", "target_taxonomy"],
|
|
262
|
+
[
|
|
263
|
+
"taxonomy_allowed_usage.source_taxonomy_key",
|
|
264
|
+
"taxonomy_allowed_usage.target_type",
|
|
265
|
+
],
|
|
266
|
+
ondelete="RESTRICT",
|
|
267
|
+
name="fk_taxonomy_usage_allowed",
|
|
268
|
+
),
|
|
269
|
+
# Prevent duplicate applications
|
|
270
|
+
UniqueConstraint(
|
|
271
|
+
"source_element_key",
|
|
272
|
+
"target_element_key",
|
|
273
|
+
name="uq_taxonomy_usage",
|
|
274
|
+
),
|
|
275
|
+
)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from abc import ABC
|
|
1
2
|
from typing import Any, Dict, List, Literal, Optional, Union
|
|
2
3
|
|
|
3
4
|
from pydantic import ConfigDict, Field, field_validator, model_validator
|
|
@@ -12,22 +13,10 @@ class CustomIdentity(FidesSchema):
|
|
|
12
13
|
label: str
|
|
13
14
|
|
|
14
15
|
|
|
15
|
-
class LocationIdentityField(FidesSchema):
|
|
16
|
-
"""Location field configuration that extends the useful parts of CustomPrivacyRequestField"""
|
|
17
|
-
|
|
18
|
-
label: str
|
|
19
|
-
required: Optional[bool] = True
|
|
20
|
-
default_value: Optional[str] = None
|
|
21
|
-
query_param_key: Optional[str] = None
|
|
22
|
-
ip_geolocation_hint: Optional[bool] = False
|
|
23
|
-
# Note: We intentionally omit 'hidden' field as it doesn't make sense for location identity input
|
|
24
|
-
|
|
25
|
-
|
|
26
16
|
class IdentityInputs(FidesSchema):
|
|
27
17
|
name: Optional[RequiredType] = None
|
|
28
18
|
email: Optional[RequiredType] = None
|
|
29
19
|
phone: Optional[RequiredType] = None
|
|
30
|
-
location: Optional[Union[RequiredType, LocationIdentityField]] = None
|
|
31
20
|
model_config = ConfigDict(extra="allow")
|
|
32
21
|
|
|
33
22
|
def __init__(self, **data: Any):
|
|
@@ -42,13 +31,12 @@ class IdentityInputs(FidesSchema):
|
|
|
42
31
|
f'Custom identity "{field}" must be an instance of CustomIdentity '
|
|
43
32
|
'(e.g. {"label": "Field label"})'
|
|
44
33
|
)
|
|
45
|
-
elif field == "location" and isinstance(value, dict):
|
|
46
|
-
# Handle location field as LocationIdentityField
|
|
47
|
-
data[field] = LocationIdentityField(**value)
|
|
48
34
|
super().__init__(**data)
|
|
49
35
|
|
|
50
36
|
|
|
51
|
-
class
|
|
37
|
+
class BaseCustomPrivacyRequestField(FidesSchema, ABC):
|
|
38
|
+
"""Abstract base class for all custom privacy request fields"""
|
|
39
|
+
|
|
52
40
|
label: str
|
|
53
41
|
required: Optional[bool] = True
|
|
54
42
|
default_value: Optional[str] = None
|
|
@@ -69,6 +57,41 @@ class CustomPrivacyRequestField(FidesSchema):
|
|
|
69
57
|
return values
|
|
70
58
|
|
|
71
59
|
|
|
60
|
+
class CustomPrivacyRequestField(BaseCustomPrivacyRequestField):
|
|
61
|
+
"""Regular custom privacy request field supporting text, select, and multiselect types"""
|
|
62
|
+
|
|
63
|
+
field_type: Optional[Literal["text", "select", "multiselect"]] = None
|
|
64
|
+
options: Optional[List[str]] = None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class LocationCustomPrivacyRequestField(BaseCustomPrivacyRequestField):
|
|
68
|
+
"""Location field that doesn't support options and includes IP geolocation hint"""
|
|
69
|
+
|
|
70
|
+
field_type: Literal["location"] = "location"
|
|
71
|
+
ip_geolocation_hint: Optional[bool] = False
|
|
72
|
+
|
|
73
|
+
@model_validator(mode="before")
|
|
74
|
+
@classmethod
|
|
75
|
+
def validate_location_field(cls, values: Dict[str, Any]) -> Dict[str, Any]:
|
|
76
|
+
# Ensure options is not provided for location fields
|
|
77
|
+
if "options" in values:
|
|
78
|
+
raise ValueError(
|
|
79
|
+
"LocationCustomPrivacyRequestField does not support options"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# This field cannot be hidden
|
|
83
|
+
if values.get("hidden"):
|
|
84
|
+
raise ValueError("Custom location fields cannot be hidden")
|
|
85
|
+
|
|
86
|
+
return values
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Create a simple union type - Pydantic will use the field_type to determine which model to use
|
|
90
|
+
CustomPrivacyRequestFieldUnion = Union[
|
|
91
|
+
LocationCustomPrivacyRequestField, CustomPrivacyRequestField
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
|
|
72
95
|
class PrivacyRequestOption(FidesSchema):
|
|
73
96
|
locations: Optional[Union[List[PrivacyNoticeRegion], Literal["fallback"]]] = None
|
|
74
97
|
policy_key: Optional[str] = None
|
|
@@ -79,7 +102,9 @@ class PrivacyRequestOption(FidesSchema):
|
|
|
79
102
|
confirm_button_text: Optional[str] = Field(alias="confirmButtonText", default=None)
|
|
80
103
|
cancel_button_text: Optional[str] = Field(alias="cancelButtonText", default=None)
|
|
81
104
|
identity_inputs: Optional[IdentityInputs] = None
|
|
82
|
-
custom_privacy_request_fields: Optional[
|
|
105
|
+
custom_privacy_request_fields: Optional[
|
|
106
|
+
Dict[str, CustomPrivacyRequestFieldUnion]
|
|
107
|
+
] = None
|
|
83
108
|
|
|
84
109
|
|
|
85
110
|
class ConsentConfigButton(FidesSchema):
|
|
@@ -89,7 +114,9 @@ class ConsentConfigButton(FidesSchema):
|
|
|
89
114
|
cancel_button_text: Optional[str] = Field(alias="cancelButtonText", default=None)
|
|
90
115
|
icon_path: str
|
|
91
116
|
identity_inputs: IdentityInputs
|
|
92
|
-
custom_privacy_request_fields: Optional[
|
|
117
|
+
custom_privacy_request_fields: Optional[
|
|
118
|
+
Dict[str, CustomPrivacyRequestFieldUnion]
|
|
119
|
+
] = None
|
|
93
120
|
title: str
|
|
94
121
|
modal_title: Optional[str] = Field(alias="modalTitle", default=None)
|
|
95
122
|
|
|
@@ -174,7 +201,9 @@ class PartialPrivacyRequestOption(FidesSchema):
|
|
|
174
201
|
policy_key: str
|
|
175
202
|
title: str
|
|
176
203
|
identity_inputs: Optional[IdentityInputs] = None
|
|
177
|
-
custom_privacy_request_fields: Optional[
|
|
204
|
+
custom_privacy_request_fields: Optional[
|
|
205
|
+
Dict[str, CustomPrivacyRequestFieldUnion]
|
|
206
|
+
] = None
|
|
178
207
|
|
|
179
208
|
|
|
180
209
|
class PartialPrivacyCenterConfig(FidesSchema):
|
|
@@ -37,6 +37,7 @@ class StorageDetails(Enum):
|
|
|
37
37
|
NAMING = "naming"
|
|
38
38
|
MAX_RETRIES = "max_retries"
|
|
39
39
|
AUTH_METHOD = "auth_method"
|
|
40
|
+
ENABLE_STREAMING = "enable_streaming"
|
|
40
41
|
model_config = ConfigDict(extra="forbid")
|
|
41
42
|
|
|
42
43
|
|
|
@@ -58,6 +59,7 @@ class StorageDetailsS3(FileBasedStorageDetails):
|
|
|
58
59
|
auth_method: AWSAuthMethod
|
|
59
60
|
bucket: str
|
|
60
61
|
max_retries: Optional[int] = 0
|
|
62
|
+
enable_streaming: Optional[bool] = False
|
|
61
63
|
model_config = ConfigDict(use_enum_values=True)
|
|
62
64
|
|
|
63
65
|
|
|
File without changes
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from loguru import logger
|
|
2
|
+
from sqlalchemy.orm import Session
|
|
3
|
+
|
|
4
|
+
from fides.api.common_exceptions import PrivacyRequestError
|
|
5
|
+
from fides.api.models.connectionconfig import ConnectionConfig
|
|
6
|
+
from fides.api.models.datasetconfig import DatasetConfig
|
|
7
|
+
from fides.api.models.privacy_request import PrivacyRequest, RequestTask
|
|
8
|
+
from fides.api.schemas.privacy_request import PrivacyRequestStatus
|
|
9
|
+
from fides.api.task.task_resources import TaskResources
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def requeue_polling_request(
|
|
13
|
+
db: Session,
|
|
14
|
+
async_task: RequestTask,
|
|
15
|
+
) -> None:
|
|
16
|
+
"""Re-queue a Privacy request that polls async tasks for a given privacy request"""
|
|
17
|
+
# Check that the privacy request is approved or in processing
|
|
18
|
+
privacy_request: PrivacyRequest = async_task.privacy_request
|
|
19
|
+
|
|
20
|
+
if privacy_request.status not in [
|
|
21
|
+
PrivacyRequestStatus.approved,
|
|
22
|
+
PrivacyRequestStatus.in_processing,
|
|
23
|
+
]:
|
|
24
|
+
raise PrivacyRequestError(
|
|
25
|
+
f"Cannot re-queue privacy request {privacy_request.id} with status {privacy_request.status.value}"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
logger.info(
|
|
29
|
+
"Polling starting for {} task {} {}",
|
|
30
|
+
async_task.action_type,
|
|
31
|
+
async_task.collection_address,
|
|
32
|
+
async_task.id,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
connection_config = get_connection_config_from_task(db, async_task)
|
|
36
|
+
|
|
37
|
+
with TaskResources(
|
|
38
|
+
privacy_request,
|
|
39
|
+
privacy_request.policy,
|
|
40
|
+
[connection_config],
|
|
41
|
+
async_task,
|
|
42
|
+
db,
|
|
43
|
+
) as resources:
|
|
44
|
+
# graph_task: GraphTask = create_graph_task(db, async_task, resources)
|
|
45
|
+
# Currently, upstream tasks and "input keys" (which are built by data dependencies)
|
|
46
|
+
# are the same, but they may not be the same in the future.
|
|
47
|
+
# upstream_tasks = async_task.upstream_tasks_objects(db)
|
|
48
|
+
# upstream_access_data: List[List[Row]] = _build_upstream_access_data(
|
|
49
|
+
# graph_task.execution_node.input_keys, upstream_tasks
|
|
50
|
+
# )
|
|
51
|
+
# TODO: Implement the polling strategy
|
|
52
|
+
logger.info(f"found resources: {resources}")
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def get_connection_config_from_task(
|
|
57
|
+
db: Session, request_task: RequestTask
|
|
58
|
+
) -> ConnectionConfig:
|
|
59
|
+
dataset_config = DatasetConfig.filter(
|
|
60
|
+
db=db,
|
|
61
|
+
conditions=(DatasetConfig.fides_key == request_task.dataset_name),
|
|
62
|
+
).first()
|
|
63
|
+
if not dataset_config:
|
|
64
|
+
raise PrivacyRequestError(
|
|
65
|
+
f"DatasetConfig with fides_key {request_task.dataset_name} not found."
|
|
66
|
+
)
|
|
67
|
+
connection_config = ConnectionConfig.get(
|
|
68
|
+
db=db, object_id=dataset_config.connection_config_id
|
|
69
|
+
)
|
|
70
|
+
if not connection_config:
|
|
71
|
+
raise PrivacyRequestError(
|
|
72
|
+
f"ConnectionConfig with id {dataset_config.connection_config_id} not found."
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return connection_config
|
|
@@ -11,7 +11,7 @@ from sqlalchemy.orm import Session
|
|
|
11
11
|
from starlette.status import HTTP_204_NO_CONTENT
|
|
12
12
|
|
|
13
13
|
from fides.api.common_exceptions import (
|
|
14
|
-
|
|
14
|
+
AwaitingAsyncTask,
|
|
15
15
|
FidesopsException,
|
|
16
16
|
PostProcessingException,
|
|
17
17
|
SkippingConsentPropagation,
|
|
@@ -229,7 +229,6 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
229
229
|
query_config: SaaSQueryConfig = self.query_config(node)
|
|
230
230
|
|
|
231
231
|
# generate initial set of requests if read request is defined, otherwise raise an exception
|
|
232
|
-
|
|
233
232
|
# An endpoint can be defined with multiple 'read' requests if the data for a single
|
|
234
233
|
# collection can be accessed in multiple ways for example:
|
|
235
234
|
#
|
|
@@ -336,8 +335,8 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
336
335
|
if awaiting_async_callback:
|
|
337
336
|
# If a read request was marked to expect async results, original response data here is ignored.
|
|
338
337
|
# We'll instead use the data received in the callback URL later.
|
|
339
|
-
# Raising an
|
|
340
|
-
raise
|
|
338
|
+
# Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
|
|
339
|
+
raise AwaitingAsyncTask()
|
|
341
340
|
|
|
342
341
|
return rows
|
|
343
342
|
|
|
@@ -641,8 +640,8 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
|
|
|
641
640
|
if awaiting_async_callback:
|
|
642
641
|
# Asynchronous masking request detected in saas config.
|
|
643
642
|
# If the masking request was marked to expect async results, original responses are ignored
|
|
644
|
-
# and we raise an
|
|
645
|
-
raise
|
|
643
|
+
# and we raise an AwaitingAsyncTask to put this task in an awaiting_processing state.
|
|
644
|
+
raise AwaitingAsyncTask()
|
|
646
645
|
return rows_updated
|
|
647
646
|
|
|
648
647
|
@staticmethod
|
fides/api/service/deps.py
CHANGED
|
@@ -8,6 +8,7 @@ from fides.service.dataset.dataset_config_service import DatasetConfigService
|
|
|
8
8
|
from fides.service.dataset.dataset_service import DatasetService
|
|
9
9
|
from fides.service.messaging.messaging_service import MessagingService
|
|
10
10
|
from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
|
|
11
|
+
from fides.service.taxonomy.taxonomy_service import TaxonomyService
|
|
11
12
|
from fides.service.user.user_service import UserService
|
|
12
13
|
|
|
13
14
|
|
|
@@ -41,3 +42,7 @@ def get_user_service(
|
|
|
41
42
|
config_proxy: ConfigProxy = Depends(get_config_proxy),
|
|
42
43
|
) -> UserService:
|
|
43
44
|
return UserService(db, config, config_proxy)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_taxonomy_service(db: Session = Depends(get_db)) -> TaxonomyService:
|
|
48
|
+
return TaxonomyService(db)
|
|
@@ -5,13 +5,12 @@ import zipfile
|
|
|
5
5
|
from collections import defaultdict
|
|
6
6
|
from io import BytesIO
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any, Optional
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
9
9
|
|
|
10
10
|
import jinja2
|
|
11
11
|
from jinja2 import Environment, FileSystemLoader
|
|
12
12
|
from loguru import logger
|
|
13
13
|
|
|
14
|
-
from fides.api.models.privacy_request import PrivacyRequest
|
|
15
14
|
from fides.api.schemas.policy import ActionType
|
|
16
15
|
from fides.api.util.storage_util import StorageJSONEncoder, format_size
|
|
17
16
|
|
|
@@ -21,6 +20,9 @@ TEXT_COLOR = "#4A5568"
|
|
|
21
20
|
HEADER_COLOR = "#FAFAFA"
|
|
22
21
|
BORDER_COLOR = "#E2E8F0"
|
|
23
22
|
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from fides.api.models.privacy_request import PrivacyRequest # pragma: no cover
|
|
25
|
+
|
|
24
26
|
|
|
25
27
|
# pylint: disable=too-many-instance-attributes
|
|
26
28
|
class DsrReportBuilder:
|
|
@@ -42,7 +44,7 @@ class DsrReportBuilder:
|
|
|
42
44
|
|
|
43
45
|
def __init__(
|
|
44
46
|
self,
|
|
45
|
-
privacy_request: PrivacyRequest,
|
|
47
|
+
privacy_request: "PrivacyRequest",
|
|
46
48
|
dsr_data: dict[str, Any],
|
|
47
49
|
):
|
|
48
50
|
"""
|
|
@@ -387,7 +389,7 @@ class DsrReportBuilder:
|
|
|
387
389
|
return self.baos
|
|
388
390
|
|
|
389
391
|
|
|
390
|
-
def _map_privacy_request(privacy_request: PrivacyRequest) -> dict[str, Any]:
|
|
392
|
+
def _map_privacy_request(privacy_request: "PrivacyRequest") -> dict[str, Any]:
|
|
391
393
|
"""Creates a map with a subset of values from the privacy request"""
|
|
392
394
|
request_data: dict[str, Any] = {}
|
|
393
395
|
request_data["id"] = privacy_request.id
|