ethyca-fides 2.64.1b1__py2.py3-none-any.whl → 2.64.1rc0__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.1b1.dist-info → ethyca_fides-2.64.1rc0.dist-info}/METADATA +2 -2
- {ethyca_fides-2.64.1b1.dist-info → ethyca_fides-2.64.1rc0.dist-info}/RECORD +104 -107
- fides/_version.py +3 -3
- fides/api/db/base.py +0 -4
- fides/api/models/manual_tasks/__init__.py +1 -7
- fides/api/models/manual_tasks/manual_task.py +3 -19
- fides/api/models/manual_tasks/manual_task_config.py +6 -39
- fides/api/models/manual_tasks/manual_task_log.py +7 -20
- fides/api/schemas/manual_tasks/manual_task_schemas.py +0 -42
- fides/api/schemas/manual_tasks/manual_task_status.py +46 -107
- fides/service/manual_tasks/manual_task_config_service.py +5 -17
- fides/service/manual_tasks/manual_task_service.py +10 -66
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6662-cb11881dcaabe5e2.js → 6662-6a6b90fc8f11558f.js} +1 -1
- fides/ui-build/static/admin/_next/static/{zBkPKRGECPjwEx0G7BvHe → hCJxUAFBWobWrps6RkP0K}/_buildManifest.js +1 -1
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/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/api/alembic/migrations/versions/6a76a1fa4f3f_add_manual_task_instance_table.py +0 -256
- fides/api/models/manual_tasks/manual_task_instance.py +0 -187
- fides/service/manual_tasks/manual_task_instance_service.py +0 -285
- {ethyca_fides-2.64.1b1.dist-info → ethyca_fides-2.64.1rc0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.64.1b1.dist-info → ethyca_fides-2.64.1rc0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.64.1b1.dist-info → ethyca_fides-2.64.1rc0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.64.1b1.dist-info → ethyca_fides-2.64.1rc0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{zBkPKRGECPjwEx0G7BvHe → hCJxUAFBWobWrps6RkP0K}/_ssgManifest.js +0 -0
@@ -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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/92fc10cc7ed1aba3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/92fc10cc7ed1aba3.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/699-8ca44b0de9fa20f0.js" defer=""></script><script src="/_next/static/chunks/5277-e8a036319456127f.js" defer=""></script><script src="/_next/static/chunks/7553-a95939c32d54b5b7.js" defer=""></script><script src="/_next/static/chunks/4481-f597a7cf03f8c9e1.js" defer=""></script><script src="/_next/static/chunks/409-037cfc3f096150f0.js" defer=""></script><script src="/_next/static/chunks/401-fceaae662cfca5a5.js" defer=""></script><script src="/_next/static/chunks/9951-f9ab5cac7e2c05ab.js" defer=""></script><script src="/_next/static/chunks/1040-630c7f4284dc6f70.js" defer=""></script><script src="/_next/static/chunks/3450-bdaeb35442d810b4.js" defer=""></script><script src="/_next/static/chunks/pages/systems/configure/%5Bid%5D-6eb886e7b7e6785b.js" defer=""></script><script src="/_next/static/
|
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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/92fc10cc7ed1aba3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/92fc10cc7ed1aba3.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/699-8ca44b0de9fa20f0.js" defer=""></script><script src="/_next/static/chunks/5277-e8a036319456127f.js" defer=""></script><script src="/_next/static/chunks/7553-a95939c32d54b5b7.js" defer=""></script><script src="/_next/static/chunks/4481-f597a7cf03f8c9e1.js" defer=""></script><script src="/_next/static/chunks/409-037cfc3f096150f0.js" defer=""></script><script src="/_next/static/chunks/401-fceaae662cfca5a5.js" defer=""></script><script src="/_next/static/chunks/9951-f9ab5cac7e2c05ab.js" defer=""></script><script src="/_next/static/chunks/1040-630c7f4284dc6f70.js" defer=""></script><script src="/_next/static/chunks/3450-bdaeb35442d810b4.js" defer=""></script><script src="/_next/static/chunks/pages/systems/configure/%5Bid%5D-6eb886e7b7e6785b.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_buildManifest.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_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":"/systems/configure/[id]","query":{},"buildId":"hCJxUAFBWobWrps6RkP0K","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-a95939c32d54b5b7.js" defer=""></script><script src="/_next/static/chunks/4481-f597a7cf03f8c9e1.js" defer=""></script><script src="/_next/static/chunks/pages/systems-7b71274334c559a4.js" defer=""></script><script src="/_next/static/
|
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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js" defer=""></script><script src="/_next/static/chunks/6060-cb1ab5be7067bf7b.js" defer=""></script><script src="/_next/static/chunks/7553-a95939c32d54b5b7.js" defer=""></script><script src="/_next/static/chunks/4481-f597a7cf03f8c9e1.js" defer=""></script><script src="/_next/static/chunks/pages/systems-7b71274334c559a4.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_buildManifest.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_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":"/systems","query":{},"buildId":"hCJxUAFBWobWrps6RkP0K","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/34a7eb08b86ddb57.css" as="style"/><link rel="stylesheet" href="/_next/static/css/34a7eb08b86ddb57.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/678d4732-50255cc09048e643.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/3983-17ae9c232bddc413.js" defer=""></script><script src="/_next/static/chunks/pages/taxonomy-18534d2a79a3850b.js" defer=""></script><script src="/_next/static/
|
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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.css" data-n-g=""/><link rel="preload" href="/_next/static/css/34a7eb08b86ddb57.css" as="style"/><link rel="stylesheet" href="/_next/static/css/34a7eb08b86ddb57.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/678d4732-50255cc09048e643.js" defer=""></script><script src="/_next/static/chunks/2858-0b44609b6be7850b.js" defer=""></script><script src="/_next/static/chunks/2866-a73888c17a195cbe.js" defer=""></script><script src="/_next/static/chunks/9278-9b1b5970f0702668.js" defer=""></script><script src="/_next/static/chunks/3662-f6a1ddca5ee42076.js" defer=""></script><script src="/_next/static/chunks/3983-17ae9c232bddc413.js" defer=""></script><script src="/_next/static/chunks/pages/taxonomy-18534d2a79a3850b.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_buildManifest.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_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":"/taxonomy","query":{},"buildId":"hCJxUAFBWobWrps6RkP0K","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/3513-8677ee280eaef0da.js" defer=""></script><script src="/_next/static/chunks/4121-78a76e980acbd539.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/new-b124cc24b930c9e1.js" defer=""></script><script src="/_next/static/
|
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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/3513-8677ee280eaef0da.js" defer=""></script><script src="/_next/static/chunks/4121-78a76e980acbd539.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/new-b124cc24b930c9e1.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_buildManifest.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_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":"/user-management/new","query":{},"buildId":"hCJxUAFBWobWrps6RkP0K","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/3513-8677ee280eaef0da.js" defer=""></script><script src="/_next/static/chunks/4121-78a76e980acbd539.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/profile/%5Bid%5D-75d41fde668b9025.js" defer=""></script><script src="/_next/static/
|
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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/3513-8677ee280eaef0da.js" defer=""></script><script src="/_next/static/chunks/4121-78a76e980acbd539.js" defer=""></script><script src="/_next/static/chunks/pages/user-management/profile/%5Bid%5D-75d41fde668b9025.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_buildManifest.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_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":"/user-management/profile/[id]","query":{},"buildId":"hCJxUAFBWobWrps6RkP0K","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/3513-8677ee280eaef0da.js" defer=""></script><script src="/_next/static/chunks/pages/user-management-dd43755b687c09a7.js" defer=""></script><script src="/_next/static/
|
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/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.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-0a61b5bd21a41fe6.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-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/3513-8677ee280eaef0da.js" defer=""></script><script src="/_next/static/chunks/pages/user-management-dd43755b687c09a7.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_buildManifest.js" defer=""></script><script src="/_next/static/hCJxUAFBWobWrps6RkP0K/_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":"/user-management","query":{},"buildId":"hCJxUAFBWobWrps6RkP0K","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
@@ -1,256 +0,0 @@
|
|
1
|
-
"""add_manual_task_instance_table
|
2
|
-
|
3
|
-
Revision ID: 6a76a1fa4f3f
|
4
|
-
Revises: ba414a58ba90
|
5
|
-
Create Date: 2025-06-10 22:45:27.591492
|
6
|
-
|
7
|
-
"""
|
8
|
-
|
9
|
-
import sqlalchemy as sa
|
10
|
-
from alembic import op
|
11
|
-
from sqlalchemy.dialects.postgresql import JSONB
|
12
|
-
|
13
|
-
# revision identifiers, used by Alembic.
|
14
|
-
revision = "6a76a1fa4f3f"
|
15
|
-
down_revision = "ba414a58ba90"
|
16
|
-
branch_labels = None
|
17
|
-
depends_on = None
|
18
|
-
|
19
|
-
|
20
|
-
def upgrade():
|
21
|
-
# Add execution_timing column to manual_task_config
|
22
|
-
op.add_column(
|
23
|
-
"manual_task_config",
|
24
|
-
sa.Column(
|
25
|
-
"execution_timing",
|
26
|
-
sa.String(),
|
27
|
-
nullable=False,
|
28
|
-
server_default="pre_execution",
|
29
|
-
),
|
30
|
-
)
|
31
|
-
|
32
|
-
# Remove due_date column from manual_task
|
33
|
-
op.drop_column("manual_task", "due_date")
|
34
|
-
|
35
|
-
# Create manual_task_instance table
|
36
|
-
op.create_table(
|
37
|
-
"manual_task_instance",
|
38
|
-
sa.Column("id", sa.String(), nullable=False),
|
39
|
-
sa.Column(
|
40
|
-
"created_at",
|
41
|
-
sa.DateTime(timezone=True),
|
42
|
-
server_default=sa.text("now()"),
|
43
|
-
nullable=False,
|
44
|
-
),
|
45
|
-
sa.Column(
|
46
|
-
"updated_at",
|
47
|
-
sa.DateTime(timezone=True),
|
48
|
-
server_default=sa.text("now()"),
|
49
|
-
nullable=False,
|
50
|
-
),
|
51
|
-
sa.Column("task_id", sa.String(), nullable=False),
|
52
|
-
sa.Column("config_id", sa.String(), nullable=False),
|
53
|
-
sa.Column("entity_id", sa.String(), nullable=False),
|
54
|
-
sa.Column("entity_type", sa.String(), nullable=False),
|
55
|
-
sa.Column("status", sa.String(), nullable=False, server_default="pending"),
|
56
|
-
sa.Column("due_date", sa.DateTime(timezone=True), nullable=True),
|
57
|
-
sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True),
|
58
|
-
sa.Column("completed_by_id", sa.String(), nullable=True),
|
59
|
-
sa.ForeignKeyConstraint(
|
60
|
-
["config_id"], ["manual_task_config.id"], ondelete="CASCADE"
|
61
|
-
),
|
62
|
-
sa.ForeignKeyConstraint(["task_id"], ["manual_task.id"], ondelete="CASCADE"),
|
63
|
-
sa.PrimaryKeyConstraint("id"),
|
64
|
-
)
|
65
|
-
|
66
|
-
# Create indexes for manual_task_instance
|
67
|
-
op.create_index(
|
68
|
-
"ix_manual_task_instance_task_id", "manual_task_instance", ["task_id"]
|
69
|
-
)
|
70
|
-
op.create_index(
|
71
|
-
"ix_manual_task_instance_config_id", "manual_task_instance", ["config_id"]
|
72
|
-
)
|
73
|
-
op.create_index(
|
74
|
-
"ix_manual_task_instance_entity_id", "manual_task_instance", ["entity_id"]
|
75
|
-
)
|
76
|
-
op.create_index(
|
77
|
-
"ix_manual_task_instance_entity_type", "manual_task_instance", ["entity_type"]
|
78
|
-
)
|
79
|
-
op.create_index(
|
80
|
-
"ix_manual_task_instance_status", "manual_task_instance", ["status"]
|
81
|
-
)
|
82
|
-
op.create_index(
|
83
|
-
"ix_manual_task_instance_completed_at", "manual_task_instance", ["completed_at"]
|
84
|
-
)
|
85
|
-
# Composite index for common query pattern
|
86
|
-
op.create_index(
|
87
|
-
"ix_manual_task_instance_entity",
|
88
|
-
"manual_task_instance",
|
89
|
-
["entity_type", "entity_id"],
|
90
|
-
)
|
91
|
-
|
92
|
-
# Create manual_task_submission table
|
93
|
-
op.create_table(
|
94
|
-
"manual_task_submission",
|
95
|
-
sa.Column("id", sa.String(), nullable=False),
|
96
|
-
sa.Column(
|
97
|
-
"created_at",
|
98
|
-
sa.DateTime(timezone=True),
|
99
|
-
server_default=sa.text("now()"),
|
100
|
-
nullable=False,
|
101
|
-
),
|
102
|
-
sa.Column(
|
103
|
-
"updated_at",
|
104
|
-
sa.DateTime(timezone=True),
|
105
|
-
server_default=sa.text("now()"),
|
106
|
-
nullable=False,
|
107
|
-
),
|
108
|
-
sa.Column("task_id", sa.String(), nullable=False),
|
109
|
-
sa.Column("config_id", sa.String(), nullable=False),
|
110
|
-
sa.Column("field_id", sa.String(), nullable=False),
|
111
|
-
sa.Column("instance_id", sa.String(), nullable=False),
|
112
|
-
sa.Column("submitted_by", sa.String(), nullable=True),
|
113
|
-
sa.Column("submitted_at", sa.DateTime(timezone=True), nullable=False),
|
114
|
-
sa.Column("data", JSONB, nullable=False),
|
115
|
-
sa.ForeignKeyConstraint(
|
116
|
-
["config_id"], ["manual_task_config.id"], ondelete="CASCADE"
|
117
|
-
),
|
118
|
-
sa.ForeignKeyConstraint(
|
119
|
-
["field_id"], ["manual_task_config_field.id"], ondelete="CASCADE"
|
120
|
-
),
|
121
|
-
sa.ForeignKeyConstraint(
|
122
|
-
["instance_id"], ["manual_task_instance.id"], ondelete="CASCADE"
|
123
|
-
),
|
124
|
-
sa.ForeignKeyConstraint(["task_id"], ["manual_task.id"], ondelete="CASCADE"),
|
125
|
-
sa.ForeignKeyConstraint(
|
126
|
-
["submitted_by"], ["fidesuser.id"], ondelete="SET NULL"
|
127
|
-
),
|
128
|
-
sa.PrimaryKeyConstraint("id"),
|
129
|
-
)
|
130
|
-
|
131
|
-
# Create indexes for manual_task_submission
|
132
|
-
op.create_index(
|
133
|
-
"ix_manual_task_submission_task_id", "manual_task_submission", ["task_id"]
|
134
|
-
)
|
135
|
-
op.create_index(
|
136
|
-
"ix_manual_task_submission_config_id", "manual_task_submission", ["config_id"]
|
137
|
-
)
|
138
|
-
op.create_index(
|
139
|
-
"ix_manual_task_submission_field_id", "manual_task_submission", ["field_id"]
|
140
|
-
)
|
141
|
-
op.create_index(
|
142
|
-
"ix_manual_task_submission_instance_id",
|
143
|
-
"manual_task_submission",
|
144
|
-
["instance_id"],
|
145
|
-
)
|
146
|
-
op.create_index(
|
147
|
-
"ix_manual_task_submission_submitted_by",
|
148
|
-
"manual_task_submission",
|
149
|
-
["submitted_by"],
|
150
|
-
)
|
151
|
-
op.create_index(
|
152
|
-
"ix_manual_task_submission_submitted_at",
|
153
|
-
"manual_task_submission",
|
154
|
-
["submitted_at"],
|
155
|
-
)
|
156
|
-
# Composite index for common query pattern
|
157
|
-
op.create_index(
|
158
|
-
"ix_manual_task_submission_instance_field",
|
159
|
-
"manual_task_submission",
|
160
|
-
["instance_id", "field_id"],
|
161
|
-
)
|
162
|
-
|
163
|
-
# Add foreign key constraint to manual_task_log.instance_id
|
164
|
-
op.create_foreign_key(
|
165
|
-
"fk_manual_task_log_instance_id",
|
166
|
-
"manual_task_log",
|
167
|
-
"manual_task_instance",
|
168
|
-
["instance_id"],
|
169
|
-
["id"],
|
170
|
-
ondelete="CASCADE",
|
171
|
-
)
|
172
|
-
|
173
|
-
# Update foreign key constraint for manual_task_log.config_id to use CASCADE
|
174
|
-
op.drop_constraint(
|
175
|
-
"fk_manual_task_log_config_id", "manual_task_log", type_="foreignkey"
|
176
|
-
)
|
177
|
-
op.create_foreign_key(
|
178
|
-
"fk_manual_task_log_config_id",
|
179
|
-
"manual_task_log",
|
180
|
-
"manual_task_config",
|
181
|
-
["config_id"],
|
182
|
-
["id"],
|
183
|
-
ondelete="CASCADE",
|
184
|
-
)
|
185
|
-
|
186
|
-
|
187
|
-
def downgrade():
|
188
|
-
# Drop execution_timing column from manual_task_config
|
189
|
-
op.drop_column("manual_task_config", "execution_timing")
|
190
|
-
|
191
|
-
# Add due_date column to manual_task
|
192
|
-
op.add_column(
|
193
|
-
"manual_task",
|
194
|
-
sa.Column("due_date", sa.DateTime(timezone=True), nullable=True),
|
195
|
-
)
|
196
|
-
|
197
|
-
# Drop foreign key constraint from manual_task_log.instance_id
|
198
|
-
op.drop_constraint(
|
199
|
-
"fk_manual_task_log_instance_id", "manual_task_log", type_="foreignkey"
|
200
|
-
)
|
201
|
-
|
202
|
-
# Revert foreign key constraint for manual_task_log.config_id back to SET NULL
|
203
|
-
op.drop_constraint(
|
204
|
-
"fk_manual_task_log_config_id", "manual_task_log", type_="foreignkey"
|
205
|
-
)
|
206
|
-
op.create_foreign_key(
|
207
|
-
"fk_manual_task_log_config_id",
|
208
|
-
"manual_task_log",
|
209
|
-
"manual_task_config",
|
210
|
-
["config_id"],
|
211
|
-
["id"],
|
212
|
-
ondelete="SET NULL",
|
213
|
-
)
|
214
|
-
|
215
|
-
# Drop indexes first
|
216
|
-
op.drop_index(
|
217
|
-
"ix_manual_task_submission_instance_field", table_name="manual_task_submission"
|
218
|
-
)
|
219
|
-
op.drop_index(
|
220
|
-
"ix_manual_task_submission_submitted_at", table_name="manual_task_submission"
|
221
|
-
)
|
222
|
-
op.drop_index(
|
223
|
-
"ix_manual_task_submission_submitted_by", table_name="manual_task_submission"
|
224
|
-
)
|
225
|
-
op.drop_index(
|
226
|
-
"ix_manual_task_submission_instance_id", table_name="manual_task_submission"
|
227
|
-
)
|
228
|
-
op.drop_index(
|
229
|
-
"ix_manual_task_submission_field_id", table_name="manual_task_submission"
|
230
|
-
)
|
231
|
-
op.drop_index(
|
232
|
-
"ix_manual_task_submission_config_id", table_name="manual_task_submission"
|
233
|
-
)
|
234
|
-
op.drop_index(
|
235
|
-
"ix_manual_task_submission_task_id", table_name="manual_task_submission"
|
236
|
-
)
|
237
|
-
|
238
|
-
op.drop_index("ix_manual_task_instance_entity", table_name="manual_task_instance")
|
239
|
-
op.drop_index(
|
240
|
-
"ix_manual_task_instance_completed_at", table_name="manual_task_instance"
|
241
|
-
)
|
242
|
-
op.drop_index("ix_manual_task_instance_status", table_name="manual_task_instance")
|
243
|
-
op.drop_index(
|
244
|
-
"ix_manual_task_instance_entity_type", table_name="manual_task_instance"
|
245
|
-
)
|
246
|
-
op.drop_index(
|
247
|
-
"ix_manual_task_instance_entity_id", table_name="manual_task_instance"
|
248
|
-
)
|
249
|
-
op.drop_index(
|
250
|
-
"ix_manual_task_instance_config_id", table_name="manual_task_instance"
|
251
|
-
)
|
252
|
-
op.drop_index("ix_manual_task_instance_task_id", table_name="manual_task_instance")
|
253
|
-
|
254
|
-
# Drop tables in reverse order to handle foreign key constraints
|
255
|
-
op.drop_table("manual_task_submission")
|
256
|
-
op.drop_table("manual_task_instance")
|
@@ -1,187 +0,0 @@
|
|
1
|
-
from datetime import datetime, timezone
|
2
|
-
from typing import TYPE_CHECKING, Optional
|
3
|
-
|
4
|
-
from sqlalchemy import Column, DateTime, ForeignKey, String
|
5
|
-
from sqlalchemy.dialects.postgresql import JSONB
|
6
|
-
from sqlalchemy.ext.declarative import declared_attr
|
7
|
-
from sqlalchemy.orm import relationship
|
8
|
-
|
9
|
-
from fides.api.db.base_class import Base
|
10
|
-
from fides.api.db.util import EnumColumn
|
11
|
-
from fides.api.models.manual_tasks.manual_task_config import ManualTaskConfigField
|
12
|
-
from fides.api.schemas.manual_tasks.manual_task_schemas import ManualTaskEntityType
|
13
|
-
from fides.api.schemas.manual_tasks.manual_task_status import (
|
14
|
-
StatusTransitionMixin,
|
15
|
-
StatusType,
|
16
|
-
)
|
17
|
-
|
18
|
-
if TYPE_CHECKING: # pragma: no cover
|
19
|
-
from fides.api.models.attachment import Attachment # pragma: no cover
|
20
|
-
from fides.api.models.fides_user import FidesUser # pragma: no cover
|
21
|
-
from fides.api.models.manual_tasks.manual_task import ManualTask # pragma: no cover
|
22
|
-
from fides.api.models.manual_tasks.manual_task_config import (
|
23
|
-
ManualTaskConfig, # pragma: no cover
|
24
|
-
)
|
25
|
-
from fides.api.models.manual_tasks.manual_task_log import (
|
26
|
-
ManualTaskLog, # pragma: no cover; pragma: no cover
|
27
|
-
)
|
28
|
-
|
29
|
-
|
30
|
-
class ManualTaskInstance(Base, StatusTransitionMixin):
|
31
|
-
"""Model for tracking task status per entity instance.
|
32
|
-
|
33
|
-
This model implements StatusTransitionProtocol through the StatusTransitionMixin.
|
34
|
-
"""
|
35
|
-
|
36
|
-
@declared_attr
|
37
|
-
def __tablename__(cls) -> str:
|
38
|
-
"""Overriding base class method to set the table name."""
|
39
|
-
return "manual_task_instance"
|
40
|
-
|
41
|
-
# Database columns
|
42
|
-
task_id: Column[str] = Column(String, ForeignKey("manual_task.id"), nullable=False)
|
43
|
-
config_id: Column[str] = Column(
|
44
|
-
String, ForeignKey("manual_task_config.id"), nullable=False
|
45
|
-
)
|
46
|
-
# entity id is the entity that the instance relates to
|
47
|
-
# (e.g. a privacy request is an entity that has its own manual task instance)
|
48
|
-
entity_id: Column[str] = Column(String, nullable=False)
|
49
|
-
entity_type: Column[ManualTaskEntityType] = Column(
|
50
|
-
EnumColumn(ManualTaskEntityType), nullable=False
|
51
|
-
)
|
52
|
-
# ingnore[assignment] because the mypy and sqlalchemy types mismatch
|
53
|
-
# upgrading to 2.0 allows mapping which provides better type safety visibility.
|
54
|
-
status: Column[StatusType] = Column(EnumColumn(StatusType), nullable=False, default=StatusType.pending) # type: ignore[assignment]
|
55
|
-
completed_at: Column[Optional[datetime]] = Column(DateTime, nullable=True) # type: ignore[assignment]
|
56
|
-
completed_by_id: Column[Optional[str]] = Column(String, nullable=True) # type: ignore[assignment]
|
57
|
-
due_date: Column[Optional[datetime]] = Column(DateTime, nullable=True)
|
58
|
-
|
59
|
-
# Relationships
|
60
|
-
task = relationship("ManualTask", back_populates="instances")
|
61
|
-
config = relationship("ManualTaskConfig", back_populates="instances")
|
62
|
-
submissions = relationship(
|
63
|
-
"ManualTaskSubmission",
|
64
|
-
back_populates="instance",
|
65
|
-
cascade="all, delete-orphan",
|
66
|
-
uselist=True,
|
67
|
-
)
|
68
|
-
logs = relationship(
|
69
|
-
"ManualTaskLog",
|
70
|
-
back_populates="instance",
|
71
|
-
primaryjoin="ManualTaskInstance.id == ManualTaskLog.instance_id",
|
72
|
-
cascade="all, delete-orphan",
|
73
|
-
order_by="ManualTaskLog.created_at",
|
74
|
-
uselist=True,
|
75
|
-
)
|
76
|
-
attachments = relationship(
|
77
|
-
"Attachment",
|
78
|
-
secondary="attachment_reference",
|
79
|
-
primaryjoin="and_(ManualTaskInstance.id == ManualTaskSubmission.instance_id, "
|
80
|
-
"ManualTaskSubmission.id == AttachmentReference.reference_id, "
|
81
|
-
"AttachmentReference.reference_type == 'manual_task_submission')",
|
82
|
-
secondaryjoin="Attachment.id == AttachmentReference.attachment_id",
|
83
|
-
order_by="Attachment.created_at",
|
84
|
-
viewonly=True,
|
85
|
-
uselist=True,
|
86
|
-
)
|
87
|
-
|
88
|
-
@property
|
89
|
-
def required_fields(self) -> list["ManualTaskConfigField"]:
|
90
|
-
"""Get all required fields."""
|
91
|
-
return [
|
92
|
-
field
|
93
|
-
for field in self.config.field_definitions
|
94
|
-
if field.field_metadata.get("required", False)
|
95
|
-
]
|
96
|
-
|
97
|
-
@property
|
98
|
-
def incomplete_fields(self) -> list["ManualTaskConfigField"]:
|
99
|
-
"""Get all fields that haven't been completed yet.
|
100
|
-
A field is considered incomplete if:
|
101
|
-
1. It's required and has no submission
|
102
|
-
Returns:
|
103
|
-
list[ManualTaskConfigField]: List of incomplete fields
|
104
|
-
"""
|
105
|
-
return [
|
106
|
-
field
|
107
|
-
for field in self.required_fields
|
108
|
-
if not self.get_submission_for_field(field.id)
|
109
|
-
]
|
110
|
-
|
111
|
-
@property
|
112
|
-
def completed_fields(self) -> list["ManualTaskConfigField"]:
|
113
|
-
"""Get all fields that have been completed."""
|
114
|
-
return [
|
115
|
-
field
|
116
|
-
for field in self.config.field_definitions
|
117
|
-
if field.field_metadata.get("required", False)
|
118
|
-
and self.get_submission_for_field(field.id)
|
119
|
-
]
|
120
|
-
|
121
|
-
def get_submission_for_field(
|
122
|
-
self, field_id: str
|
123
|
-
) -> Optional["ManualTaskSubmission"]:
|
124
|
-
"""Get the submission for a specific field.
|
125
|
-
|
126
|
-
Args:
|
127
|
-
field_id: The ID of the field to get the submission for
|
128
|
-
|
129
|
-
Returns:
|
130
|
-
Optional[ManualTaskSubmission]: The submission for the field, or None if no submission exists
|
131
|
-
"""
|
132
|
-
return next(
|
133
|
-
(
|
134
|
-
submission
|
135
|
-
for submission in self.submissions
|
136
|
-
if submission.field_id == field_id
|
137
|
-
),
|
138
|
-
None,
|
139
|
-
)
|
140
|
-
|
141
|
-
|
142
|
-
class ManualTaskSubmission(Base):
|
143
|
-
"""Model for storing user submissions.
|
144
|
-
Each submission represents data for a single field.
|
145
|
-
"""
|
146
|
-
|
147
|
-
@declared_attr
|
148
|
-
def __tablename__(cls) -> str:
|
149
|
-
"""Overriding base class method to set the table name."""
|
150
|
-
return "manual_task_submission"
|
151
|
-
|
152
|
-
# Database columns
|
153
|
-
task_id = Column(String, ForeignKey("manual_task.id"))
|
154
|
-
config_id = Column(String, ForeignKey("manual_task_config.id"))
|
155
|
-
field_id = Column(String, ForeignKey("manual_task_config_field.id"))
|
156
|
-
instance_id = Column(String, ForeignKey("manual_task_instance.id"), nullable=False)
|
157
|
-
submitted_by = Column(String, ForeignKey("fidesuser.id"), nullable=True)
|
158
|
-
submitted_at = Column(DateTime, default=datetime.now(timezone.utc), nullable=False)
|
159
|
-
data = Column(JSONB, nullable=False)
|
160
|
-
|
161
|
-
# Relationships
|
162
|
-
task = relationship("ManualTask", back_populates="submissions", viewonly=True)
|
163
|
-
config = relationship(
|
164
|
-
"ManualTaskConfig", back_populates="submissions", viewonly=True
|
165
|
-
)
|
166
|
-
field = relationship(
|
167
|
-
"ManualTaskConfigField", back_populates="submissions", viewonly=True
|
168
|
-
)
|
169
|
-
instance = relationship(
|
170
|
-
"ManualTaskInstance", back_populates="submissions", viewonly=True
|
171
|
-
)
|
172
|
-
attachments = relationship(
|
173
|
-
"Attachment",
|
174
|
-
secondary="attachment_reference",
|
175
|
-
primaryjoin="and_(ManualTaskSubmission.id == AttachmentReference.reference_id, "
|
176
|
-
"AttachmentReference.reference_type == 'manual_task_submission')",
|
177
|
-
secondaryjoin="Attachment.id == AttachmentReference.attachment_id",
|
178
|
-
order_by="Attachment.created_at",
|
179
|
-
viewonly=True,
|
180
|
-
uselist=True,
|
181
|
-
)
|
182
|
-
|
183
|
-
user = relationship(
|
184
|
-
"FidesUser",
|
185
|
-
primaryjoin="FidesUser.id == ManualTaskSubmission.submitted_by",
|
186
|
-
viewonly=True,
|
187
|
-
)
|