ethyca-fides 2.70.5rc0__py2.py3-none-any.whl → 2.71.0__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.5rc0.dist-info → ethyca_fides-2.71.0.dist-info}/METADATA +5 -3
- {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0.dist-info}/RECORD +239 -217
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/0eef0016cf06_adding_oauth2_config_for_.py +69 -0
- fides/api/alembic/migrations/versions/9e0dcbf67b9f_add_digest_config.py +84 -0
- fides/api/alembic/migrations/versions/a8e0c016afd_add_classification_benchmark_table.py +126 -0
- fides/api/alembic/migrations/versions/cd8649be3a2b_add_classifications_and_user_assigned_.py +74 -0
- fides/api/alembic/migrations/versions/e2cda8d6abc3_add_dismissed_in_activity_view_to_.py +29 -0
- fides/api/api/v1/endpoints/connection_endpoints.py +153 -2
- fides/api/api/v1/endpoints/privacy_request_endpoints.py +18 -2
- fides/api/db/base.py +2 -0
- fides/api/db/crud.py +30 -2
- fides/api/db/database.py +1 -1
- fides/api/db/safe_crud.py +377 -0
- fides/api/migrations/post_upgrade_index_creation.py +10 -0
- fides/api/models/conditional_dependency/__init__.py +0 -0
- fides/api/models/conditional_dependency/conditional_dependency_base.py +82 -0
- fides/api/models/connection_oauth_credentials.py +57 -0
- fides/api/models/connectionconfig.py +7 -0
- fides/api/models/detection_discovery/__init__.py +2 -0
- fides/api/models/detection_discovery/classification_benchmark.py +140 -0
- fides/api/models/detection_discovery/core.py +11 -0
- fides/api/models/detection_discovery/monitor_task.py +2 -1
- fides/api/models/digest/__init__.py +10 -0
- fides/api/models/digest/conditional_dependencies.py +9 -0
- fides/api/models/digest/digest_config.py +76 -0
- fides/api/models/manual_task/conditional_dependency.py +21 -77
- fides/api/models/policy.py +24 -0
- fides/api/models/privacy_notice.py +1 -1
- fides/api/models/privacy_request/privacy_request.py +68 -0
- fides/api/models/privacy_request/webhook.py +3 -1
- fides/api/oauth/roles.py +2 -0
- fides/api/schemas/connection_configuration/connection_oauth_config.py +42 -0
- fides/api/schemas/privacy_request.py +5 -2
- fides/api/schemas/user.py +2 -2
- fides/api/service/connectors/http_connector.py +48 -12
- fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +2 -2
- fides/api/service/storage/streaming/smart_open_streaming_storage.py +36 -28
- fides/api/service/storage/util.py +11 -102
- fides/api/task/conditional_dependencies/sql_schemas.py +301 -0
- fides/api/task/conditional_dependencies/sql_translator.py +757 -0
- fides/api/task/manual/manual_task_utils.py +5 -6
- fides/common/api/v1/urn_registry.py +1 -0
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/155-047c3806cc41295e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3700-dc3f05d21e2a5ff6.js → 3700-08e0703b1ef770da.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{504-afd3588f1908ac33.js → 504-88caa30c03374e9b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5643-10a36584c399526c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-0b6e114658b15eaa.js → 7476-d055aa931da47ac0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-a4e3c999afb28ee7.js → _app-a77584f9ad3334af.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-939253f8daf349b2.js → manual-75e99306393938e8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-293c1f2d9aefb447.js → [resourceUrn]-2fa4b3a58f75f81d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-18501152fa1e4f40.js → [resourceUrn]-5b31e3d7727b917a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2e1e2b7808d3b21f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-e8ec4080d9a3e22f.js → [monitorId]-0d512528b498d75c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-1901c26cdde820da.js → [resourceUrn]-5525cf287d4ab493.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-0cea22af5929c81f.js → discovery-ed4723e1b67d890e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-619f27c745188adb.js → datamap-15616bea02397ef4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-cc149157d290a94d.js → [id]-816e02b6cbe4a684.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-4c9fb068a5561658.js → new-b6838162200141b3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-8b13bb5f7bee61c6.js → [id]-01e025f878ba806c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-6f109ef64304ef59.js → integrations-14120a529d7dac27.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-8566e3b7b2a632fa.js → [id]-7dac2302f573f5ee.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-2c82cf73d20416f2.js → privacy-requests-7af00f72cf694077.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-5b423687e227ad4d.js → datamap-f7753e9effae3816.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-bd1042a0e9be6aff.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-469ad83c8cfa1290.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-5edfec10a945ca43.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-b0d93bf478bf63ee.js → [key]-77239269acc2d31a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-084f9756b9987285.js → new-8bf1821722b082e9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-1895c6a13b543436.js → [id]-547c6ef0ad52b85d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{systems-d266cc062b56beb2.js → systems-0f1d833282f09684.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-a8cfa7de4948b374.js +1 -0
- fides/ui-build/static/admin/_next/static/css/64fac6fb884435c2.css +1 -0
- fides/ui-build/static/admin/_next/static/t-PRt7eeD3YslOxniAZyz/_buildManifest.js +1 -0
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +1 -1
- fides/ui-build/static/admin/lib/fides.js +1 -1
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/poc/table-migration.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/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/[id].html +1 -0
- fides/ui-build/static/admin/settings/custom-fields/new.html +1 -0
- 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/ui-build/static/admin/_next/static/PZe9jkBWNOGDEEZ4Y_Rvq/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3550-d04125c828d591a1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7725-dd6736855807936a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9951-651d521d9a02b6df.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b0e3f1886de28d66.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-26ce8fc493993765.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-07848c232d960f6a.js +0 -1
- fides/ui-build/static/admin/_next/static/css/1866822702989bb3.css +0 -1
- {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1115-7888473b3dc28cda.js → 1115-90baef2a89f361ad.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1817-ee9e29a6b8c4af50.js → 1817-ca6473f31a67a804.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2040-ab6212a3074f34f9.js → 2040-fdecc41a18e40bdc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3585-451504ea5ed7a1ea.js → 3585-efd5d41f08e180c4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3696-c25dc8d1b0e1aee1.js → 3696-90c8b336bbc46782.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3872-3514b712afd683c0.js → 3872-04d3afbfa41a7782.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3923-a551756b413367ea.js → 3923-98bea73b618292aa.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4608-b22905c65f61db15.js → 4608-a9941d0c236ebca1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{502-a40d39e615f7b664.js → 502-d3ecae97b67befbd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5185-33f50cf9ae17b42e.js → 5185-51eaa78e3ed6bfb7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5574-b8c4cba5a6938c00.js → 5574-c31ea831371610d5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5783-8de76df87af55e98.js → 5783-d119cb132abd8a91.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6084-2cd165179c428a6f.js → 6084-d0943ee628bf4388.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6416-264aadc6b336ee0a.js → 6416-0ccadfefcdad00cc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6882-447f15e87b8c48a5.js → 6882-10296485ec326e6b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6954-599f2de2c902e9b2.js → 6954-4b24e1731c1cc3b3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7158-835ba42fd881d8dd.js → 7158-04745cc8d684b2e7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7630-e7ea13be69c118a1.js → 7630-d0d3a0fe3f95e971.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{796-e07ac2c543f569e3.js → 796-02086581996a0548.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{8002-25fd174aec9b077b.js → 8002-ed832921ad190832.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9226-2f960b7ca530642a.js → 9226-4a7027057f55ca2a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9826-c02be5882205bbbc.js → 9826-ccedc28e978ca9e1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-83ed7da0bb90b0a5.js → multiple-2ca59996860a33c5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-f90aa48500c1cbde.js → add-systems-58920afe2b67f952.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-46b88bda3d7b15c5.js → add-vendors-7a258b7ecd6da4b8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-c0db068d1863222f.js → configure-fb5017ff5fa54fcc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-92a337ee96845af2.js → privacy-experience-92182be6603c2842.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-1fd2cda8707314f6.js → [id]-9c23fbe813c997d0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2987e397445713c5.js → new-0e5e38bbcfe59fd2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-59a8aff5935482ec.js → privacy-notices-ab54b19609bff325.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-e5a33654a2dfaf35.js → consent-d2bf72508c3cad55.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-6a4b0d49dcbf17a8.js → [projectUrn]-4a1af12d2d7cd660.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-be7b385073f22414.js → projects-99573a1ee3ef8f4c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-af80fdca3bbdc82f.js → resources-6e429b7511028d60.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-351caadeef03876a.js → data-catalog-56fd0f3e465e52b6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-1554afcb8b9da2ab.js → action-center-040813022f0890c9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-0497f3ffdb632516.js → [resourceUrn]-844a8de0d1b506e2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-a780390da99f3e43.js → detection-11b07cf2d91b17ef.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-ef71f387fbbab425.js → [...subfieldNames]-d4031e438c363fff.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-d790553662caf5c3.js → [collectionName]-9463af37079762d0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-cb63db8594fe8dc1.js → [datasetId]-60a4a9eb4aab4c11.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-78e052c8f95110c4.js → new-ea198c4a7869f402.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-d6d7ee8bd8858a8a.js → dataset-0e3a6ac4797ffbbb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-a832084ce294f8af.js → datastore-connection-223c2d1ded51bfb1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{index-269b8f81546dad66.js → index-b74d1e8608ae5b5d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-d8c5c03fb2f31d65.js → [id]-e8d2140787045acd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-0e0c06e3c8aabe02.js → add-template-e3f93462a08251bf.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-3f15804cf9625f01.js → messaging-b5f7d6afdecd013d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-e551fccfcaae76e7.js → table-migration-29fb7b39f8962650.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-1b38b656807ed0cd.js → storage-648d775d0fce49dc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-b00532a0ad4f6927.js → configure-8f577df28ebca869.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-322a01e2bceab3fb.js → [id]-57a75c7e9659271a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-777ed2d73812043d.js → add-property-8964c2300206bc89.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-55e36839d219a503.js → consent-e5d781b28f8e29c8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-7ddf9d992fe714a6.js → domain-records-744f669431b84f71.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-7c78ae51f0dd7102.js → domains-a3275554ffe8e640.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-05ffbda19ab894b9.js → email-templates-604790638c656fbd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-77fb85bdd0be42b5.js → locations-be2a885150adc133.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{messaging-providers-6c51ffd46bb598e7.js → messaging-providers-8d92be437793c96f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-44456bfe54ac4ad5.js → organization-3c86162afe9759df.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-fbe7e8030d837aed.js → privacy-requests-8cbdfd08e0fa88fb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-2866ac99faa5a542.js → regulations-4fe3b90747d885e5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-a86bafe1b4e1205f.js → test-datasets-2deb6becece69d46.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-6304dad2c5fab694.js → new-629c88e90699369b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-ff4711db191099cd.js → [id]-98f737e735eaa0f0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-82fcf1151e2fe2ba.js → user-management-562624e5461083ec.js} +0 -0
- /fides/ui-build/static/admin/_next/static/{PZe9jkBWNOGDEEZ4Y_Rvq → t-PRt7eeD3YslOxniAZyz}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Database model for classification benchmark results.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
from sqlalchemy import ARRAY, Column, ForeignKey, String
|
|
11
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
12
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
13
|
+
from sqlalchemy.ext.mutable import MutableDict
|
|
14
|
+
from sqlalchemy.orm import Query, RelationshipProperty, Session, relationship
|
|
15
|
+
|
|
16
|
+
from fides.api.db.base_class import Base, FidesBase
|
|
17
|
+
from fides.api.models.detection_discovery.core import MonitorConfig
|
|
18
|
+
from fides.api.models.sql_models import Dataset # type: ignore[attr-defined]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ClassificationBenchmark(Base, FidesBase):
|
|
22
|
+
"""
|
|
23
|
+
Database model for storing classification benchmark results.
|
|
24
|
+
|
|
25
|
+
This model stores the results of classification accuracy benchmarks that compare
|
|
26
|
+
system-assigned classifications on staged resources with ground truth data from datasets.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
@declared_attr
|
|
30
|
+
def __tablename__(self) -> str:
|
|
31
|
+
return "classification_benchmark"
|
|
32
|
+
|
|
33
|
+
# Foreign key relationships
|
|
34
|
+
monitor_config_key = Column(
|
|
35
|
+
String,
|
|
36
|
+
ForeignKey(MonitorConfig.key, ondelete="CASCADE"),
|
|
37
|
+
nullable=False,
|
|
38
|
+
index=True,
|
|
39
|
+
)
|
|
40
|
+
dataset_fides_key = Column(
|
|
41
|
+
String,
|
|
42
|
+
ForeignKey(Dataset.fides_key, ondelete="CASCADE"),
|
|
43
|
+
nullable=False,
|
|
44
|
+
index=True,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Resource URNs (array of strings)
|
|
48
|
+
resource_urns = Column(
|
|
49
|
+
ARRAY(String),
|
|
50
|
+
nullable=False,
|
|
51
|
+
server_default="{}",
|
|
52
|
+
default=list,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# Overall accuracy metrics stored as JSONB
|
|
56
|
+
overall_metrics = Column(
|
|
57
|
+
MutableDict.as_mutable(JSONB),
|
|
58
|
+
nullable=True,
|
|
59
|
+
server_default=None,
|
|
60
|
+
default=None,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Field-level accuracy details stored as JSONB array
|
|
64
|
+
field_accuracy_details = Column(
|
|
65
|
+
ARRAY(JSONB),
|
|
66
|
+
nullable=False,
|
|
67
|
+
server_default="{}",
|
|
68
|
+
default=list,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Status and messages for tracking benchmark execution
|
|
72
|
+
status = Column(
|
|
73
|
+
String,
|
|
74
|
+
nullable=False,
|
|
75
|
+
server_default="'pending'",
|
|
76
|
+
default="pending",
|
|
77
|
+
index=True,
|
|
78
|
+
)
|
|
79
|
+
messages = Column(
|
|
80
|
+
ARRAY(String),
|
|
81
|
+
nullable=False,
|
|
82
|
+
server_default="{}",
|
|
83
|
+
default=list,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# Relationships
|
|
87
|
+
monitor_config: RelationshipProperty[MonitorConfig] = relationship(
|
|
88
|
+
MonitorConfig,
|
|
89
|
+
foreign_keys=[monitor_config_key],
|
|
90
|
+
primaryjoin="ClassificationBenchmark.monitor_config_key == MonitorConfig.key",
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
dataset: RelationshipProperty[Dataset] = relationship(
|
|
94
|
+
Dataset,
|
|
95
|
+
foreign_keys=[dataset_fides_key],
|
|
96
|
+
primaryjoin="ClassificationBenchmark.dataset_fides_key == Dataset.fides_key",
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def list_benchmarks(
|
|
101
|
+
cls,
|
|
102
|
+
db: Session,
|
|
103
|
+
monitor_config_key: Optional[str] = None,
|
|
104
|
+
dataset_fides_key: Optional[str] = None,
|
|
105
|
+
created_after: Optional[datetime] = None,
|
|
106
|
+
created_before: Optional[datetime] = None,
|
|
107
|
+
status: Optional[str] = None,
|
|
108
|
+
) -> Query:
|
|
109
|
+
"""
|
|
110
|
+
Get a filtered query for benchmarks.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
db: Database session
|
|
114
|
+
monitor_config_key: Filter by monitor config key
|
|
115
|
+
dataset_fides_key: Filter by dataset fides key
|
|
116
|
+
created_after: Filter by creation date (inclusive)
|
|
117
|
+
created_before: Filter by creation date (exclusive)
|
|
118
|
+
status: Filter by status
|
|
119
|
+
Returns:
|
|
120
|
+
Filtered query (not executed)
|
|
121
|
+
"""
|
|
122
|
+
# Build the query with filters
|
|
123
|
+
query = db.query(cls)
|
|
124
|
+
|
|
125
|
+
# Apply filters
|
|
126
|
+
if monitor_config_key:
|
|
127
|
+
query = query.filter(cls.monitor_config_key == monitor_config_key)
|
|
128
|
+
if dataset_fides_key:
|
|
129
|
+
query = query.filter(cls.dataset_fides_key == dataset_fides_key)
|
|
130
|
+
if created_after:
|
|
131
|
+
query = query.filter(cls.created_at >= created_after)
|
|
132
|
+
if created_before:
|
|
133
|
+
query = query.filter(cls.created_at < created_before)
|
|
134
|
+
if status:
|
|
135
|
+
query = query.filter(cls.status == status)
|
|
136
|
+
|
|
137
|
+
# Apply sorting
|
|
138
|
+
query = query.order_by(cls.created_at.desc())
|
|
139
|
+
|
|
140
|
+
return query
|
|
@@ -599,6 +599,17 @@ 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
|
+
),
|
|
602
613
|
)
|
|
603
614
|
|
|
604
615
|
@classmethod
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from enum import Enum
|
|
4
4
|
from typing import List, Optional
|
|
5
5
|
|
|
6
|
-
from sqlalchemy import ARRAY, Column
|
|
6
|
+
from sqlalchemy import ARRAY, Boolean, Column
|
|
7
7
|
from sqlalchemy import Enum as SQLAlchemyEnum
|
|
8
8
|
from sqlalchemy import ForeignKey, String
|
|
9
9
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
@@ -51,6 +51,7 @@ class MonitorTask(WorkerTask, Base):
|
|
|
51
51
|
)
|
|
52
52
|
staged_resource_urns = Column(ARRAY(String), nullable=True)
|
|
53
53
|
child_resource_urns = Column(ARRAY(String), nullable=True)
|
|
54
|
+
dismissed = Column(Boolean, nullable=False, default=False)
|
|
54
55
|
|
|
55
56
|
monitor_config = relationship(MonitorConfig, cascade="all, delete")
|
|
56
57
|
execution_logs = relationship(
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Digest models package."""
|
|
2
|
+
|
|
3
|
+
from fides.api.models.digest.conditional_dependencies import DigestConditionType
|
|
4
|
+
from fides.api.models.digest.digest_config import DigestConfig, DigestType
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"DigestConfig",
|
|
8
|
+
"DigestType",
|
|
9
|
+
"DigestConditionType",
|
|
10
|
+
]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Optional, Union
|
|
3
|
+
|
|
4
|
+
from sqlalchemy import Boolean, Column, DateTime, String, Text
|
|
5
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
6
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
7
|
+
from sqlalchemy.orm import Session
|
|
8
|
+
|
|
9
|
+
from fides.api.db.base_class import Base
|
|
10
|
+
from fides.api.db.util import EnumColumn
|
|
11
|
+
from fides.api.models.digest.conditional_dependencies import DigestConditionType
|
|
12
|
+
from fides.api.schemas.messaging.messaging import MessagingMethod
|
|
13
|
+
from fides.api.task.conditional_dependencies.schemas import (
|
|
14
|
+
Condition,
|
|
15
|
+
ConditionGroup,
|
|
16
|
+
ConditionLeaf,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DigestType(str, Enum):
|
|
21
|
+
"""Types of digests that can be configured."""
|
|
22
|
+
|
|
23
|
+
MANUAL_TASKS = "manual_tasks"
|
|
24
|
+
PRIVACY_REQUESTS = "privacy_requests"
|
|
25
|
+
# More types can be added here
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class DigestConfig(Base):
|
|
29
|
+
"""Generic configuration for any type of digest."""
|
|
30
|
+
|
|
31
|
+
@declared_attr
|
|
32
|
+
def __tablename__(cls) -> str:
|
|
33
|
+
return "digest_config"
|
|
34
|
+
|
|
35
|
+
# Digest identification
|
|
36
|
+
digest_type = Column(EnumColumn(DigestType), nullable=False, index=True)
|
|
37
|
+
name = Column(String(255), nullable=False)
|
|
38
|
+
description = Column(Text, nullable=True)
|
|
39
|
+
|
|
40
|
+
# Configuration
|
|
41
|
+
enabled = Column(Boolean, nullable=False, default=True, index=True)
|
|
42
|
+
messaging_service_type = Column(
|
|
43
|
+
EnumColumn(MessagingMethod),
|
|
44
|
+
nullable=False,
|
|
45
|
+
default=MessagingMethod.EMAIL,
|
|
46
|
+
index=True,
|
|
47
|
+
)
|
|
48
|
+
cron_expression = Column(String(100), nullable=False, default="0 9 * * 1")
|
|
49
|
+
timezone = Column(String(50), nullable=False, default="US/Eastern")
|
|
50
|
+
last_sent_at = Column(DateTime(timezone=True), nullable=True)
|
|
51
|
+
next_scheduled_at = Column(DateTime(timezone=True), nullable=True, index=True)
|
|
52
|
+
config_metadata = Column(JSONB, nullable=True, default={})
|
|
53
|
+
|
|
54
|
+
def get_receiver_conditions(
|
|
55
|
+
self, db: Session
|
|
56
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
57
|
+
"""Get receiver conditions for this digest config."""
|
|
58
|
+
raise NotImplementedError("Conditions are not implemented for digests")
|
|
59
|
+
|
|
60
|
+
def get_content_conditions(
|
|
61
|
+
self, db: Session
|
|
62
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
63
|
+
"""Get content conditions for this digest config."""
|
|
64
|
+
raise NotImplementedError("Conditions are not implemented for digests")
|
|
65
|
+
|
|
66
|
+
def get_priority_conditions(
|
|
67
|
+
self, db: Session
|
|
68
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
69
|
+
"""Get priority conditions for this digest config."""
|
|
70
|
+
raise NotImplementedError("Conditions are not implemented for digests")
|
|
71
|
+
|
|
72
|
+
def get_all_conditions(
|
|
73
|
+
self, db: Session
|
|
74
|
+
) -> dict["DigestConditionType", Optional[Condition]]:
|
|
75
|
+
"""Get all condition types for this digest config."""
|
|
76
|
+
raise NotImplementedError("Conditions are not implemented for digests")
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
from
|
|
2
|
-
from typing import TYPE_CHECKING, Optional, Union
|
|
1
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
|
3
2
|
|
|
4
|
-
from sqlalchemy import Column, ForeignKey, Index,
|
|
5
|
-
from sqlalchemy.dialects.postgresql import JSONB
|
|
3
|
+
from sqlalchemy import Column, ForeignKey, Index, String
|
|
6
4
|
from sqlalchemy.ext.declarative import declared_attr
|
|
7
5
|
from sqlalchemy.orm import Session, relationship
|
|
8
6
|
|
|
9
|
-
from fides.api.db.base_class import
|
|
10
|
-
from fides.api.
|
|
7
|
+
from fides.api.db.base_class import FidesBase
|
|
8
|
+
from fides.api.models.conditional_dependency.conditional_dependency_base import (
|
|
9
|
+
ConditionalDependencyBase,
|
|
10
|
+
ConditionalDependencyType,
|
|
11
|
+
)
|
|
11
12
|
from fides.api.task.conditional_dependencies.schemas import (
|
|
12
13
|
ConditionGroup,
|
|
13
14
|
ConditionLeaf,
|
|
@@ -17,42 +18,16 @@ if TYPE_CHECKING:
|
|
|
17
18
|
from fides.api.models.manual_task.manual_task import ManualTask
|
|
18
19
|
|
|
19
20
|
|
|
20
|
-
class
|
|
21
|
-
"""
|
|
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."""
|
|
21
|
+
class ManualTaskConditionalDependency(ConditionalDependencyBase):
|
|
22
|
+
"""Manual task conditional dependencies - single type hierarchy."""
|
|
46
23
|
|
|
47
24
|
@declared_attr
|
|
48
25
|
def __tablename__(cls) -> str:
|
|
49
|
-
"""Overriding base class method to set the table name."""
|
|
50
26
|
return "manual_task_conditional_dependency"
|
|
51
27
|
|
|
52
28
|
# We need to redefine it here so that self-referential relationships
|
|
53
29
|
# can properly reference the `id` column instead of the built-in Python function.
|
|
54
30
|
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
|
55
|
-
|
|
56
31
|
# Foreign key relationships
|
|
57
32
|
manual_task_id = Column(
|
|
58
33
|
String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
|
|
@@ -63,18 +38,6 @@ class ManualTaskConditionalDependency(Base):
|
|
|
63
38
|
nullable=True,
|
|
64
39
|
)
|
|
65
40
|
|
|
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
|
-
|
|
78
41
|
__table_args__ = (
|
|
79
42
|
Index("ix_manual_task_conditional_dependency_manual_task_id", "manual_task_id"),
|
|
80
43
|
Index("ix_manual_task_conditional_dependency_parent_id", "parent_id"),
|
|
@@ -97,38 +60,20 @@ class ManualTaskConditionalDependency(Base):
|
|
|
97
60
|
foreign_keys=[parent_id],
|
|
98
61
|
)
|
|
99
62
|
|
|
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
|
-
|
|
127
63
|
@classmethod
|
|
128
64
|
def get_root_condition(
|
|
129
|
-
cls, db: Session,
|
|
65
|
+
cls, db: Session, *args: Any, **kwargs: Any
|
|
130
66
|
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
131
|
-
"""Get the root condition for a
|
|
67
|
+
"""Get the root condition for a manual task
|
|
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]
|
|
132
77
|
root = (
|
|
133
78
|
db.query(cls)
|
|
134
79
|
.filter(cls.manual_task_id == manual_task_id, cls.parent_id.is_(None))
|
|
@@ -138,7 +83,6 @@ class ManualTaskConditionalDependency(Base):
|
|
|
138
83
|
if not root:
|
|
139
84
|
return None
|
|
140
85
|
|
|
141
|
-
if root.condition_type ==
|
|
86
|
+
if root.condition_type == ConditionalDependencyType.leaf:
|
|
142
87
|
return root.to_condition_leaf()
|
|
143
|
-
|
|
144
88
|
return root.to_condition_group()
|
fides/api/models/policy.py
CHANGED
|
@@ -177,6 +177,30 @@ 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
|
+
|
|
180
204
|
|
|
181
205
|
def _get_ref_from_taxonomy(
|
|
182
206
|
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(Enum):
|
|
44
|
+
class ConsentMechanism(str, Enum):
|
|
45
45
|
"""
|
|
46
46
|
Enum is not formalized in the DB because it may be subject to frequent change
|
|
47
47
|
"""
|
|
@@ -261,6 +261,12 @@ 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
|
+
|
|
264
270
|
pre_approval_webhook_replies = relationship(
|
|
265
271
|
PreApprovalWebhookReply,
|
|
266
272
|
back_populates="privacy_request",
|
|
@@ -355,6 +361,64 @@ class PrivacyRequest(
|
|
|
355
361
|
|
|
356
362
|
return super().create(db=db, data=data, check_name=check_name)
|
|
357
363
|
|
|
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
|
+
|
|
358
422
|
def clear_cached_values(self) -> None:
|
|
359
423
|
"""
|
|
360
424
|
Clears all cached values associated with this privacy request from Redis.
|
|
@@ -903,6 +967,8 @@ class PrivacyRequest(
|
|
|
903
967
|
callback_type=CallbackType.pre_approval,
|
|
904
968
|
identity=self.get_cached_identity_data(),
|
|
905
969
|
policy_action=policy_action,
|
|
970
|
+
privacy_request=self.to_safe_dict(),
|
|
971
|
+
timestamp=datetime.utcnow(),
|
|
906
972
|
)
|
|
907
973
|
headers = {
|
|
908
974
|
"reply-to-approve": f"/privacy-request/{self.id}/pre-approve/eligible",
|
|
@@ -943,6 +1009,8 @@ class PrivacyRequest(
|
|
|
943
1009
|
callback_type=webhook.prefix,
|
|
944
1010
|
identity=self.get_cached_identity_data(),
|
|
945
1011
|
policy_action=policy_action,
|
|
1012
|
+
privacy_request=self.to_safe_dict(),
|
|
1013
|
+
timestamp=datetime.utcnow(),
|
|
946
1014
|
)
|
|
947
1015
|
|
|
948
1016
|
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 Optional
|
|
8
|
+
from typing import Any, Dict, Optional
|
|
9
9
|
|
|
10
10
|
from pydantic import BaseModel, ConfigDict
|
|
11
11
|
|
|
@@ -51,6 +51,8 @@ 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
|
|
54
56
|
|
|
55
57
|
|
|
56
58
|
def generate_request_callback_resume_jwe(webhook: PolicyPreWebhook) -> str:
|
fides/api/oauth/roles.py
CHANGED
|
@@ -26,6 +26,7 @@ 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,
|
|
29
30
|
PRIVACY_REQUEST_DELETE,
|
|
30
31
|
PRIVACY_REQUEST_EMAIL_INTEGRATIONS_SEND,
|
|
31
32
|
PRIVACY_REQUEST_MANUAL_STEPS_RESPOND,
|
|
@@ -88,6 +89,7 @@ approver_scopes = [
|
|
|
88
89
|
PRIVACY_REQUEST_UPLOAD_DATA,
|
|
89
90
|
PRIVACY_REQUEST_VIEW_DATA,
|
|
90
91
|
PRIVACY_REQUEST_DELETE,
|
|
92
|
+
PRIVACY_REQUEST_CREATE, # allows approvers to create new privacy requests
|
|
91
93
|
USER_READ, # allows approver to view user management table and update their own password
|
|
92
94
|
PRIVACY_REQUEST_MANUAL_STEPS_REVIEW, # allows approvers to see all manual steps
|
|
93
95
|
]
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
5
|
+
|
|
6
|
+
from fides.api.schemas.base_class import NoValidationSchema
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class OAuthGrantType(str, Enum):
|
|
10
|
+
"""OAuth2 grant types supported by the system"""
|
|
11
|
+
|
|
12
|
+
client_credentials = "client_credentials"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class OAuthConfigSchema(BaseModel):
|
|
16
|
+
"""Schema for OAuth2 configuration used in API requests"""
|
|
17
|
+
|
|
18
|
+
grant_type: Optional[OAuthGrantType] = None
|
|
19
|
+
token_url: Optional[str] = None
|
|
20
|
+
scope: Optional[str] = None
|
|
21
|
+
client_id: Optional[str] = None
|
|
22
|
+
client_secret: Optional[str] = Field(json_schema_extra={"sensitive": True})
|
|
23
|
+
|
|
24
|
+
model_config = ConfigDict(
|
|
25
|
+
from_attributes=True, use_enum_values=True, extra="forbid"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class OAuthConfigResponse(BaseModel):
|
|
30
|
+
"""Schema for OAuth2 configuration used in API responses with masked sensitive fields"""
|
|
31
|
+
|
|
32
|
+
grant_type: OAuthGrantType
|
|
33
|
+
token_url: str
|
|
34
|
+
scope: Optional[str] = None
|
|
35
|
+
client_id: str
|
|
36
|
+
client_secret: str = "**********" # Always masked in responses
|
|
37
|
+
|
|
38
|
+
model_config = ConfigDict(from_attributes=True, use_enum_values=True)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class OAuthConfigDocsSchema(OAuthConfigSchema, NoValidationSchema):
|
|
42
|
+
"""OAuth2 Config Schema for API Docs"""
|
|
@@ -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 PrivacyRequestUser
|
|
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,7 +316,9 @@ 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
|
-
|
|
319
|
+
submitted_by: Optional[str] = None
|
|
320
|
+
reviewer: Optional[PrivacyRequestUser] = None
|
|
321
|
+
submitter: Optional[PrivacyRequestUser] = None
|
|
320
322
|
finished_processing_at: Optional[datetime] = None
|
|
321
323
|
identity_verified_at: Optional[datetime] = None
|
|
322
324
|
paused_at: Optional[datetime] = None
|
|
@@ -340,6 +342,7 @@ class PrivacyRequestResponse(FidesSchema):
|
|
|
340
342
|
deleted_by: Optional[str] = None
|
|
341
343
|
finalized_at: Optional[datetime] = None
|
|
342
344
|
finalized_by: Optional[str] = None
|
|
345
|
+
|
|
343
346
|
model_config = ConfigDict(from_attributes=True, use_enum_values=True)
|
|
344
347
|
|
|
345
348
|
|
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
|
|
13
|
+
class PrivacyRequestUser(FidesSchema):
|
|
14
|
+
"""Data we can expose via PrivacyRequest user relations (reviewer, submitter, etc.)"""
|
|
15
15
|
|
|
16
16
|
id: str
|
|
17
17
|
username: str
|