ethyca-fides 2.64.1rc0__py2.py3-none-any.whl → 2.64.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.
- {ethyca_fides-2.64.1rc0.dist-info → ethyca_fides-2.64.2b0.dist-info}/METADATA +2 -2
- {ethyca_fides-2.64.1rc0.dist-info → ethyca_fides-2.64.2b0.dist-info}/RECORD +235 -235
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/6a76a1fa4f3f_add_manual_task_instance_table.py +256 -0
- fides/api/alembic/migrations/versions/aadfe83c5644_add_manual_task_to_connectiontype_enum.py +46 -0
- fides/api/db/base.py +4 -0
- fides/api/db/database.py +27 -2
- fides/api/models/attachment.py +15 -3
- fides/api/models/comment.py +22 -5
- fides/api/models/connectionconfig.py +11 -0
- fides/api/models/db_cache.py +1 -1
- fides/api/models/detection_discovery/core.py +15 -15
- fides/api/models/fides_user_respondent_email_verification.py +27 -2
- fides/api/models/manual_tasks/__init__.py +7 -1
- fides/api/models/manual_tasks/manual_task.py +68 -4
- fides/api/models/manual_tasks/manual_task_config.py +123 -12
- fides/api/models/manual_tasks/manual_task_instance.py +294 -0
- fides/api/models/manual_tasks/manual_task_log.py +48 -10
- fides/api/models/tcf_publisher_restrictions.py +16 -4
- fides/api/schemas/manual_tasks/manual_task_schemas.py +42 -0
- fides/api/schemas/manual_tasks/manual_task_status.py +107 -46
- fides/common/api/v1/urn_registry.py +4 -0
- fides/service/manual_tasks/manual_task_config_service.py +17 -5
- fides/service/manual_tasks/manual_task_instance_service.py +285 -0
- fides/service/manual_tasks/manual_task_service.py +66 -10
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{1040-630c7f4284dc6f70.js → 1040-fa06cd3b94d97493.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1169-f75d7958fbe6e136.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1807-3beab149351d5ded.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1817-b4688ba5042ec687.js → 1817-a3813209d7a6d28d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{2921-aabf41bf3d7573f9.js → 2921-81a48418f77bc9a7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3450-bdaeb35442d810b4.js → 3450-2bb9f1b5a23fb520.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3855-0dec3e7d9e886550.js → 3855-b85ad4e52433d519.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3872-ffa16c2df7ef0ab6.js → 3872-09f81435f7905d76.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3923-5d580fbb1dd6ae01.js → 3923-2565d952c662555c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{401-fceaae662cfca5a5.js → 401-8ea41700c5437d38.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{409-037cfc3f096150f0.js → 409-e0d39af1d9ce8ff2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/4121-55f5b0bcb5ba41fb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{4230-1cdb7ea1be370ed3.js → 4230-b3fe52af1035dff5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{431-f72599f01b98f07d.js → 431-c74dab231c8ac968.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5309-4511df9708d5a63c.js → 5309-0e44dbd914896514.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5574-3cd33b3a6c937899.js → 5574-917c5ff63d222308.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6084-57446e3c99078be8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6662-45b8977f48a219f5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6853-a4097260e402980e.js → 6853-8d0a099f61c758d1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6882-3cc73d407a088d7d.js → 6882-13d6f8d95b1e404f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6954-13a25cef3a8fdd76.js → 6954-4e106b3f7097fe6e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-b5fb1c0cf4ad8f63.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7630-e3d06546f9dfeb91.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/787-381156db4e81dbe8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{79-5670e31eb65d0a53.js → 79-3f742fe4efd9893f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{796-9a6b13c838e25538.js → 796-83a8bbdcdb67f2ba.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/827-c6fe34fb336467ae.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9046-fdf53cc7e926a8c1.js → 9046-6995482a030e323c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{905-742074a074be1055.js → 905-ffdbd0b14167e8bd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9226-ba6587e46ec7659a.js → 9226-2be3a6efb127148f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9392.25024e070026343d.js → 9392.9a948112de74781b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9676.e60a53f1f5890847.js → 9676.cc515c853b8cf578.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-980699a4d0f56acc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9826-303b14ef4fc7ab4a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9951-f9ab5cac7e2c05ab.js → 9951-57c0a671463e0ebb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-ac2f0844e5c4b4cd.js → 404-488f8f03fe0ffbc7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-8ec6e466f3373ac0.js → _app-5e6fbbf17a62ac76.js} +68 -65
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-0a5f2310ce6b1059.js → manual-1e88ac28bc7a41b6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-00cb904825aad7e3.js → multiple-f2c9451fffaaa529.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-40a6b572d49c2b68.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-fa7305b88c1afd20.js → add-vendors-b17d160147365cf3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-f140ec9d8e8a0f7a.js → configure-8e168d78acdf0cfe.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-0edb7c92518e7d21.js → [id]-5ca2467de7986929.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a0039f216fb3eb93.js → new-06bb3b0bf097fcdb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-d8d926f0735a2546.js → privacy-experience-3c11fecc2797ab68.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5c949f2e3cef2398.js → [id]-92bc6c7b82a679b4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-130155cfb4a0bcc7.js → new-a3da3243526b7ecb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-1135ad8924d32c36.js → privacy-notices-b7d82386e7521041.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-776855e370414beb.js → properties-20a2029b7e7fc895.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-21c23f75ff1135d9.js → reporting-0ce299131db4c3e5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-4d5ea70a77df1bb8.js → consent-9f6a7a231bba17b7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-c623d6f1a61c8ea9.js → [resourceUrn]-11d52f1570759c4d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-030ee304cbe5e530.js → [projectUrn]-fd705968b357e99a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-cfac259a30641e68.js → projects-45b585deee0b2371.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-57bd5cdf784f059f.js → [resourceUrn]-b83afa5565d0c84e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-51d99174c8006eb5.js → resources-d8db234a44a2ddf4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-7b5aec33da578745.js → data-catalog-4fd60a74c0369e3e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-c948f93c833d4358.js → [systemId]-e861699a8866c64b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-333f53caab751428.js → [monitorId]-5dd2fbf33e228f9c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-27205f8457a1ecb0.js → action-center-806cae6bc128cd38.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-20a1043f6a06198f.js → activity-487285bd5eca2595.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-06edce289876dea1.js → [resourceUrn]-393e20924c83373e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-faf326a6200637d0.js → detection-8733807dad4bc96e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-64acf269256ee74f.js → [resourceUrn]-14bd7500362ff224.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-8c3e4be6d36da66d.js → discovery-9e7dfd5a6acc2e8f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-fb50de22f83edd4a.js → datamap-c9509d72c538d22b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-41ab27c4195cfa93.js → [...subfieldNames]-4e8a436297a055b2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-6e2caba24b3e78c2.js → [collectionName]-6ce02295bb7f5b6d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-904d43e31157aa55.js → [datasetId]-9eaa907437fde063.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-de5e9ccfecdf31b1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-8f7d16bc5e9229c8.js → dataset-dcdec3644f05188d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-4a33dd0371dbaebc.js → [id]-81ab412e337d2888.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-e88509346b2d2851.js → new-34dfc172165dbb1c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cdb77886d7fd4f44.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-1adb6bcb71701ac2.js → index-de954b741cbca022.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-fdc2964fa7d1d8fd.js → [id]-dba625eddca48f69.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-40a3cd14264796e2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-9b4d1d61c7c97509.js → [id]-42edcab11e8b5c3c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-f8fd4795e260887c.js → add-template-333e54ac8c3ad57a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-aa744ae8b61e5ff2.js → messaging-8e1e6f3782983225.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-3407158757fb3627.js → ant-components-25c74d51a49b2403.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-47e947c02ae90fd0.js → AntForm-920338760f5a71b5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-24f9a44512ce8827.js → FormikAntFormItem-7462fb387a9de3f8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-e567a69f8c37fb9a.js → FormikControlled-6148fce7a4e2e9ca.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-35a33f9c7def2220.js → FormikField-30efd8c937bf19e4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-780e18dde8e38099.js → forms-c44de83e0952d1e0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-7852aa60090c8c9a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-11dd6152bf6607cc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-83a548813fec4f90.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-a087847d6cbccc65.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-1a1aa83a3f88844c.js → configure-1d981663e1a84166.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-6a5794999a1cc0b6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-19737d4f21aadbee.js → [id]-b08a69b1c460c7fe.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-9ccb295110feee20.js → add-property-a5d1c65ec21df69d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-3a1037a2e036212a.js → properties-3a75c6ed8308d126.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-4cdbbb8cd1d8698e.js → datamap-911996819aa16e04.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-965cc21889b25e44.js → alpha-6773158ba6ccf4b0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-0e1c381d488a7ada.js → about-2e046d177d52465c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-d0e350d2a2667883.js → [purpose_id]-a5420c3ba02fe6a5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-2a95eb36aa2b47a6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-6f866bc799a5f67f.js → custom-fields-06075fbf122c98d0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-0b44b2b224077dcd.js → domain-records-2c7ecff0a8a74c42.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-afed8ba5498a9f93.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-c1d3f3cb9c6ca463.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-811dadb489f23d7d.js → locations-8d4383584c72eb5a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-aae79a344a96a367.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-54f142bc3e4c95ba.js → regulations-29892065d99ff113.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-9669fa6b20545530.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6eb886e7b7e6785b.js → [id]-8fa8a2f238e08791.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{systems-7b71274334c559a4.js → systems-acdbdd3dfd21162f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-9b4d28f02df3a238.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-b124cc24b930c9e1.js → new-a2524414e968f862.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-75d41fde668b9025.js → [id]-87ed17fa1d9f8f72.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-dd43755b687c09a7.js → user-management-6b4e0764bb8816b8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-da78c536f3d86d06.js +1 -0
- fides/ui-build/static/admin/_next/static/css/{c693338e3bc8dcc6.css → 67ac3d00a5f134a2.css} +1 -1
- fides/ui-build/static/admin/_next/static/jg8bMUMFAG7KlEnEbTRct/_buildManifest.js +1 -0
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
- fides/ui-build/static/admin/lib/fides.js +2 -2
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/poc/table-migration.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/settings/about/alpha.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1100-d43cb04522a6505c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2430-b480401d44c55416.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3505-a79256cd851dfab4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3513-8677ee280eaef0da.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3670-2abd9b2f17770872.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3983-17ae9c232bddc413.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4060-71cd041e5a57ca5a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4121-78a76e980acbd539.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4481-f597a7cf03f8c9e1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +0 -4
- fides/ui-build/static/admin/_next/static/chunks/6277-3fb4c7fc790a6d20.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6659-b2088f525bf13c17.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6662-6a6b90fc8f11558f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/69-6889d6674c95e7b5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7553-a95939c32d54b5b7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8433-adb1fcb29d82f1b7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9767-e49b065d03ce4e80.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-587e21d14e0a5196.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4e31a1c4a58800e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-8f9b8890018e1ea5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adc286ff254e7f41.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-7a17dffa515e5560.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-91dd0039cc2b70bc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-b01cbbaac34dadbc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-a15410de7f1d0f84.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-c4e1b69fb5bab61a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-7796fbf458f8f159.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-5d00e1155bd11178.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-d2cdbe770683e9df.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-24108f615ff5e1e7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-fef247a87baeb080.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-18534d2a79a3850b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-0a61b5bd21a41fe6.js +0 -1
- fides/ui-build/static/admin/_next/static/hCJxUAFBWobWrps6RkP0K/_buildManifest.js +0 -1
- {ethyca_fides-2.64.1rc0.dist-info → ethyca_fides-2.64.2b0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.64.1rc0.dist-info → ethyca_fides-2.64.2b0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.64.1rc0.dist-info → ethyca_fides-2.64.2b0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.64.1rc0.dist-info → ethyca_fides-2.64.2b0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{hCJxUAFBWobWrps6RkP0K → jg8bMUMFAG7KlEnEbTRct}/_ssgManifest.js +0 -0
@@ -1,11 +1,12 @@
|
|
1
1
|
from typing import TYPE_CHECKING, Any, Optional
|
2
2
|
|
3
|
-
from sqlalchemy import Column, ForeignKey, String
|
3
|
+
from sqlalchemy import Column, DateTime, ForeignKey, Index, String
|
4
4
|
from sqlalchemy.dialects.postgresql import JSONB
|
5
5
|
from sqlalchemy.ext.declarative import declared_attr
|
6
6
|
from sqlalchemy.orm import Session, relationship
|
7
|
+
from sqlalchemy.sql import func
|
7
8
|
|
8
|
-
from fides.api.db.base_class import Base
|
9
|
+
from fides.api.db.base_class import Base, FidesBase
|
9
10
|
from fides.api.schemas.manual_tasks.manual_task_schemas import ManualTaskLogStatus
|
10
11
|
|
11
12
|
if TYPE_CHECKING: # pragma: no cover
|
@@ -13,6 +14,9 @@ if TYPE_CHECKING: # pragma: no cover
|
|
13
14
|
from fides.api.models.manual_tasks.manual_task_config import (
|
14
15
|
ManualTaskConfig, # pragma: no cover
|
15
16
|
)
|
17
|
+
from fides.api.models.manual_tasks.manual_task_instance import ( # pragma: no cover
|
18
|
+
ManualTaskInstance,
|
19
|
+
)
|
16
20
|
|
17
21
|
|
18
22
|
class ManualTaskLog(Base):
|
@@ -23,22 +27,56 @@ class ManualTaskLog(Base):
|
|
23
27
|
"""Overriding base class method to set the table name."""
|
24
28
|
return "manual_task_log"
|
25
29
|
|
30
|
+
# redefined here because there's a minor, unintended discrepancy between
|
31
|
+
# this `id` field and that of the `Base` class, which explicitly sets `index=True`.
|
32
|
+
# TODO: we likely should _not_ be setting `index=True` on the `id`
|
33
|
+
# attribute of the `Base` class, as `primary_key=True` already specifies a
|
34
|
+
# primary key constraint, which will implicitly create an index for the field.
|
35
|
+
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
36
|
+
created_at = Column(
|
37
|
+
DateTime(timezone=True), server_default=func.now(), nullable=False
|
38
|
+
)
|
39
|
+
updated_at = Column(
|
40
|
+
DateTime(timezone=True),
|
41
|
+
server_default=func.now(),
|
42
|
+
onupdate=func.now(),
|
43
|
+
nullable=False,
|
44
|
+
)
|
45
|
+
|
26
46
|
task_id = Column(
|
27
47
|
String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
|
28
48
|
)
|
29
|
-
config_id = Column(
|
30
|
-
|
49
|
+
config_id = Column(
|
50
|
+
String, ForeignKey("manual_task_config.id", ondelete="CASCADE"), nullable=True
|
51
|
+
)
|
52
|
+
instance_id = Column(
|
53
|
+
String,
|
54
|
+
ForeignKey("manual_task_instance.id", ondelete="CASCADE"),
|
55
|
+
nullable=True,
|
56
|
+
)
|
31
57
|
status = Column(String, nullable=False)
|
32
|
-
message = Column(String, nullable=
|
58
|
+
message = Column(String, nullable=True)
|
33
59
|
details = Column(JSONB, nullable=True)
|
34
60
|
|
35
|
-
|
36
|
-
|
61
|
+
__table_args__ = (
|
62
|
+
Index("ix_manual_task_log_config_id", "config_id"),
|
63
|
+
Index("ix_manual_task_log_created_at", "created_at"),
|
64
|
+
Index("ix_manual_task_log_instance_id", "instance_id"),
|
65
|
+
Index("ix_manual_task_log_status", "status"),
|
66
|
+
Index("ix_manual_task_log_task_id", "task_id"),
|
67
|
+
)
|
68
|
+
|
69
|
+
# Relationships
|
70
|
+
task = relationship(
|
71
|
+
"ManualTask", back_populates="logs", foreign_keys=[task_id], viewonly=True
|
72
|
+
)
|
37
73
|
config = relationship(
|
38
|
-
"ManualTaskConfig",
|
74
|
+
"ManualTaskConfig",
|
75
|
+
back_populates="logs",
|
76
|
+
foreign_keys=[config_id],
|
77
|
+
viewonly=True,
|
39
78
|
)
|
40
|
-
|
41
|
-
# instance = relationship("ManualTaskInstance", back_populates="logs")
|
79
|
+
instance = relationship("ManualTaskInstance", back_populates="logs", viewonly=True)
|
42
80
|
|
43
81
|
@classmethod
|
44
82
|
def create_log(
|
@@ -10,7 +10,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|
10
10
|
from sqlalchemy.ext.declarative import declared_attr
|
11
11
|
from sqlalchemy.orm import Session, relationship
|
12
12
|
|
13
|
-
from fides.api.db.base_class import Base
|
13
|
+
from fides.api.db.base_class import Base, FidesBase
|
14
14
|
|
15
15
|
if TYPE_CHECKING:
|
16
16
|
from fides.api.models.privacy_experience import PrivacyExperienceConfig
|
@@ -83,7 +83,13 @@ class TCFConfiguration(Base):
|
|
83
83
|
def __tablename__(self) -> str:
|
84
84
|
return "tcf_configuration"
|
85
85
|
|
86
|
-
|
86
|
+
# redefined here because there's a minor, unintended discrepancy between
|
87
|
+
# this `id` field and that of the `Base` class, which explicitly sets `index=True`.
|
88
|
+
# TODO: we likely should _not_ be setting `index=True` on the `id`
|
89
|
+
# attribute of the `Base` class, as `primary_key=True` already specifies a
|
90
|
+
# primary key constraint, which will implicitly create an index for the field.
|
91
|
+
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
92
|
+
name = Column(String, nullable=False, unique=True)
|
87
93
|
|
88
94
|
privacy_experience_configs = relationship(
|
89
95
|
"PrivacyExperienceConfig",
|
@@ -103,11 +109,17 @@ class TCFPublisherRestriction(Base):
|
|
103
109
|
def __tablename__(self) -> str:
|
104
110
|
return "tcf_publisher_restriction"
|
105
111
|
|
112
|
+
# redefined here because there's a minor, unintended discrepancy between
|
113
|
+
# this `id` field and that of the `Base` class, which explicitly sets `index=True`.
|
114
|
+
# TODO: we likely should _not_ be setting `index=True` on the `id`
|
115
|
+
# attribute of the `Base` class, as `primary_key=True` already specifies a
|
116
|
+
# primary key constraint, which will implicitly create an index for the field.
|
117
|
+
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
118
|
+
|
106
119
|
tcf_configuration_id = Column(
|
107
120
|
String(255),
|
108
121
|
ForeignKey("tcf_configuration.id", ondelete="CASCADE"),
|
109
122
|
nullable=False,
|
110
|
-
index=True,
|
111
123
|
)
|
112
124
|
purpose_id = Column(Integer, nullable=False)
|
113
125
|
restriction_type = Column(EnumColumn(TCFRestrictionType), nullable=False)
|
@@ -121,7 +133,7 @@ class TCFPublisherRestriction(Base):
|
|
121
133
|
# can be inferred from the presence of the end_vendor_id.
|
122
134
|
range_entries = Column(
|
123
135
|
ARRAY(JSONB),
|
124
|
-
nullable=
|
136
|
+
nullable=False,
|
125
137
|
server_default="{}",
|
126
138
|
default=list,
|
127
139
|
)
|
@@ -5,6 +5,15 @@ from typing import Annotated, Any, Optional
|
|
5
5
|
from pydantic import ConfigDict, Field
|
6
6
|
|
7
7
|
from fides.api.schemas.base_class import FidesSchema
|
8
|
+
from fides.api.schemas.manual_tasks.manual_task_status import StatusType
|
9
|
+
|
10
|
+
|
11
|
+
class ManualTaskExecutionTiming(str, Enum):
|
12
|
+
"""Enum for when a manual task should be executed in the privacy request DAG."""
|
13
|
+
|
14
|
+
pre_execution = "pre_execution" # Execute before the main DAG
|
15
|
+
post_execution = "post_execution" # Execute after the main DAG
|
16
|
+
parallel = "parallel" # Execute in parallel with the main DAG
|
8
17
|
|
9
18
|
|
10
19
|
class ManualTaskType(str, Enum):
|
@@ -23,6 +32,13 @@ class ManualTaskParentEntityType(str, Enum):
|
|
23
32
|
# Add more parent entity types as needed
|
24
33
|
|
25
34
|
|
35
|
+
class ManualTaskEntityType(str, Enum):
|
36
|
+
"""Enum for manual task entity types."""
|
37
|
+
|
38
|
+
privacy_request = "privacy_request"
|
39
|
+
# Add more entity types as needed
|
40
|
+
|
41
|
+
|
26
42
|
class ManualTaskReferenceType(str, Enum):
|
27
43
|
"""Enum for manual task reference types."""
|
28
44
|
|
@@ -46,6 +62,32 @@ class ManualTaskLogStatus(str, Enum):
|
|
46
62
|
awaiting_input = "awaiting_input"
|
47
63
|
|
48
64
|
|
65
|
+
class ManualTaskResponse(FidesSchema):
|
66
|
+
"""Schema for manual task response."""
|
67
|
+
|
68
|
+
model_config = ConfigDict(extra="forbid")
|
69
|
+
|
70
|
+
id: Annotated[str, Field(..., description="Task ID")]
|
71
|
+
parent_entity_id: Annotated[str, Field(..., description="Parent entity ID")]
|
72
|
+
parent_entity_type: Annotated[
|
73
|
+
ManualTaskParentEntityType, Field(..., description="Parent entity type")
|
74
|
+
]
|
75
|
+
status: Annotated[StatusType, Field(..., description="Task status")]
|
76
|
+
created_at: Annotated[datetime, Field(..., description="Creation timestamp")]
|
77
|
+
updated_at: Annotated[datetime, Field(..., description="Last update timestamp")]
|
78
|
+
|
79
|
+
|
80
|
+
class ManualTaskCreate(FidesSchema):
|
81
|
+
"""Schema for creating a manual task."""
|
82
|
+
|
83
|
+
model_config = ConfigDict(extra="forbid")
|
84
|
+
|
85
|
+
parent_entity_id: Annotated[str, Field(..., description="Parent entity ID")]
|
86
|
+
parent_entity_type: Annotated[
|
87
|
+
ManualTaskParentEntityType, Field(..., description="Parent entity type")
|
88
|
+
]
|
89
|
+
|
90
|
+
|
49
91
|
class ManualTaskLogCreate(FidesSchema):
|
50
92
|
"""Schema for creating a manual task log entry."""
|
51
93
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from datetime import datetime, timezone
|
2
2
|
from enum import Enum as EnumType
|
3
|
-
from typing import Optional
|
3
|
+
from typing import Optional, Protocol
|
4
4
|
|
5
5
|
from sqlalchemy.orm import Session
|
6
6
|
|
@@ -23,61 +23,133 @@ class StatusType(str, EnumType):
|
|
23
23
|
|
24
24
|
@classmethod
|
25
25
|
def get_valid_transitions(cls, current_status: "StatusType") -> list["StatusType"]:
|
26
|
-
"""Get valid transitions from the current status.
|
26
|
+
"""Get valid transitions from the current status."""
|
27
|
+
transitions = {
|
28
|
+
cls.pending: [cls.in_progress, cls.failed, cls.completed],
|
29
|
+
cls.in_progress: [cls.completed, cls.failed],
|
30
|
+
cls.completed: [],
|
31
|
+
cls.failed: [cls.pending, cls.in_progress],
|
32
|
+
}
|
33
|
+
return transitions.get(current_status, [])
|
34
|
+
|
35
|
+
|
36
|
+
class StatusTransitionProtocol(Protocol):
|
37
|
+
"""Protocol for objects that support status transitions.
|
38
|
+
|
39
|
+
This protocol defines the interface that any object supporting status transitions
|
40
|
+
must implement. It includes both the required attributes and methods.
|
41
|
+
|
42
|
+
Example:
|
43
|
+
```python
|
44
|
+
# Any class that implements this protocol can be used interchangeably
|
45
|
+
def process_status_update(obj: StatusTransitionProtocol, db: Session) -> None:
|
46
|
+
if obj.is_pending:
|
47
|
+
obj.start_progress(db)
|
48
|
+
elif obj.is_in_progress:
|
49
|
+
obj.mark_completed(db, user_id="user123")
|
50
|
+
|
51
|
+
# This works with ManualTaskInstance or any other class implementing the protocol
|
52
|
+
instance = ManualTaskInstance(...)
|
53
|
+
process_status_update(instance, db)
|
54
|
+
```
|
55
|
+
"""
|
27
56
|
|
28
|
-
|
29
|
-
|
57
|
+
# Required attributes - using runtime types that work with SQLAlchemy
|
58
|
+
status: StatusType
|
59
|
+
completed_at: Optional[datetime] # Can be None when resetting to pending
|
60
|
+
completed_by_id: Optional[str] # Can be None when resetting to pending
|
30
61
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
62
|
+
# Required methods
|
63
|
+
# pylint does not understand the Protocol abstract syntax and will complain about the ellipsis
|
64
|
+
def update_status(
|
65
|
+
self, db: Session, new_status: StatusType, user_id: Optional[str] = None
|
66
|
+
) -> None:
|
67
|
+
"""Update the status with validation and completion handling."""
|
68
|
+
... # pylint: disable=unnecessary-ellipsis
|
69
|
+
|
70
|
+
def mark_completed(self, db: Session, user_id: str) -> None:
|
71
|
+
"""Mark as completed."""
|
72
|
+
... # pylint: disable=unnecessary-ellipsis
|
73
|
+
|
74
|
+
def mark_failed(self, db: Session) -> None:
|
75
|
+
"""Mark as failed."""
|
76
|
+
... # pylint: disable=unnecessary-ellipsis
|
77
|
+
|
78
|
+
def start_progress(self, db: Session) -> None:
|
79
|
+
"""Mark as in progress."""
|
80
|
+
... # pylint: disable=unnecessary-ellipsis
|
81
|
+
|
82
|
+
def reset_to_pending(self, db: Session) -> None:
|
83
|
+
"""Reset to pending status."""
|
84
|
+
... # pylint: disable=unnecessary-ellipsis
|
85
|
+
|
86
|
+
@property
|
87
|
+
def is_completed(self) -> bool:
|
88
|
+
"""Check if completed."""
|
89
|
+
... # pylint: disable=unnecessary-ellipsis
|
90
|
+
|
91
|
+
@property
|
92
|
+
def is_failed(self) -> bool:
|
93
|
+
"""Check if failed."""
|
94
|
+
... # pylint: disable=unnecessary-ellipsis
|
95
|
+
|
96
|
+
@property
|
97
|
+
def is_in_progress(self) -> bool:
|
98
|
+
"""Check if in progress."""
|
99
|
+
... # pylint: disable=unnecessary-ellipsis
|
100
|
+
|
101
|
+
@property
|
102
|
+
def is_pending(self) -> bool:
|
103
|
+
"""Check if pending."""
|
104
|
+
... # pylint: disable=unnecessary-ellipsis
|
105
|
+
|
106
|
+
|
107
|
+
def validate_status_transition_object(obj: StatusTransitionProtocol) -> bool:
|
108
|
+
"""Validate that an object properly implements the StatusTransitionProtocol.
|
109
|
+
|
110
|
+
This function demonstrates how the Protocol can be used for runtime validation
|
111
|
+
and type checking.
|
112
|
+
"""
|
113
|
+
required_attrs = ["status", "completed_at", "completed_by_id"]
|
114
|
+
required_methods = [
|
115
|
+
"update_status",
|
116
|
+
"mark_completed",
|
117
|
+
"mark_failed",
|
118
|
+
"start_progress",
|
119
|
+
"reset_to_pending",
|
120
|
+
]
|
121
|
+
required_properties = ["is_completed", "is_failed", "is_in_progress", "is_pending"]
|
122
|
+
|
123
|
+
# Check all required elements
|
124
|
+
all_required = required_attrs + required_methods + required_properties
|
125
|
+
return all(hasattr(obj, attr) for attr in all_required) and all(
|
126
|
+
callable(getattr(obj, method)) for method in required_methods
|
127
|
+
)
|
43
128
|
|
44
129
|
|
45
130
|
class StatusTransitionMixin:
|
46
131
|
"""Mixin for handling status transitions.
|
47
132
|
|
48
133
|
This mixin provides methods for managing status transitions and completion tracking.
|
49
|
-
It can be used by any model that needs status management.
|
134
|
+
It implements the StatusTransitionProtocol and can be used by any model that needs status management.
|
50
135
|
"""
|
51
136
|
|
52
|
-
#
|
137
|
+
# Type annotations to match the Protocol
|
53
138
|
status: StatusType
|
54
139
|
completed_at: Optional[datetime]
|
55
140
|
completed_by_id: Optional[str]
|
56
141
|
|
57
142
|
def _get_valid_transitions(self) -> list[StatusType]:
|
58
|
-
"""Get valid transitions from the current status.
|
59
|
-
|
60
|
-
Returns:
|
61
|
-
list[StatusType]: List of valid transitions
|
62
|
-
"""
|
143
|
+
"""Get valid transitions from the current status."""
|
63
144
|
return StatusType.get_valid_transitions(self.status)
|
64
145
|
|
65
146
|
def _validate_status_transition(self, new_status: StatusType) -> None:
|
66
|
-
"""Validate that a status transition is allowed.
|
67
|
-
|
68
|
-
Args:
|
69
|
-
new_status: The new status to transition to
|
70
|
-
|
71
|
-
Raises:
|
72
|
-
StatusTransitionNotAllowed: If the transition is not allowed
|
73
|
-
"""
|
74
|
-
# Don't allow transitions to the same status
|
147
|
+
"""Validate that a status transition is allowed."""
|
75
148
|
if new_status == self.status:
|
76
149
|
raise StatusTransitionNotAllowed(
|
77
150
|
f"Invalid status transition: already in status {new_status}"
|
78
151
|
)
|
79
152
|
|
80
|
-
# Get valid transitions for current status
|
81
153
|
valid_transitions = self._get_valid_transitions()
|
82
154
|
if new_status not in valid_transitions:
|
83
155
|
raise StatusTransitionNotAllowed(
|
@@ -88,13 +160,7 @@ class StatusTransitionMixin:
|
|
88
160
|
def update_status(
|
89
161
|
self, db: Session, new_status: StatusType, user_id: Optional[str] = None
|
90
162
|
) -> None:
|
91
|
-
"""Update the status with validation and completion handling.
|
92
|
-
|
93
|
-
Args:
|
94
|
-
db: Database session
|
95
|
-
new_status: New status to set
|
96
|
-
user_id: Optional user ID who is making the change
|
97
|
-
"""
|
163
|
+
"""Update the status with validation and completion handling."""
|
98
164
|
self._validate_status_transition(new_status)
|
99
165
|
|
100
166
|
if new_status == StatusType.completed:
|
@@ -110,12 +176,7 @@ class StatusTransitionMixin:
|
|
110
176
|
db.commit()
|
111
177
|
|
112
178
|
def mark_completed(self, db: Session, user_id: str) -> None:
|
113
|
-
"""Mark as completed.
|
114
|
-
|
115
|
-
Args:
|
116
|
-
db: Database session
|
117
|
-
user_id: user ID who completed the task
|
118
|
-
"""
|
179
|
+
"""Mark as completed."""
|
119
180
|
self.update_status(db, StatusType.completed, user_id)
|
120
181
|
|
121
182
|
def mark_failed(self, db: Session) -> None:
|
@@ -155,6 +155,10 @@ AUTHORIZE = "/connection/{connection_key}/authorize"
|
|
155
155
|
ACCESS_MANUAL_WEBHOOKS = "/access_manual_webhook"
|
156
156
|
ACCESS_MANUAL_WEBHOOK = CONNECTION_BY_KEY + "/access_manual_webhook"
|
157
157
|
|
158
|
+
# Manual Tasks
|
159
|
+
MANUAL_TASKS = "/manual-tasks"
|
160
|
+
MANUAL_TASK = CONNECTION_BY_KEY + "/manual-task"
|
161
|
+
|
158
162
|
# Collection URLs
|
159
163
|
DATASETS = "/dataset"
|
160
164
|
DATASET_CONFIG = "/datasetconfig"
|
@@ -15,6 +15,14 @@ from fides.api.schemas.manual_tasks.manual_task_config import (
|
|
15
15
|
from fides.service.manual_tasks.utils import validate_fields, with_task_logging
|
16
16
|
|
17
17
|
|
18
|
+
class ManualTaskConfigError(Exception):
|
19
|
+
"""Exception raised when a manual task config error occurs."""
|
20
|
+
|
21
|
+
def __init__(self, message: str):
|
22
|
+
self.message = message
|
23
|
+
super().__init__(self.message)
|
24
|
+
|
25
|
+
|
18
26
|
class ManualTaskConfigService:
|
19
27
|
def __init__(self, db: Session):
|
20
28
|
self.db = db
|
@@ -51,8 +59,8 @@ class ManualTaskConfigService:
|
|
51
59
|
"""
|
52
60
|
try:
|
53
61
|
ManualTaskConfigurationType(config_type)
|
54
|
-
except
|
55
|
-
raise
|
62
|
+
except ManualTaskConfigError:
|
63
|
+
raise ManualTaskConfigError(f"Invalid config type: {config_type}")
|
56
64
|
|
57
65
|
# Set all existing versions to non-current
|
58
66
|
if is_current:
|
@@ -96,7 +104,11 @@ class ManualTaskConfigService:
|
|
96
104
|
modified_keys = set(fields_to_remove or [])
|
97
105
|
|
98
106
|
if field_updates:
|
99
|
-
|
107
|
+
try:
|
108
|
+
validate_fields(field_updates, is_submission=False)
|
109
|
+
except ValueError as e:
|
110
|
+
raise ManualTaskConfigError(f"Invalid field updates: {e}") from e
|
111
|
+
|
100
112
|
fields_to_create = [
|
101
113
|
{
|
102
114
|
"task_id": config.task_id,
|
@@ -167,7 +179,7 @@ class ManualTaskConfigService:
|
|
167
179
|
)
|
168
180
|
|
169
181
|
if not config:
|
170
|
-
raise
|
182
|
+
raise ManualTaskConfigError(
|
171
183
|
f"No current config found for task {task.id} and type {config_type}"
|
172
184
|
)
|
173
185
|
return config
|
@@ -355,7 +367,7 @@ class ManualTaskConfigService:
|
|
355
367
|
"""
|
356
368
|
config = self.db.query(ManualTaskConfig).filter_by(id=config_id).first()
|
357
369
|
if not config:
|
358
|
-
raise
|
370
|
+
raise ManualTaskConfigError(f"Config with ID {config_id} not found")
|
359
371
|
|
360
372
|
log_data = self._create_log_data(
|
361
373
|
task.id,
|