ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.71.2b0__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.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/METADATA +1 -1
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/RECORD +262 -248
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +35 -0
- fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
- fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
- fides/api/common_exceptions.py +4 -0
- fides/api/main.py +2 -2
- fides/api/models/attachment.py +1 -0
- fides/api/models/digest/__init__.py +2 -0
- fides/api/models/digest/digest_config.py +10 -1
- fides/api/models/digest/digest_execution.py +132 -0
- fides/api/models/event_audit.py +8 -0
- fides/api/models/privacy_request/privacy_request.py +1 -1
- fides/api/models/privacy_request/request_task.py +98 -1
- fides/api/models/worker_task.py +8 -0
- fides/api/schemas/saas/async_polling_configuration.py +81 -0
- fides/api/schemas/saas/saas_config.py +10 -3
- fides/api/schemas/saas/strategy_configuration.py +0 -12
- fides/api/service/async_dsr/handlers/__init__.py +0 -0
- fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
- fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
- fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
- fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
- fides/api/service/async_dsr/strategies/__init__.py +0 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
- fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +678 -0
- fides/api/service/async_dsr/utils.py +130 -0
- fides/api/service/connectors/fides/fides_client.py +63 -1
- fides/api/service/connectors/query_configs/saas_query_config.py +20 -5
- fides/api/service/connectors/saas_connector.py +86 -70
- fides/api/service/privacy_request/attachment_handling.py +9 -2
- fides/api/service/privacy_request/request_runner_service.py +9 -83
- fides/api/service/privacy_request/request_service.py +47 -74
- fides/api/service/saas_request/saas_request_override_factory.py +66 -1
- fides/api/task/execute_request_tasks.py +5 -2
- fides/api/task/filter_results.py +35 -2
- fides/api/task/graph_task.py +34 -2
- fides/api/util/saas_util.py +1 -0
- fides/config/execution_settings.py +7 -3
- fides/data/language/languages.yml +2 -0
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-27b2d4e59a569b38.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-8fb5000847f73ec7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1437-fb699e9d69c3e325.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/155-3d03f101c662c054.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1817-1ad037b7d6d2f6d2.js → 1817-10b392e1dd9c4673.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.50599b6774562644.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-01d5edb1802d3482.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2397-40506a386a3a469a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{2921-66f65496c3a09316.js → 2921-edfdffa353a611e4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3377-4c129258b4c4ea28.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-259be222ea12392a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3700-42976bfaad3b91c9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3772-aa7beafe5df5e656.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-fa1d71afc7dc9e6e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{401-ffe4e8436e1eceb9.js → 401-5270e3e23b08ab2b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4817-5f9b9c9bafe888f1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5185-51eaa78e3ed6bfb7.js → 5185-325e5435a0c7dcb7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5258-2d28b2c64acf5de3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5279-12c9cbdc67ad7b14.js → 5279-21929b12c927b022.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/549-c3b4c51f45a84a52.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5643-10a36584c399526c.js → 5643-7583c1f8dbd83273.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-55c0387508e50f3e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6277-182efc294d413f64.js → 6277-ca31d48a33202761.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6315-2d4e86a32fc40458.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6344-ca66a6e10d128179.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6853-7004a8c420b1ca02.js → 6853-cb15625a713b3ef9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6954-4b24e1731c1cc3b3.js → 6954-08b59d28d7a2a43b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7245-895bb7c6a6c797bc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-f25fce73eeb1f9c6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7488-df17b592fbeaa1eb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{7630-d0d3a0fe3f95e971.js → 7630-71582de0e818e28f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7773-98d34d188ae0a694.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-7944f684f8945506.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/8011-56031d82d5428981.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8373-7f940f5ac9c38b1f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9046-31b16a7e872c22be.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9070-13f237db78da586d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9330-cea1bf40f5d27e53.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.1ea49d4b6e0541f2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9682-2754256aeae141bb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-e71887e2c4283249.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9899-15530c468d5656a1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9965-54037b6c8f36d14b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-2014144a1a0fa64f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-9e869a44215709ed.js} +9 -9
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4f3ba02774f27795.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2ca59996860a33c5.js → multiple-1c9cef80deccb15d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-4adeec3bcec05f7b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-f7bdc2da53137ffd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-a27b220fe76bdc8e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-542fd4a4322122f1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-92182be6603c2842.js → privacy-experience-4254abef7bb52edd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-d31d1c233e94dc1f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-2ea057e6217993f9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-ab54b19609bff325.js → privacy-notices-8e76cbfaf71fdcb9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-eb557180eded0abd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-93730a4316c0d980.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-c64589e53338e59a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-d3d1841bc8105e56.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-8cd4d1d6ba000333.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-69b429a9d30ebaf1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-791c522ad1d9a2ce.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-8c7103ebf01d6e6a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-a53ef0161235ee47.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-f85f4f8fcf1bfbdb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-3619e454763dba09.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-ace848575e688200.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-53ca31c50c43007f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-f87e4a0f664f4cde.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-699762cb8a66237e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-d970d0b82db36c88.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-a6343038a447699c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-ce82ba79f9bf825c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-ae7a4c1c4eabc0d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-179e5d09ccff50c1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-59466e5e238c59d0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-36d90c8c39fb0d1c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-db54d01fd8f6df50.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-55d312af5228e098.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-488beba62e832660.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-4aad5495f9bf81ce.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-496ec7ecca8259dc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-8a2ba955d92d52ee.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4580f70eb41b6a7d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-f69b04d3b4cf43b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-e8d2140787045acd.js → [id]-d6eed2dc5d27f625.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-e3f93462a08251bf.js → add-template-c7b43fa365f4be10.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-b5f7d6afdecd013d.js → messaging-c7ba755c2e0e2377.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-248ad9f65a872442.js → ant-components-f14bfd5890a0e939.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-aedb66a62042b10a.js → AntForm-e4274a4d5d23eea9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-018df38b7cd77fdb.js → FormikAntFormItem-f5bce1ceb0502f04.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-6ca9099d03aab817.js → FormikControlled-90b4ea9f9deca6e2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-0f2c90786ea005a4.js → FormikField-d6043ae8dae6ef7d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-200b51a725f8b2d1.js → forms-520ba5ae02f47bda.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-b46f432b51421fae.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-fe4ed3ad75151e36.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-de681c2d022c9e0d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-04ebf2fb6fc4358a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-cd8ba2eef9085377.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-f75a407d78857ab3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-975ff605e1dbc09c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-e7fdf3a9a3e8c267.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-764b6ce8e030d4a1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-f3e6e74e0efb005c.js → [purpose_id]-da78452b3c41b29e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-4d658222ec800511.js → consent-6442e761ecb5c65a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-ea9baf24de35d3b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-44d06e280990854d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-a3275554ffe8e640.js → domains-6f61d886aa6f5ce7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-11148b182370fd83.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-33448bf0a1d53870.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-77239269acc2d31a.js → [key]-4a18d8135c0dbf2a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-8bf1821722b082e9.js → new-41957281b8ec26b1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-776258bad0941a7d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-3c315036f1fc9f90.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-00917525c9245a90.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-5d924b2f1f926b88.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-2deb6becece69d46.js → test-datasets-8067e12227210f48.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-1a902922759cae76.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-277ea1f34c3714cf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-cecea5832cb1f3b0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-726fbc0a34ffba1f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-df9b75ab01c1a2ea.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{webpack-2766492c5dbceb0a.js → webpack-118fb4723d13c14f.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/372d6a236c84613f.css +1 -0
- fides/ui-build/static/admin/_next/static/css/f38242c11f7fea64.css +1 -0
- fides/ui-build/static/admin/_next/static/zmEQMSpOBih8kmA1t-EWO/_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]/data-explorer.html +1 -0
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/poc/table-migration.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/settings/about/alpha.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
- fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/api/service/async_dsr/async_dsr_service.py +0 -195
- fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
- fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
- fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
- fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
- fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
- fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
- fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.71.2b0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → zmEQMSpOBih8kmA1t-EWO}/_ssgManifest.js +0 -0
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
import time
|
|
3
3
|
from copy import deepcopy
|
|
4
4
|
from datetime import datetime, timedelta
|
|
5
|
-
from typing import Any, Optional
|
|
5
|
+
from typing import Any, Optional
|
|
6
6
|
|
|
7
|
-
import requests
|
|
8
7
|
from loguru import logger
|
|
9
8
|
from pydantic import ValidationError as PydanticValidationError
|
|
10
9
|
from sqlalchemy.orm import Query, Session
|
|
@@ -22,7 +21,6 @@ from fides.api.common_exceptions import (
|
|
|
22
21
|
ValidationError,
|
|
23
22
|
)
|
|
24
23
|
from fides.api.db.session import get_db_session
|
|
25
|
-
from fides.api.graph.config import CollectionAddress
|
|
26
24
|
from fides.api.graph.graph import DatasetGraph
|
|
27
25
|
from fides.api.models.attachment import Attachment, AttachmentReferenceType
|
|
28
26
|
from fides.api.models.audit_log import AuditLog, AuditLogAction
|
|
@@ -53,7 +51,7 @@ from fides.api.schemas.policy import ActionType, CurrentStep
|
|
|
53
51
|
from fides.api.schemas.privacy_request import PrivacyRequestStatus
|
|
54
52
|
from fides.api.schemas.redis_cache import Identity
|
|
55
53
|
from fides.api.schemas.storage.storage import StorageType
|
|
56
|
-
from fides.api.service.connectors import
|
|
54
|
+
from fides.api.service.connectors import get_connector
|
|
57
55
|
from fides.api.service.connectors.consent_email_connector import (
|
|
58
56
|
CONSENT_EMAIL_CONNECTOR_TYPES,
|
|
59
57
|
)
|
|
@@ -85,11 +83,7 @@ from fides.api.util.collection_util import Row
|
|
|
85
83
|
from fides.api.util.logger import Pii, _log_exception, _log_warning
|
|
86
84
|
from fides.api.util.logger_context_utils import LoggerContextKeys, log_context
|
|
87
85
|
from fides.api.util.memory_watchdog import memory_limiter
|
|
88
|
-
from fides.common.api.v1.urn_registry import
|
|
89
|
-
PRIVACY_CENTER_DSR_PACKAGE,
|
|
90
|
-
PRIVACY_REQUEST_TRANSFER_TO_PARENT,
|
|
91
|
-
V1_URL_PREFIX,
|
|
92
|
-
)
|
|
86
|
+
from fides.common.api.v1.urn_registry import PRIVACY_CENTER_DSR_PACKAGE
|
|
93
87
|
from fides.config import CONFIG
|
|
94
88
|
from fides.config.config_proxy import ConfigProxy
|
|
95
89
|
|
|
@@ -307,8 +301,11 @@ def upload_and_save_access_results( # pylint: disable=R0912
|
|
|
307
301
|
) -> list[str]:
|
|
308
302
|
"""Process the data uploads after the access portion of the privacy request has completed"""
|
|
309
303
|
download_urls: list[str] = []
|
|
310
|
-
# Remove manual webhook attachments from the list of attachments
|
|
311
|
-
# This is done because
|
|
304
|
+
# Remove manual webhook attachments and request task attachments from the list of attachments
|
|
305
|
+
# This is done because:
|
|
306
|
+
# - manual webhook attachments are already included in the manual_data
|
|
307
|
+
# - manual task submission attachments are already included in the manual_data
|
|
308
|
+
# - request task attachments (from async polling) are already embedded in the dataset results
|
|
312
309
|
loaded_attachments = [
|
|
313
310
|
attachment
|
|
314
311
|
for attachment in privacy_request.attachments
|
|
@@ -317,6 +314,7 @@ def upload_and_save_access_results( # pylint: disable=R0912
|
|
|
317
314
|
in [
|
|
318
315
|
AttachmentReferenceType.access_manual_webhook,
|
|
319
316
|
AttachmentReferenceType.manual_task_submission,
|
|
317
|
+
AttachmentReferenceType.request_task,
|
|
320
318
|
]
|
|
321
319
|
for ref in attachment.references
|
|
322
320
|
)
|
|
@@ -922,78 +920,6 @@ def mark_paused_privacy_request_as_expired(privacy_request_id: str) -> None:
|
|
|
922
920
|
db.close()
|
|
923
921
|
|
|
924
922
|
|
|
925
|
-
def _retrieve_child_results( # pylint: disable=R0911
|
|
926
|
-
fides_connector: Tuple[str, ConnectionConfig],
|
|
927
|
-
rule_key: str,
|
|
928
|
-
access_result: dict[str, list[Row]],
|
|
929
|
-
) -> Optional[list[dict[str, Optional[list[Row]]]]]:
|
|
930
|
-
"""Get child access request results to add to upload."""
|
|
931
|
-
try:
|
|
932
|
-
connector = FidesConnector(fides_connector[1])
|
|
933
|
-
except Exception as e:
|
|
934
|
-
logger.error(
|
|
935
|
-
"Error create client for child server {}: {}", fides_connector[0], e
|
|
936
|
-
)
|
|
937
|
-
return None
|
|
938
|
-
|
|
939
|
-
results = []
|
|
940
|
-
|
|
941
|
-
for key, rows in access_result.items():
|
|
942
|
-
address = CollectionAddress.from_string(key)
|
|
943
|
-
privacy_request_id = None
|
|
944
|
-
if address.dataset == fides_connector[0]:
|
|
945
|
-
if not rows:
|
|
946
|
-
logger.info("No rows found for result entry {}", key)
|
|
947
|
-
continue
|
|
948
|
-
privacy_request_id = rows[0]["id"]
|
|
949
|
-
|
|
950
|
-
if not privacy_request_id:
|
|
951
|
-
logger.error(
|
|
952
|
-
"No privacy request found for connector key {}", fides_connector[0]
|
|
953
|
-
)
|
|
954
|
-
continue
|
|
955
|
-
|
|
956
|
-
try:
|
|
957
|
-
client = connector.create_client()
|
|
958
|
-
except requests.exceptions.HTTPError as e:
|
|
959
|
-
logger.error(
|
|
960
|
-
"Error logger into to child server for privacy request {}: {}",
|
|
961
|
-
privacy_request_id,
|
|
962
|
-
e,
|
|
963
|
-
)
|
|
964
|
-
continue
|
|
965
|
-
|
|
966
|
-
try:
|
|
967
|
-
request = client.authenticated_request(
|
|
968
|
-
method="get",
|
|
969
|
-
path=f"{V1_URL_PREFIX}{PRIVACY_REQUEST_TRANSFER_TO_PARENT.format(privacy_request_id=privacy_request_id, rule_key=rule_key)}",
|
|
970
|
-
headers={"Authorization": f"Bearer {client.token}"},
|
|
971
|
-
)
|
|
972
|
-
response = client.session.send(request)
|
|
973
|
-
except requests.exceptions.HTTPError as e:
|
|
974
|
-
logger.error(
|
|
975
|
-
"Error retrieving data from child server for privacy request {}: {}",
|
|
976
|
-
privacy_request_id,
|
|
977
|
-
e,
|
|
978
|
-
)
|
|
979
|
-
continue
|
|
980
|
-
|
|
981
|
-
if response.status_code != 200:
|
|
982
|
-
logger.error(
|
|
983
|
-
"Error retrieving data from child server for privacy request {}: {}",
|
|
984
|
-
privacy_request_id,
|
|
985
|
-
response.json(),
|
|
986
|
-
)
|
|
987
|
-
continue
|
|
988
|
-
|
|
989
|
-
results.append(response.json())
|
|
990
|
-
|
|
991
|
-
if not results:
|
|
992
|
-
return None
|
|
993
|
-
|
|
994
|
-
return results
|
|
995
|
-
|
|
996
|
-
|
|
997
923
|
def get_consent_email_connection_configs(db: Session) -> Query:
|
|
998
924
|
"""Return enabled consent email connection configs."""
|
|
999
925
|
return db.query(ConnectionConfig).filter(
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
-
from asyncio import sleep
|
|
5
4
|
from datetime import datetime, timedelta
|
|
6
5
|
from typing import Any, Dict, List, Optional, Set
|
|
7
6
|
|
|
@@ -11,7 +10,7 @@ from sqlalchemy import text
|
|
|
11
10
|
from sqlalchemy.orm import Session
|
|
12
11
|
from sqlalchemy.sql.elements import TextClause
|
|
13
12
|
|
|
14
|
-
from fides.api.common_exceptions import PrivacyRequestError
|
|
13
|
+
from fides.api.common_exceptions import PrivacyRequestError
|
|
15
14
|
from fides.api.models.privacy_request import (
|
|
16
15
|
EXITED_EXECUTION_LOG_STATUSES,
|
|
17
16
|
PrivacyRequest,
|
|
@@ -21,10 +20,7 @@ from fides.api.models.privacy_request.request_task import AsyncTaskType
|
|
|
21
20
|
from fides.api.models.worker_task import ExecutionLogStatus
|
|
22
21
|
from fides.api.schemas.drp_privacy_request import DrpPrivacyRequestCreate
|
|
23
22
|
from fides.api.schemas.policy import ActionType
|
|
24
|
-
from fides.api.schemas.privacy_request import
|
|
25
|
-
PrivacyRequestResponse,
|
|
26
|
-
PrivacyRequestStatus,
|
|
27
|
-
)
|
|
23
|
+
from fides.api.schemas.privacy_request import PrivacyRequestStatus
|
|
28
24
|
from fides.api.schemas.redis_cache import Identity
|
|
29
25
|
from fides.api.tasks import DSR_QUEUE_NAME, DatabaseTask, celery_app
|
|
30
26
|
from fides.api.tasks.scheduled.scheduler import scheduler
|
|
@@ -38,7 +34,6 @@ from fides.api.util.cache import (
|
|
|
38
34
|
reset_privacy_request_retry_count,
|
|
39
35
|
)
|
|
40
36
|
from fides.api.util.lock import redis_lock
|
|
41
|
-
from fides.common.api.v1.urn_registry import PRIVACY_REQUESTS, V1_URL_PREFIX
|
|
42
37
|
from fides.config import CONFIG
|
|
43
38
|
|
|
44
39
|
PRIVACY_REQUEST_STATUS_CHANGE_POLL = "privacy_request_status_change_poll"
|
|
@@ -98,62 +93,6 @@ def get_async_client() -> AsyncClient:
|
|
|
98
93
|
return AsyncClient()
|
|
99
94
|
|
|
100
95
|
|
|
101
|
-
async def poll_server_for_completion(
|
|
102
|
-
privacy_request_id: str,
|
|
103
|
-
server_url: str,
|
|
104
|
-
token: str,
|
|
105
|
-
*,
|
|
106
|
-
poll_interval_seconds: int = 30,
|
|
107
|
-
timeout_seconds: int = 1800, # 30 minutes
|
|
108
|
-
client: AsyncClient | None = None,
|
|
109
|
-
) -> PrivacyRequestResponse:
|
|
110
|
-
"""Poll a server for privacy request completion.
|
|
111
|
-
|
|
112
|
-
Requests will report complete with if they have a status of canceled, complete,
|
|
113
|
-
denied, or error. By default the polling will time out if not completed in 30
|
|
114
|
-
minutes, time can be overridden by setting the timeout_seconds.
|
|
115
|
-
"""
|
|
116
|
-
url = (
|
|
117
|
-
f"{server_url}{V1_URL_PREFIX}{PRIVACY_REQUESTS}?request_id={privacy_request_id}"
|
|
118
|
-
)
|
|
119
|
-
start_time = datetime.now()
|
|
120
|
-
elapsed_time = 0.0
|
|
121
|
-
while elapsed_time < timeout_seconds:
|
|
122
|
-
if client:
|
|
123
|
-
response = await client.get(
|
|
124
|
-
url, headers={"Authorization": f"Bearer {token}"}
|
|
125
|
-
)
|
|
126
|
-
else:
|
|
127
|
-
async_client = get_async_client()
|
|
128
|
-
response = await async_client.get(
|
|
129
|
-
url, headers={"Authorization": f"Bearer {token}"}
|
|
130
|
-
)
|
|
131
|
-
response.raise_for_status()
|
|
132
|
-
|
|
133
|
-
# Privacy requests are returned paginated. Since this is searching for a specific
|
|
134
|
-
# privacy request there should only be one value present in items.
|
|
135
|
-
items = response.json()["items"]
|
|
136
|
-
if not items:
|
|
137
|
-
raise PrivacyRequestNotFound(
|
|
138
|
-
f"No privacy request found with id '{privacy_request_id}'"
|
|
139
|
-
)
|
|
140
|
-
status = PrivacyRequestResponse(**items[0])
|
|
141
|
-
if status.status and status.status in (
|
|
142
|
-
PrivacyRequestStatus.complete,
|
|
143
|
-
PrivacyRequestStatus.canceled,
|
|
144
|
-
PrivacyRequestStatus.error,
|
|
145
|
-
PrivacyRequestStatus.denied,
|
|
146
|
-
):
|
|
147
|
-
return status
|
|
148
|
-
|
|
149
|
-
await sleep(poll_interval_seconds)
|
|
150
|
-
time_delta = datetime.now() - start_time
|
|
151
|
-
elapsed_time = time_delta.seconds
|
|
152
|
-
raise TimeoutError(
|
|
153
|
-
f"Timeout of {timeout_seconds} seconds has been exceeded while waiting for privacy request {privacy_request_id}"
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
|
|
157
96
|
def initiate_poll_for_exited_privacy_request_tasks() -> None:
|
|
158
97
|
"""Initiates scheduler to check if a Privacy Request's status needs to be flipped when all
|
|
159
98
|
Request Tasks have had a chance to run"""
|
|
@@ -364,7 +303,7 @@ def initiate_interrupted_task_requeue_poll() -> None:
|
|
|
364
303
|
)
|
|
365
304
|
|
|
366
305
|
|
|
367
|
-
def
|
|
306
|
+
def initiate_polling_task_requeue() -> None:
|
|
368
307
|
"""Initiates scheduler to check for and requeue pending polling async tasks"""
|
|
369
308
|
if CONFIG.test_mode:
|
|
370
309
|
return
|
|
@@ -375,13 +314,13 @@ def initiate_async_tasks_status_polling() -> None:
|
|
|
375
314
|
|
|
376
315
|
logger.info("Initiating scheduler for async tasks status polling")
|
|
377
316
|
scheduler.add_job(
|
|
378
|
-
func=
|
|
317
|
+
func=requeue_polling_tasks,
|
|
379
318
|
trigger="interval",
|
|
380
319
|
kwargs={},
|
|
381
320
|
id=ASYNC_TASKS_STATUS_POLLING,
|
|
382
321
|
coalesce=True,
|
|
383
322
|
replace_existing=True,
|
|
384
|
-
seconds=
|
|
323
|
+
seconds=20,
|
|
385
324
|
)
|
|
386
325
|
|
|
387
326
|
|
|
@@ -541,6 +480,27 @@ def _get_request_task_ids_in_progress(
|
|
|
541
480
|
return [task[0] for task in request_tasks_in_progress]
|
|
542
481
|
|
|
543
482
|
|
|
483
|
+
def _has_polling_tasks(db: Session, privacy_request_id: str) -> bool:
|
|
484
|
+
"""
|
|
485
|
+
Check if a privacy request has any polling async tasks.
|
|
486
|
+
|
|
487
|
+
Args:
|
|
488
|
+
db: Database session
|
|
489
|
+
privacy_request_id: The ID of the privacy request to check
|
|
490
|
+
|
|
491
|
+
Returns:
|
|
492
|
+
bool: True if the privacy request has polling tasks, False otherwise
|
|
493
|
+
"""
|
|
494
|
+
return db.query(
|
|
495
|
+
db.query(RequestTask)
|
|
496
|
+
.filter(
|
|
497
|
+
RequestTask.privacy_request_id == privacy_request_id,
|
|
498
|
+
RequestTask.async_type == AsyncTaskType.polling,
|
|
499
|
+
)
|
|
500
|
+
.exists()
|
|
501
|
+
).scalar()
|
|
502
|
+
|
|
503
|
+
|
|
544
504
|
# pylint: disable=too-many-branches
|
|
545
505
|
# pylint: disable=too-many-statements
|
|
546
506
|
@celery_app.task(base=DatabaseTask, bind=True)
|
|
@@ -680,6 +640,17 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
|
|
|
680
640
|
should_requeue = False
|
|
681
641
|
break
|
|
682
642
|
|
|
643
|
+
# Check if the Privacy request has polling tasks
|
|
644
|
+
if _has_polling_tasks(db, privacy_request.id):
|
|
645
|
+
# If the polling request task has no cached task ID, it's stuck
|
|
646
|
+
logger.warning(
|
|
647
|
+
f"No task ID found for request task {request_task_id} "
|
|
648
|
+
f"(privacy request {privacy_request.id}) Contains polling tasks - "
|
|
649
|
+
f"keeping request in current status as it may be waiting for polling task to complete"
|
|
650
|
+
)
|
|
651
|
+
should_requeue = False
|
|
652
|
+
break
|
|
653
|
+
|
|
683
654
|
# For other statuses, cancel the entire privacy request
|
|
684
655
|
_cancel_interrupted_tasks_and_error_privacy_request(
|
|
685
656
|
db,
|
|
@@ -706,7 +677,7 @@ def requeue_interrupted_tasks(self: DatabaseTask) -> None:
|
|
|
706
677
|
|
|
707
678
|
|
|
708
679
|
@celery_app.task(base=DatabaseTask, bind=True)
|
|
709
|
-
def
|
|
680
|
+
def requeue_polling_tasks(self: DatabaseTask) -> None:
|
|
710
681
|
"""
|
|
711
682
|
Poll the status of async tasks that are awaiting processing.
|
|
712
683
|
"""
|
|
@@ -720,19 +691,21 @@ def poll_async_tasks_status(self: DatabaseTask) -> None:
|
|
|
720
691
|
with self.get_new_session() as db:
|
|
721
692
|
logger.debug("Polling for async tasks status")
|
|
722
693
|
|
|
723
|
-
# Get all tasks that are
|
|
694
|
+
# Get all tasks that are polling and are from polling async tasks
|
|
724
695
|
async_tasks = (
|
|
725
696
|
db.query(RequestTask)
|
|
726
|
-
.filter(RequestTask.status == ExecutionLogStatus.
|
|
697
|
+
.filter(RequestTask.status == ExecutionLogStatus.polling)
|
|
727
698
|
.filter(RequestTask.async_type == AsyncTaskType.polling)
|
|
728
699
|
.all()
|
|
729
700
|
)
|
|
730
|
-
logger.info(f"Found {len(async_tasks)} async tasks
|
|
701
|
+
logger.info(f"Found {len(async_tasks)} async polling tasks")
|
|
731
702
|
|
|
732
703
|
if async_tasks:
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
)
|
|
704
|
+
# Avoiding cyclic imports
|
|
705
|
+
from fides.api.task.execute_request_tasks import queue_request_task
|
|
736
706
|
|
|
737
707
|
for async_task in async_tasks:
|
|
738
|
-
|
|
708
|
+
logger.info(
|
|
709
|
+
f"Requeuing polling task {async_task.id} for processing"
|
|
710
|
+
)
|
|
711
|
+
queue_request_task(async_task, privacy_request_proceed=True)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
2
|
from inspect import Signature, signature
|
|
3
|
-
from typing import Callable, Dict, List, Union
|
|
3
|
+
from typing import TYPE_CHECKING, Callable, Dict, List, Union
|
|
4
4
|
|
|
5
5
|
from loguru import logger
|
|
6
6
|
|
|
@@ -12,6 +12,9 @@ from fides.api.schemas.consentable_item import ConsentableItem, ConsentWebhookRe
|
|
|
12
12
|
from fides.api.schemas.saas.shared_schemas import ConsentPropagationStatus
|
|
13
13
|
from fides.api.util.collection_util import Row
|
|
14
14
|
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from fides.api.schemas.saas.async_polling_configuration import PollingResult
|
|
17
|
+
|
|
15
18
|
|
|
16
19
|
# at some point this should likely be formalized more centrally...
|
|
17
20
|
class SaaSRequestType(Enum):
|
|
@@ -30,6 +33,10 @@ class SaaSRequestType(Enum):
|
|
|
30
33
|
UPDATE_CONSENT = "update_consent"
|
|
31
34
|
PROCESS_CONSENT_WEBHOOK = "process_consent_webhook"
|
|
32
35
|
|
|
36
|
+
# Async polling request types
|
|
37
|
+
POLLING_STATUS = "polling_status"
|
|
38
|
+
POLLING_RESULT = "polling_result"
|
|
39
|
+
|
|
33
40
|
|
|
34
41
|
RequestOverrideFunction = Callable[
|
|
35
42
|
...,
|
|
@@ -39,6 +46,8 @@ RequestOverrideFunction = Callable[
|
|
|
39
46
|
List[Row],
|
|
40
47
|
ConsentPropagationStatus,
|
|
41
48
|
int,
|
|
49
|
+
bool, # For polling status overrides
|
|
50
|
+
"PollingResult", # For polling result overrides - string literal to avoid circular import
|
|
42
51
|
None,
|
|
43
52
|
],
|
|
44
53
|
]
|
|
@@ -105,6 +114,10 @@ class SaaSRequestOverrideFactory:
|
|
|
105
114
|
validate_update_consent_function(override_function)
|
|
106
115
|
elif request_type == SaaSRequestType.PROCESS_CONSENT_WEBHOOK:
|
|
107
116
|
validate_process_consent_webhook_function(override_function)
|
|
117
|
+
elif request_type == SaaSRequestType.POLLING_STATUS:
|
|
118
|
+
validate_polling_status_override_function(override_function)
|
|
119
|
+
elif request_type == SaaSRequestType.POLLING_RESULT:
|
|
120
|
+
validate_polling_result_override_function(override_function)
|
|
108
121
|
else:
|
|
109
122
|
raise ValueError(
|
|
110
123
|
f"Invalid SaaSRequestType '{request_type}' provided for SaaS request override function"
|
|
@@ -264,5 +277,57 @@ def validate_process_consent_webhook_function(f: Callable) -> None:
|
|
|
264
277
|
)
|
|
265
278
|
|
|
266
279
|
|
|
280
|
+
def validate_polling_status_override_function(f: Callable) -> None:
|
|
281
|
+
"""
|
|
282
|
+
Perform some basic checks on the user-provided SaaS request override function
|
|
283
|
+
that will be used for polling status checks.
|
|
284
|
+
|
|
285
|
+
The validation is not overly strict to allow for some flexibility in
|
|
286
|
+
the functions that are used for overrides, but we check to ensure that
|
|
287
|
+
the function meets the framework's basic expectations.
|
|
288
|
+
|
|
289
|
+
Specifically, the validation checks that function's return type is `bool`
|
|
290
|
+
and that it declares at least 4 parameters.
|
|
291
|
+
"""
|
|
292
|
+
sig: Signature = signature(f)
|
|
293
|
+
if sig.return_annotation is not bool:
|
|
294
|
+
raise InvalidSaaSRequestOverrideException(
|
|
295
|
+
"Polling status override function must return a bool"
|
|
296
|
+
)
|
|
297
|
+
if len(sig.parameters) < 4:
|
|
298
|
+
raise InvalidSaaSRequestOverrideException(
|
|
299
|
+
"Polling status override function must declare at least 4 parameters"
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def validate_polling_result_override_function(f: Callable) -> None:
|
|
304
|
+
"""
|
|
305
|
+
Perform some basic checks on the user-provided SaaS request override function
|
|
306
|
+
that will be used for polling result retrieval.
|
|
307
|
+
|
|
308
|
+
The validation is not overly strict to allow for some flexibility in
|
|
309
|
+
the functions that are used for overrides, but we check to ensure that
|
|
310
|
+
the function meets the framework's basic expectations.
|
|
311
|
+
|
|
312
|
+
Specifically, the validation checks that function's return type is `PollingResult`
|
|
313
|
+
and that it declares at least 4 parameters.
|
|
314
|
+
"""
|
|
315
|
+
sig: Signature = signature(f)
|
|
316
|
+
|
|
317
|
+
# Import PollingResult here to avoid circular imports at module level
|
|
318
|
+
from fides.api.schemas.saas.async_polling_configuration import PollingResult
|
|
319
|
+
|
|
320
|
+
# Check return type annotation - handle both direct class and string literals
|
|
321
|
+
return_annotation = sig.return_annotation
|
|
322
|
+
if return_annotation not in (PollingResult, "PollingResult"):
|
|
323
|
+
raise InvalidSaaSRequestOverrideException(
|
|
324
|
+
"Polling result override function must return a PollingResult"
|
|
325
|
+
)
|
|
326
|
+
if len(sig.parameters) < 4:
|
|
327
|
+
raise InvalidSaaSRequestOverrideException(
|
|
328
|
+
"Polling result override function must declare at least 4 parameters"
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
|
|
267
332
|
# TODO: Avoid running this on import?
|
|
268
333
|
register = SaaSRequestOverrideFactory.register
|
|
@@ -22,7 +22,10 @@ from fides.api.common_exceptions import (
|
|
|
22
22
|
from fides.api.graph.config import TERMINATOR_ADDRESS, CollectionAddress
|
|
23
23
|
from fides.api.models.connectionconfig import ConnectionConfig
|
|
24
24
|
from fides.api.models.privacy_request import ExecutionLog, PrivacyRequest, RequestTask
|
|
25
|
-
from fides.api.models.worker_task import
|
|
25
|
+
from fides.api.models.worker_task import (
|
|
26
|
+
RESUMABLE_EXECUTION_LOG_STATUSES,
|
|
27
|
+
ExecutionLogStatus,
|
|
28
|
+
)
|
|
26
29
|
from fides.api.schemas.policy import ActionType, CurrentStep
|
|
27
30
|
from fides.api.schemas.privacy_request import PrivacyRequestStatus
|
|
28
31
|
from fides.api.task.graph_task import (
|
|
@@ -162,7 +165,7 @@ def can_run_task_body(
|
|
|
162
165
|
if request_task.is_root_task:
|
|
163
166
|
# Shouldn't be possible but adding as a catch-all
|
|
164
167
|
return False
|
|
165
|
-
if request_task.status
|
|
168
|
+
if request_task.status not in RESUMABLE_EXECUTION_LOG_STATUSES:
|
|
166
169
|
logger_method(request_task)(
|
|
167
170
|
"Skipping {} task {} with status {}.",
|
|
168
171
|
request_task.action_type,
|
fides/api/task/filter_results.py
CHANGED
|
@@ -6,10 +6,43 @@ from loguru import logger
|
|
|
6
6
|
|
|
7
7
|
from fides.api.graph.config import CollectionAddress, FieldPath
|
|
8
8
|
from fides.api.graph.graph import DatasetGraph
|
|
9
|
+
from fides.api.service.storage.util import is_attachment_field
|
|
9
10
|
from fides.api.task.manual.manual_task_address import ManualTaskAddress
|
|
10
11
|
from fides.api.util.collection_util import Row
|
|
11
12
|
|
|
12
13
|
|
|
14
|
+
def should_skip_data_category_filtering(
|
|
15
|
+
node_address: str, results: List[Dict[str, Optional[Any]]]
|
|
16
|
+
) -> bool:
|
|
17
|
+
"""
|
|
18
|
+
Determine if results should skip data category filtering.
|
|
19
|
+
|
|
20
|
+
This includes:
|
|
21
|
+
1. Manual task data - controlled by field definitions, not data categories
|
|
22
|
+
2. Attachment data - should be preserved regardless of data categories (from polling or manual tasks)
|
|
23
|
+
|
|
24
|
+
:param node_address: The collection address being processed
|
|
25
|
+
:param results: The results data to check
|
|
26
|
+
:return: True if filtering should be skipped, False otherwise
|
|
27
|
+
"""
|
|
28
|
+
# Check if this is a manual task address
|
|
29
|
+
if ManualTaskAddress.is_manual_task_address(node_address):
|
|
30
|
+
return True
|
|
31
|
+
|
|
32
|
+
# Check if results contain attachment data
|
|
33
|
+
if not results:
|
|
34
|
+
return False
|
|
35
|
+
|
|
36
|
+
# Verify it looks like actual attachment data
|
|
37
|
+
for result in results:
|
|
38
|
+
if isinstance(result, dict) and any(
|
|
39
|
+
is_attachment_field(value) for value in result.values()
|
|
40
|
+
):
|
|
41
|
+
return True
|
|
42
|
+
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
|
|
13
46
|
def filter_data_categories(
|
|
14
47
|
access_request_results: Dict[str, List[Dict[str, Optional[Any]]]],
|
|
15
48
|
target_categories: Set[str],
|
|
@@ -38,8 +71,8 @@ def filter_data_categories(
|
|
|
38
71
|
if not results:
|
|
39
72
|
continue
|
|
40
73
|
|
|
41
|
-
# Skip
|
|
42
|
-
if
|
|
74
|
+
# Skip data that doesn't need filtering (manual tasks and attachment data)
|
|
75
|
+
if should_skip_data_category_filtering(node_address, results):
|
|
43
76
|
filtered_access_results[node_address].extend(results)
|
|
44
77
|
continue
|
|
45
78
|
|
fides/api/task/graph_task.py
CHANGED
|
@@ -13,6 +13,7 @@ from sqlalchemy.orm import Session
|
|
|
13
13
|
from fides.api.api.deps import get_autoclose_db_session as get_db
|
|
14
14
|
from fides.api.common_exceptions import (
|
|
15
15
|
ActionDisabled,
|
|
16
|
+
AwaitingAsyncProcessing,
|
|
16
17
|
AwaitingAsyncTask,
|
|
17
18
|
CollectionDisabled,
|
|
18
19
|
NotSupportedForCollection,
|
|
@@ -96,6 +97,7 @@ def retry(
|
|
|
96
97
|
If we exceed the number of TASK_RETRY_COUNT retries, we re-raise the exception to stop execution of the privacy request.
|
|
97
98
|
"""
|
|
98
99
|
|
|
100
|
+
# pylint: disable=too-many-return-statements
|
|
99
101
|
def decorator(func: Callable) -> Callable:
|
|
100
102
|
@wraps(func)
|
|
101
103
|
def result(*args: Any, **kwargs: Any) -> Any:
|
|
@@ -115,6 +117,17 @@ def retry(
|
|
|
115
117
|
self.log_start(action_type)
|
|
116
118
|
# Run access or erasure request
|
|
117
119
|
return func(*args, **kwargs)
|
|
120
|
+
except AwaitingAsyncProcessing as ex:
|
|
121
|
+
logger.warning(
|
|
122
|
+
"Request Task {} {} {} async processing in progress",
|
|
123
|
+
self.request_task.id if self.request_task.id else None,
|
|
124
|
+
method_name,
|
|
125
|
+
self.execution_node.address,
|
|
126
|
+
)
|
|
127
|
+
# Log the async processing status and exit without retrying.
|
|
128
|
+
self.log_async_processing(action_type, ex)
|
|
129
|
+
# Request Task put in "polling" status and exited, external system is processing
|
|
130
|
+
return None
|
|
118
131
|
except AwaitingAsyncTask as ex:
|
|
119
132
|
logger.warning(
|
|
120
133
|
"Request Task {} {} {} awaiting async continuation",
|
|
@@ -416,9 +429,13 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
|
|
|
416
429
|
# created to keep these in sync.
|
|
417
430
|
# TODO remove conditional above alongside deprecating DSR 2.0
|
|
418
431
|
if self.request_task.id:
|
|
419
|
-
# Merge the
|
|
420
|
-
#
|
|
432
|
+
# Merge the request_task into the current session to make it persistent,
|
|
433
|
+
# then refresh its `async_type` to load the latest state from the
|
|
434
|
+
# database. This is crucial for async tasks where `async_type` might be
|
|
435
|
+
# updated by another process, and avoids overwriting local data like
|
|
436
|
+
# `access_data`.
|
|
421
437
|
request_task = db.merge(self.request_task)
|
|
438
|
+
db.refresh(request_task, attribute_names=["async_type"])
|
|
422
439
|
request_task.update_status(db, status)
|
|
423
440
|
self.request_task = request_task
|
|
424
441
|
|
|
@@ -453,6 +470,21 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
|
|
|
453
470
|
message, [], action_type, ExecutionLogStatus.awaiting_processing
|
|
454
471
|
)
|
|
455
472
|
|
|
473
|
+
def log_async_processing(
|
|
474
|
+
self,
|
|
475
|
+
action_type: ActionType,
|
|
476
|
+
ex: Optional[BaseException],
|
|
477
|
+
extra_message: Optional[str] = None,
|
|
478
|
+
) -> None:
|
|
479
|
+
"""On async processing activities - external system is actively processing, Fides is polling"""
|
|
480
|
+
logger.info("Polling for async results on node {}", self.key)
|
|
481
|
+
|
|
482
|
+
message = str(ex)
|
|
483
|
+
if extra_message:
|
|
484
|
+
message = f"{message}. {extra_message}"
|
|
485
|
+
|
|
486
|
+
self.update_status(message, [], action_type, ExecutionLogStatus.polling)
|
|
487
|
+
|
|
456
488
|
def log_skipped(self, action_type: ActionType, ex: str) -> None:
|
|
457
489
|
"""Log that a collection was skipped. For now, this is because a collection has been disabled."""
|
|
458
490
|
logger.info("Skipping node {}", self.key)
|
fides/api/util/saas_util.py
CHANGED
|
@@ -26,6 +26,7 @@ PRIVACY_REQUEST_ID = "privacy_request_id"
|
|
|
26
26
|
MASKED_OBJECT_FIELDS = "masked_object_fields"
|
|
27
27
|
ALL_OBJECT_FIELDS = "all_object_fields"
|
|
28
28
|
CUSTOM_PRIVACY_REQUEST_FIELDS = "custom_privacy_request_fields"
|
|
29
|
+
PRIVACY_REQUEST_OBJECT = "privacy_request"
|
|
29
30
|
UUID = "uuid"
|
|
30
31
|
ISO_8601_DATETIME = "iso_8601_datetime"
|
|
31
32
|
FIELD_LIST = "field_list"
|
|
@@ -61,9 +61,13 @@ class ExecutionSettings(FidesSettings):
|
|
|
61
61
|
default=3,
|
|
62
62
|
description="The number of times a privacy request will be requeued when its tasks are interrupted before being marked as error",
|
|
63
63
|
)
|
|
64
|
-
|
|
65
|
-
default=
|
|
66
|
-
description="
|
|
64
|
+
async_polling_interval_hours: int = Field(
|
|
65
|
+
default=24,
|
|
66
|
+
description="Hours between status checks for async tasks",
|
|
67
|
+
)
|
|
68
|
+
async_polling_request_timeout_days: int = Field(
|
|
69
|
+
default=30,
|
|
70
|
+
description="Maximum time in days to wait for an async polling request to complete before timing out",
|
|
67
71
|
)
|
|
68
72
|
erasure_request_finalization_required: bool = Field(
|
|
69
73
|
default=False,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/372d6a236c84613f.css" as="style"/><link rel="stylesheet" href="/_next/static/css/372d6a236c84613f.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-118fb4723d13c14f.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-9e869a44215709ed.js" defer=""></script><script src="/_next/static/chunks/pages/404-2014144a1a0fa64f.js" defer=""></script><script src="/_next/static/zmEQMSpOBih8kmA1t-EWO/_buildManifest.js" defer=""></script><script src="/_next/static/zmEQMSpOBih8kmA1t-EWO/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"zmEQMSpOBih8kmA1t-EWO","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1099],{56632:function(e,t,n){var i=n(89278),a=n(80068),o=n(50098);e.exports=function(e){return function(t,n,r){var s=Object(t);if(!a(t)){var l=i(n,3);t=o(t),n=function(e){return l(s[e],e,s)}}var c=e(t,n,r);return c>-1?s[l?t[c]:c]:void 0}}},64925:function(e,t,n){var i=n(56632)(n(66259));e.exports=i},66259:function(e,t,n){var i=n(95372),a=n(89278),o=n(47991),r=Math.max;e.exports=function(e,t,n){var s=null==e?0:e.length;if(!s)return -1;var l=null==n?0:o(n);return l<0&&(l=r(s+l,0)),i(e,a(t,3),l)}},94919:function(e,t,n){var i=n(91936),a=1/0;e.exports=function(e){return e?(e=i(e))===a||e===-a?(e<0?-1:1)*17976931348623157e292:e==e?e:0:0===e?e:0}},47991:function(e,t,n){var i=n(94919);e.exports=function(e){var t=i(e),n=t%1;return t==t?n?t-n:t:0}},12627:function(e,t,n){"use strict";var i=n(24246),a=n(79283),o=n(34929);t.Z=e=>{let{selectedTaxonomies:t,showDisabled:n=!1,...r}=e,{getDataCategoryDisplayNameProps:s,getDataCategories:l}=(0,o.Z)(),c=(n?l():l().filter(e=>e.active)).filter(e=>!(null==t?void 0:t.includes(e.fides_key))).map(e=>{let{name:t,primaryName:n}=s(e.fides_key);return{value:e.fides_key,name:t,primaryName:n,description:e.description||""}});return(0,i.jsx)(a.l,{options:c,...r})}},79283:function(e,t,n){"use strict";n.d(t,{l:function(){return d}});var i=n(24246),a=n(20595),o=n(72707),r=n.n(o);let s=e=>{let{data:{formattedTitle:t,description:n,name:o,primaryName:r}}=e;return(0,i.jsxs)(a.jqI,{gap:12,title:"".concat(t," - ").concat(n),children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("strong",{children:r||o}),r&&": ".concat(o)]}),(0,i.jsx)("em",{children:n})]})},l=e=>"options"in e&&Array.isArray(e.options),c=e=>({...e,className:r().option,formattedTitle:e.formattedTitle||[e.primaryName,e.name].filter(e=>e).join(": ")}),d=e=>{let{options:t,...n}=e,o=null==t?void 0:t.map(e=>l(e)?{...e,options:e.options.map(c)}:c(e));return(0,i.jsx)(a.WPr,{options:o,filterOption:(e,t)=>{var n,i;return(null==t?void 0:null===(n=t.formattedTitle)||void 0===n?void 0:n.toLowerCase().includes(e.toLowerCase()))||(null==t?void 0:null===(i=t.value)||void 0===i?void 0:i.toLowerCase().includes(e.toLowerCase()))||!1},optionFilterProp:"label",autoFocus:!0,variant:"borderless",optionRender:s,styles:{popup:{root:{minWidth:"500px"}}},className:"w-full p-0","data-testid":"taxonomy-select",...n})}},34929:function(e,t,n){"use strict";var i=n(24246),a=n(64925),o=n.n(a),r=n(27378),s=n(16134),l=n(30002),c=n(28079),d=n(57072);let u=()=>{let{isLoading:e}=(0,c.fd)(),t=(0,s.C)(c.U3),{isLoading:n}=(0,d.MO)(),i=(0,s.C)(d.qb),{isLoading:a}=(0,l.te)();return{dataUses:t,dataSubjects:(0,s.C)(l.ZL),dataCategories:i,isLoading:e||n||a}};t.Z=()=>{let{dataUses:e,dataCategories:t,dataSubjects:n,isLoading:a}=u(),s=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return e.split(".").slice(0,t).join(".")},l=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,i=t(e);if(!i)return{};let a=t(s(e,n)),o=!!i.parent_key;return{name:i.name||void 0,primaryName:o&&(null==a?void 0:a.name)!==i.name&&(null==a?void 0:a.name)||void 0}},c=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,{name:a,primaryName:o}=l(e,t,n);return a?o?(0,i.jsxs)(r.Fragment,{children:[(0,i.jsxs)("strong",{children:[o,":"]})," ",a]},e):(0,i.jsx)("strong",{children:a},e):e},d=t=>o()(e,{fides_key:t}),f=e=>o()(t,{fides_key:e}),v=e=>o()(n,{fides_key:e});return{getDataUses:()=>e,getDataUseByKey:d,getDataUseDisplayName:e=>c(e,d,1),getDataUseDisplayNameProps:e=>l(e,d,1),getDataCategories:()=>t,getDataCategoryByKey:f,getDataCategoryDisplayName:e=>c(e,f,2),getDataCategoryDisplayNameProps:e=>l(e,f,2),getDataSubjects:()=>n,getDataSubjectByKey:v,getDataSubjectDisplayName:e=>{let t=v(e);return t?t.name:e},getPrimaryKey:s,isLoading:a}}},61099:function(e,t,n){"use strict";var i=n(24246),a=n(20595),o=n(27378),r=n(12627),s=n(34929),l=n(26183),c=n(70675);t.Z=e=>{var t,n,d;let{resource:u}=e,[f,v]=(0,o.useState)(!1),{getDataCategoryDisplayName:p}=(0,s.Z)(),[g]=(0,c.NA)(),m=(null===(t=u.classifications)||void 0===t?void 0:t.length)?u.classifications[0].label:null,x=null!==(d=u.user_assigned_data_categories)&&void 0!==d?d:[],h=!m&&!(null==x?void 0:x.length),_=null===(n=u.sub_field_urns)||void 0===n?void 0:n.length,j=e=>{g({staged_resource_urn:u.urn,monitor_config_id:u.monitor_config_id,user_assigned_data_categories:[...x,e]})},y=e=>{var t;g({staged_resource_urn:u.urn,monitor_config_id:u.monitor_config_id,user_assigned_data_categories:null!==(t=null==x?void 0:x.filter(t=>t!==e))&&void 0!==t?t:[]})},b=!f&&!!x.length,w=!f&&!!m&&!x.length;return(0,i.jsxs)(l.Z,{"data-testid":"edit-category-cell",children:[h&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.j8w,{"data-testid":"no-classifications",color:"white",children:"None"}),!_&&(0,i.jsx)(a.j8w,{onClick:()=>v(!0),addable:!0,"data-testid":"taxonomy-add-btn","aria-label":"Add category"})]}),b&&(0,i.jsxs)(i.Fragment,{children:[x.map(e=>(0,i.jsx)(a.j8w,{"data-testid":"user-classification-".concat(e),color:"white",closable:!0,onClose:()=>y(e),closeButtonLabel:"Remove category",children:p(e)},e)),(0,i.jsx)(a.j8w,{onClick:()=>v(!0),addable:!0,"data-testid":"taxonomy-add-btn","aria-label":"Add category"})]}),w&&(0,i.jsxs)(a.j8w,{onClick:()=>v(!0),color:"white","data-testid":"classification-".concat(m),hasSparkle:!0,children:[p(m),(0,i.jsx)(a.PJP.I8b,{size:10})]}),f&&(0,i.jsx)(a.xuv,{className:"select-wrapper",position:"absolute",zIndex:10,top:"0",left:"0",width:"100%",height:"max",bgColor:"#fff",children:(0,i.jsx)(r.Z,{selectedTaxonomies:x,onChange:e=>{v(!1),j(e)},onBlur:()=>v(!1),open:!0})})]})}},26183:function(e,t,n){"use strict";var i=n(24246);n(27378),t.Z=e=>{let{children:t,className:n,...a}=e;return(0,i.jsx)("div",{className:"relative flex w-full flex-wrap items-center gap-2 overflow-x-auto py-2 ".concat(n||""),...a,children:t})}},57072:function(e,t,n){"use strict";n.d(t,{Bd:function(){return i.Bd},L5:function(){return i.L5},MO:function(){return i.MO},qb:function(){return i.qb}});var i=n(5785)},72707:function(e){e.exports={option:"TaxonomySelect_option__vY6v2"}}}]);
|