ethyca-fides 2.68.1b2__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.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/METADATA +3 -1
- {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/RECORD +231 -216
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/90502bcda282_update_request_tasks_add_polling_async.py +35 -0
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +1 -1
- fides/api/common_exceptions.py +12 -3
- fides/api/models/detection_discovery/core.py +6 -0
- fides/api/models/privacy_request/request_task.py +25 -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/privacy_request/dsr_package/dsr_report_builder.py +6 -4
- fides/api/service/privacy_request/request_service.py +50 -2
- 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 +3 -4
- fides/config/execution_settings.py +4 -0
- fides/service/privacy_request/privacy_request_service.py +1 -9
- 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-2c10f6b217b7978b.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]-4e286a1e501a0c73.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/{a72179b1754aadd3.css → 92441453b27e9c34.css} +1 -1
- 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/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-58827eb86516931f.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-709bcb0bc6a5382d.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/qvk5eMANVfwYkdURE7fgG/_buildManifest.js +0 -1
- {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.68.1b2.dist-info → ethyca_fides-2.68.1b3.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{qvk5eMANVfwYkdURE7fgG → _BLI2ArqQzY5XnXbrcxa2}/_ssgManifest.js +0 -0
fides/_version.py
CHANGED
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-08-
|
|
11
|
+
"date": "2025-08-25T16:34:15-0600",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.68.
|
|
14
|
+
"full-revisionid": "05d56cc8111caa00faea2dd8433a36fd4d5b7a8a",
|
|
15
|
+
"version": "2.68.1b3"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Update Request Tasks
|
|
2
|
+
|
|
3
|
+
Revision ID: 90502bcda282
|
|
4
|
+
Revises: 3baf42d251a6
|
|
5
|
+
Create Date: 2025-08-05 16:31:45.335384
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
|
|
12
|
+
# revision identifiers, used by Alembic.
|
|
13
|
+
revision = "90502bcda282"
|
|
14
|
+
down_revision = "3baf42d251a6"
|
|
15
|
+
branch_labels = None
|
|
16
|
+
depends_on = None
|
|
17
|
+
|
|
18
|
+
async_task_type = sa.Enum("manual", "polling", "callback", name="asynctasktype")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade():
|
|
22
|
+
async_task_type.create(op.get_bind(), checkfirst=True)
|
|
23
|
+
op.add_column(
|
|
24
|
+
"requesttask",
|
|
25
|
+
sa.Column(
|
|
26
|
+
"async_type",
|
|
27
|
+
async_task_type,
|
|
28
|
+
nullable=True,
|
|
29
|
+
),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def downgrade():
|
|
34
|
+
op.drop_column("requesttask", "async_type")
|
|
35
|
+
async_task_type.drop(op.get_bind(), checkfirst=True)
|
|
@@ -50,6 +50,7 @@ from fides.api.common_exceptions import (
|
|
|
50
50
|
IdentityVerificationException,
|
|
51
51
|
ManualWebhookFieldsUnset,
|
|
52
52
|
NoCachedManualWebhookEntry,
|
|
53
|
+
PrivacyRequestError,
|
|
53
54
|
TraversalError,
|
|
54
55
|
ValidationError,
|
|
55
56
|
)
|
|
@@ -175,7 +176,6 @@ from fides.service.dataset.dataset_config_service import (
|
|
|
175
176
|
)
|
|
176
177
|
from fides.service.messaging.messaging_service import MessagingService
|
|
177
178
|
from fides.service.privacy_request.privacy_request_service import (
|
|
178
|
-
PrivacyRequestError,
|
|
179
179
|
PrivacyRequestService,
|
|
180
180
|
_process_privacy_request_restart,
|
|
181
181
|
_requeue_privacy_request,
|
fides/api/common_exceptions.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import List
|
|
3
|
+
from typing import Dict, List, Optional
|
|
4
4
|
|
|
5
5
|
from fastapi import HTTPException, status
|
|
6
6
|
from starlette.status import (
|
|
@@ -175,8 +175,8 @@ class RequestTaskNotFound(BaseException):
|
|
|
175
175
|
"""Privacy Request Task Not Found"""
|
|
176
176
|
|
|
177
177
|
|
|
178
|
-
class
|
|
179
|
-
"""Request Task is Awaiting Processing - Awaiting Async Task
|
|
178
|
+
class AwaitingAsyncTask(BaseException):
|
|
179
|
+
"""Request Task is Awaiting Processing - Awaiting Async Task"""
|
|
180
180
|
|
|
181
181
|
|
|
182
182
|
class UpstreamTasksNotReady(BaseException):
|
|
@@ -373,6 +373,15 @@ class InvalidScopeError(HTTPException):
|
|
|
373
373
|
)
|
|
374
374
|
|
|
375
375
|
|
|
376
|
+
class PrivacyRequestError(Exception):
|
|
377
|
+
"""Base exception for privacy request operations."""
|
|
378
|
+
|
|
379
|
+
def __init__(self, message: str, data: Optional[Dict] = None):
|
|
380
|
+
self.message = message
|
|
381
|
+
self.data = data
|
|
382
|
+
super().__init__(message)
|
|
383
|
+
|
|
384
|
+
|
|
376
385
|
class KeyOrNameAlreadyExists(Exception):
|
|
377
386
|
"""A resource already exists with this key or name."""
|
|
378
387
|
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -11,12 +11,13 @@ from sqlalchemy import text
|
|
|
11
11
|
from sqlalchemy.orm import Session
|
|
12
12
|
from sqlalchemy.sql.elements import TextClause
|
|
13
13
|
|
|
14
|
-
from fides.api.common_exceptions import PrivacyRequestNotFound
|
|
14
|
+
from fides.api.common_exceptions import PrivacyRequestError, PrivacyRequestNotFound
|
|
15
15
|
from fides.api.models.privacy_request import (
|
|
16
16
|
EXITED_EXECUTION_LOG_STATUSES,
|
|
17
17
|
PrivacyRequest,
|
|
18
18
|
RequestTask,
|
|
19
19
|
)
|
|
20
|
+
from fides.api.models.privacy_request.request_task import AsyncTaskType
|
|
20
21
|
from fides.api.models.worker_task import ExecutionLogStatus
|
|
21
22
|
from fides.api.schemas.drp_privacy_request import DrpPrivacyRequestCreate
|
|
22
23
|
from fides.api.schemas.policy import ActionType
|
|
@@ -43,6 +44,7 @@ from fides.config import CONFIG
|
|
|
43
44
|
PRIVACY_REQUEST_STATUS_CHANGE_POLL = "privacy_request_status_change_poll"
|
|
44
45
|
DSR_DATA_REMOVAL = "dsr_data_removal"
|
|
45
46
|
INTERRUPTED_TASK_REQUEUE_POLL = "interrupted_task_requeue_poll"
|
|
47
|
+
ASYNC_TASKS_STATUS_POLLING = "async_tasks_status_polling"
|
|
46
48
|
|
|
47
49
|
|
|
48
50
|
def build_required_privacy_request_kwargs(
|
|
@@ -357,6 +359,27 @@ def initiate_interrupted_task_requeue_poll() -> None:
|
|
|
357
359
|
)
|
|
358
360
|
|
|
359
361
|
|
|
362
|
+
def initiate_async_tasks_status_polling() -> None:
|
|
363
|
+
"""Initiates scheduler to check for and requeue pending polling async tasks"""
|
|
364
|
+
if CONFIG.test_mode:
|
|
365
|
+
return
|
|
366
|
+
|
|
367
|
+
assert (
|
|
368
|
+
scheduler.running
|
|
369
|
+
), "Scheduler is not running! Cannot add async tasks status polling job."
|
|
370
|
+
|
|
371
|
+
logger.info("Initiating scheduler for async tasks status polling")
|
|
372
|
+
scheduler.add_job(
|
|
373
|
+
func=poll_async_tasks_status,
|
|
374
|
+
trigger="interval",
|
|
375
|
+
kwargs={},
|
|
376
|
+
id=ASYNC_TASKS_STATUS_POLLING,
|
|
377
|
+
coalesce=True,
|
|
378
|
+
replace_existing=True,
|
|
379
|
+
seconds=CONFIG.execution.async_tasks_status_polling_interval_seconds,
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
|
|
360
383
|
def get_cached_task_id(entity_id: str) -> Optional[str]:
|
|
361
384
|
"""Gets the cached task ID for a privacy request or request task by ID.
|
|
362
385
|
|
|
@@ -465,7 +488,6 @@ def _handle_privacy_request_requeue(
|
|
|
465
488
|
)
|
|
466
489
|
|
|
467
490
|
from fides.service.privacy_request.privacy_request_service import ( # pylint: disable=cyclic-import
|
|
468
|
-
PrivacyRequestError,
|
|
469
491
|
_requeue_privacy_request,
|
|
470
492
|
)
|
|
471
493
|
|
|
@@ -662,3 +684,29 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
|
|
|
662
684
|
# Requeue the privacy request if needed
|
|
663
685
|
if should_requeue:
|
|
664
686
|
_handle_privacy_request_requeue(db, privacy_request)
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
@celery_app.task(base=DatabaseTask, bind=True)
|
|
690
|
+
def poll_async_tasks_status(self: DatabaseTask) -> None:
|
|
691
|
+
"""
|
|
692
|
+
Poll the status of async tasks that are awaiting processing.
|
|
693
|
+
"""
|
|
694
|
+
|
|
695
|
+
with self.get_new_session() as db:
|
|
696
|
+
logger.debug("Polling for async tasks status")
|
|
697
|
+
|
|
698
|
+
# Get all tasks that are awaiting processing and are from polling async tasks
|
|
699
|
+
async_tasks = (
|
|
700
|
+
db.query(RequestTask)
|
|
701
|
+
.filter(RequestTask.status == ExecutionLogStatus.awaiting_processing)
|
|
702
|
+
.filter(RequestTask.async_type == AsyncTaskType.polling)
|
|
703
|
+
.all()
|
|
704
|
+
)
|
|
705
|
+
if async_tasks:
|
|
706
|
+
logger.debug(f"Found {len(async_tasks)} async tasks to poll")
|
|
707
|
+
from fides.api.service.async_dsr.async_dsr_service import ( # pylint: disable=cyclic-import
|
|
708
|
+
requeue_polling_request,
|
|
709
|
+
)
|
|
710
|
+
|
|
711
|
+
for async_task in async_tasks:
|
|
712
|
+
requeue_polling_request(db, async_task)
|