ethyca-fides 2.64.1b2__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.
Files changed (110) hide show
  1. {ethyca_fides-2.64.1b2.dist-info → ethyca_fides-2.64.1rc0.dist-info}/METADATA +2 -2
  2. {ethyca_fides-2.64.1b2.dist-info → ethyca_fides-2.64.1rc0.dist-info}/RECORD +106 -110
  3. fides/_version.py +3 -3
  4. fides/api/db/base.py +0 -4
  5. fides/api/models/connectionconfig.py +0 -11
  6. fides/api/models/manual_tasks/__init__.py +1 -7
  7. fides/api/models/manual_tasks/manual_task.py +3 -19
  8. fides/api/models/manual_tasks/manual_task_config.py +6 -39
  9. fides/api/models/manual_tasks/manual_task_log.py +7 -20
  10. fides/api/schemas/manual_tasks/manual_task_schemas.py +0 -42
  11. fides/api/schemas/manual_tasks/manual_task_status.py +46 -107
  12. fides/common/api/v1/urn_registry.py +0 -4
  13. fides/service/manual_tasks/manual_task_config_service.py +5 -17
  14. fides/service/manual_tasks/manual_task_service.py +10 -66
  15. fides/ui-build/static/admin/404.html +1 -1
  16. fides/ui-build/static/admin/_next/static/chunks/{6662-cb11881dcaabe5e2.js → 6662-6a6b90fc8f11558f.js} +1 -1
  17. fides/ui-build/static/admin/_next/static/{xYqpgK9yFhQK_wL_F_kAF → hCJxUAFBWobWrps6RkP0K}/_buildManifest.js +1 -1
  18. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  19. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  20. fides/ui-build/static/admin/add-systems.html +1 -1
  21. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  22. fides/ui-build/static/admin/consent/configure.html +1 -1
  23. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  24. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  25. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  26. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  27. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  28. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  29. fides/ui-build/static/admin/consent/properties.html +1 -1
  30. fides/ui-build/static/admin/consent/reporting.html +1 -1
  31. fides/ui-build/static/admin/consent.html +1 -1
  32. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  33. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  34. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  35. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  36. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  37. fides/ui-build/static/admin/data-catalog.html +1 -1
  38. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  39. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  40. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  41. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  42. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  43. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  44. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  45. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  46. fides/ui-build/static/admin/datamap.html +1 -1
  47. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  48. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  49. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  50. fides/ui-build/static/admin/dataset/new.html +1 -1
  51. fides/ui-build/static/admin/dataset.html +1 -1
  52. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  53. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  54. fides/ui-build/static/admin/datastore-connection.html +1 -1
  55. fides/ui-build/static/admin/index.html +1 -1
  56. fides/ui-build/static/admin/integrations/[id].html +1 -1
  57. fides/ui-build/static/admin/integrations.html +1 -1
  58. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  59. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  60. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  61. fides/ui-build/static/admin/lib/fides.js +2 -2
  62. fides/ui-build/static/admin/login/[provider].html +1 -1
  63. fides/ui-build/static/admin/login.html +1 -1
  64. fides/ui-build/static/admin/messaging/[id].html +1 -1
  65. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  66. fides/ui-build/static/admin/messaging.html +1 -1
  67. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  68. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  69. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  70. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  71. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  72. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  73. fides/ui-build/static/admin/poc/forms.html +1 -1
  74. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  75. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  76. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  77. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  78. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  79. fides/ui-build/static/admin/privacy-requests.html +1 -1
  80. fides/ui-build/static/admin/properties/[id].html +1 -1
  81. fides/ui-build/static/admin/properties/add-property.html +1 -1
  82. fides/ui-build/static/admin/properties.html +1 -1
  83. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  84. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  85. fides/ui-build/static/admin/settings/about.html +1 -1
  86. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  87. fides/ui-build/static/admin/settings/consent.html +1 -1
  88. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  89. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  90. fides/ui-build/static/admin/settings/domains.html +1 -1
  91. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  92. fides/ui-build/static/admin/settings/locations.html +1 -1
  93. fides/ui-build/static/admin/settings/organization.html +1 -1
  94. fides/ui-build/static/admin/settings/regulations.html +1 -1
  95. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  96. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  97. fides/ui-build/static/admin/systems.html +1 -1
  98. fides/ui-build/static/admin/taxonomy.html +1 -1
  99. fides/ui-build/static/admin/user-management/new.html +1 -1
  100. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  101. fides/ui-build/static/admin/user-management.html +1 -1
  102. fides/api/alembic/migrations/versions/6a76a1fa4f3f_add_manual_task_instance_table.py +0 -256
  103. fides/api/alembic/migrations/versions/aadfe83c5644_add_manual_task_to_connectiontype_enum.py +0 -46
  104. fides/api/models/manual_tasks/manual_task_instance.py +0 -187
  105. fides/service/manual_tasks/manual_task_instance_service.py +0 -285
  106. {ethyca_fides-2.64.1b2.dist-info → ethyca_fides-2.64.1rc0.dist-info}/WHEEL +0 -0
  107. {ethyca_fides-2.64.1b2.dist-info → ethyca_fides-2.64.1rc0.dist-info}/entry_points.txt +0 -0
  108. {ethyca_fides-2.64.1b2.dist-info → ethyca_fides-2.64.1rc0.dist-info}/licenses/LICENSE +0 -0
  109. {ethyca_fides-2.64.1b2.dist-info → ethyca_fides-2.64.1rc0.dist-info}/top_level.txt +0 -0
  110. /fides/ui-build/static/admin/_next/static/{xYqpgK9yFhQK_wL_F_kAF → 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/xYqpgK9yFhQK_wL_F_kAF/_buildManifest.js" defer=""></script><script src="/_next/static/xYqpgK9yFhQK_wL_F_kAF/_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":"xYqpgK9yFhQK_wL_F_kAF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/xYqpgK9yFhQK_wL_F_kAF/_buildManifest.js" defer=""></script><script src="/_next/static/xYqpgK9yFhQK_wL_F_kAF/_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":"xYqpgK9yFhQK_wL_F_kAF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/xYqpgK9yFhQK_wL_F_kAF/_buildManifest.js" defer=""></script><script src="/_next/static/xYqpgK9yFhQK_wL_F_kAF/_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":"xYqpgK9yFhQK_wL_F_kAF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/xYqpgK9yFhQK_wL_F_kAF/_buildManifest.js" defer=""></script><script src="/_next/static/xYqpgK9yFhQK_wL_F_kAF/_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":"xYqpgK9yFhQK_wL_F_kAF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/xYqpgK9yFhQK_wL_F_kAF/_buildManifest.js" defer=""></script><script src="/_next/static/xYqpgK9yFhQK_wL_F_kAF/_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":"xYqpgK9yFhQK_wL_F_kAF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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/xYqpgK9yFhQK_wL_F_kAF/_buildManifest.js" defer=""></script><script src="/_next/static/xYqpgK9yFhQK_wL_F_kAF/_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":"xYqpgK9yFhQK_wL_F_kAF","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
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,46 +0,0 @@
1
- """add_manual_task_to_connectiontype_enum
2
-
3
- Revision ID: aadfe83c5644
4
- Revises: 6a76a1fa4f3f
5
- Create Date: 2025-06-19 18:55:08.131278
6
-
7
- """
8
-
9
- import sqlalchemy as sa
10
- from alembic import op
11
-
12
- # revision identifiers, used by Alembic.
13
- revision = "aadfe83c5644"
14
- down_revision = "6a76a1fa4f3f"
15
- branch_labels = None
16
- depends_on = None
17
-
18
-
19
- def upgrade():
20
- # Add manual_task to ConnectionType enum
21
- op.execute("alter type connectiontype rename to connectiontype_old")
22
- op.execute(
23
- "create type connectiontype as enum('attentive_email', 'bigquery', 'datahub', 'dynamodb', 'fides', 'generic_consent_email', 'generic_erasure_email', 'dynamic_erasure_email', 'google_cloud_sql_mysql', 'google_cloud_sql_postgres', 'https', 'manual', 'manual_webhook', 'manual_task', 'mariadb', 'mongodb', 'mssql', 'mysql', 'okta', 'postgres', 'rds_mysql', 'rds_postgres', 'redshift', 's3', 'saas', 'scylla', 'snowflake', 'sovrn', 'timescale', 'website')"
24
- )
25
- op.execute(
26
- (
27
- "alter table connectionconfig alter column connection_type type connectiontype using "
28
- "connection_type::text::connectiontype"
29
- )
30
- )
31
- op.execute("drop type connectiontype_old")
32
-
33
-
34
- def downgrade():
35
- # Remove manual_task from ConnectionType enum
36
- op.execute("alter type connectiontype rename to connectiontype_old")
37
- op.execute(
38
- "create type connectiontype as enum('attentive_email', 'bigquery', 'datahub', 'dynamodb', 'fides', 'generic_consent_email', 'generic_erasure_email', 'dynamic_erasure_email', 'google_cloud_sql_mysql', 'google_cloud_sql_postgres', 'https', 'manual', 'manual_webhook', 'mariadb', 'mongodb', 'mssql', 'mysql', 'okta', 'postgres', 'rds_mysql', 'rds_postgres', 'redshift', 's3', 'saas', 'scylla', 'snowflake', 'sovrn', 'timescale', 'website')"
39
- )
40
- op.execute(
41
- (
42
- "alter table connectionconfig alter column connection_type type connectiontype using "
43
- "connection_type::text::connectiontype"
44
- )
45
- )
46
- op.execute("drop type connectiontype_old")
@@ -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
- )