ethyca-fides 2.70.4b0__py2.py3-none-any.whl → 2.70.4rc0__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.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/METADATA +3 -3
- {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/RECORD +199 -205
- fides/_version.py +3 -3
- fides/api/db/crud.py +2 -30
- fides/api/db/database.py +1 -1
- fides/api/migrations/post_upgrade_index_creation.py +0 -10
- fides/api/models/detection_discovery/__init__.py +0 -2
- fides/api/models/detection_discovery/core.py +0 -11
- fides/api/models/manual_task/conditional_dependency.py +77 -21
- fides/api/models/policy.py +0 -24
- fides/api/models/privacy_notice.py +26 -6
- fides/api/models/privacy_request/privacy_request.py +0 -68
- fides/api/models/privacy_request/webhook.py +1 -3
- fides/api/oauth/roles.py +0 -2
- fides/api/schemas/privacy_request.py +2 -4
- fides/api/schemas/user.py +2 -2
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +2 -2
- fides/api/service/storage/streaming/smart_open_streaming_storage.py +28 -36
- fides/api/service/storage/util.py +102 -11
- fides/api/task/manual/manual_task_utils.py +6 -5
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/{gAyR6aUQCeUTA_oMVYpBp → FsUI1o1jlJ3c5YMu0fXdv}/_buildManifest.js +1 -1
- fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-0b6e114658b15eaa.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7725-fdc4298dfbea6f80.js → 7725-dd6736855807936a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-de41f80e35acbde0.js → _app-cbfaf762a0d853be.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b0e3f1886de28d66.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-9f6c82e14ff2cad2.js → [id]-8b13bb5f7bee61c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-ebc9c90fe99ee68d.js → integrations-6f109ef64304ef59.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-f8e3f63bea43db3b.js → [id]-8566e3b7b2a632fa.js} +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/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/messaging-providers/[key].html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/api/alembic/migrations/versions/a8e0c016afd_add_classification_benchmark_table.py +0 -126
- fides/api/alembic/migrations/versions/cd8649be3a2b_add_classifications_and_user_assigned_.py +0 -74
- fides/api/db/safe_crud.py +0 -377
- fides/api/models/conditional_dependency/__init__.py +0 -0
- fides/api/models/conditional_dependency/conditional_dependency_base.py +0 -82
- fides/api/models/detection_discovery/classification_benchmark.py +0 -140
- fides/ui-build/static/admin/_next/static/chunks/155-047c3806cc41295e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3d03cd31cd99fa07.js +0 -1
- {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{gAyR6aUQCeUTA_oMVYpBp → FsUI1o1jlJ3c5YMu0fXdv}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-7888473b3dc28cda.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1817-dbde9966025d7970.js → 1817-ee9e29a6b8c4af50.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-ab6212a3074f34f9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-c25dc8d1b0e1aee1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3700-865408b36fbee782.js → 3700-dc3f05d21e2a5ff6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3872-04d3afbfa41a7782.js → 3872-3514b712afd683c0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4608-a9941d0c236ebca1.js → 4608-b22905c65f61db15.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{502-d3ecae97b67befbd.js → 502-a40d39e615f7b664.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5185-51eaa78e3ed6bfb7.js → 5185-33f50cf9ae17b42e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5574-c31ea831371610d5.js → 5574-b8c4cba5a6938c00.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5783-8f5713517ebc35f3.js → 5783-8de76df87af55e98.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6084-dc473a58c3e2889b.js → 6084-2cd165179c428a6f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6416-0ccadfefcdad00cc.js → 6416-264aadc6b336ee0a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6882-10296485ec326e6b.js → 6882-447f15e87b8c48a5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6954-4b24e1731c1cc3b3.js → 6954-599f2de2c902e9b2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7158-04745cc8d684b2e7.js → 7158-835ba42fd881d8dd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7630-d0d3a0fe3f95e971.js → 7630-e7ea13be69c118a1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{796-876998c86754da97.js → 796-e07ac2c543f569e3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{8002-ed832921ad190832.js → 8002-25fd174aec9b077b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9226-4a7027057f55ca2a.js → 9226-2f960b7ca530642a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-c02be5882205bbbc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-16ecb33f09224fbb.js → manual-939253f8daf349b2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2ca59996860a33c5.js → multiple-83ed7da0bb90b0a5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-caff552fce501f82.js → add-systems-f90aa48500c1cbde.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-46b88bda3d7b15c5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-259ad2e10fe6f413.js → configure-c0db068d1863222f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-7e78616b7b048978.js → privacy-experience-92a337ee96845af2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-9c23fbe813c997d0.js → [id]-1fd2cda8707314f6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-0e5e38bbcfe59fd2.js → new-2987e397445713c5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-3ff2fd2570f02f1c.js → privacy-notices-59a8aff5935482ec.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-e5a33654a2dfaf35.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-06a08970907ed3f0.js → [resourceUrn]-293c1f2d9aefb447.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-4a1af12d2d7cd660.js → [projectUrn]-6a4b0d49dcbf17a8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-99573a1ee3ef8f4c.js → projects-be7b385073f22414.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-4c84d952bb1db690.js → [resourceUrn]-18501152fa1e4f40.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-6e429b7511028d60.js → resources-af80fdca3bbdc82f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-56fd0f3e465e52b6.js → data-catalog-351caadeef03876a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-b74dfaf4f4126e57.js → [monitorId]-e8ec4080d9a3e22f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-040813022f0890c9.js → action-center-1554afcb8b9da2ab.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-0497f3ffdb632516.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-a780390da99f3e43.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-65dc7f5a2ce3eae7.js → [resourceUrn]-1901c26cdde820da.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-4d378516817cf00b.js → discovery-0cea22af5929c81f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-4a05303416dcb657.js → datamap-619f27c745188adb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-d4031e438c363fff.js → [...subfieldNames]-ef71f387fbbab425.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-9463af37079762d0.js → [collectionName]-d790553662caf5c3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-60a4a9eb4aab4c11.js → [datasetId]-cb63db8594fe8dc1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-910e28bce6a98f3d.js → new-78e052c8f95110c4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-108630926347724e.js → dataset-d6d7ee8bd8858a8a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-5119e6602507157f.js → [id]-cc149157d290a94d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cda4e7b5b888e17c.js → new-4c9fb068a5561658.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-223c2d1ded51bfb1.js → datastore-connection-a832084ce294f8af.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-269b8f81546dad66.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-e8d2140787045acd.js → [id]-d8c5c03fb2f31d65.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-e3f93462a08251bf.js → add-template-0e0c06e3c8aabe02.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-b5f7d6afdecd013d.js → messaging-3f15804cf9625f01.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-329333a88f3826eb.js → table-migration-e551fccfcaae76e7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-648d775d0fce49dc.js → storage-1b38b656807ed0cd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-b00532a0ad4f6927.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-1eeb320867dbebf4.js → privacy-requests-2c82cf73d20416f2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-322a01e2bceab3fb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-777ed2d73812043d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-1ae1257f5b388924.js → consent-55e36839d219a503.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-c2f1376aca192114.js → custom-fields-26ce8fc493993765.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-586505df9d853f1f.js → domain-records-7ddf9d992fe714a6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-a3275554ffe8e640.js → domains-7c78ae51f0dd7102.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-05ffbda19ab894b9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-77fb85bdd0be42b5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-8df31428446a6a96.js → [key]-b0d93bf478bf63ee.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-af1471bf4571d5d3.js → new-084f9756b9987285.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{messaging-providers-8d92be437793c96f.js → messaging-providers-6c51ffd46bb598e7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-44456bfe54ac4ad5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-8cbdfd08e0fa88fb.js → privacy-requests-fbe7e8030d837aed.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-2866ac99faa5a542.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-2deb6becece69d46.js → test-datasets-a86bafe1b4e1205f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-589952aa1a31c33d.js → [id]-1895c6a13b543436.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{systems-916238dcc0596957.js → systems-d266cc062b56beb2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-616f5a7cbb99e46d.js → taxonomy-07848c232d960f6a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-6304dad2c5fab694.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-ff4711db191099cd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-82fcf1151e2fe2ba.js} +0 -0
fides/_version.py
CHANGED
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-09-
|
|
11
|
+
"date": "2025-09-23T16:27:51-0300",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.70.
|
|
14
|
+
"full-revisionid": "297be85ff113f65b9ea9f21f31da8bda9326d5dd",
|
|
15
|
+
"version": "2.70.4rc0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
fides/api/db/crud.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
Contains all of the generic CRUD endpoints that can be
|
|
3
|
+
generated programmatically for each resource.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from collections import defaultdict
|
|
@@ -18,7 +18,6 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
18
18
|
from sqlalchemy.future import select
|
|
19
19
|
from sqlalchemy.sql import Select
|
|
20
20
|
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
|
|
21
|
-
from typing_extensions import deprecated
|
|
22
21
|
|
|
23
22
|
from fides.api.models.sql_models import ( # type: ignore[attr-defined]
|
|
24
23
|
CustomField,
|
|
@@ -33,9 +32,6 @@ T = TypeVar("T", bound="FidesBase")
|
|
|
33
32
|
|
|
34
33
|
|
|
35
34
|
# CRUD Functions
|
|
36
|
-
@deprecated(
|
|
37
|
-
"This function uses a manual session.begin() which can lead to unexpected transaction handling. Use create_resource from safe_crud instead."
|
|
38
|
-
)
|
|
39
35
|
async def create_resource(
|
|
40
36
|
sql_model: Type[T], resource_dict: Dict, async_session: AsyncSession
|
|
41
37
|
) -> T:
|
|
@@ -70,9 +66,6 @@ async def create_resource(
|
|
|
70
66
|
return await get_resource(sql_model, resource_dict["fides_key"], async_session)
|
|
71
67
|
|
|
72
68
|
|
|
73
|
-
@deprecated(
|
|
74
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use get_custom_fields_filtered from safe_crud instead."
|
|
75
|
-
)
|
|
76
69
|
async def get_custom_fields_filtered(
|
|
77
70
|
async_session: AsyncSession,
|
|
78
71
|
resource_types_to_ids: Dict[ResourceTypes, List[str]] = defaultdict(list),
|
|
@@ -118,9 +111,6 @@ async def get_custom_fields_filtered(
|
|
|
118
111
|
raise sa_error
|
|
119
112
|
|
|
120
113
|
|
|
121
|
-
@deprecated(
|
|
122
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use get_resource from safe_crud instead."
|
|
123
|
-
)
|
|
124
114
|
async def get_resource(
|
|
125
115
|
sql_model: Type[T],
|
|
126
116
|
fides_key: str,
|
|
@@ -152,9 +142,6 @@ async def get_resource(
|
|
|
152
142
|
return sql_resource
|
|
153
143
|
|
|
154
144
|
|
|
155
|
-
@deprecated(
|
|
156
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use get_resource_with_custom_fields from safe_crud instead."
|
|
157
|
-
)
|
|
158
145
|
async def get_resource_with_custom_fields(
|
|
159
146
|
sql_model: Type[T], fides_key: str, async_session: AsyncSession
|
|
160
147
|
) -> Dict[str, Any]:
|
|
@@ -206,9 +193,6 @@ async def get_resource_with_custom_fields(
|
|
|
206
193
|
return resource_dict
|
|
207
194
|
|
|
208
195
|
|
|
209
|
-
@deprecated(
|
|
210
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use list_resource from safe_crud instead."
|
|
211
|
-
)
|
|
212
196
|
async def list_resource(sql_model: Type[T], async_session: AsyncSession) -> List[T]:
|
|
213
197
|
"""
|
|
214
198
|
Get a list of all of the resources of this type from the database.
|
|
@@ -219,9 +203,6 @@ async def list_resource(sql_model: Type[T], async_session: AsyncSession) -> List
|
|
|
219
203
|
return await list_resource_query(async_session, query, sql_model)
|
|
220
204
|
|
|
221
205
|
|
|
222
|
-
@deprecated(
|
|
223
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use list_resource_query from safe_crud instead."
|
|
224
|
-
)
|
|
225
206
|
async def list_resource_query(
|
|
226
207
|
async_session: AsyncSession, query: Select, sql_model: Type[T]
|
|
227
208
|
) -> List[T]:
|
|
@@ -244,9 +225,6 @@ async def list_resource_query(
|
|
|
244
225
|
return sql_resources
|
|
245
226
|
|
|
246
227
|
|
|
247
|
-
@deprecated(
|
|
248
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use update_resource from safe_crud instead."
|
|
249
|
-
)
|
|
250
228
|
async def update_resource(
|
|
251
229
|
sql_model: Type[T], resource_dict: Dict, async_session: AsyncSession
|
|
252
230
|
) -> Dict:
|
|
@@ -273,9 +251,6 @@ async def update_resource(
|
|
|
273
251
|
return await get_resource(sql_model, resource_dict["fides_key"], async_session)
|
|
274
252
|
|
|
275
253
|
|
|
276
|
-
@deprecated(
|
|
277
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use upsert_resources from safe_crud instead."
|
|
278
|
-
)
|
|
279
254
|
async def upsert_resources(
|
|
280
255
|
sql_model: Type[T], resource_dicts: List[Dict], async_session: AsyncSession
|
|
281
256
|
) -> Tuple[int, int]:
|
|
@@ -325,9 +300,6 @@ async def upsert_resources(
|
|
|
325
300
|
raise sa_error
|
|
326
301
|
|
|
327
302
|
|
|
328
|
-
@deprecated(
|
|
329
|
-
"This function uses manual session.begin() which can lead to unexpected transaction handling. Use delete_resource from safe_crud instead."
|
|
330
|
-
)
|
|
331
303
|
async def delete_resource(
|
|
332
304
|
sql_model: Type[T], fides_key: str, async_session: AsyncSession
|
|
333
305
|
) -> T:
|
fides/api/db/database.py
CHANGED
|
@@ -159,5 +159,5 @@ def check_missing_migrations(database_url: str) -> None:
|
|
|
159
159
|
result = command.autogen.compare_metadata(migration_context, Base.metadata) # type: ignore[attr-defined]
|
|
160
160
|
|
|
161
161
|
if result:
|
|
162
|
-
raise SystemExit("
|
|
162
|
+
raise SystemExit("Migrations needs to be generated!")
|
|
163
163
|
print("No migrations need to be generated.")
|
|
@@ -153,16 +153,6 @@ TABLE_OBJECT_MAP: Dict[str, List[Dict[str, str]]] = {
|
|
|
153
153
|
"statement": "CREATE INDEX CONCURRENTLY ix_stagedresource_system_vendor_consent ON stagedresource (system_id, vendor_id, (meta->>'consent_aggregated'))",
|
|
154
154
|
"type": "index",
|
|
155
155
|
},
|
|
156
|
-
{
|
|
157
|
-
"name": "idx_stagedresource_user_categories_gin",
|
|
158
|
-
"statement": "CREATE INDEX CONCURRENTLY idx_stagedresource_user_categories_gin ON stagedresource USING GIN (user_assigned_data_categories)",
|
|
159
|
-
"type": "index",
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
"name": "idx_stagedresource_classifications_gin",
|
|
163
|
-
"statement": "CREATE INDEX CONCURRENTLY idx_stagedresource_classifications_gin ON stagedresource USING GIN (classifications)",
|
|
164
|
-
"type": "index",
|
|
165
|
-
},
|
|
166
156
|
],
|
|
167
157
|
}
|
|
168
158
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from .classification_benchmark import ClassificationBenchmark
|
|
2
1
|
from .core import (
|
|
3
2
|
DiffStatus,
|
|
4
3
|
MonitorConfig,
|
|
@@ -19,7 +18,6 @@ from .monitor_task import (
|
|
|
19
18
|
)
|
|
20
19
|
|
|
21
20
|
__all__ = [
|
|
22
|
-
"ClassificationBenchmark",
|
|
23
21
|
"DiffStatus",
|
|
24
22
|
"MonitorConfig",
|
|
25
23
|
"MonitorExecution",
|
|
@@ -599,17 +599,6 @@ class StagedResource(Base):
|
|
|
599
599
|
"vendor_id",
|
|
600
600
|
text("(meta->>'consent_aggregated')"),
|
|
601
601
|
),
|
|
602
|
-
# GIN indices for array operations (&&, @>, <@)
|
|
603
|
-
Index(
|
|
604
|
-
"idx_stagedresource_classifications_gin",
|
|
605
|
-
"classifications",
|
|
606
|
-
postgresql_using="gin",
|
|
607
|
-
),
|
|
608
|
-
Index(
|
|
609
|
-
"idx_stagedresource_user_categories_gin",
|
|
610
|
-
"user_assigned_data_categories",
|
|
611
|
-
postgresql_using="gin",
|
|
612
|
-
),
|
|
613
602
|
)
|
|
614
603
|
|
|
615
604
|
@classmethod
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
from
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import TYPE_CHECKING, Optional, Union
|
|
2
3
|
|
|
3
|
-
from sqlalchemy import Column, ForeignKey, Index, String
|
|
4
|
+
from sqlalchemy import Column, ForeignKey, Index, Integer, String
|
|
5
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
4
6
|
from sqlalchemy.ext.declarative import declared_attr
|
|
5
7
|
from sqlalchemy.orm import Session, relationship
|
|
6
8
|
|
|
7
|
-
from fides.api.db.base_class import FidesBase
|
|
8
|
-
from fides.api.
|
|
9
|
-
ConditionalDependencyBase,
|
|
10
|
-
ConditionalDependencyType,
|
|
11
|
-
)
|
|
9
|
+
from fides.api.db.base_class import Base, FidesBase
|
|
10
|
+
from fides.api.db.util import EnumColumn
|
|
12
11
|
from fides.api.task.conditional_dependencies.schemas import (
|
|
13
12
|
ConditionGroup,
|
|
14
13
|
ConditionLeaf,
|
|
@@ -18,16 +17,42 @@ if TYPE_CHECKING:
|
|
|
18
17
|
from fides.api.models.manual_task.manual_task import ManualTask
|
|
19
18
|
|
|
20
19
|
|
|
21
|
-
class
|
|
22
|
-
"""
|
|
20
|
+
class ManualTaskConditionalDependencyType(str, Enum):
|
|
21
|
+
"""Enum for manual task conditional dependency types.
|
|
22
|
+
|
|
23
|
+
This enum defines the two types of nodes in a conditional dependency tree:
|
|
24
|
+
|
|
25
|
+
- leaf: A terminal node that represents a single condition (e.g., "user.age >= 18")
|
|
26
|
+
- group: A non-terminal node that groups multiple conditions with logical operators (AND/OR)
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
leaf: Used for simple field comparisons like:
|
|
30
|
+
- "user.name exists"
|
|
31
|
+
- "user.age >= 18"
|
|
32
|
+
- "billing.subscription.status == 'active'"
|
|
33
|
+
|
|
34
|
+
group: Used to combine multiple conditions with logical operators:
|
|
35
|
+
- AND group: "user.age >= 18 AND user.active == true"
|
|
36
|
+
- OR group: "user.role == 'admin' OR user.verified == true"
|
|
37
|
+
- Nested groups: "(user.age >= 18 AND (user.role == 'admin' OR user.verified == true))"
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
leaf = "leaf"
|
|
41
|
+
group = "group"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ManualTaskConditionalDependency(Base):
|
|
45
|
+
"""Model for storing conditional dependencies."""
|
|
23
46
|
|
|
24
47
|
@declared_attr
|
|
25
48
|
def __tablename__(cls) -> str:
|
|
49
|
+
"""Overriding base class method to set the table name."""
|
|
26
50
|
return "manual_task_conditional_dependency"
|
|
27
51
|
|
|
28
52
|
# We need to redefine it here so that self-referential relationships
|
|
29
53
|
# can properly reference the `id` column instead of the built-in Python function.
|
|
30
54
|
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
|
55
|
+
|
|
31
56
|
# Foreign key relationships
|
|
32
57
|
manual_task_id = Column(
|
|
33
58
|
String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
|
|
@@ -38,6 +63,18 @@ class ManualTaskConditionalDependency(ConditionalDependencyBase):
|
|
|
38
63
|
nullable=True,
|
|
39
64
|
)
|
|
40
65
|
|
|
66
|
+
# Condition metadata
|
|
67
|
+
condition_type = Column(
|
|
68
|
+
EnumColumn(ManualTaskConditionalDependencyType), nullable=False
|
|
69
|
+
) # leaf or group
|
|
70
|
+
field_address = Column(String, nullable=True) # For leaf conditions
|
|
71
|
+
operator = Column(String, nullable=True) # For leaf conditions
|
|
72
|
+
value = Column(JSONB, nullable=True) # For leaf conditions
|
|
73
|
+
logical_operator = Column(String, nullable=True) # 'and' or 'or' for groups
|
|
74
|
+
|
|
75
|
+
# Ordering
|
|
76
|
+
sort_order = Column(Integer, nullable=False, default=0)
|
|
77
|
+
|
|
41
78
|
__table_args__ = (
|
|
42
79
|
Index("ix_manual_task_conditional_dependency_manual_task_id", "manual_task_id"),
|
|
43
80
|
Index("ix_manual_task_conditional_dependency_parent_id", "parent_id"),
|
|
@@ -60,20 +97,38 @@ class ManualTaskConditionalDependency(ConditionalDependencyBase):
|
|
|
60
97
|
foreign_keys=[parent_id],
|
|
61
98
|
)
|
|
62
99
|
|
|
100
|
+
def to_condition_leaf(self) -> ConditionLeaf:
|
|
101
|
+
"""Convert to ConditionLeaf if this is a leaf condition"""
|
|
102
|
+
if self.condition_type != "leaf":
|
|
103
|
+
raise ValueError("Cannot convert group condition to leaf")
|
|
104
|
+
|
|
105
|
+
return ConditionLeaf(
|
|
106
|
+
field_address=self.field_address, operator=self.operator, value=self.value
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def to_condition_group(self) -> ConditionGroup:
|
|
110
|
+
"""Convert to ConditionGroup if this is a group condition"""
|
|
111
|
+
if self.condition_type != "group":
|
|
112
|
+
raise ValueError("Cannot convert leaf condition to group")
|
|
113
|
+
|
|
114
|
+
# Recursively build children
|
|
115
|
+
child_conditions = []
|
|
116
|
+
children_list = [child for child in self.children] # type: ignore[attr-defined]
|
|
117
|
+
for child in sorted(children_list, key=lambda x: x.sort_order):
|
|
118
|
+
if child.condition_type == "leaf":
|
|
119
|
+
child_conditions.append(child.to_condition_leaf())
|
|
120
|
+
else:
|
|
121
|
+
child_conditions.append(child.to_condition_group())
|
|
122
|
+
|
|
123
|
+
return ConditionGroup(
|
|
124
|
+
logical_operator=self.logical_operator, conditions=child_conditions
|
|
125
|
+
)
|
|
126
|
+
|
|
63
127
|
@classmethod
|
|
64
128
|
def get_root_condition(
|
|
65
|
-
cls, db: Session,
|
|
129
|
+
cls, db: Session, manual_task_id: str
|
|
66
130
|
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
67
|
-
"""Get the root condition for a
|
|
68
|
-
|
|
69
|
-
Args:
|
|
70
|
-
db: Database session
|
|
71
|
-
manual_task_id: ID of the manual task (first positional arg)
|
|
72
|
-
"""
|
|
73
|
-
if not args:
|
|
74
|
-
raise ValueError("manual_task_id is required as first positional argument")
|
|
75
|
-
|
|
76
|
-
manual_task_id = args[0]
|
|
131
|
+
"""Get the root condition for a config"""
|
|
77
132
|
root = (
|
|
78
133
|
db.query(cls)
|
|
79
134
|
.filter(cls.manual_task_id == manual_task_id, cls.parent_id.is_(None))
|
|
@@ -83,6 +138,7 @@ class ManualTaskConditionalDependency(ConditionalDependencyBase):
|
|
|
83
138
|
if not root:
|
|
84
139
|
return None
|
|
85
140
|
|
|
86
|
-
if root.condition_type ==
|
|
141
|
+
if root.condition_type == "leaf":
|
|
87
142
|
return root.to_condition_leaf()
|
|
143
|
+
|
|
88
144
|
return root.to_condition_group()
|
fides/api/models/policy.py
CHANGED
|
@@ -177,30 +177,6 @@ class Policy(Base):
|
|
|
177
177
|
for category in node.get_data_categories()
|
|
178
178
|
)
|
|
179
179
|
|
|
180
|
-
def to_safe_dict(self) -> Dict[str, Any]:
|
|
181
|
-
"""
|
|
182
|
-
Returns a dictionary representation of the Policy, excluding sensitive information.
|
|
183
|
-
"""
|
|
184
|
-
return {
|
|
185
|
-
"id": self.id,
|
|
186
|
-
"name": self.name,
|
|
187
|
-
"key": self.key,
|
|
188
|
-
"drp_action": self.drp_action.value if self.drp_action else None, # type: ignore[attr-defined]
|
|
189
|
-
"execution_timeframe": self.execution_timeframe,
|
|
190
|
-
"client_id": self.client_id,
|
|
191
|
-
"rules": [
|
|
192
|
-
{
|
|
193
|
-
"id": rule.id,
|
|
194
|
-
"name": rule.name,
|
|
195
|
-
"key": rule.key,
|
|
196
|
-
"action_type": rule.action_type.value,
|
|
197
|
-
"masking_strategy": rule.masking_strategy,
|
|
198
|
-
"storage_destination_id": rule.storage_destination_id,
|
|
199
|
-
}
|
|
200
|
-
for rule in self.rules # type: ignore[attr-defined]
|
|
201
|
-
],
|
|
202
|
-
}
|
|
203
|
-
|
|
204
180
|
|
|
205
181
|
def _get_ref_from_taxonomy(
|
|
206
182
|
fides_key: FidesKey,
|
|
@@ -41,7 +41,7 @@ class UserConsentPreference(Enum):
|
|
|
41
41
|
tcf = "tcf" # Overall preference set for TCF where there are numerous preferences under the single notice
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
class ConsentMechanism(
|
|
44
|
+
class ConsentMechanism(Enum):
|
|
45
45
|
"""
|
|
46
46
|
Enum is not formalized in the DB because it may be subject to frequent change
|
|
47
47
|
"""
|
|
@@ -191,16 +191,36 @@ class PrivacyNotice(PrivacyNoticeBase, Base):
|
|
|
191
191
|
|
|
192
192
|
@property
|
|
193
193
|
def cookies(self) -> List[Asset]:
|
|
194
|
-
"""
|
|
194
|
+
"""
|
|
195
|
+
Return the privacy notice's assets of type 'cookie'.
|
|
196
|
+
Cookies are matched to the privacy notice if they have at least one data use
|
|
197
|
+
that is either an exact match or a hierarchical descendant of a one of the
|
|
198
|
+
data uses in the privacy notice.
|
|
199
|
+
"""
|
|
195
200
|
db = Session.object_session(self)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
201
|
+
|
|
202
|
+
if not self.data_uses:
|
|
203
|
+
return []
|
|
204
|
+
|
|
205
|
+
# Use array overlap operator (&&) for exact matches - GIN index friendly
|
|
206
|
+
exact_matches_condition = Asset.data_uses.op("&&")(self.data_uses)
|
|
207
|
+
|
|
208
|
+
# For hierarchical children, we still need to check individual elements with LIKE
|
|
209
|
+
# They have to match the data_use and the period separator, so we know it's a hierarchical descendant
|
|
210
|
+
hierarchical_conditions = [
|
|
211
|
+
text(
|
|
212
|
+
f"EXISTS(SELECT 1 FROM unnest(data_uses) AS data_use WHERE data_use LIKE :pattern_{i})"
|
|
213
|
+
).bindparams(**{f"pattern_{i}": f"{data_use}.%"})
|
|
214
|
+
for i, data_use in enumerate(self.data_uses)
|
|
199
215
|
]
|
|
200
216
|
|
|
217
|
+
asset_matching_condition = or_(
|
|
218
|
+
exact_matches_condition, *hierarchical_conditions
|
|
219
|
+
)
|
|
220
|
+
|
|
201
221
|
query = db.query(Asset).filter(
|
|
202
222
|
Asset.asset_type == "Cookie",
|
|
203
|
-
|
|
223
|
+
asset_matching_condition,
|
|
204
224
|
)
|
|
205
225
|
|
|
206
226
|
return query.all()
|
|
@@ -261,12 +261,6 @@ class PrivacyRequest(
|
|
|
261
261
|
foreign_keys=[reviewed_by],
|
|
262
262
|
)
|
|
263
263
|
|
|
264
|
-
submitter = relationship(
|
|
265
|
-
FidesUser,
|
|
266
|
-
backref=backref("submitted_privacy_requests", passive_deletes=True),
|
|
267
|
-
foreign_keys=[submitted_by],
|
|
268
|
-
)
|
|
269
|
-
|
|
270
264
|
pre_approval_webhook_replies = relationship(
|
|
271
265
|
PreApprovalWebhookReply,
|
|
272
266
|
back_populates="privacy_request",
|
|
@@ -361,64 +355,6 @@ class PrivacyRequest(
|
|
|
361
355
|
|
|
362
356
|
return super().create(db=db, data=data, check_name=check_name)
|
|
363
357
|
|
|
364
|
-
def to_safe_dict(self) -> Dict[str, Any]:
|
|
365
|
-
"""
|
|
366
|
-
Return a dict representation of the PrivacyRequest, excluding any fields
|
|
367
|
-
that may contain sensitive information.
|
|
368
|
-
"""
|
|
369
|
-
return {
|
|
370
|
-
"id": self.id,
|
|
371
|
-
"external_id": self.external_id,
|
|
372
|
-
"status": self.status.value,
|
|
373
|
-
"requested_at": (
|
|
374
|
-
self.requested_at.isoformat() if self.requested_at else None
|
|
375
|
-
),
|
|
376
|
-
"started_processing_at": (
|
|
377
|
-
self.started_processing_at.isoformat()
|
|
378
|
-
if self.started_processing_at
|
|
379
|
-
else None
|
|
380
|
-
),
|
|
381
|
-
"finished_processing_at": (
|
|
382
|
-
self.finished_processing_at.isoformat()
|
|
383
|
-
if self.finished_processing_at
|
|
384
|
-
else None
|
|
385
|
-
),
|
|
386
|
-
"reviewed_at": self.reviewed_at.isoformat() if self.reviewed_at else None,
|
|
387
|
-
"reviewed_by": self.reviewed_by,
|
|
388
|
-
"finalized_at": (
|
|
389
|
-
self.finalized_at.isoformat() if self.finalized_at else None
|
|
390
|
-
),
|
|
391
|
-
"finalized_by": self.finalized_by,
|
|
392
|
-
"submitted_by": self.submitted_by,
|
|
393
|
-
"custom_privacy_request_fields_approved_by": (
|
|
394
|
-
self.custom_privacy_request_fields_approved_by
|
|
395
|
-
),
|
|
396
|
-
"identity_verified_at": (
|
|
397
|
-
self.identity_verified_at.isoformat()
|
|
398
|
-
if self.identity_verified_at
|
|
399
|
-
else None
|
|
400
|
-
),
|
|
401
|
-
"custom_privacy_request_fields_approved_at": (
|
|
402
|
-
self.custom_privacy_request_fields_approved_at.isoformat()
|
|
403
|
-
if self.custom_privacy_request_fields_approved_at
|
|
404
|
-
else None
|
|
405
|
-
),
|
|
406
|
-
"client_id": self.client_id,
|
|
407
|
-
"origin": self.origin,
|
|
408
|
-
"policy_id": self.policy_id,
|
|
409
|
-
"policy": self.policy.to_safe_dict() if self.policy else None,
|
|
410
|
-
"property_id": self.property_id,
|
|
411
|
-
"cancel_reason": self.cancel_reason,
|
|
412
|
-
"canceled_at": self.canceled_at.isoformat() if self.canceled_at else None,
|
|
413
|
-
"consent_preferences": self.consent_preferences,
|
|
414
|
-
"source": self.source.value if self.source else None,
|
|
415
|
-
"paused_at": self.paused_at.isoformat() if self.paused_at else None,
|
|
416
|
-
"due_date": self.due_date.isoformat() if self.due_date else None,
|
|
417
|
-
"days_left": self.days_left,
|
|
418
|
-
"custom_fields": self.get_persisted_custom_privacy_request_fields() if self.custom_fields else None, # type: ignore[attr-defined]
|
|
419
|
-
"location": self.location,
|
|
420
|
-
}
|
|
421
|
-
|
|
422
358
|
def clear_cached_values(self) -> None:
|
|
423
359
|
"""
|
|
424
360
|
Clears all cached values associated with this privacy request from Redis.
|
|
@@ -967,8 +903,6 @@ class PrivacyRequest(
|
|
|
967
903
|
callback_type=CallbackType.pre_approval,
|
|
968
904
|
identity=self.get_cached_identity_data(),
|
|
969
905
|
policy_action=policy_action,
|
|
970
|
-
privacy_request=self.to_safe_dict(),
|
|
971
|
-
timestamp=datetime.utcnow(),
|
|
972
906
|
)
|
|
973
907
|
headers = {
|
|
974
908
|
"reply-to-approve": f"/privacy-request/{self.id}/pre-approve/eligible",
|
|
@@ -1009,8 +943,6 @@ class PrivacyRequest(
|
|
|
1009
943
|
callback_type=webhook.prefix,
|
|
1010
944
|
identity=self.get_cached_identity_data(),
|
|
1011
945
|
policy_action=policy_action,
|
|
1012
|
-
privacy_request=self.to_safe_dict(),
|
|
1013
|
-
timestamp=datetime.utcnow(),
|
|
1014
946
|
)
|
|
1015
947
|
|
|
1016
948
|
headers = {}
|
|
@@ -5,7 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import json
|
|
6
6
|
from datetime import datetime
|
|
7
7
|
from enum import Enum as EnumType
|
|
8
|
-
from typing import
|
|
8
|
+
from typing import Optional
|
|
9
9
|
|
|
10
10
|
from pydantic import BaseModel, ConfigDict
|
|
11
11
|
|
|
@@ -51,8 +51,6 @@ class SecondPartyRequestFormat(BaseModel):
|
|
|
51
51
|
identity: Identity
|
|
52
52
|
policy_action: Optional[ActionType] = None
|
|
53
53
|
model_config = ConfigDict(use_enum_values=True)
|
|
54
|
-
privacy_request: Dict[str, Any]
|
|
55
|
-
timestamp: datetime
|
|
56
54
|
|
|
57
55
|
|
|
58
56
|
def generate_request_callback_resume_jwe(webhook: PolicyPreWebhook) -> str:
|
fides/api/oauth/roles.py
CHANGED
|
@@ -26,7 +26,6 @@ from fides.common.api.scope_registry import (
|
|
|
26
26
|
PRIVACY_EXPERIENCE_READ,
|
|
27
27
|
PRIVACY_NOTICE_READ,
|
|
28
28
|
PRIVACY_REQUEST_CALLBACK_RESUME,
|
|
29
|
-
PRIVACY_REQUEST_CREATE,
|
|
30
29
|
PRIVACY_REQUEST_DELETE,
|
|
31
30
|
PRIVACY_REQUEST_EMAIL_INTEGRATIONS_SEND,
|
|
32
31
|
PRIVACY_REQUEST_MANUAL_STEPS_RESPOND,
|
|
@@ -89,7 +88,6 @@ approver_scopes = [
|
|
|
89
88
|
PRIVACY_REQUEST_UPLOAD_DATA,
|
|
90
89
|
PRIVACY_REQUEST_VIEW_DATA,
|
|
91
90
|
PRIVACY_REQUEST_DELETE,
|
|
92
|
-
PRIVACY_REQUEST_CREATE, # allows approvers to create new privacy requests
|
|
93
91
|
USER_READ, # allows approver to view user management table and update their own password
|
|
94
92
|
PRIVACY_REQUEST_MANUAL_STEPS_REVIEW, # allows approvers to see all manual steps
|
|
95
93
|
]
|
|
@@ -14,7 +14,7 @@ from fides.api.schemas.base_class import FidesSchema
|
|
|
14
14
|
from fides.api.schemas.policy import ActionType, CurrentStep
|
|
15
15
|
from fides.api.schemas.policy import PolicyResponse as PolicySchema
|
|
16
16
|
from fides.api.schemas.redis_cache import CustomPrivacyRequestField, Identity
|
|
17
|
-
from fides.api.schemas.user import
|
|
17
|
+
from fides.api.schemas.user import PrivacyRequestReviewer
|
|
18
18
|
from fides.api.util.collection_util import Row
|
|
19
19
|
from fides.api.util.encryption.aes_gcm_encryption_scheme import verify_encryption_key
|
|
20
20
|
from fides.api.util.enums import ColumnSort
|
|
@@ -316,9 +316,7 @@ class PrivacyRequestResponse(FidesSchema):
|
|
|
316
316
|
started_processing_at: Optional[datetime] = None
|
|
317
317
|
reviewed_at: Optional[datetime] = None
|
|
318
318
|
reviewed_by: Optional[str] = None
|
|
319
|
-
|
|
320
|
-
reviewer: Optional[PrivacyRequestUser] = None
|
|
321
|
-
submitter: Optional[PrivacyRequestUser] = None
|
|
319
|
+
reviewer: Optional[PrivacyRequestReviewer] = None
|
|
322
320
|
finished_processing_at: Optional[datetime] = None
|
|
323
321
|
identity_verified_at: Optional[datetime] = None
|
|
324
322
|
paused_at: Optional[datetime] = None
|
fides/api/schemas/user.py
CHANGED
|
@@ -10,8 +10,8 @@ from fides.api.schemas.base_class import FidesSchema
|
|
|
10
10
|
from fides.api.schemas.oauth import AccessToken
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
class
|
|
14
|
-
"""Data we can expose via PrivacyRequest
|
|
13
|
+
class PrivacyRequestReviewer(FidesSchema):
|
|
14
|
+
"""Data we can expose via the PrivacyRequest.reviewer relation"""
|
|
15
15
|
|
|
16
16
|
id: str
|
|
17
17
|
username: str
|
|
@@ -26,7 +26,7 @@ from fides.api.service.storage.util import (
|
|
|
26
26
|
is_attachment_field,
|
|
27
27
|
process_attachment_naming,
|
|
28
28
|
process_attachments_contextually,
|
|
29
|
-
|
|
29
|
+
resolve_directory_from_context,
|
|
30
30
|
)
|
|
31
31
|
from fides.api.util.storage_util import StorageJSONEncoder, format_size
|
|
32
32
|
from fides.config import CONFIG
|
|
@@ -226,7 +226,7 @@ class DSRReportBuilder:
|
|
|
226
226
|
file_size = format_attachment_size(attachment.get("file_size"))
|
|
227
227
|
|
|
228
228
|
# Determine the actual directory for this attachment based on its context
|
|
229
|
-
actual_directory =
|
|
229
|
+
actual_directory = resolve_directory_from_context(attachment, directory)
|
|
230
230
|
|
|
231
231
|
# Generate attachment URL using shared utility with actual storage path
|
|
232
232
|
download_url = attachment.get("download_url")
|