ethyca-fides 2.69.3b0__py2.py3-none-any.whl → 2.69.3b1__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.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/METADATA +1 -1
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/RECORD +226 -214
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
- fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
- fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
- fides/api/api/v1/endpoints/system.py +140 -55
- fides/api/db/base.py +2 -0
- fides/api/main.py +2 -0
- fides/api/models/asset.py +2 -0
- fides/api/models/detection_discovery/web_monitor.py +61 -0
- fides/api/models/sql_models.py +8 -0
- fides/api/models/system_group.py +85 -0
- fides/api/schemas/saas/saas_config.py +2 -17
- fides/api/schemas/saas/strategy_configuration.py +12 -0
- fides/api/schemas/system.py +8 -0
- fides/api/service/async_dsr/async_dsr_service.py +130 -10
- fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
- fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
- fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
- fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
- fides/api/service/connectors/saas_connector.py +25 -7
- fides/api/service/deps.py +7 -0
- fides/api/service/privacy_request/request_service.py +29 -20
- fides/api/service/strategy.py +6 -3
- fides/api/task/graph_task.py +1 -2
- fides/api/util/filter_utils.py +0 -3
- fides/service/system/__init__.py +0 -0
- fides/service/system/system_service.py +138 -0
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/_b75ACzlGNz3tZqGUPTE5/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1345-5e1c5b66e25c566e.js → 1345-1961771e9619db39.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1817-0ca16d288fad916d.js → 1817-9423665774c2c08f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3620-602eb74dc896d556.js → 3620-34355b0c44325537.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3642-c052564812532324.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3729-c17ac8031a4c4fd1.js → 3729-c8accd71498f6fe4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-0565d44d150c985a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3872-f78dec02f0d959ae.js → 3872-c022bb7259a9f323.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4164-355644b916ae0094.js → 4164-cadb4c6528662248.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4608-be8cba73f5d7c326.js → 4608-caa9cb70fb66ac99.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4786-61154adf88e448e1.js → 4786-d2b03ba5c82a02ed.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4831-fd99c0b3784de128.js → 4831-c0d20b2a0b7332bb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4844-46324c3d848b8b6a.js → 4844-e5064a161a7e5a12.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5258-e880b606a2293803.js → 5258-0062e0a1e4f8c03e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5487-02d00bad7c6830e0.js → 5487-46774dc9df554af1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6084-c153669d5567e242.js → 6084-2c7b81cbcae7e3b4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-8fb39280a8f0eb89.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-3b26ff8259c4d5c3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-45c5088baa8b66af.js → 7476-fdd0eb08a12e0334.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{787-a8c7eab617e2fceb.js → 787-f2eca25837ff7305.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{79-65674011d455af4d.js → 79-68834fd07d69f428.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{8002-24af20d679efc04e.js → 8002-193a97fe4de8b779.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9046-712156d461165f56.js → 9046-1afcfb1c4dbdd6c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-0c8a80f01e431957.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-a653cee14ce2366b.js} +9 -9
- fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-bd0d82078e67cac3.js → add-systems-0a2b2f4a30245089.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-dff842dbed2bc6c8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-23d3e50db42f31b3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-75be0acd400cf527.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-30108b00ac769fc3.js → data-catalog-9fa11c01b44ba8f1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-fb16cb8fd2b3826f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a481a5be96dede96.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-9a81d42a474e1e48.js → action-center-6c65b86a61340753.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-b6ae7adb8ef0b525.js → activity-7fe1ca395914f77f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-e32fccc4ca520d2b.js → new-85b28db67d96f201.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-7c59a6abf6ba6207.js → dataset-409fe1a086fb7d38.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-785205655317b1d3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-a6985f77afbc5bc0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-6cd8708106331b8d.js → index-bf3042fdbfb12b3d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-5d40db1ce8810e1d.js → [id]-e545f8ef5c945f45.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-f297e6cdb9fe97b9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-0f25a76dd18c5e20.js → [id]-6e864b293571a508.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-ad6ad3e5bd72765d.js → messaging-0fc3f1f3b1cd6f2a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-6032d82f0fc2893d.js → storage-089c166287a89166.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-baf31c3e4b081046.js → privacy-requests-73be3cfaaa95ece4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-adbea0f9fd21ff3a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-c64b87694eda4785.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-93a978443bf299db.js → consent-d502bf1e7580df06.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-9ecb803099082bf4.js → custom-fields-b841d63011827b43.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-e29384f7a3db5221.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-f547f1f33c12faf3.js → organization-88f6badc1bb38b97.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-20b1193ed76c56b0.js → test-datasets-0366184eda09a933.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-f4bf47ed2c4746ba.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-4d7827fc9c46b6b8.js → taxonomy-2d9548cfa6086e8f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-763861f5eb207db5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-98a3277820e232c7.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.css +1 -0
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/poc/table-migration.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/settings/about/alpha.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/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/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
- fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → _b75ACzlGNz3tZqGUPTE5}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1099-79646e64f26d62fa.js → 1099-718ce18b9bd70cdb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-765918f8aa37fdb2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-23df37eef17d6ea2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-45f399d4d1325340.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4808-dd4157aa72648068.js → 4808-57c5ac15fd8b0d81.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{549-38ea1d91ee2addaa.js → 549-170c96caa601e15a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7630-7ed6c6117775dffe.js → 7630-8613916021366672.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{796-9e1ca1a4030707c5.js → 796-8fbae2fc714e7a3a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9826-dbae8dee941a7fac.js → 9826-d49a56431e896acb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-8d9c703c96662265.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-adaec1ec185160af.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-20050dbae806179d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-7b8cec88b5ad53d1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-7207ab23bdb36ce8.js → configure-b7b7fb3e8b2ea816.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-c30382719d6f797a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-074cdbfc678ba791.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-bcddda632b4df409.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-17cdca29c6d4cdd6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-3e8bdefe714254ec.js → consent-9b4e0a08ae6216c7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-d0dbba5bff738b57.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-8ffd8d148269d323.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-5f2d7b24804f861f.js → projects-25c5916c8357f98d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-cfc118e68285405c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-9b7e4b86b1e8a40a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-c7390e046b2e2b7f.js → datamap-ea1eabce2a3fc2c7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-dfd71c1e9c458b89.js → [...subfieldNames]-3c629aecee30c575.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-7cdc42ec5493b83d.js → [collectionName]-a13ea13e0316d5a2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-e12b11ba15bc3fc1.js → [datasetId]-a6ae353b3b1536cc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-cce20440b177050b.js → datastore-connection-93d5c01dd927bad2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-f03f1fdaa1f5a0c6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-8f90e275e932940b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-68385a251c7ade5f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-fc7d652910f3ad8d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-fb6e6f4b276b6189.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-00869abf79950a9a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-5716d749236c9f70.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-d6dfb9daa3935db3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-9697549bce7060be.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-888656ae0bd40f62.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-d83e5bd52a638234.js → configure-5a3cd9b14a37ef27.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-3d2a77cb07aa8dc0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-210e7e3b3d776d44.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-18257b6a70fa8a97.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-a82f3df840d5c1b5.js → alpha-b678e7577eef5e5c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-d06fb16487705b9d.js → about-3f3039c7e86cab2f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-16fdd91a81074dd1.js → domain-records-50f9b26c6907d6de.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-4cdd6001e7cb9aee.js → domains-5ae0d30eb3b770ab.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-1914de830ce5cfc4.js → email-templates-f5924e64a15a0dc3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-2ecc073f41628f62.js → privacy-requests-d5f8db89c7e91a02.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-46d06037fcadaf00.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-a659f18a30ef89f3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{webpack-678e89d68dbcd94f.js → webpack-606818148553db7b.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-08T12:08:59-0300",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.69.
|
|
14
|
+
"full-revisionid": "4e4ef38fde9cbb24f1b053bb67af1945cf409477",
|
|
15
|
+
"version": "2.69.3b1"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Add WebMonitorGroupJob model
|
|
2
|
+
|
|
3
|
+
Revision ID: 30369bb8ae01
|
|
4
|
+
Revises: 67d0e389b003
|
|
5
|
+
Create Date: 2025-09-04 13:18:41.306744
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
from sqlalchemy.dialects import postgresql
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "30369bb8ae01"
|
|
15
|
+
down_revision = "67d0e389b003"
|
|
16
|
+
branch_labels = None
|
|
17
|
+
depends_on = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade():
|
|
21
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
22
|
+
op.create_table(
|
|
23
|
+
"web_monitor_group_job",
|
|
24
|
+
sa.Column("id", sa.String(length=255), nullable=False),
|
|
25
|
+
sa.Column(
|
|
26
|
+
"created_at",
|
|
27
|
+
sa.DateTime(timezone=True),
|
|
28
|
+
server_default=sa.text("now()"),
|
|
29
|
+
nullable=True,
|
|
30
|
+
),
|
|
31
|
+
sa.Column(
|
|
32
|
+
"updated_at",
|
|
33
|
+
sa.DateTime(timezone=True),
|
|
34
|
+
server_default=sa.text("now()"),
|
|
35
|
+
nullable=True,
|
|
36
|
+
),
|
|
37
|
+
sa.Column("group_id", sa.String(), nullable=False, unique=True),
|
|
38
|
+
sa.Column(
|
|
39
|
+
"raw_experiences_data",
|
|
40
|
+
postgresql.JSONB(astext_type=sa.Text()),
|
|
41
|
+
nullable=True,
|
|
42
|
+
),
|
|
43
|
+
sa.Column(
|
|
44
|
+
"processed_experiences_data",
|
|
45
|
+
postgresql.JSONB(astext_type=sa.Text()),
|
|
46
|
+
nullable=True,
|
|
47
|
+
),
|
|
48
|
+
sa.Column("is_test_run", sa.Boolean(), nullable=False),
|
|
49
|
+
sa.PrimaryKeyConstraint("id"),
|
|
50
|
+
sa.UniqueConstraint("group_id"),
|
|
51
|
+
)
|
|
52
|
+
op.create_index(
|
|
53
|
+
op.f("ix_web_monitor_group_job_id"),
|
|
54
|
+
"web_monitor_group_job",
|
|
55
|
+
["id"],
|
|
56
|
+
unique=False,
|
|
57
|
+
)
|
|
58
|
+
# ### end Alembic commands ###
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def downgrade():
|
|
62
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
63
|
+
op.drop_index(
|
|
64
|
+
op.f("ix_web_monitor_group_job_id"), table_name="web_monitor_group_job"
|
|
65
|
+
)
|
|
66
|
+
op.drop_table("web_monitor_group_job")
|
|
67
|
+
# ### end Alembic commands ###
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Update ConsentStatus enum
|
|
2
|
+
|
|
3
|
+
Revision ID: 67d0e389b003
|
|
4
|
+
Revises: f36ce1bde293
|
|
5
|
+
Create Date: 2025-09-02 19:32:05.025508
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
|
|
12
|
+
# revision identifiers, used by Alembic.
|
|
13
|
+
revision = "67d0e389b003"
|
|
14
|
+
down_revision = "f36ce1bde293"
|
|
15
|
+
branch_labels = None
|
|
16
|
+
depends_on = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upgrade():
|
|
20
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
21
|
+
op.execute("ALTER TYPE consentstatus ADD VALUE 'pre_consent'")
|
|
22
|
+
op.execute("ALTER TYPE consentstatus ADD VALUE 'cmp_error'")
|
|
23
|
+
# ### end Alembic commands ###
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade():
|
|
27
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
28
|
+
# Remove any records that have the new enum values before dropping them
|
|
29
|
+
op.execute(
|
|
30
|
+
"UPDATE asset SET consent_status = 'unknown' WHERE consent_status IN ('pre_consent', 'cmp_error')"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# Recreate the enum without the new values
|
|
34
|
+
op.execute("ALTER TYPE consentstatus RENAME TO consentstatus_old")
|
|
35
|
+
op.execute(
|
|
36
|
+
"CREATE TYPE consentstatus AS ENUM ('with_consent', 'without_consent', 'exempt', 'unknown')"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# Drop default, change type, and set default back
|
|
40
|
+
op.execute("ALTER TABLE asset ALTER COLUMN consent_status DROP DEFAULT")
|
|
41
|
+
op.execute(
|
|
42
|
+
"ALTER TABLE asset ALTER COLUMN consent_status TYPE consentstatus USING "
|
|
43
|
+
"consent_status::text::consentstatus"
|
|
44
|
+
)
|
|
45
|
+
op.execute("ALTER TABLE asset ALTER COLUMN consent_status SET DEFAULT 'unknown'")
|
|
46
|
+
op.execute("DROP TYPE consentstatus_old")
|
|
47
|
+
# ### end Alembic commands ###
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""add system groups
|
|
2
|
+
|
|
3
|
+
Revision ID: f36ce1bde293
|
|
4
|
+
Revises: 78dbe23d8204
|
|
5
|
+
Create Date: 2025-08-18 21:36:19.279969
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
from citext import CIText
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "f36ce1bde293"
|
|
15
|
+
down_revision = "78dbe23d8204"
|
|
16
|
+
branch_labels = None
|
|
17
|
+
depends_on = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade():
|
|
21
|
+
op.create_table(
|
|
22
|
+
"system_group",
|
|
23
|
+
sa.Column("id", sa.String(length=255), nullable=False),
|
|
24
|
+
sa.Column(
|
|
25
|
+
"created_at",
|
|
26
|
+
sa.DateTime(timezone=True),
|
|
27
|
+
server_default=sa.text("now()"),
|
|
28
|
+
nullable=True,
|
|
29
|
+
),
|
|
30
|
+
sa.Column(
|
|
31
|
+
"updated_at",
|
|
32
|
+
sa.DateTime(timezone=True),
|
|
33
|
+
server_default=sa.text("now()"),
|
|
34
|
+
nullable=True,
|
|
35
|
+
),
|
|
36
|
+
sa.Column("fides_key", sa.String(), nullable=False),
|
|
37
|
+
sa.Column(
|
|
38
|
+
"label_color",
|
|
39
|
+
sa.Enum(
|
|
40
|
+
"taxonomy_white",
|
|
41
|
+
"taxonomy_red",
|
|
42
|
+
"taxonomy_orange",
|
|
43
|
+
"taxonomy_yellow",
|
|
44
|
+
"taxonomy_green",
|
|
45
|
+
"taxonomy_blue",
|
|
46
|
+
"taxonomy_purple",
|
|
47
|
+
"sandstone",
|
|
48
|
+
"minos",
|
|
49
|
+
name="customtaxonomycolor",
|
|
50
|
+
),
|
|
51
|
+
nullable=True,
|
|
52
|
+
),
|
|
53
|
+
sa.Column("data_steward_username", CIText(), nullable=True),
|
|
54
|
+
sa.Column(
|
|
55
|
+
"data_uses", sa.ARRAY(sa.String()), server_default="{}", nullable=False
|
|
56
|
+
),
|
|
57
|
+
sa.ForeignKeyConstraint(
|
|
58
|
+
["data_steward_username"], ["fidesuser.username"], ondelete="SET NULL"
|
|
59
|
+
),
|
|
60
|
+
sa.ForeignKeyConstraint(
|
|
61
|
+
["fides_key"], ["taxonomy_element.fides_key"], ondelete="CASCADE"
|
|
62
|
+
),
|
|
63
|
+
sa.PrimaryKeyConstraint("id"),
|
|
64
|
+
)
|
|
65
|
+
op.create_index(
|
|
66
|
+
op.f("ix_system_group_data_steward_username"),
|
|
67
|
+
"system_group",
|
|
68
|
+
["data_steward_username"],
|
|
69
|
+
unique=False,
|
|
70
|
+
)
|
|
71
|
+
op.create_index(
|
|
72
|
+
op.f("ix_system_group_fides_key"), "system_group", ["fides_key"], unique=True
|
|
73
|
+
)
|
|
74
|
+
op.create_index(op.f("ix_system_group_id"), "system_group", ["id"], unique=False)
|
|
75
|
+
op.create_table(
|
|
76
|
+
"system_group_member",
|
|
77
|
+
sa.Column("id", sa.String(length=255), nullable=False),
|
|
78
|
+
sa.Column(
|
|
79
|
+
"created_at",
|
|
80
|
+
sa.DateTime(timezone=True),
|
|
81
|
+
server_default=sa.text("now()"),
|
|
82
|
+
nullable=True,
|
|
83
|
+
),
|
|
84
|
+
sa.Column(
|
|
85
|
+
"updated_at",
|
|
86
|
+
sa.DateTime(timezone=True),
|
|
87
|
+
server_default=sa.text("now()"),
|
|
88
|
+
nullable=True,
|
|
89
|
+
),
|
|
90
|
+
sa.Column("system_group_id", sa.String(length=255), nullable=True),
|
|
91
|
+
sa.Column("system_id", sa.String(length=255), nullable=True),
|
|
92
|
+
sa.ForeignKeyConstraint(
|
|
93
|
+
["system_group_id"], ["system_group.id"], ondelete="CASCADE"
|
|
94
|
+
),
|
|
95
|
+
sa.ForeignKeyConstraint(["system_id"], ["ctl_systems.id"], ondelete="CASCADE"),
|
|
96
|
+
sa.PrimaryKeyConstraint("id"),
|
|
97
|
+
sa.UniqueConstraint(
|
|
98
|
+
"system_group_id", "system_id", name="uq_system_group_member_group_system"
|
|
99
|
+
),
|
|
100
|
+
)
|
|
101
|
+
op.create_index(
|
|
102
|
+
op.f("ix_system_group_member_id"), "system_group_member", ["id"], unique=False
|
|
103
|
+
)
|
|
104
|
+
op.create_index(
|
|
105
|
+
op.f("ix_system_group_member_system_group_id"),
|
|
106
|
+
"system_group_member",
|
|
107
|
+
["system_group_id"],
|
|
108
|
+
unique=False,
|
|
109
|
+
)
|
|
110
|
+
op.create_index(
|
|
111
|
+
op.f("ix_system_group_member_system_id"),
|
|
112
|
+
"system_group_member",
|
|
113
|
+
["system_id"],
|
|
114
|
+
unique=False,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def downgrade():
|
|
119
|
+
op.drop_index(
|
|
120
|
+
op.f("ix_system_group_member_system_id"), table_name="system_group_member"
|
|
121
|
+
)
|
|
122
|
+
op.drop_index(
|
|
123
|
+
op.f("ix_system_group_member_system_group_id"), table_name="system_group_member"
|
|
124
|
+
)
|
|
125
|
+
op.drop_index(op.f("ix_system_group_member_id"), table_name="system_group_member")
|
|
126
|
+
op.drop_table("system_group_member")
|
|
127
|
+
op.drop_index(op.f("ix_system_group_id"), table_name="system_group")
|
|
128
|
+
op.drop_index(op.f("ix_system_group_fides_key"), table_name="system_group")
|
|
129
|
+
op.drop_index(
|
|
130
|
+
op.f("ix_system_group_data_steward_username"), table_name="system_group"
|
|
131
|
+
)
|
|
132
|
+
op.drop_table("system_group")
|
|
@@ -1,29 +1,27 @@
|
|
|
1
|
-
import datetime
|
|
2
1
|
from typing import Annotated, Dict, List, Optional, Union
|
|
3
2
|
|
|
4
3
|
from fastapi import Depends, HTTPException, Query, Response, Security
|
|
5
4
|
from fastapi_pagination import Page, Params
|
|
6
5
|
from fastapi_pagination.bases import AbstractPage
|
|
7
|
-
from fastapi_pagination.ext.async_sqlalchemy import paginate as async_paginate
|
|
8
6
|
from fastapi_pagination.ext.sqlalchemy import paginate
|
|
9
7
|
from fideslang.models import System as SystemSchema
|
|
10
8
|
from fideslang.validation import FidesKey
|
|
11
9
|
from loguru import logger
|
|
12
10
|
from pydantic import Field
|
|
13
|
-
from sqlalchemy import or_
|
|
14
11
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
15
12
|
from sqlalchemy.future import select
|
|
16
13
|
from sqlalchemy.orm import Session
|
|
17
14
|
from starlette import status
|
|
18
|
-
from starlette.status import
|
|
15
|
+
from starlette.status import (
|
|
16
|
+
HTTP_200_OK,
|
|
17
|
+
HTTP_204_NO_CONTENT,
|
|
18
|
+
HTTP_400_BAD_REQUEST,
|
|
19
|
+
HTTP_404_NOT_FOUND,
|
|
20
|
+
)
|
|
19
21
|
|
|
20
22
|
from fides.api.api import deps
|
|
21
23
|
from fides.api.api.v1.endpoints.saas_config_endpoints import instantiate_connection
|
|
22
|
-
from fides.api.db.crud import
|
|
23
|
-
get_resource,
|
|
24
|
-
get_resource_with_custom_fields,
|
|
25
|
-
list_resource,
|
|
26
|
-
)
|
|
24
|
+
from fides.api.db.crud import get_resource, get_resource_with_custom_fields
|
|
27
25
|
from fides.api.db.ctl_session import get_async_db
|
|
28
26
|
from fides.api.db.system import (
|
|
29
27
|
create_system,
|
|
@@ -34,10 +32,8 @@ from fides.api.db.system import (
|
|
|
34
32
|
)
|
|
35
33
|
from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
|
|
36
34
|
from fides.api.models.fides_user import FidesUser
|
|
37
|
-
from fides.api.models.sql_models import
|
|
38
|
-
|
|
39
|
-
System,
|
|
40
|
-
)
|
|
35
|
+
from fides.api.models.sql_models import System # type:ignore[attr-defined]
|
|
36
|
+
from fides.api.oauth.roles import APPROVER
|
|
41
37
|
from fides.api.oauth.system_manager_oauth_util import (
|
|
42
38
|
verify_oauth_client_for_system_from_fides_key,
|
|
43
39
|
verify_oauth_client_for_system_from_request_body_cli,
|
|
@@ -56,8 +52,12 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
|
|
|
56
52
|
from fides.api.schemas.connection_configuration.saas_config_template_values import (
|
|
57
53
|
SaasConnectionTemplateValues,
|
|
58
54
|
)
|
|
59
|
-
from fides.api.schemas.
|
|
60
|
-
|
|
55
|
+
from fides.api.schemas.system import (
|
|
56
|
+
AssignStewardRequest,
|
|
57
|
+
BasicSystemResponse,
|
|
58
|
+
SystemResponse,
|
|
59
|
+
)
|
|
60
|
+
from fides.api.service.deps import get_system_service
|
|
61
61
|
from fides.api.util.api_router import APIRouter
|
|
62
62
|
from fides.api.util.connection_util import (
|
|
63
63
|
connection_status,
|
|
@@ -66,7 +66,6 @@ from fides.api.util.connection_util import (
|
|
|
66
66
|
patch_connection_configs,
|
|
67
67
|
validate_secrets,
|
|
68
68
|
)
|
|
69
|
-
from fides.api.util.filter_utils import apply_filters_to_query
|
|
70
69
|
from fides.common.api.scope_registry import (
|
|
71
70
|
CONNECTION_CREATE_OR_UPDATE,
|
|
72
71
|
CONNECTION_DELETE,
|
|
@@ -82,6 +81,7 @@ from fides.common.api.v1.urn_registry import (
|
|
|
82
81
|
SYSTEM_CONNECTIONS,
|
|
83
82
|
V1_URL_PREFIX,
|
|
84
83
|
)
|
|
84
|
+
from fides.service.system.system_service import SystemService
|
|
85
85
|
|
|
86
86
|
SYSTEM_ROUTER = APIRouter(tags=["System"], prefix=f"{V1_URL_PREFIX}/system")
|
|
87
87
|
SYSTEM_CONNECTIONS_ROUTER = APIRouter(
|
|
@@ -349,6 +349,123 @@ async def delete(
|
|
|
349
349
|
}
|
|
350
350
|
|
|
351
351
|
|
|
352
|
+
@SYSTEM_ROUTER.post(
|
|
353
|
+
"/bulk-delete",
|
|
354
|
+
dependencies=[
|
|
355
|
+
Security(
|
|
356
|
+
verify_oauth_client_prod,
|
|
357
|
+
scopes=[SYSTEM_DELETE],
|
|
358
|
+
)
|
|
359
|
+
],
|
|
360
|
+
status_code=status.HTTP_200_OK,
|
|
361
|
+
)
|
|
362
|
+
async def system_bulk_delete(
|
|
363
|
+
fides_keys: List[str],
|
|
364
|
+
db: AsyncSession = Depends(get_async_db),
|
|
365
|
+
) -> Dict:
|
|
366
|
+
"""Delete multiple systems by their fides_keys."""
|
|
367
|
+
|
|
368
|
+
deleted: List[Dict] = []
|
|
369
|
+
|
|
370
|
+
async with db.begin():
|
|
371
|
+
# Retrieve all systems within the same transactional context
|
|
372
|
+
stmt = select(System).filter(System.fides_key.in_(fides_keys))
|
|
373
|
+
result = await db.execute(stmt)
|
|
374
|
+
systems_to_delete = result.scalars().all()
|
|
375
|
+
|
|
376
|
+
for system in systems_to_delete:
|
|
377
|
+
await db.delete(system)
|
|
378
|
+
deleted.append(SystemSchema.model_validate(system).model_dump(mode="json"))
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
"message": f"Deleted {len(deleted)} system(s)",
|
|
382
|
+
"deleted": deleted,
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
@SYSTEM_ROUTER.post(
|
|
387
|
+
"/assign-steward",
|
|
388
|
+
dependencies=[
|
|
389
|
+
Security(
|
|
390
|
+
verify_oauth_client_prod,
|
|
391
|
+
scopes=[SYSTEM_UPDATE],
|
|
392
|
+
)
|
|
393
|
+
],
|
|
394
|
+
)
|
|
395
|
+
async def bulk_assign_steward(
|
|
396
|
+
data: AssignStewardRequest,
|
|
397
|
+
db: Session = Depends(deps.get_db),
|
|
398
|
+
) -> Dict:
|
|
399
|
+
"""Assign the given `data_steward` (username) as a system manager for the list of `system_keys`.
|
|
400
|
+
|
|
401
|
+
This mirrors the behavior of the user permissions endpoint that assigns systems to a given user but
|
|
402
|
+
from the perspective of the System API. It validates that:
|
|
403
|
+
|
|
404
|
+
1. The provided user exists.
|
|
405
|
+
2. The user already has permissions (cannot be None).
|
|
406
|
+
3. The user is not an approver (approvers are explicitly disallowed from being system managers).
|
|
407
|
+
4. All provided `system_keys` resolve to existing System records.
|
|
408
|
+
5. There are no duplicate keys in the payload.
|
|
409
|
+
"""
|
|
410
|
+
|
|
411
|
+
data_steward = data.data_steward
|
|
412
|
+
system_keys = data.system_keys
|
|
413
|
+
|
|
414
|
+
user: Optional[FidesUser] = FidesUser.get_by(
|
|
415
|
+
db, field="username", value=data_steward
|
|
416
|
+
)
|
|
417
|
+
if not user:
|
|
418
|
+
raise HTTPException(
|
|
419
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
420
|
+
detail=f"No user found with username {data_steward}.",
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
# Validate user has permissions assigned
|
|
424
|
+
if not (user.permissions and user.permissions.roles): # type: ignore[attr-defined]
|
|
425
|
+
raise HTTPException(
|
|
426
|
+
status_code=HTTP_400_BAD_REQUEST,
|
|
427
|
+
detail=f"User {data_steward} needs permissions before they can be assigned as system manager.",
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
# Approvers are not allowed to be system managers
|
|
431
|
+
if APPROVER in user.permissions.roles: # type: ignore[attr-defined]
|
|
432
|
+
raise HTTPException(
|
|
433
|
+
status_code=HTTP_400_BAD_REQUEST,
|
|
434
|
+
detail=f"User {data_steward} is an {APPROVER} and cannot be assigned as a system manager.",
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
# Check for duplicate system keys
|
|
438
|
+
if len(set(system_keys)) != len(system_keys):
|
|
439
|
+
raise HTTPException(
|
|
440
|
+
status_code=HTTP_400_BAD_REQUEST,
|
|
441
|
+
detail=f"Cannot add user {data_steward} as system manager. Duplicate systems in request body.",
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
# Retrieve systems and validate existence
|
|
445
|
+
systems_query = db.query(System).filter(System.fides_key.in_(system_keys))
|
|
446
|
+
if systems_query.count() != len(system_keys):
|
|
447
|
+
raise HTTPException(
|
|
448
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
449
|
+
detail=f"Cannot add user {data_steward} as system manager. System(s) not found.",
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
systems = systems_query.all()
|
|
453
|
+
|
|
454
|
+
logger.info(
|
|
455
|
+
"Assigning user {} as data steward for {} systems", data_steward, len(systems)
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
updated_count = 0
|
|
459
|
+
for system in systems:
|
|
460
|
+
if user not in system.data_stewards:
|
|
461
|
+
user.set_as_system_manager(db, system)
|
|
462
|
+
updated_count += 1
|
|
463
|
+
|
|
464
|
+
return {
|
|
465
|
+
"message": f"User {data_steward} assigned as data steward to {updated_count} system(s)",
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
|
|
352
469
|
@SYSTEM_ROUTER.post(
|
|
353
470
|
"/",
|
|
354
471
|
response_model=SystemResponse,
|
|
@@ -384,62 +501,30 @@ async def create(
|
|
|
384
501
|
name="List systems (optionally paginated)",
|
|
385
502
|
)
|
|
386
503
|
async def ls( # pylint: disable=invalid-name
|
|
387
|
-
|
|
504
|
+
system_service: SystemService = Depends(get_system_service),
|
|
388
505
|
size: Optional[int] = Query(None, ge=1, le=100),
|
|
389
506
|
page: Optional[int] = Query(None, ge=1),
|
|
390
507
|
search: Optional[str] = None,
|
|
391
508
|
data_uses: Optional[List[FidesKey]] = Query(None),
|
|
392
509
|
data_categories: Optional[List[FidesKey]] = Query(None),
|
|
393
510
|
data_subjects: Optional[List[FidesKey]] = Query(None),
|
|
394
|
-
show_deleted:
|
|
395
|
-
) -> List:
|
|
511
|
+
show_deleted: bool = Query(False),
|
|
512
|
+
) -> Union[List[System], Page[System]]:
|
|
396
513
|
"""Get a list of all of the Systems.
|
|
397
514
|
If any parameters or filters are provided the response will be paginated and/or filtered.
|
|
398
515
|
Otherwise all Systems will be returned (this may be a slow operation if there are many systems,
|
|
399
516
|
so using the pagination parameters is recommended).
|
|
400
517
|
"""
|
|
401
|
-
if not (size or page or search or data_uses or data_categories or data_subjects):
|
|
402
|
-
# if no advanced parameters are passed, we return a very basic list of all System resources
|
|
403
|
-
# to maintain backward compatibility of the original API, which backs some important client usages, e.g. the fides CLI
|
|
404
518
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
query = select(System)
|
|
408
|
-
|
|
409
|
-
pagination_params = Params(page=page or 1, size=size or 50)
|
|
410
|
-
# Need to join with PrivacyDeclaration in order to be able to filter
|
|
411
|
-
# by data use, data category, and data subject
|
|
412
|
-
if any([data_uses, data_categories, data_subjects]):
|
|
413
|
-
query = query.outerjoin(
|
|
414
|
-
PrivacyDeclaration, System.id == PrivacyDeclaration.system_id
|
|
415
|
-
)
|
|
416
|
-
|
|
417
|
-
# Filter out any vendor deleted systems, unless explicitly asked for
|
|
418
|
-
if not show_deleted:
|
|
419
|
-
query = query.filter(
|
|
420
|
-
or_(
|
|
421
|
-
System.vendor_deleted_date.is_(None),
|
|
422
|
-
System.vendor_deleted_date >= datetime.datetime.now(),
|
|
423
|
-
)
|
|
424
|
-
)
|
|
425
|
-
|
|
426
|
-
filter_params = FilterParams(
|
|
519
|
+
return await system_service.get_systems(
|
|
427
520
|
search=search,
|
|
428
521
|
data_uses=data_uses,
|
|
429
522
|
data_categories=data_categories,
|
|
430
523
|
data_subjects=data_subjects,
|
|
524
|
+
size=size,
|
|
525
|
+
page=page,
|
|
526
|
+
show_deleted=show_deleted,
|
|
431
527
|
)
|
|
432
|
-
filtered_query = apply_filters_to_query(
|
|
433
|
-
query=query,
|
|
434
|
-
filter_params=filter_params,
|
|
435
|
-
search_model=System,
|
|
436
|
-
taxonomy_model=PrivacyDeclaration,
|
|
437
|
-
)
|
|
438
|
-
|
|
439
|
-
# Add a distinct so we only get one row per system
|
|
440
|
-
duplicates_removed = filtered_query.distinct(System.id)
|
|
441
|
-
|
|
442
|
-
return await async_paginate(db, duplicates_removed, pagination_params)
|
|
443
528
|
|
|
444
529
|
|
|
445
530
|
@SYSTEM_ROUTER.patch(
|
fides/api/db/base.py
CHANGED
|
@@ -21,6 +21,7 @@ from fides.api.models.detection_discovery.monitor_task import (
|
|
|
21
21
|
MonitorTask,
|
|
22
22
|
MonitorTaskExecutionLog,
|
|
23
23
|
)
|
|
24
|
+
from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
|
|
24
25
|
from fides.api.models.experience_notices import ExperienceNotices
|
|
25
26
|
from fides.api.models.fides_cloud import FidesCloud
|
|
26
27
|
from fides.api.models.fides_user import FidesUser
|
|
@@ -77,6 +78,7 @@ from fides.api.models.property import (
|
|
|
77
78
|
from fides.api.models.registration import UserRegistration
|
|
78
79
|
from fides.api.models.storage import StorageConfig
|
|
79
80
|
from fides.api.models.system_compass_sync import SystemCompassSync
|
|
81
|
+
from fides.api.models.system_group import SystemGroup, SystemGroupMember
|
|
80
82
|
from fides.api.models.system_history import SystemHistory
|
|
81
83
|
from fides.api.models.system_manager import SystemManager
|
|
82
84
|
from fides.api.models.taxonomy import (
|
fides/api/main.py
CHANGED
|
@@ -45,6 +45,7 @@ from fides.api.service.privacy_request.email_batch_service import (
|
|
|
45
45
|
initiate_scheduled_batch_email_send,
|
|
46
46
|
)
|
|
47
47
|
from fides.api.service.privacy_request.request_service import (
|
|
48
|
+
initiate_async_tasks_status_polling,
|
|
48
49
|
initiate_interrupted_task_requeue_poll,
|
|
49
50
|
initiate_poll_for_exited_privacy_request_tasks,
|
|
50
51
|
initiate_scheduled_dsr_data_removal,
|
|
@@ -102,6 +103,7 @@ async def lifespan(wrapped_app: FastAPI) -> AsyncGenerator[None, None]:
|
|
|
102
103
|
initiate_poll_for_exited_privacy_request_tasks()
|
|
103
104
|
initiate_scheduled_dsr_data_removal()
|
|
104
105
|
initiate_interrupted_task_requeue_poll()
|
|
106
|
+
initiate_async_tasks_status_polling()
|
|
105
107
|
initiate_bcrypt_migration_task()
|
|
106
108
|
initiate_post_upgrade_index_creation()
|
|
107
109
|
|
fides/api/models/asset.py
CHANGED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from typing import Any, Optional
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import Boolean, Column, String, insert, select
|
|
4
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
5
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
6
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
7
|
+
|
|
8
|
+
from fides.api.db.base_class import Base
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class WebMonitorGroupJob(Base):
|
|
12
|
+
"""SQL model for storing data returned from a web monitor group job"""
|
|
13
|
+
|
|
14
|
+
@declared_attr
|
|
15
|
+
def __tablename__(self) -> str:
|
|
16
|
+
return "web_monitor_group_job"
|
|
17
|
+
|
|
18
|
+
# The id for the web monitor group on the web monitor service
|
|
19
|
+
group_id = Column(String, nullable=False, unique=True)
|
|
20
|
+
|
|
21
|
+
# The raw experiences data obtained for that group from the web monitor service
|
|
22
|
+
raw_experiences_data = Column(JSONB, nullable=True)
|
|
23
|
+
# The processed experiences data, used to calculate an StagedResource's consent status
|
|
24
|
+
processed_experiences_data = Column(JSONB, nullable=True)
|
|
25
|
+
|
|
26
|
+
# Whether this data is from a test_website monitor rather than a real one
|
|
27
|
+
is_test_run = Column(Boolean, nullable=False, default=False)
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
async def create_async(
|
|
31
|
+
cls,
|
|
32
|
+
async_session: AsyncSession,
|
|
33
|
+
*,
|
|
34
|
+
group_id: str,
|
|
35
|
+
is_test_run: Optional[bool] = False,
|
|
36
|
+
raw_experiences_data: Optional[dict[str, Any]] = None,
|
|
37
|
+
processed_experiences_data: Optional[dict[str, Any]] = None,
|
|
38
|
+
) -> "WebMonitorGroupJob":
|
|
39
|
+
"""Create a new WebMonitorGroupJob"""
|
|
40
|
+
values = {
|
|
41
|
+
"group_id": group_id,
|
|
42
|
+
"is_test_run": is_test_run,
|
|
43
|
+
"raw_experiences_data": raw_experiences_data,
|
|
44
|
+
"processed_experiences_data": processed_experiences_data,
|
|
45
|
+
}
|
|
46
|
+
stmt = insert(cls.__table__).values(**values).returning(*cls.__table__.columns)
|
|
47
|
+
result = await async_session.execute(stmt)
|
|
48
|
+
row = result.first()
|
|
49
|
+
return cls(**dict(row))
|
|
50
|
+
|
|
51
|
+
@classmethod
|
|
52
|
+
async def get_by_group_id_async(
|
|
53
|
+
cls, async_session: AsyncSession, group_id: str
|
|
54
|
+
) -> Optional["WebMonitorGroupJob"]:
|
|
55
|
+
"""Get a WebMonitorGroupJob by group_id"""
|
|
56
|
+
stmt = select(*cls.__table__.columns).where(
|
|
57
|
+
cls.__table__.c.group_id == group_id
|
|
58
|
+
)
|
|
59
|
+
result = await async_session.execute(stmt)
|
|
60
|
+
row = result.first()
|
|
61
|
+
return cls(**dict(row)) if row else None
|
fides/api/models/sql_models.py
CHANGED
|
@@ -461,6 +461,14 @@ class System(Base, FidesBase):
|
|
|
461
461
|
"Asset", back_populates="system", lazy="selectin", uselist=True, viewonly=True
|
|
462
462
|
)
|
|
463
463
|
|
|
464
|
+
system_groups = relationship(
|
|
465
|
+
"SystemGroup",
|
|
466
|
+
secondary="system_group_member",
|
|
467
|
+
back_populates="systems",
|
|
468
|
+
lazy="selectin",
|
|
469
|
+
viewonly=True,
|
|
470
|
+
)
|
|
471
|
+
|
|
464
472
|
@classmethod
|
|
465
473
|
def get_data_uses(
|
|
466
474
|
cls: Type[System], systems: List[System], include_parents: bool = True
|