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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ethyca-fides might be problematic. Click here for more details.

Files changed (285) hide show
  1. {ethyca_fides-2.64.2rc0.dist-info → ethyca_fides-2.64.3b0.dist-info}/METADATA +3 -3
  2. {ethyca_fides-2.64.2rc0.dist-info → ethyca_fides-2.64.3b0.dist-info}/RECORD +237 -245
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/41a634d8c669_manual_task_restrict_deletes.py +257 -0
  5. fides/api/alembic/migrations/versions/6a76a1fa4f3f_add_manual_task_instance_table.py +256 -0
  6. fides/api/alembic/migrations/versions/aadfe83c5644_add_manual_task_to_connectiontype_enum.py +46 -0
  7. fides/api/api/v1/api.py +2 -0
  8. fides/api/api/v1/endpoints/partitioning_endpoints.py +108 -0
  9. fides/api/db/base.py +6 -3
  10. fides/api/db/database.py +27 -2
  11. fides/api/graph/config.py +16 -9
  12. fides/api/models/attachment.py +15 -3
  13. fides/api/models/comment.py +23 -5
  14. fides/api/models/connectionconfig.py +11 -0
  15. fides/api/models/db_cache.py +1 -1
  16. fides/api/models/detection_discovery/core.py +15 -15
  17. fides/api/models/fides_user_respondent_email_verification.py +27 -2
  18. fides/api/models/manual_task.py +965 -0
  19. fides/api/models/tcf_publisher_restrictions.py +16 -4
  20. fides/api/schemas/partitioning/__init__.py +17 -0
  21. fides/api/schemas/partitioning/bigquery_time_based_partitioning.py +31 -0
  22. fides/api/schemas/partitioning/time_based_partitioning.py +1376 -0
  23. fides/api/service/connectors/query_configs/bigquery_query_config.py +44 -22
  24. fides/api/service/connectors/query_configs/query_config.py +5 -2
  25. fides/api/util/connection_util.py +25 -2
  26. fides/common/api/v1/urn_registry.py +4 -0
  27. fides/ui-build/static/admin/404.html +1 -1
  28. fides/ui-build/static/admin/_next/static/chunks/{1040-af383f535c11eb24.js → 1040-3def3c62138371bb.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/1169-76bbada4f3d16538.js +1 -0
  30. fides/ui-build/static/admin/_next/static/chunks/1807-3beab149351d5ded.js +1 -0
  31. fides/ui-build/static/admin/_next/static/chunks/{1817-b4688ba5042ec687.js → 1817-a3813209d7a6d28d.js} +1 -1
  32. fides/ui-build/static/admin/_next/static/chunks/{2921-aabf41bf3d7573f9.js → 2921-81a48418f77bc9a7.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{3450-f6fc4ed04a63935f.js → 3450-3a1f0e80ead8d1b0.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/{3855-0dec3e7d9e886550.js → 3855-b85ad4e52433d519.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/{3872-ffa16c2df7ef0ab6.js → 3872-09f81435f7905d76.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{3923-b0fb0989671407b7.js → 3923-565a852f322fdadc.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/{401-6721f8bcb14a6537.js → 401-c3f586a23a061526.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{409-037cfc3f096150f0.js → 409-e0d39af1d9ce8ff2.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/4121-de4ca969faf2b9f4.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/{4230-18f4849f9db58a08.js → 4230-d80ae2430aca784a.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{431-f72599f01b98f07d.js → 431-c74dab231c8ac968.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{5309-4511df9708d5a63c.js → 5309-0e44dbd914896514.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{5574-3cd33b3a6c937899.js → 5574-917c5ff63d222308.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/6084-40d5d94561a6093e.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/6662-6a915300505fd9c0.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/{6853-a4097260e402980e.js → 6853-8d0a099f61c758d1.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/{6882-3cc73d407a088d7d.js → 6882-13d6f8d95b1e404f.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/{6954-8bac07b8278ded5c.js → 6954-882b87698c5ed4fb.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/7476-aaf8970dbbbe4864.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/7630-c558dc3a199a633d.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/787-9c751615f5816094.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/{79-5670e31eb65d0a53.js → 79-3f742fe4efd9893f.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/{796-9a6b13c838e25538.js → 796-83a8bbdcdb67f2ba.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/827-c6fe34fb336467ae.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/{9046-fdf53cc7e926a8c1.js → 9046-6995482a030e323c.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/{905-742074a074be1055.js → 905-ffdbd0b14167e8bd.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/{9226-50427ff861ffa8bf.js → 9226-8a3be36ad1a9c1e7.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/{9392.25024e070026343d.js → 9392.9a948112de74781b.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/{9676.e60a53f1f5890847.js → 9676.cc515c853b8cf578.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/9767-1dca308466dce863.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/9826-303b14ef4fc7ab4a.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/{9951-7de52d41dc1319f7.js → 9951-b5b77bfcc8efb493.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/{404-ac2f0844e5c4b4cd.js → 404-488f8f03fe0ffbc7.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-8310662c216e8f04.js → _app-030b20295bb61f96.js} +92 -89
  68. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-0a5f2310ce6b1059.js → manual-1e88ac28bc7a41b6.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-00cb904825aad7e3.js → multiple-f2c9451fffaaa529.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a8e0bc7b6674f47e.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-fa7305b88c1afd20.js → add-vendors-b17d160147365cf3.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-f140ec9d8e8a0f7a.js → configure-8e168d78acdf0cfe.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-0edb7c92518e7d21.js → [id]-5ca2467de7986929.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a0039f216fb3eb93.js → new-06bb3b0bf097fcdb.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-d8d926f0735a2546.js → privacy-experience-3c11fecc2797ab68.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5c949f2e3cef2398.js → [id]-92bc6c7b82a679b4.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-130155cfb4a0bcc7.js → new-a3da3243526b7ecb.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-1135ad8924d32c36.js → privacy-notices-b7d82386e7521041.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-776855e370414beb.js → properties-20a2029b7e7fc895.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-21c23f75ff1135d9.js → reporting-0ce299131db4c3e5.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-4d5ea70a77df1bb8.js → consent-9f6a7a231bba17b7.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-c623d6f1a61c8ea9.js → [resourceUrn]-11d52f1570759c4d.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-030ee304cbe5e530.js → [projectUrn]-fd705968b357e99a.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-cfac259a30641e68.js → projects-45b585deee0b2371.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-57bd5cdf784f059f.js → [resourceUrn]-b83afa5565d0c84e.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-51d99174c8006eb5.js → resources-d8db234a44a2ddf4.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-132e54310cd047af.js → data-catalog-2810fa2b519a076b.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-c948f93c833d4358.js → [systemId]-e861699a8866c64b.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-333f53caab751428.js → [monitorId]-5dd2fbf33e228f9c.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-27205f8457a1ecb0.js → action-center-806cae6bc128cd38.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-20a1043f6a06198f.js → activity-487285bd5eca2595.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-06edce289876dea1.js → [resourceUrn]-393e20924c83373e.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-faf326a6200637d0.js → detection-8733807dad4bc96e.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-64acf269256ee74f.js → [resourceUrn]-14bd7500362ff224.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-8c3e4be6d36da66d.js → discovery-9e7dfd5a6acc2e8f.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-fb50de22f83edd4a.js → datamap-c9509d72c538d22b.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-41ab27c4195cfa93.js → [...subfieldNames]-4e8a436297a055b2.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-6e2caba24b3e78c2.js → [collectionName]-6ce02295bb7f5b6d.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-904d43e31157aa55.js → [datasetId]-9eaa907437fde063.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-55243db34cf77b7e.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-5a24f549246605b2.js → dataset-b328595abf20ea5d.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-4a33dd0371dbaebc.js → [id]-81ab412e337d2888.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-e88509346b2d2851.js → new-34dfc172165dbb1c.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cdb77886d7fd4f44.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/{index-1adb6bcb71701ac2.js → index-de954b741cbca022.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-41c4f321da3c6169.js → [id]-16dd6eff8f5dcc81.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-40a3cd14264796e2.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-9b4d1d61c7c97509.js → [id]-42edcab11e8b5c3c.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-f8fd4795e260887c.js → add-template-333e54ac8c3ad57a.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-aa744ae8b61e5ff2.js → messaging-8e1e6f3782983225.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-3f62dd959a039fe9.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-47e947c02ae90fd0.js → AntForm-920338760f5a71b5.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-24f9a44512ce8827.js → FormikAntFormItem-7462fb387a9de3f8.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-e567a69f8c37fb9a.js → FormikControlled-6148fce7a4e2e9ca.js} +1 -1
  115. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-35a33f9c7def2220.js → FormikField-30efd8c937bf19e4.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-780e18dde8e38099.js → forms-c44de83e0952d1e0.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-7852aa60090c8c9a.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-11dd6152bf6607cc.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-c50c2ee7d7d2a585.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-282de19599d67aaf.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-1a1aa83a3f88844c.js → configure-1d981663e1a84166.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-3f962ade5df86380.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-19737d4f21aadbee.js → [id]-b08a69b1c460c7fe.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-9ccb295110feee20.js → add-property-a5d1c65ec21df69d.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-3a1037a2e036212a.js → properties-3a75c6ed8308d126.js} +1 -1
  126. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-959d2a35ca015976.js → datamap-dda59a7105ee609b.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-965cc21889b25e44.js → alpha-6773158ba6ccf4b0.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-0e1c381d488a7ada.js → about-2e046d177d52465c.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-1ad018d87c79a9d6.js → [purpose_id]-91f2ec72f9654cbd.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-0a87f29768425a37.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-9d5310145cbdc8ba.js → custom-fields-94d97e3eb964c494.js} +1 -1
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-0b44b2b224077dcd.js → domain-records-2c7ecff0a8a74c42.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-b9e77c75c6b77c88.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-bb60c397a03558d8.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-811dadb489f23d7d.js → locations-8d4383584c72eb5a.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-4b835393f5274379.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-54f142bc3e4c95ba.js → regulations-29892065d99ff113.js} +1 -1
  138. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-9669fa6b20545530.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6eb886e7b7e6785b.js → [id]-8fa8a2f238e08791.js} +1 -1
  140. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-7b71274334c559a4.js → systems-acdbdd3dfd21162f.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-c9510a1eb612323d.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-b124cc24b930c9e1.js → new-a2524414e968f862.js} +1 -1
  143. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-75d41fde668b9025.js → [id]-87ed17fa1d9f8f72.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-dd43755b687c09a7.js → user-management-6b4e0764bb8816b8.js} +1 -1
  145. fides/ui-build/static/admin/_next/static/chunks/webpack-da78c536f3d86d06.js +1 -0
  146. fides/ui-build/static/admin/_next/static/css/{c693338e3bc8dcc6.css → 1994066ec907b7df.css} +1 -1
  147. fides/ui-build/static/admin/_next/static/ezJVaZ_Oi_0J2-wPEOvj1/_buildManifest.js +1 -0
  148. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  149. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  150. fides/ui-build/static/admin/add-systems.html +1 -1
  151. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  152. fides/ui-build/static/admin/consent/configure.html +1 -1
  153. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  154. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  155. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  156. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  158. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  159. fides/ui-build/static/admin/consent/properties.html +1 -1
  160. fides/ui-build/static/admin/consent/reporting.html +1 -1
  161. fides/ui-build/static/admin/consent.html +1 -1
  162. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  163. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  164. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  165. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  166. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  167. fides/ui-build/static/admin/data-catalog.html +1 -1
  168. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  169. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  170. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  171. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  172. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  173. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  174. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  175. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  176. fides/ui-build/static/admin/datamap.html +1 -1
  177. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  178. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  179. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  180. fides/ui-build/static/admin/dataset/new.html +1 -1
  181. fides/ui-build/static/admin/dataset.html +1 -1
  182. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  183. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  184. fides/ui-build/static/admin/datastore-connection.html +1 -1
  185. fides/ui-build/static/admin/index.html +1 -1
  186. fides/ui-build/static/admin/integrations/[id].html +1 -1
  187. fides/ui-build/static/admin/integrations.html +1 -1
  188. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  189. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  190. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  191. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  192. fides/ui-build/static/admin/lib/fides.js +2 -2
  193. fides/ui-build/static/admin/login/[provider].html +1 -1
  194. fides/ui-build/static/admin/login.html +1 -1
  195. fides/ui-build/static/admin/messaging/[id].html +1 -1
  196. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  197. fides/ui-build/static/admin/messaging.html +1 -1
  198. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  199. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  200. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  201. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  202. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  203. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  204. fides/ui-build/static/admin/poc/forms.html +1 -1
  205. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  206. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  207. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  208. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  209. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  210. fides/ui-build/static/admin/privacy-requests.html +1 -1
  211. fides/ui-build/static/admin/properties/[id].html +1 -1
  212. fides/ui-build/static/admin/properties/add-property.html +1 -1
  213. fides/ui-build/static/admin/properties.html +1 -1
  214. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  215. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  216. fides/ui-build/static/admin/settings/about.html +1 -1
  217. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  218. fides/ui-build/static/admin/settings/consent.html +1 -1
  219. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  220. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  221. fides/ui-build/static/admin/settings/domains.html +1 -1
  222. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  223. fides/ui-build/static/admin/settings/locations.html +1 -1
  224. fides/ui-build/static/admin/settings/organization.html +1 -1
  225. fides/ui-build/static/admin/settings/regulations.html +1 -1
  226. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  227. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  228. fides/ui-build/static/admin/systems.html +1 -1
  229. fides/ui-build/static/admin/taxonomy.html +1 -1
  230. fides/ui-build/static/admin/user-management/new.html +1 -1
  231. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  232. fides/ui-build/static/admin/user-management.html +1 -1
  233. fides/api/models/manual_tasks/__init__.py +0 -14
  234. fides/api/models/manual_tasks/manual_task.py +0 -120
  235. fides/api/models/manual_tasks/manual_task_config.py +0 -136
  236. fides/api/models/manual_tasks/manual_task_log.py +0 -104
  237. fides/api/schemas/manual_tasks/__init__.py +0 -0
  238. fides/api/schemas/manual_tasks/manual_task_config.py +0 -311
  239. fides/api/schemas/manual_tasks/manual_task_schemas.py +0 -79
  240. fides/api/schemas/manual_tasks/manual_task_status.py +0 -151
  241. fides/service/manual_tasks/__init__.py +0 -0
  242. fides/service/manual_tasks/manual_task_config_service.py +0 -370
  243. fides/service/manual_tasks/manual_task_service.py +0 -294
  244. fides/service/manual_tasks/utils.py +0 -185
  245. fides/ui-build/static/admin/_next/static/chunks/1100-2dfb464ef0359d6d.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/2430-b480401d44c55416.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/3505-a79256cd851dfab4.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/3513-24db696153a0778b.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/3670-2abd9b2f17770872.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/3983-17ae9c232bddc413.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/4060-cb74476245af456e.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4121-8a791c8cc79d28c4.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/4481-f597a7cf03f8c9e1.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +0 -4
  255. fides/ui-build/static/admin/_next/static/chunks/6277-32adfa799bfd1616.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/6659-b2088f525bf13c17.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/6662-0ce35f1a7a4d07b0.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/69-9952d261ca57275e.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/7553-a95939c32d54b5b7.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/8433-0acacfca722ce475.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/9767-118e4abca85bbd97.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-9fee3bc13b393070.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-3f997c29f6d8cb24.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-8f9b8890018e1ea5.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adc286ff254e7f41.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-3407158757fb3627.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-7a17dffa515e5560.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-91dd0039cc2b70bc.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-dda47b868cf8ea27.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-53acc4a492d160ab.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-138e4697e269d339.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4c56222e847986ff.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-50bdc72e2f34c39e.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-983fbf2cf335b945.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-5ae1bdd93c5bd72a.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-fef247a87baeb080.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-88178d29a15ba479.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/webpack-0a61b5bd21a41fe6.js +0 -1
  280. fides/ui-build/static/admin/_next/static/rJbP2kuATyoki-YIQWFdS/_buildManifest.js +0 -1
  281. {ethyca_fides-2.64.2rc0.dist-info → ethyca_fides-2.64.3b0.dist-info}/WHEEL +0 -0
  282. {ethyca_fides-2.64.2rc0.dist-info → ethyca_fides-2.64.3b0.dist-info}/entry_points.txt +0 -0
  283. {ethyca_fides-2.64.2rc0.dist-info → ethyca_fides-2.64.3b0.dist-info}/licenses/LICENSE +0 -0
  284. {ethyca_fides-2.64.2rc0.dist-info → ethyca_fides-2.64.3b0.dist-info}/top_level.txt +0 -0
  285. /fides/ui-build/static/admin/_next/static/{rJbP2kuATyoki-YIQWFdS → ezJVaZ_Oi_0J2-wPEOvj1}/_ssgManifest.js +0 -0
@@ -1,370 +0,0 @@
1
- from typing import Any, Optional
2
-
3
- from loguru import logger
4
- from sqlalchemy.orm import Query, Session, selectinload
5
-
6
- from fides.api.models.manual_tasks.manual_task import ManualTask
7
- from fides.api.models.manual_tasks.manual_task_config import (
8
- ManualTaskConfig,
9
- ManualTaskConfigField,
10
- )
11
- from fides.api.schemas.manual_tasks.manual_task_config import (
12
- ManualTaskConfigResponse,
13
- ManualTaskConfigurationType,
14
- )
15
- from fides.service.manual_tasks.utils import validate_fields, with_task_logging
16
-
17
-
18
- class ManualTaskConfigService:
19
- def __init__(self, db: Session):
20
- self.db = db
21
-
22
- def _create_log_data(
23
- self, task_id: str, config_id: Optional[str], details: dict[str, Any]
24
- ) -> dict[str, Any]:
25
- """Create standard log data structure."""
26
- return {"task_id": task_id, "config_id": config_id, "details": details}
27
-
28
- def _get_base_config_query(self) -> Query:
29
- """Get base config query with field definitions loaded."""
30
- return self.db.query(ManualTaskConfig).options(
31
- selectinload(ManualTaskConfig.field_definitions)
32
- )
33
-
34
- def _create_config_version(
35
- self,
36
- task: ManualTask,
37
- config_type: str,
38
- version: int,
39
- is_current: bool = True,
40
- ) -> ManualTaskConfig:
41
- """Create a new config version. This is a helper method that creates a new config
42
- version and sets it as the current version.
43
-
44
- Args:
45
- task: The task to create the config for
46
- config_type: The type of config to create
47
- version: The version number of the config
48
- is_current: Whether the config is the current version
49
- Returns:
50
- The new config
51
- """
52
- try:
53
- ManualTaskConfigurationType(config_type)
54
- except ValueError:
55
- raise ValueError(f"Invalid config type: {config_type}")
56
-
57
- # Set all existing versions to non-current
58
- if is_current:
59
- self.db.query(ManualTaskConfig).filter(
60
- ManualTaskConfig.task_id == task.id,
61
- ManualTaskConfig.config_type == config_type,
62
- ).update({"is_current": False})
63
- self.db.flush()
64
-
65
- return ManualTaskConfig.create(
66
- db=self.db,
67
- data={
68
- "task_id": task.id,
69
- "config_type": config_type,
70
- "version": version,
71
- "is_current": is_current,
72
- },
73
- )
74
-
75
- def _handle_field_updates(
76
- self,
77
- config: ManualTaskConfig,
78
- field_updates: Optional[list[dict[str, Any]]] = None,
79
- fields_to_remove: Optional[list[str]] = None,
80
- previous_config: Optional[ManualTaskConfig] = None,
81
- ) -> set[str]:
82
- """Handle field updates, removals, and recreation from previous version. This is a helper
83
- function that:
84
- - Creates new fields from field_updates
85
- - Recreates unmodified fields from previous version so they will remain in the config
86
- - Removes fields that are no longer in the config
87
-
88
- Args:
89
- config: The config to update
90
- field_updates: The fields to update
91
- fields_to_remove: The fields to remove
92
- previous_config: The previous config
93
- Returns:
94
- The modified keys
95
- """
96
- modified_keys = set(fields_to_remove or [])
97
-
98
- if field_updates:
99
- validate_fields(field_updates, is_submission=False)
100
- fields_to_create = [
101
- {
102
- "task_id": config.task_id,
103
- "config_id": config.id,
104
- "field_key": f["field_key"],
105
- "field_type": f.get("field_type"),
106
- "field_metadata": f.get("field_metadata", {}),
107
- }
108
- for f in field_updates
109
- ]
110
- if fields_to_create:
111
- self.db.bulk_insert_mappings(ManualTaskConfigField, fields_to_create)
112
- modified_keys.update(f["field_key"] for f in field_updates)
113
-
114
- if previous_config:
115
- # Recreate unmodified fields from previous version
116
- unmodified = [
117
- {
118
- "task_id": config.task_id,
119
- "config_id": config.id,
120
- "field_key": f.field_key,
121
- "field_type": f.field_type,
122
- "field_metadata": f.field_metadata,
123
- }
124
- for f in previous_config.field_definitions
125
- if f.field_key not in modified_keys
126
- ]
127
- if unmodified:
128
- self.db.bulk_insert_mappings(ManualTaskConfigField, unmodified)
129
-
130
- self.db.flush()
131
- return modified_keys
132
-
133
- def to_response(self, config: ManualTaskConfig) -> ManualTaskConfigResponse:
134
- """Convert config model to response object."""
135
- return ManualTaskConfigResponse.model_validate(
136
- {
137
- "id": config.id,
138
- "task_id": config.task_id,
139
- "config_type": config.config_type,
140
- "version": config.version,
141
- "is_current": config.is_current,
142
- "fields": [
143
- {
144
- "field_key": f.field_key,
145
- "field_type": f.field_type,
146
- "field_metadata": f.field_metadata,
147
- }
148
- for f in config.field_definitions
149
- ],
150
- "created_at": config.created_at,
151
- "updated_at": config.updated_at,
152
- }
153
- )
154
-
155
- def get_current_config(
156
- self, task: ManualTask, config_type: str
157
- ) -> ManualTaskConfig:
158
- """Get current config for task by type."""
159
- config = (
160
- self._get_base_config_query()
161
- .filter(
162
- ManualTaskConfig.task_id == task.id,
163
- ManualTaskConfig.config_type == config_type,
164
- ManualTaskConfig.is_current.is_(True),
165
- )
166
- .first()
167
- )
168
-
169
- if not config:
170
- raise ValueError(
171
- f"No current config found for task {task.id} and type {config_type}"
172
- )
173
- return config
174
-
175
- def list_config_type_versions(
176
- self, task: ManualTask, config_type: str
177
- ) -> list[ManualTaskConfig]:
178
- """List all versions of a config type for a task."""
179
- return (
180
- self._get_base_config_query()
181
- .filter(
182
- ManualTaskConfig.task_id == task.id,
183
- ManualTaskConfig.config_type == config_type,
184
- )
185
- .order_by(ManualTaskConfig.version.desc())
186
- .all()
187
- )
188
-
189
- def get_config(
190
- self,
191
- task: ManualTask,
192
- config_type: str,
193
- field_id: str,
194
- config_id: str,
195
- field_key: str,
196
- version: int,
197
- ) -> Optional[ManualTaskConfig]:
198
- """Get config by various filters. This is a flexible lookup method that can find configs based on various filters.
199
-
200
- Args:
201
- task: The task to get the config for
202
- config_type: The type of config to get
203
- field_id: The ID of a field in the config
204
- config_id: The ID of the config
205
- field_key: The key of a field in the config
206
- version: The version number of the config
207
- Returns:
208
- The matching config if found, None otherwise
209
- """
210
- if not any([task, config_id, field_id, config_type]):
211
- logger.debug("No filters provided to get_config")
212
- return None
213
-
214
- query = self._get_base_config_query()
215
- if field_id or field_key:
216
- query = query.join(ManualTaskConfig.field_definitions)
217
-
218
- filters = [
219
- f
220
- for f in [
221
- task and ManualTaskConfig.task_id == task.id,
222
- config_id and ManualTaskConfig.id == config_id,
223
- field_id and ManualTaskConfigField.id == field_id,
224
- field_key and ManualTaskConfigField.field_key == field_key,
225
- version and ManualTaskConfig.version == version,
226
- config_type and ManualTaskConfig.config_type == config_type,
227
- ]
228
- if f
229
- ]
230
-
231
- return query.filter(*filters).first()
232
-
233
- @with_task_logging("Creating new configuration version")
234
- def create_new_version(
235
- self,
236
- task: ManualTask,
237
- config_type: str,
238
- field_updates: Optional[list[dict[str, Any]]] = None,
239
- fields_to_remove: Optional[list[str]] = None,
240
- previous_config: Optional[ManualTaskConfig] = None,
241
- ) -> tuple[ManualTaskConfig, dict[str, Any]]:
242
- """Create new version of configuration.
243
-
244
- Args:
245
- task: The task to create the config for
246
- config_type: The type of config to create
247
- field_updates: The fields to update
248
- fields_to_remove: The fields to remove
249
- previous_config: The previous config
250
-
251
- Returns:
252
- Tuple containing the new config and log data, the log data is
253
- captured by the with_task_logging decorator. and the new config is
254
- returned to the caller.
255
- """
256
- new_config = self._create_config_version(
257
- task, config_type, (previous_config.version + 1 if previous_config else 1)
258
- )
259
-
260
- self._handle_field_updates(
261
- new_config, field_updates, fields_to_remove, previous_config
262
- )
263
-
264
- return new_config, self._create_log_data(
265
- task.id,
266
- new_config.id,
267
- {
268
- "config_type": config_type,
269
- "version": new_config.version,
270
- "added_field_keys": [f.get("field_key") for f in (field_updates or [])],
271
- "removed_field_keys": fields_to_remove or [],
272
- },
273
- )
274
-
275
- @with_task_logging("Adding fields to configuration")
276
- def add_fields(
277
- self, task: ManualTask, config_type: str, fields: list[dict[str, Any]]
278
- ) -> tuple[ManualTaskConfig, dict[str, Any]]:
279
- """Add fields to configuration.
280
-
281
- Args:
282
- task: The task to add the fields to
283
- config_type: The type of config to add the fields to
284
- fields: The fields to add
285
-
286
- Returns:
287
- Tuple containing the new config and log data, the log data is
288
- captured by the with_task_logging decorator. and the new config is
289
- returned to the caller.
290
- """
291
- current = self.get_current_config(task, config_type)
292
- self.create_new_version(task, config_type, fields, previous_config=current)
293
- new_config = self.get_current_config(task, config_type)
294
-
295
- return new_config, self._create_log_data(
296
- task.id,
297
- current.id,
298
- {
299
- "config_type": config_type,
300
- "previous_version": current.version,
301
- "added_field_keys": [f.get("field_key") for f in fields],
302
- "new_config_id": new_config.id,
303
- "new_config_version": new_config.version,
304
- },
305
- )
306
-
307
- @with_task_logging("Removing fields from configuration")
308
- def remove_fields(
309
- self, task: ManualTask, config_type: str, field_keys: list[str]
310
- ) -> tuple[ManualTaskConfig, dict[str, Any]]:
311
- """Remove fields from configuration.
312
-
313
- Args:
314
- task: The task to remove the fields from
315
- config_type: The type of config to remove the fields from
316
- field_keys: The keys of the fields to remove
317
-
318
- Returns:
319
- Tuple containing the new config and log data, the log data is
320
- captured by the with_task_logging decorator. and the new config is
321
- returned to the caller.
322
- """
323
- current = self.get_current_config(task, config_type)
324
- self.create_new_version(
325
- task, config_type, fields_to_remove=field_keys, previous_config=current
326
- )
327
- new_config = self.get_current_config(task, config_type)
328
-
329
- return new_config, self._create_log_data(
330
- task.id,
331
- current.id,
332
- {
333
- "config_type": config_type,
334
- "version": current.version,
335
- "deleted_field_keys": field_keys,
336
- "new_config_id": new_config.id,
337
- "new_config_version": new_config.version,
338
- },
339
- )
340
-
341
- @with_task_logging("Deleting Manual Task configuration")
342
- def delete_config(
343
- self, task: ManualTask, config_id: str
344
- ) -> tuple[ManualTaskConfig, dict[str, Any]]:
345
- """Delete config for task.
346
-
347
- Args:
348
- task: The task to delete the config for
349
- config_id: The ID of the config to delete
350
-
351
- Returns:
352
- Tuple containing the deleted config and log data, the log data is
353
- captured by the with_task_logging decorator. and the deleted config is
354
- returned to the caller.
355
- """
356
- config = self.db.query(ManualTaskConfig).filter_by(id=config_id).first()
357
- if not config:
358
- raise ValueError(f"Config with ID {config_id} not found")
359
-
360
- log_data = self._create_log_data(
361
- task.id,
362
- None,
363
- {
364
- "config_type": config.config_type,
365
- "version": config.version,
366
- "deleted_config_id": config_id,
367
- },
368
- )
369
- config.delete(self.db)
370
- return config, log_data
@@ -1,294 +0,0 @@
1
- from typing import Any, Optional, cast
2
-
3
- from loguru import logger
4
- from sqlalchemy import select
5
- from sqlalchemy.orm import Session
6
-
7
- from fides.api.models.fides_user import FidesUser
8
- from fides.api.models.manual_tasks.manual_task import ManualTask, ManualTaskReference
9
- from fides.api.models.manual_tasks.manual_task_config import ManualTaskConfig
10
- from fides.api.schemas.manual_tasks.manual_task_schemas import (
11
- ManualTaskParentEntityType,
12
- ManualTaskReferenceType,
13
- ManualTaskType,
14
- )
15
- from fides.service.manual_tasks.manual_task_config_service import (
16
- ManualTaskConfigService,
17
- )
18
- from fides.service.manual_tasks.utils import with_task_logging
19
-
20
-
21
- class ManualTaskService:
22
- def __init__(self, db: Session):
23
- self.db = db
24
- self.config_service = ManualTaskConfigService(db)
25
-
26
- def get_task(
27
- self,
28
- task_id: Optional[str] = None,
29
- parent_entity_id: Optional[str] = None,
30
- parent_entity_type: Optional[ManualTaskParentEntityType] = None,
31
- task_type: Optional[ManualTaskType] = None,
32
- ) -> ManualTask:
33
- """Get the manual task using provided filters.
34
-
35
- This is a flexible lookup method that can find tasks based on various filters.
36
- It's normal for this method to return None if no task matches the given filters.
37
-
38
- Args:
39
- task_id: The task ID
40
- parent_entity_id: The parent entity ID
41
- parent_entity_type: The parent entity type
42
- task_type: The task type
43
-
44
- Returns:
45
- ManualTask: The matching task
46
- """
47
- if not any([task_id, parent_entity_id, parent_entity_type, task_type]):
48
- logger.debug("No filters provided to get_task")
49
- raise ValueError("No filters provided to get_task")
50
-
51
- # Build filter conditions and a human-readable description
52
- filters = []
53
- filter_desc = []
54
- if task_id:
55
- filters.append(ManualTask.id == task_id)
56
- filter_desc.append(f"task_id={task_id}")
57
- if parent_entity_id:
58
- filters.append(ManualTask.parent_entity_id == parent_entity_id)
59
- filter_desc.append(f"parent_entity_id={parent_entity_id}")
60
- if parent_entity_type:
61
- filters.append(ManualTask.parent_entity_type == parent_entity_type)
62
- filter_desc.append(f"parent_entity_type={parent_entity_type}")
63
- if task_type:
64
- filters.append(ManualTask.task_type == task_type)
65
- filter_desc.append(f"task_type={task_type}")
66
-
67
- # Apply all filters at once
68
- stmt = select(ManualTask) # type: ignore[arg-type]
69
- if filters:
70
- stmt = stmt.where(*filters)
71
-
72
- task = self.db.execute(stmt).scalar_one_or_none()
73
- if task is None:
74
- logger.debug(f"No task found with filters: {filter_desc}")
75
- raise ValueError(f"No task found with filters: {filter_desc}")
76
- return task
77
-
78
- @with_task_logging("Provided user IDs verified")
79
- def _non_existent_users(
80
- self, non_existent_user_ids: list[str], *, task_id: str
81
- ) -> None:
82
- """This is a helper function to raise an error if users do not exist.
83
- If non_existent_user_ids is empty, this function will instead create
84
- a success log entry.
85
-
86
- Args:
87
- non_existent_user_ids: List of non-existent user IDs
88
- task_id: The task ID
89
-
90
- Returns:
91
- None
92
- """
93
- if len(non_existent_user_ids) > 0:
94
- raise ValueError(
95
- f"User(s) {sorted(list(non_existent_user_ids))} do not exist"
96
- )
97
-
98
- def _create_log_data(self, task_id: str, details: dict[str, Any]) -> dict[str, Any]:
99
- """Create standard log data structure.
100
-
101
- Args:
102
- task_id: The task ID
103
- details: The log details
104
-
105
- Returns:
106
- dict: The log data structure
107
- """
108
- return {
109
- "task_id": task_id,
110
- "details": details,
111
- }
112
-
113
- def _handle_user_errors(
114
- self,
115
- non_existent_users: list[str],
116
- task_id: str,
117
- details: dict[str, Any],
118
- success_count: int,
119
- error_key: str,
120
- ) -> None:
121
- """Handle errors for non-existent users.
122
-
123
- Args:
124
- non_existent_users: List of non-existent user IDs
125
- task_id: The task ID
126
- details: The log details to update
127
- success_count: Number of successful operations
128
- error_key: Key to use for error details
129
-
130
- Raises:
131
- ValueError: If no successful operations and users don't exist
132
- """
133
- try:
134
- self._non_existent_users(non_existent_users, task_id=task_id)
135
- except ValueError as e:
136
- details[error_key] = sorted(non_existent_users)
137
- if success_count == 0:
138
- raise e
139
-
140
- def _get_existing_users(self, user_ids: list[str]) -> set[str]:
141
- """Get set of existing user IDs from the provided list.
142
-
143
- Args:
144
- user_ids: List of user IDs to check
145
-
146
- Returns:
147
- set: Set of existing user IDs
148
- """
149
- return set(
150
- user.id
151
- for user in self.db.query(FidesUser)
152
- .filter(FidesUser.id.in_(user_ids))
153
- .all()
154
- )
155
-
156
- def _handle_user_operation(
157
- self,
158
- task_id: str,
159
- user_ids: list[str],
160
- operation_type: str,
161
- current_users: Optional[set[str]] = None,
162
- ) -> tuple[set[str], dict[str, Any]]:
163
- """Handle user assignment/unassignment operations.
164
-
165
- Args:
166
- task_id: The task ID
167
- user_ids: List of user IDs to process
168
- operation_type: Type of operation ('assign' or 'unassign')
169
- current_users: Optional set of current users
170
-
171
- Returns:
172
- tuple: (processed_users, log_data)
173
- """
174
- if not (user_ids := list(set(user_ids))):
175
- raise ValueError(f"User ID is required for {operation_type}ment")
176
-
177
- existing_users = set(
178
- u.id
179
- for u in self.db.query(FidesUser).filter(FidesUser.id.in_(user_ids)).all()
180
- )
181
- processed_users = (
182
- existing_users - (current_users or set())
183
- if operation_type == "assign"
184
- else existing_users
185
- )
186
- details = {f"{operation_type}ed_users": sorted(list(processed_users))}
187
-
188
- if non_existing := list(set(user_ids) - existing_users):
189
- try:
190
- self._non_existent_users(non_existing, task_id=task_id)
191
- except ValueError as e:
192
- details[f"user_ids_not_{operation_type}ed"] = sorted(non_existing)
193
- if not processed_users:
194
- raise e
195
-
196
- return processed_users, {"task_id": task_id, "details": details}
197
-
198
- @with_task_logging("Assign users to task")
199
- def assign_users_to_task(
200
- self, task_id: str, user_ids: list[str]
201
- ) -> tuple[ManualTask, dict[str, Any]]:
202
- """Assign users to a task.
203
-
204
- Args:
205
- task_id: The task ID
206
- user_ids: List of user IDs to assign
207
-
208
- Returns:
209
- Tuple containing the task and log data, the log data is
210
- captured by the with_task_logging decorator. and the task is
211
- returned to the caller.
212
- """
213
- task = self.get_task(task_id=task_id)
214
- users_to_assign, log_data = self._handle_user_operation(
215
- task_id, user_ids, "assign", set(task.assigned_users)
216
- )
217
-
218
- if users_to_assign:
219
- self.db.bulk_insert_mappings(
220
- ManualTaskReference,
221
- [
222
- {
223
- "task_id": task.id,
224
- "reference_id": user_id,
225
- "reference_type": ManualTaskReferenceType.assigned_user,
226
- }
227
- for user_id in users_to_assign
228
- ],
229
- )
230
- self.db.flush()
231
- self.db.refresh(task)
232
-
233
- return task, log_data
234
-
235
- @with_task_logging("Unassign users from task")
236
- def unassign_users_from_task(
237
- self, task_id: str, user_ids: list[str]
238
- ) -> tuple[ManualTask, dict[str, Any]]:
239
- task = self.get_task(task_id=task_id)
240
- refs_to_unassign = (
241
- self.db.query(ManualTaskReference)
242
- .filter(
243
- ManualTaskReference.task_id == task.id,
244
- ManualTaskReference.reference_type
245
- == ManualTaskReferenceType.assigned_user,
246
- ManualTaskReference.reference_id.in_(user_ids),
247
- )
248
- .all()
249
- )
250
-
251
- if refs_to_unassign:
252
- self.db.query(ManualTaskReference).filter(
253
- ManualTaskReference.id.in_([ref.id for ref in refs_to_unassign])
254
- ).delete(synchronize_session=False)
255
- self.db.flush()
256
- self.db.refresh(task)
257
-
258
- _, log_data = self._handle_user_operation(task_id, user_ids, "unassign")
259
- return task, log_data
260
-
261
- def create_config(
262
- self, config_type: str, fields: list[dict], task_id: str
263
- ) -> ManualTaskConfig:
264
- """Create a new config for a task.
265
-
266
- Args:
267
- config_type: The config type
268
- fields: The fields for the config
269
- task_id: The task ID
270
-
271
- Returns:
272
- ManualTaskConfig: The new config
273
- """
274
- task = self.get_task(task_id=task_id)
275
- config = self.config_service.create_new_version(task, config_type, fields)
276
- return cast(ManualTaskConfig, config)
277
-
278
- def delete_config(self, config: ManualTaskConfig, task_id: str) -> None:
279
- """Delete this configuration.
280
- Args:
281
- config: The config to delete
282
- task_id: The task ID
283
- Raises:
284
- ValueError: If there are active instances using this configuration
285
- ValueError: If the task does not exist
286
-
287
- Returns:
288
- dict[str, Any]: The log details - intercepted by the `with_task_logging` decorator.
289
- """
290
- task = self.get_task(task_id=task_id)
291
-
292
- # Delete the configuration
293
- config_id = config.id
294
- self.config_service.delete_config(task, config_id)