ethyca-fides 2.64.1rc0__py2.py3-none-any.whl → 2.64.2b0__py2.py3-none-any.whl

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