ethyca-fides 2.64.3b0__py2.py3-none-any.whl → 2.64.5rc1__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 (284) hide show
  1. {ethyca_fides-2.64.3b0.dist-info → ethyca_fides-2.64.5rc1.dist-info}/METADATA +3 -3
  2. {ethyca_fides-2.64.3b0.dist-info → ethyca_fides-2.64.5rc1.dist-info}/RECORD +245 -237
  3. fides/_version.py +3 -3
  4. fides/api/api/v1/api.py +0 -2
  5. fides/api/db/base.py +3 -6
  6. fides/api/db/database.py +2 -27
  7. fides/api/graph/config.py +9 -16
  8. fides/api/models/attachment.py +3 -15
  9. fides/api/models/comment.py +5 -23
  10. fides/api/models/connectionconfig.py +0 -11
  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 +2 -27
  14. fides/api/models/manual_tasks/__init__.py +14 -0
  15. fides/api/models/manual_tasks/manual_task.py +120 -0
  16. fides/api/models/manual_tasks/manual_task_config.py +136 -0
  17. fides/api/models/manual_tasks/manual_task_log.py +104 -0
  18. fides/api/models/tcf_publisher_restrictions.py +4 -16
  19. fides/api/schemas/manual_tasks/__init__.py +0 -0
  20. fides/api/schemas/manual_tasks/manual_task_config.py +311 -0
  21. fides/api/schemas/manual_tasks/manual_task_schemas.py +79 -0
  22. fides/api/schemas/manual_tasks/manual_task_status.py +151 -0
  23. fides/api/service/connectors/query_configs/bigquery_query_config.py +22 -44
  24. fides/api/service/connectors/query_configs/query_config.py +2 -5
  25. fides/api/util/connection_util.py +2 -25
  26. fides/common/api/v1/urn_registry.py +0 -4
  27. fides/service/manual_tasks/__init__.py +0 -0
  28. fides/service/manual_tasks/manual_task_config_service.py +370 -0
  29. fides/service/manual_tasks/manual_task_service.py +294 -0
  30. fides/service/manual_tasks/utils.py +185 -0
  31. fides/ui-build/static/admin/404.html +1 -1
  32. fides/ui-build/static/admin/_next/static/chunks/{1040-3def3c62138371bb.js → 1040-c1c1372a7f909aef.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/1100-3fdbdf211c3c2a5b.js +1 -0
  34. fides/ui-build/static/admin/_next/static/chunks/{1817-a3813209d7a6d28d.js → 1817-96182c1558f80b63.js} +1 -1
  35. fides/ui-build/static/admin/_next/static/chunks/2430-b480401d44c55416.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/{2921-81a48418f77bc9a7.js → 2921-f5608275555bd7d9.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{3450-3a1f0e80ead8d1b0.js → 3450-272f26c102f3510d.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/3505-192986c86dc47869.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/3513-a563133845dc990f.js +1 -0
  40. fides/ui-build/static/admin/_next/static/chunks/3670-2abd9b2f17770872.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/{3855-b85ad4e52433d519.js → 3855-beb58821d1ddba89.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{3872-09f81435f7905d76.js → 3872-82482e55e69b5a93.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{3923-565a852f322fdadc.js → 3923-a54c286a2ba0a47a.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/3983-17ae9c232bddc413.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/{401-c3f586a23a061526.js → 401-d2ce0a5a9120e056.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/4060-3486b45081151b69.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/{409-e0d39af1d9ce8ff2.js → 409-86f4f687105917fb.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/4121-f0aecb2abd384945.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/{4230-d80ae2430aca784a.js → 4230-63abbdfb9e9016b9.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/{431-c74dab231c8ac968.js → 431-77d59d43e90058ca.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/4481-d181a9db72984adf.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/{5309-0e44dbd914896514.js → 5309-10f68cf805817cfb.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/{5574-917c5ff63d222308.js → 5574-b6db9d62362e72d9.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +4 -0
  55. fides/ui-build/static/admin/_next/static/chunks/6277-ccdb50f676a1b336.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/6659-b2088f525bf13c17.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/6662-42940a2b00933e79.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/{6853-8d0a099f61c758d1.js → 6853-8a1b8e1c8b249f2f.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/{6882-13d6f8d95b1e404f.js → 6882-6c94583bffe85ba7.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/69-943b19d39da339d9.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/{6954-882b87698c5ed4fb.js → 6954-dc3540389daf94da.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/7553-e7ae268701f3dcfe.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/{79-3f742fe4efd9893f.js → 79-26ccd45dfd6653a7.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/{796-83a8bbdcdb67f2ba.js → 796-38c0f7e6755ad359.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/8433-1e065c55c8da73b0.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/{9046-6995482a030e323c.js → 9046-bbce3c73af16daf9.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/{905-ffdbd0b14167e8bd.js → 905-742074a074be1055.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/{9226-8a3be36ad1a9c1e7.js → 9226-5e0ce31cfdedd5ee.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/{9392.9a948112de74781b.js → 9392.25024e070026343d.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/{9676.cc515c853b8cf578.js → 9676.e60a53f1f5890847.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/9767-96ed554a043c3c4d.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/{9951-b5b77bfcc8efb493.js → 9951-d3d5d0fe4c4edb86.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/c78d26b1-88a3e1bacb2a03c2.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/pages/{404-488f8f03fe0ffbc7.js → 404-d41660858638adee.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-030b20295bb61f96.js → _app-6b3539f8d82ce9ae.js} +89 -92
  76. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-1e88ac28bc7a41b6.js → manual-7c5e1e845372c99b.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-f2c9451fffaaa529.js → multiple-87e78f52af21c4a9.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-68955d8441e60668.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-b17d160147365cf3.js → add-vendors-6374a3a7747df964.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-8e168d78acdf0cfe.js → configure-0512151e2ed0f4c1.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-5ca2467de7986929.js → [id]-09435f4ab2deafd2.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-06bb3b0bf097fcdb.js → new-a0039f216fb3eb93.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-3c11fecc2797ab68.js → privacy-experience-cd036518b5d4efbe.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-92bc6c7b82a679b4.js → [id]-0e534580abf670be.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-a3da3243526b7ecb.js → new-bb1790eb87b63109.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-b7d82386e7521041.js → privacy-notices-67e9846f877a3f38.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-20a2029b7e7fc895.js → properties-69a92b6ddbc2bae2.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-0ce299131db4c3e5.js → reporting-d07d05f4b898a5ed.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-9f6a7a231bba17b7.js → consent-23e886d692ab6d1a.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-11d52f1570759c4d.js → [resourceUrn]-c623d6f1a61c8ea9.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-fd705968b357e99a.js → [projectUrn]-6c766c766dc97c5c.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-45b585deee0b2371.js → projects-28937a8da3d73145.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-b83afa5565d0c84e.js → [resourceUrn]-57bd5cdf784f059f.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-d8db234a44a2ddf4.js → resources-51d99174c8006eb5.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-2810fa2b519a076b.js → data-catalog-627fbf19dce88e81.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-e861699a8866c64b.js → [systemId]-ed1629b05519a370.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-5dd2fbf33e228f9c.js → [monitorId]-ad307bfc5f51fd9d.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-806cae6bc128cd38.js → action-center-07cbd61ede6e18ac.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-487285bd5eca2595.js → activity-6a2aaed8d0e66d82.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-393e20924c83373e.js → [resourceUrn]-06edce289876dea1.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-8733807dad4bc96e.js → detection-faf326a6200637d0.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-14bd7500362ff224.js → [resourceUrn]-64acf269256ee74f.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-9e7dfd5a6acc2e8f.js → discovery-8c3e4be6d36da66d.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-c9509d72c538d22b.js → datamap-b576a94b583a7940.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-4e8a436297a055b2.js → [...subfieldNames]-4912858ffde4621a.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-6ce02295bb7f5b6d.js → [collectionName]-df21dd7ca0f35718.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-9eaa907437fde063.js → [datasetId]-5ce28a329e8f667f.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5287c76ecf600281.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-b328595abf20ea5d.js → dataset-c6fab547396df6ac.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-81ab412e337d2888.js → [id]-d04c9925d324eee1.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-34dfc172165dbb1c.js → new-656abd09ea5ee39a.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-23fbec0590c8d192.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/{index-de954b741cbca022.js → index-b66687e8194495a2.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-16dd6eff8f5dcc81.js → [id]-906bc5f05702efb0.js} +1 -1
  115. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-024a1facb9be04d0.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-42edcab11e8b5c3c.js → [id]-b74db8488e2e4b58.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-333e54ac8c3ad57a.js → add-template-a607018ff097b6c2.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-8e1e6f3782983225.js → messaging-4a1a04c5179d2053.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-1567c9770a5f05aa.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-920338760f5a71b5.js → AntForm-4949fe7f1815462b.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-7462fb387a9de3f8.js → FormikAntFormItem-6085f73850302d55.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-6148fce7a4e2e9ca.js → FormikControlled-a3158e8217c13850.js} +1 -1
  123. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-30efd8c937bf19e4.js → FormikField-8576f1ef5c67d87d.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-c44de83e0952d1e0.js → forms-341e67462b5e3352.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-6f0e64f0c52bd68f.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-6971c7773dbf9b51.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-303bd2182da03088.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-831572cc7f42615f.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-1d981663e1a84166.js → configure-d24230b890b13762.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-569ff31eff637034.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-b08a69b1c460c7fe.js → [id]-2bedc5013e13ab52.js} +1 -1
  132. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-a5d1c65ec21df69d.js → add-property-9d68bd70299dd945.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-3a75c6ed8308d126.js → properties-c3116b6bfe2e695e.js} +1 -1
  134. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-dda59a7105ee609b.js → datamap-6dfa7091b99d8321.js} +1 -1
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-6773158ba6ccf4b0.js → alpha-9751059905bba190.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-2e046d177d52465c.js → about-ad29d77012ec9dba.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-91f2ec72f9654cbd.js → [purpose_id]-32e3190c1ad00b40.js} +1 -1
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-13a17a4ace7293d1.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-94d97e3eb964c494.js → custom-fields-d2c0aac32f5d2930.js} +1 -1
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-2c7ecff0a8a74c42.js → domain-records-a10674380f94d014.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-78449b0e02bced88.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-7d299c4cb3199036.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-8d4383584c72eb5a.js → locations-cc7d629433fa6d44.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-a9fa55c40fa570a6.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-29892065d99ff113.js → regulations-64a813cb2741683b.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-547b0cfe1e49e6d2.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-8fa8a2f238e08791.js → [id]-fb3d094e4f4585f6.js} +1 -1
  148. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-acdbdd3dfd21162f.js → systems-c2df5b7b0596a9cb.js} +1 -1
  149. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-261deb6fb3e51cb3.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-a2524414e968f862.js → new-b124cc24b930c9e1.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-87ed17fa1d9f8f72.js → [id]-fd2ff6b13052c54e.js} +1 -1
  152. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-6b4e0764bb8816b8.js → user-management-fa052b0439920ef6.js} +1 -1
  153. fides/ui-build/static/admin/_next/static/chunks/{webpack-da78c536f3d86d06.js → webpack-e61d457474e00565.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/css/{1994066ec907b7df.css → c693338e3bc8dcc6.css} +1 -1
  155. fides/ui-build/static/admin/_next/static/wyqNbL8A-USLbXV5z1vV0/_buildManifest.js +1 -0
  156. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  157. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  158. fides/ui-build/static/admin/add-systems.html +1 -1
  159. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  160. fides/ui-build/static/admin/consent/configure.html +1 -1
  161. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  162. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  163. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  164. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  165. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  166. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  167. fides/ui-build/static/admin/consent/properties.html +1 -1
  168. fides/ui-build/static/admin/consent/reporting.html +1 -1
  169. fides/ui-build/static/admin/consent.html +1 -1
  170. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  171. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  172. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  173. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  174. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  175. fides/ui-build/static/admin/data-catalog.html +1 -1
  176. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  177. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  178. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  179. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  180. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  181. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  182. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  183. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  184. fides/ui-build/static/admin/datamap.html +1 -1
  185. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  186. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  187. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  188. fides/ui-build/static/admin/dataset/new.html +1 -1
  189. fides/ui-build/static/admin/dataset.html +1 -1
  190. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  191. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  192. fides/ui-build/static/admin/datastore-connection.html +1 -1
  193. fides/ui-build/static/admin/index.html +1 -1
  194. fides/ui-build/static/admin/integrations/[id].html +1 -1
  195. fides/ui-build/static/admin/integrations.html +1 -1
  196. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  197. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  198. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  199. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  200. fides/ui-build/static/admin/lib/fides.js +2 -2
  201. fides/ui-build/static/admin/login/[provider].html +1 -1
  202. fides/ui-build/static/admin/login.html +1 -1
  203. fides/ui-build/static/admin/messaging/[id].html +1 -1
  204. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  205. fides/ui-build/static/admin/messaging.html +1 -1
  206. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  207. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  208. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  209. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  210. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  211. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  212. fides/ui-build/static/admin/poc/forms.html +1 -1
  213. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  214. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  215. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  216. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  217. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  218. fides/ui-build/static/admin/privacy-requests.html +1 -1
  219. fides/ui-build/static/admin/properties/[id].html +1 -1
  220. fides/ui-build/static/admin/properties/add-property.html +1 -1
  221. fides/ui-build/static/admin/properties.html +1 -1
  222. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  223. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  224. fides/ui-build/static/admin/settings/about.html +1 -1
  225. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  226. fides/ui-build/static/admin/settings/consent.html +1 -1
  227. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  228. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  229. fides/ui-build/static/admin/settings/domains.html +1 -1
  230. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  231. fides/ui-build/static/admin/settings/locations.html +1 -1
  232. fides/ui-build/static/admin/settings/organization.html +1 -1
  233. fides/ui-build/static/admin/settings/regulations.html +1 -1
  234. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  235. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  236. fides/ui-build/static/admin/systems.html +1 -1
  237. fides/ui-build/static/admin/taxonomy.html +1 -1
  238. fides/ui-build/static/admin/user-management/new.html +1 -1
  239. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  240. fides/ui-build/static/admin/user-management.html +1 -1
  241. fides/api/alembic/migrations/versions/41a634d8c669_manual_task_restrict_deletes.py +0 -257
  242. fides/api/alembic/migrations/versions/6a76a1fa4f3f_add_manual_task_instance_table.py +0 -256
  243. fides/api/alembic/migrations/versions/aadfe83c5644_add_manual_task_to_connectiontype_enum.py +0 -46
  244. fides/api/api/v1/endpoints/partitioning_endpoints.py +0 -108
  245. fides/api/models/manual_task.py +0 -965
  246. fides/api/schemas/partitioning/__init__.py +0 -17
  247. fides/api/schemas/partitioning/bigquery_time_based_partitioning.py +0 -31
  248. fides/api/schemas/partitioning/time_based_partitioning.py +0 -1376
  249. fides/ui-build/static/admin/_next/static/chunks/1169-76bbada4f3d16538.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/1807-3beab149351d5ded.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4121-de4ca969faf2b9f4.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/6084-40d5d94561a6093e.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/6662-6a915300505fd9c0.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/7476-aaf8970dbbbe4864.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/7630-c558dc3a199a633d.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/787-9c751615f5816094.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/827-c6fe34fb336467ae.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/9767-1dca308466dce863.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/9826-303b14ef4fc7ab4a.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-a8e0bc7b6674f47e.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-55243db34cf77b7e.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cdb77886d7fd4f44.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-40a3cd14264796e2.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-3f62dd959a039fe9.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-7852aa60090c8c9a.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-11dd6152bf6607cc.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-c50c2ee7d7d2a585.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-282de19599d67aaf.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-3f962ade5df86380.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-0a87f29768425a37.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-b9e77c75c6b77c88.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-bb60c397a03558d8.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-4b835393f5274379.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-9669fa6b20545530.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-c9510a1eb612323d.js +0 -1
  279. fides/ui-build/static/admin/_next/static/ezJVaZ_Oi_0J2-wPEOvj1/_buildManifest.js +0 -1
  280. {ethyca_fides-2.64.3b0.dist-info → ethyca_fides-2.64.5rc1.dist-info}/WHEEL +0 -0
  281. {ethyca_fides-2.64.3b0.dist-info → ethyca_fides-2.64.5rc1.dist-info}/entry_points.txt +0 -0
  282. {ethyca_fides-2.64.3b0.dist-info → ethyca_fides-2.64.5rc1.dist-info}/licenses/LICENSE +0 -0
  283. {ethyca_fides-2.64.3b0.dist-info → ethyca_fides-2.64.5rc1.dist-info}/top_level.txt +0 -0
  284. /fides/ui-build/static/admin/_next/static/{ezJVaZ_Oi_0J2-wPEOvj1 → wyqNbL8A-USLbXV5z1vV0}/_ssgManifest.js +0 -0
@@ -0,0 +1,136 @@
1
+ from typing import TYPE_CHECKING, Any, Optional
2
+
3
+ from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
4
+ from sqlalchemy.dialects.postgresql import JSONB
5
+ from sqlalchemy.ext.declarative import declared_attr
6
+ from sqlalchemy.orm import Session, relationship
7
+
8
+ from fides.api.db.base_class import Base
9
+ from fides.api.db.util import EnumColumn
10
+ from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
11
+ from fides.api.schemas.manual_tasks.manual_task_config import (
12
+ ManualTaskConfigurationType,
13
+ ManualTaskFieldMetadata,
14
+ ManualTaskFieldType,
15
+ )
16
+ from fides.api.schemas.manual_tasks.manual_task_schemas import ManualTaskLogStatus
17
+
18
+ if TYPE_CHECKING: # pragma: no cover
19
+ from fides.api.models.manual_tasks.manual_task import ManualTask # pragma: no cover
20
+
21
+
22
+ class ManualTaskConfig(Base):
23
+ """Model for storing manual task configurations.
24
+ A single configuration may have many fields of different types.
25
+ """
26
+
27
+ @declared_attr
28
+ def __tablename__(cls) -> str:
29
+ return "manual_task_config"
30
+
31
+ task_id = Column(String, ForeignKey("manual_task.id"), nullable=False)
32
+ config_type = Column(EnumColumn(ManualTaskConfigurationType), nullable=False)
33
+ version = Column(Integer, nullable=False, default=1)
34
+ is_current = Column(Boolean, nullable=False, default=True)
35
+
36
+ # Relationships
37
+ task = relationship("ManualTask", back_populates="configs")
38
+ field_definitions = relationship(
39
+ "ManualTaskConfigField",
40
+ back_populates="config",
41
+ cascade="all, delete-orphan",
42
+ uselist=True,
43
+ )
44
+ logs = relationship(
45
+ "ManualTaskLog",
46
+ back_populates="config",
47
+ primaryjoin="ManualTaskConfig.id == ManualTaskLog.config_id",
48
+ viewonly=True,
49
+ )
50
+
51
+ @classmethod
52
+ def create(
53
+ cls, db: Session, *, data: dict[str, Any], check_name: bool = True
54
+ ) -> "ManualTaskConfig":
55
+ """Create a new manual task configuration."""
56
+ # Validate config_type
57
+ try:
58
+ ManualTaskConfigurationType(data["config_type"])
59
+ except ValueError:
60
+ raise ValueError(f"Invalid config type: {data['config_type']}")
61
+
62
+ config = super().create(db=db, data=data, check_name=check_name)
63
+
64
+ # Log the config creation as a task-level log
65
+ ManualTaskLog.create_log(
66
+ db=db,
67
+ task_id=data["task_id"],
68
+ config_id=config.id,
69
+ status=ManualTaskLogStatus.created,
70
+ message=f"Created manual task configuration for {data['config_type']}",
71
+ details={
72
+ "config_type": data["config_type"],
73
+ },
74
+ )
75
+ return config
76
+
77
+ def get_field(self, field_key: str) -> Optional["ManualTaskConfigField"]:
78
+ """Get a field by its key."""
79
+ for field in self.field_definitions:
80
+ if field.field_key == field_key:
81
+ return field
82
+ return None
83
+
84
+
85
+ class ManualTaskConfigField(Base):
86
+ """Model for storing fields associated with each config."""
87
+
88
+ @declared_attr
89
+ def __tablename__(cls) -> str:
90
+ return "manual_task_config_field"
91
+
92
+ task_id = Column(String, ForeignKey("manual_task.id"), nullable=False)
93
+ config_id = Column(String, ForeignKey("manual_task_config.id"), nullable=False)
94
+ field_key = Column(String, nullable=False)
95
+ field_type = Column(
96
+ EnumColumn(ManualTaskFieldType), nullable=False
97
+ ) # Using ManualTaskFieldType
98
+ field_metadata = Column(JSONB, nullable=False, default={})
99
+
100
+ # Relationships
101
+ config = relationship("ManualTaskConfig", back_populates="field_definitions")
102
+
103
+ @property
104
+ def field_metadata_model(self) -> ManualTaskFieldMetadata:
105
+ """Get the field metadata as a Pydantic model."""
106
+ return ManualTaskFieldMetadata.model_validate(self.field_metadata)
107
+
108
+ @classmethod
109
+ def create(
110
+ cls, db: Session, *, data: dict[str, Any], check_name: bool = True
111
+ ) -> "ManualTaskConfigField":
112
+ """Create a new manual task config field."""
113
+ # Get the config to access its task_id and check if it exists
114
+ try:
115
+ config = (
116
+ db.query(ManualTaskConfig)
117
+ .filter(ManualTaskConfig.id == data["config_id"])
118
+ .first()
119
+ )
120
+ if not config:
121
+ raise ValueError(f"Config with id {data['config_id']} not found")
122
+ except Exception as e:
123
+ raise ValueError(f"Config with id {data['config_id']} not found: {e}")
124
+
125
+ # Create the field and let SQLAlchemy complex type validation handled in service.
126
+ field = super().create(db=db, data=data, check_name=check_name)
127
+
128
+ # Create a log entry
129
+ ManualTaskLog.create_log(
130
+ db=db,
131
+ task_id=config.task_id,
132
+ config_id=data["config_id"],
133
+ status=ManualTaskLogStatus.created,
134
+ message=f"Created manual task config field for {data['field_key']}",
135
+ )
136
+ return field
@@ -0,0 +1,104 @@
1
+ from typing import TYPE_CHECKING, Any, Optional
2
+
3
+ from sqlalchemy import Column, ForeignKey, String
4
+ from sqlalchemy.dialects.postgresql import JSONB
5
+ from sqlalchemy.ext.declarative import declared_attr
6
+ from sqlalchemy.orm import Session, relationship
7
+
8
+ from fides.api.db.base_class import Base
9
+ from fides.api.schemas.manual_tasks.manual_task_schemas import ManualTaskLogStatus
10
+
11
+ if TYPE_CHECKING: # pragma: no cover
12
+ from fides.api.models.manual_tasks.manual_task import ManualTask # pragma: no cover
13
+ from fides.api.models.manual_tasks.manual_task_config import (
14
+ ManualTaskConfig, # pragma: no cover
15
+ )
16
+
17
+
18
+ class ManualTaskLog(Base):
19
+ """Model for storing manual task execution logs."""
20
+
21
+ @declared_attr
22
+ def __tablename__(cls) -> str:
23
+ """Overriding base class method to set the table name."""
24
+ return "manual_task_log"
25
+
26
+ task_id = Column(
27
+ String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
28
+ )
29
+ config_id = Column(String, ForeignKey("manual_task_config.id"), nullable=True)
30
+ instance_id = Column(String, nullable=True)
31
+ status = Column(String, nullable=False)
32
+ message = Column(String, nullable=False)
33
+ details = Column(JSONB, nullable=True)
34
+
35
+ # Relationships - using string references to avoid circular imports
36
+ task = relationship("ManualTask", back_populates="logs", foreign_keys=[task_id])
37
+ config = relationship(
38
+ "ManualTaskConfig", back_populates="logs", foreign_keys=[config_id]
39
+ )
40
+ # TODO: Add instance relationship when it is implemented
41
+ # instance = relationship("ManualTaskInstance", back_populates="logs")
42
+
43
+ @classmethod
44
+ def create_log(
45
+ cls,
46
+ db: Session,
47
+ task_id: str,
48
+ status: ManualTaskLogStatus,
49
+ message: str,
50
+ config_id: Optional[str] = None,
51
+ instance_id: Optional[str] = None,
52
+ details: Optional[dict[str, Any]] = None,
53
+ ) -> "ManualTaskLog":
54
+ """Create a new task log entry.
55
+
56
+ Args:
57
+ db: Database session
58
+ task_id: ID of the task
59
+ status: Status of the log entry
60
+ message: Optional message describing the event
61
+ details: Optional additional details about the event
62
+ """
63
+ data = {
64
+ "task_id": task_id,
65
+ "config_id": config_id,
66
+ "instance_id": instance_id,
67
+ "status": status,
68
+ "message": message,
69
+ "details": details,
70
+ }
71
+ return cls.create(db=db, data=data)
72
+
73
+ @classmethod
74
+ def create_error_log(
75
+ cls,
76
+ db: Session,
77
+ task_id: str,
78
+ message: str,
79
+ config_id: Optional[str] = None,
80
+ instance_id: Optional[str] = None,
81
+ details: Optional[dict[str, Any]] = None,
82
+ ) -> "ManualTaskLog":
83
+ """Create a new error log entry.
84
+
85
+ Args:
86
+ db: Database session
87
+ task_id: ID of the task
88
+ message: Error message describing what went wrong
89
+ config_id: Optional ID of the configuration
90
+ instance_id: Optional ID of the instance
91
+ details: Optional additional details about the error
92
+
93
+ Returns:
94
+ The created error log entry
95
+ """
96
+ return cls.create_log(
97
+ db=db,
98
+ status=ManualTaskLogStatus.error,
99
+ task_id=task_id,
100
+ config_id=config_id,
101
+ instance_id=instance_id,
102
+ message=message,
103
+ details=details,
104
+ )
@@ -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, FidesBase
13
+ from fides.api.db.base_class import Base
14
14
 
15
15
  if TYPE_CHECKING:
16
16
  from fides.api.models.privacy_experience import PrivacyExperienceConfig
@@ -83,13 +83,7 @@ class TCFConfiguration(Base):
83
83
  def __tablename__(self) -> str:
84
84
  return "tcf_configuration"
85
85
 
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)
86
+ name = Column(String, nullable=False, index=True, unique=True)
93
87
 
94
88
  privacy_experience_configs = relationship(
95
89
  "PrivacyExperienceConfig",
@@ -109,17 +103,11 @@ class TCFPublisherRestriction(Base):
109
103
  def __tablename__(self) -> str:
110
104
  return "tcf_publisher_restriction"
111
105
 
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
-
119
106
  tcf_configuration_id = Column(
120
107
  String(255),
121
108
  ForeignKey("tcf_configuration.id", ondelete="CASCADE"),
122
109
  nullable=False,
110
+ index=True,
123
111
  )
124
112
  purpose_id = Column(Integer, nullable=False)
125
113
  restriction_type = Column(EnumColumn(TCFRestrictionType), nullable=False)
@@ -133,7 +121,7 @@ class TCFPublisherRestriction(Base):
133
121
  # can be inferred from the presence of the end_vendor_id.
134
122
  range_entries = Column(
135
123
  ARRAY(JSONB),
136
- nullable=False,
124
+ nullable=True,
137
125
  server_default="{}",
138
126
  default=list,
139
127
  )
File without changes
@@ -0,0 +1,311 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from typing import TYPE_CHECKING, Annotated, Literal, Optional, Union
4
+
5
+ from pydantic import ConfigDict, Field, ValidationInfo, field_validator, model_validator
6
+
7
+ from fides.api.schemas.base_class import FidesSchema
8
+
9
+ if TYPE_CHECKING: # pragma: no cover
10
+ from fides.api.models.manual_tasks.manual_task import ManualTask # pragma: no cover
11
+
12
+
13
+ class ManualTaskConfigurationType(str, Enum):
14
+ """Enum for manual task configuration types."""
15
+
16
+ access_privacy_request = "access_privacy_request"
17
+ erasure_privacy_request = "erasure_privacy_request"
18
+ # Add more configuration types as needed
19
+
20
+
21
+ class ManualTaskFieldType(str, Enum):
22
+ """Enum for manual task field types."""
23
+
24
+ text = "text" # Key-value pairs
25
+ checkbox = "checkbox" # Boolean value
26
+ attachment = "attachment" # File upload
27
+ # Add more field types as needed
28
+
29
+
30
+ class ManualTaskFieldMetadata(FidesSchema):
31
+ """Base schema for manual task field metadata."""
32
+
33
+ model_config = ConfigDict(extra="allow")
34
+
35
+ label: Annotated[str, Field(description="Display label for the field")]
36
+ required: Annotated[
37
+ bool, Field(default=False, description="Whether the field is required")
38
+ ]
39
+ help_text: Annotated[
40
+ Optional[str],
41
+ Field(default=None, description="Help text to display with the field"),
42
+ ]
43
+ data_uses: Annotated[
44
+ Optional[list[str]],
45
+ Field(
46
+ default=None,
47
+ description="List of data uses associated with this field",
48
+ ),
49
+ ]
50
+
51
+
52
+ class ManualTaskTextFieldMetadata(ManualTaskFieldMetadata):
53
+ """Schema text field metadata."""
54
+
55
+ placeholder: Annotated[
56
+ Optional[str], Field(default=None, description="Placeholder text for the field")
57
+ ]
58
+ default_value: Annotated[
59
+ Optional[str], Field(default=None, description="Default value for the field")
60
+ ]
61
+ max_length: Annotated[
62
+ Optional[int], Field(default=None, description="Maximum length for text fields")
63
+ ]
64
+ min_length: Annotated[
65
+ Optional[int], Field(default=None, description="Minimum length for text fields")
66
+ ]
67
+ pattern: Annotated[
68
+ Optional[str],
69
+ Field(
70
+ default=None,
71
+ description=(
72
+ "Regex pattern for validation, for example if the field is an email address, "
73
+ r"you could use: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
74
+ ),
75
+ ),
76
+ ]
77
+
78
+ @field_validator("min_length", "max_length")
79
+ @classmethod
80
+ def validate_lengths(cls, v: Optional[int], info: ValidationInfo) -> Optional[int]:
81
+ """Validate that min_length is not greater than max_length."""
82
+ if v is None:
83
+ return v
84
+
85
+ if info.field_name == "min_length":
86
+ max_length = info.data.get("max_length")
87
+ if max_length is not None and v > max_length:
88
+ raise ValueError("min_length cannot be greater than max_length")
89
+ elif info.field_name == "max_length":
90
+ min_length = info.data.get("min_length")
91
+ if min_length is not None and v < min_length:
92
+ raise ValueError("min_length cannot be greater than max_length")
93
+
94
+ return v
95
+
96
+
97
+ class ManualTaskCheckboxFieldMetadata(ManualTaskFieldMetadata):
98
+ """Schema for checkbox field metadata."""
99
+
100
+ default_value: Annotated[
101
+ Optional[bool],
102
+ Field(default=False, description="Default value for the checkbox"),
103
+ ]
104
+ label_true: Annotated[
105
+ Optional[str], Field(default=None, description="Label for checked state")
106
+ ]
107
+ label_false: Annotated[
108
+ Optional[str], Field(default=None, description="Label for unchecked state")
109
+ ]
110
+
111
+
112
+ class ManualTaskAttachmentFieldMetadata(ManualTaskFieldMetadata):
113
+ """Schema for attachment field metadata."""
114
+
115
+ file_types: Annotated[
116
+ list[str], Field(description="Allowed file types for upload fields")
117
+ ]
118
+ max_file_size: Annotated[
119
+ int, Field(description="Maximum file size in bytes for upload fields")
120
+ ]
121
+ multiple: Annotated[
122
+ bool, Field(default=False, description="Whether multiple files can be uploaded")
123
+ ]
124
+ max_files: Annotated[
125
+ Optional[int],
126
+ Field(
127
+ default=None,
128
+ description="Maximum number of files allowed when multiple is true",
129
+ ),
130
+ ]
131
+ require_attachment_id: Annotated[
132
+ bool,
133
+ Field(
134
+ default=True,
135
+ description="Whether an attachment ID is required for this field",
136
+ ),
137
+ ]
138
+ attachment_ids: Annotated[
139
+ Optional[list[str]],
140
+ Field(
141
+ default=None,
142
+ description="List of attachment IDs associated with this field",
143
+ ),
144
+ ]
145
+
146
+ @model_validator(mode="after")
147
+ def validate_multiple_max_files(self) -> "ManualTaskAttachmentFieldMetadata":
148
+ """Validate that max_files is set when multiple is True."""
149
+ if self.multiple and self.max_files is None:
150
+ raise ValueError("max_files must be set when multiple is True")
151
+ return self
152
+
153
+
154
+ class ManualTaskFieldBase(FidesSchema):
155
+ """Base schema for all field definitions."""
156
+
157
+ model_config = ConfigDict(extra="allow")
158
+
159
+ field_key: Annotated[
160
+ str, Field(description="Unique key for the field", min_length=1)
161
+ ]
162
+ field_type: Annotated[ManualTaskFieldType, Field(description="Type of the field")]
163
+ field_metadata: Annotated[
164
+ ManualTaskFieldMetadata, Field(description="Field metadata and configuration")
165
+ ]
166
+
167
+ @classmethod
168
+ def get_field_model_for_type(
169
+ cls, field_type: Union[str, ManualTaskFieldType]
170
+ ) -> type["ManualTaskFieldBase"]:
171
+ """Get the appropriate field model class for a given field type.
172
+
173
+ Args:
174
+ field_type: The field type as a string or ManualTaskFieldType enum value
175
+
176
+ Returns:
177
+ The appropriate field model class
178
+
179
+ Raises:
180
+ ValueError: If the field type is not recognized
181
+ """
182
+ # Handle non-string/non-enum types
183
+ if not isinstance(field_type, (str, ManualTaskFieldType)):
184
+ raise ValueError(
185
+ f"Invalid field type: expected string or ManualTaskFieldType, got {type(field_type).__name__}"
186
+ )
187
+
188
+ # Convert string to enum if needed
189
+ if isinstance(field_type, str):
190
+ try:
191
+ field_type = ManualTaskFieldType(field_type)
192
+ except ValueError:
193
+ raise ValueError(
194
+ f"Invalid field type: '{field_type}' is not a valid ManualTaskFieldType"
195
+ )
196
+
197
+ # Map field types to their model classes
198
+ field_type_to_model = {
199
+ ManualTaskFieldType.text: ManualTaskTextField,
200
+ ManualTaskFieldType.checkbox: ManualTaskCheckboxField,
201
+ ManualTaskFieldType.attachment: ManualTaskAttachmentField,
202
+ }
203
+
204
+ model_class = field_type_to_model.get(field_type)
205
+ if not model_class:
206
+ raise ValueError(f"No model class found for field type: {field_type}")
207
+
208
+ return model_class
209
+
210
+
211
+ class ManualTaskTextField(ManualTaskFieldBase):
212
+ """Schema for text field definition."""
213
+
214
+ field_type: Annotated[
215
+ Literal[ManualTaskFieldType.text], Field(description="Type of the field")
216
+ ]
217
+ field_metadata: Annotated[
218
+ ManualTaskTextFieldMetadata,
219
+ Field(description="Field metadata and configuration"),
220
+ ]
221
+
222
+
223
+ class ManualTaskCheckboxField(ManualTaskFieldBase):
224
+ """Schema for checkbox field definition."""
225
+
226
+ field_type: Annotated[
227
+ Literal[ManualTaskFieldType.checkbox], Field(description="Type of the field")
228
+ ]
229
+ field_metadata: Annotated[
230
+ ManualTaskCheckboxFieldMetadata,
231
+ Field(description="Field metadata and configuration"),
232
+ ]
233
+
234
+
235
+ class ManualTaskAttachmentField(ManualTaskFieldBase):
236
+ """Schema for attachment field definition."""
237
+
238
+ field_type: Annotated[
239
+ Literal[ManualTaskFieldType.attachment], Field(description="Type of the field")
240
+ ]
241
+ field_metadata: Annotated[
242
+ ManualTaskAttachmentFieldMetadata,
243
+ Field(description="Field metadata and configuration"),
244
+ ]
245
+
246
+
247
+ # Type alias for all field types
248
+ ManualTaskField = ManualTaskFieldBase
249
+
250
+
251
+ class ManualTaskConfigCreate(FidesSchema):
252
+ """Schema for creating a manual task configuration."""
253
+
254
+ model_config = ConfigDict(extra="forbid")
255
+
256
+ task_id: Annotated[
257
+ str, Field(description="ID of the task this configuration belongs to")
258
+ ]
259
+ config_type: Annotated[
260
+ ManualTaskConfigurationType, Field(description="Type of configuration")
261
+ ]
262
+ fields: Annotated[
263
+ list[ManualTaskFieldBase], Field(description="List of field definitions")
264
+ ]
265
+
266
+
267
+ class ManualTaskConfigResponse(FidesSchema):
268
+ """Schema for manual task configuration response."""
269
+
270
+ model_config = ConfigDict(extra="forbid")
271
+
272
+ id: Annotated[str, Field(description="Configuration ID")]
273
+ task_id: Annotated[str, Field(description="Task ID")]
274
+ config_type: Annotated[
275
+ ManualTaskConfigurationType, Field(description="Type of configuration")
276
+ ]
277
+ version: Annotated[int, Field(description="Version of the configuration")]
278
+ is_current: Annotated[
279
+ bool, Field(description="Whether this is the current version")
280
+ ]
281
+ fields: Annotated[
282
+ list[ManualTaskFieldBase], Field(description="List of field definitions")
283
+ ]
284
+ created_at: Annotated[datetime, Field(description="Creation timestamp")]
285
+ updated_at: Annotated[datetime, Field(description="Last update timestamp")]
286
+
287
+
288
+ class ManualTaskConfigUpdate(FidesSchema):
289
+ """Schema for updating a manual task configuration."""
290
+
291
+ model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True)
292
+
293
+ task_id: Annotated[str, Field(description="ID of the task")]
294
+ config_type: Annotated[
295
+ ManualTaskConfigurationType, Field(description="Type of configuration")
296
+ ]
297
+ fields: Annotated[
298
+ list[ManualTaskFieldBase], Field(description="List of field definitions")
299
+ ]
300
+
301
+
302
+ class ManualTaskConfigFieldResponse(FidesSchema):
303
+ """Schema for manual task configuration field response."""
304
+
305
+ model_config = ConfigDict(extra="forbid")
306
+
307
+ field_key: Annotated[str, Field(description="Unique key for the field")]
308
+ field_type: Annotated[ManualTaskFieldType, Field(description="Type of the field")]
309
+ field_metadata: Annotated[
310
+ ManualTaskFieldMetadata, Field(description="Field metadata and configuration")
311
+ ]
@@ -0,0 +1,79 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from typing import Annotated, Any, Optional
4
+
5
+ from pydantic import ConfigDict, Field
6
+
7
+ from fides.api.schemas.base_class import FidesSchema
8
+
9
+
10
+ class ManualTaskType(str, Enum):
11
+ """Enum for manual task types."""
12
+
13
+ privacy_request = "privacy_request"
14
+ # Add more task types as needed
15
+
16
+
17
+ class ManualTaskParentEntityType(str, Enum):
18
+ """Enum for manual task parent entity types."""
19
+
20
+ connection_config = (
21
+ "connection_config" # used for access and erasure privacy requests
22
+ )
23
+ # Add more parent entity types as needed
24
+
25
+
26
+ class ManualTaskReferenceType(str, Enum):
27
+ """Enum for manual task reference types."""
28
+
29
+ privacy_request = "privacy_request"
30
+ connection_config = "connection_config"
31
+ manual_task_config = "manual_task_config"
32
+ assigned_user = "assigned_user" # Reference to the user assigned to the task
33
+ # Add more reference types as needed
34
+
35
+
36
+ class ManualTaskLogStatus(str, Enum):
37
+ """Enum for manual task log status."""
38
+
39
+ created = "created"
40
+ updated = "updated"
41
+ in_progress = "in_progress"
42
+ complete = "complete"
43
+ error = "error"
44
+ retrying = "retrying"
45
+ paused = "paused"
46
+ awaiting_input = "awaiting_input"
47
+
48
+
49
+ class ManualTaskLogCreate(FidesSchema):
50
+ """Schema for creating a manual task log entry."""
51
+
52
+ model_config = ConfigDict(extra="forbid")
53
+
54
+ task_id: Annotated[str, Field(..., description="ID of the task")]
55
+ status: Annotated[ManualTaskLogStatus, Field(..., description="Log status")]
56
+ message: Annotated[Optional[str], Field(None, description="Log message")]
57
+ details: Annotated[
58
+ Optional[dict[str, Any]], Field(None, description="Additional details")
59
+ ]
60
+ config_id: Annotated[Optional[str], Field(None, description="Configuration ID")]
61
+ instance_id: Annotated[Optional[str], Field(None, description="Instance ID")]
62
+
63
+
64
+ class ManualTaskLogResponse(FidesSchema):
65
+ """Schema for manual task log response."""
66
+
67
+ model_config = ConfigDict(extra="forbid")
68
+
69
+ id: Annotated[str, Field(..., description="Log ID")]
70
+ task_id: Annotated[str, Field(..., description="Task ID")]
71
+ status: Annotated[ManualTaskLogStatus, Field(..., description="Log status")]
72
+ message: Annotated[Optional[str], Field(None, description="Log message")]
73
+ details: Annotated[
74
+ Optional[dict[str, Any]], Field(None, description="Additional details")
75
+ ]
76
+ config_id: Annotated[Optional[str], Field(None, description="Configuration ID")]
77
+ instance_id: Annotated[Optional[str], Field(None, description="Instance ID")]
78
+ created_at: Annotated[datetime, Field(..., description="Creation timestamp")]
79
+ updated_at: Annotated[datetime, Field(..., description="Last update timestamp")]