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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/METADATA +2 -2
  2. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/RECORD +249 -242
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/ba414a58ba90_create_manual_task_config_tables.py +121 -0
  5. fides/api/api/v1/endpoints/connection_endpoints.py +16 -3
  6. fides/api/api/v1/endpoints/oauth_endpoints.py +8 -2
  7. fides/api/db/base.py +4 -0
  8. fides/api/models/attachment.py +37 -23
  9. fides/api/models/manual_tasks/__init__.py +6 -0
  10. fides/api/models/manual_tasks/manual_task.py +11 -1
  11. fides/api/models/manual_tasks/manual_task_config.py +136 -0
  12. fides/api/models/manual_tasks/manual_task_log.py +13 -9
  13. fides/api/schemas/connection_configuration/connection_config.py +19 -4
  14. fides/api/schemas/manual_tasks/manual_task_config.py +311 -0
  15. fides/api/schemas/manual_tasks/manual_task_schemas.py +1 -1
  16. fides/api/schemas/manual_tasks/manual_task_status.py +1 -1
  17. fides/api/schemas/privacy_request.py +2 -0
  18. fides/api/service/connectors/query_configs/saas_query_config.py +15 -0
  19. fides/api/service/privacy_request/attachment_handling.py +132 -0
  20. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +264 -46
  21. fides/api/service/privacy_request/dsr_package/templates/attachments_index.html +33 -0
  22. fides/api/service/privacy_request/dsr_package/templates/collection_index.html +34 -9
  23. fides/api/service/privacy_request/dsr_package/templates/main.css +45 -2
  24. fides/api/service/privacy_request/dsr_package/templates/welcome.html +12 -8
  25. fides/api/service/privacy_request/request_runner_service.py +258 -139
  26. fides/api/service/storage/gcs.py +15 -3
  27. fides/api/service/storage/s3.py +28 -14
  28. fides/api/service/storage/util.py +45 -7
  29. fides/api/tasks/csv_utils.py +170 -0
  30. fides/api/tasks/encryption_utils.py +42 -0
  31. fides/api/tasks/storage.py +85 -91
  32. fides/api/util/cache.py +6 -3
  33. fides/api/util/saas_util.py +1 -0
  34. fides/config/redis_settings.py +105 -44
  35. fides/service/manual_tasks/manual_task_config_service.py +370 -0
  36. fides/service/manual_tasks/manual_task_service.py +231 -87
  37. fides/service/manual_tasks/utils.py +185 -0
  38. fides/ui-build/static/admin/404.html +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/1040-630c7f4284dc6f70.js +1 -0
  40. fides/ui-build/static/admin/_next/static/chunks/1100-d43cb04522a6505c.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/1316-6cc72a45ebf7ff81.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/1817-b4688ba5042ec687.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/2430-b480401d44c55416.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/2599-6c4d22e75028d8b6.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/2921-aabf41bf3d7573f9.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/3450-bdaeb35442d810b4.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/3505-a79256cd851dfab4.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/3513-8677ee280eaef0da.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/3855-0dec3e7d9e886550.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/3872-ffa16c2df7ef0ab6.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/3923-5d580fbb1dd6ae01.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/401-fceaae662cfca5a5.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/4060-71cd041e5a57ca5a.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/409-037cfc3f096150f0.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/4121-78a76e980acbd539.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/4230-1cdb7ea1be370ed3.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/431-f72599f01b98f07d.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/4481-f597a7cf03f8c9e1.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/5309-4511df9708d5a63c.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/5574-3cd33b3a6c937899.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/6277-3fb4c7fc790a6d20.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/6662-cb11881dcaabe5e2.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/6853-a4097260e402980e.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/6882-3cc73d407a088d7d.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/69-6889d6674c95e7b5.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/6954-13a25cef3a8fdd76.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/7553-a95939c32d54b5b7.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/79-5670e31eb65d0a53.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/796-9a6b13c838e25538.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/8433-adb1fcb29d82f1b7.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/9046-fdf53cc7e926a8c1.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/{905-8ab919e7b274ed50.js → 905-742074a074be1055.js} +2 -2
  74. fides/ui-build/static/admin/_next/static/chunks/9226-ba6587e46ec7659a.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/{9392.81edc11e3a175275.js → 9392.25024e070026343d.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/9676.e60a53f1f5890847.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/9767-e49b065d03ce4e80.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/9951-f9ab5cac7e2c05ab.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/pages/404-ac2f0844e5c4b4cd.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-f70bffa5a7903c46.js → _app-8ec6e466f3373ac0.js} +10 -10
  81. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-0a5f2310ce6b1059.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-00cb904825aad7e3.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-587e21d14e0a5196.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-fa7305b88c1afd20.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-f140ec9d8e8a0f7a.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-0edb7c92518e7d21.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d8d926f0735a2546.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-5c949f2e3cef2398.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-130155cfb4a0bcc7.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-1135ad8924d32c36.js +1 -0
  91. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-776855e370414beb.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-21c23f75ff1135d9.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/consent-4d5ea70a77df1bb8.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-18e3faf7963962e4.js → [resourceUrn]-c623d6f1a61c8ea9.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-030ee304cbe5e530.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-cfac259a30641e68.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-7320524a47104798.js → [resourceUrn]-57bd5cdf784f059f.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-7b5aec33da578745.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-c948f93c833d4358.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-333f53caab751428.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-27205f8457a1ecb0.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-20a1043f6a06198f.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-4c526db0c30c488a.js → [resourceUrn]-06edce289876dea1.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-6f27dbb7c8edc69d.js → detection-faf326a6200637d0.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-562d2b8ae90dd1f0.js → [resourceUrn]-64acf269256ee74f.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-fe7f51502eda57c9.js → discovery-8c3e4be6d36da66d.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-fb50de22f83edd4a.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-41ab27c4195cfa93.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-6e2caba24b3e78c2.js +1 -0
  110. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-904d43e31157aa55.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4e31a1c4a58800e.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-8f7d16bc5e9229c8.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-4a33dd0371dbaebc.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-e88509346b2d2851.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-8f9b8890018e1ea5.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-80b241bf6cddb72e.js → fides-js-docs-5d8fd1af75f19e2f.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/index-1adb6bcb71701ac2.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-fdc2964fa7d1d8fd.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adc286ff254e7f41.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-9b4d1d61c7c97509.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-f8fd4795e260887c.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-aa744ae8b61e5ff2.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-3407158757fb3627.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-47e947c02ae90fd0.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-24f9a44512ce8827.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-e567a69f8c37fb9a.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-35a33f9c7def2220.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-780e18dde8e38099.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-7a17dffa515e5560.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-91dd0039cc2b70bc.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-b01cbbaac34dadbc.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-a15410de7f1d0f84.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-1a1aa83a3f88844c.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-c4e1b69fb5bab61a.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-19737d4f21aadbee.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-9ccb295110feee20.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/properties-3a1037a2e036212a.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-4cdbbb8cd1d8698e.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-965cc21889b25e44.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-0e1c381d488a7ada.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-d0e350d2a2667883.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-7796fbf458f8f159.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-6f866bc799a5f67f.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-0b44b2b224077dcd.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-5d00e1155bd11178.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-d2cdbe770683e9df.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-811dadb489f23d7d.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-24108f615ff5e1e7.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-54f142bc3e4c95ba.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-fef247a87baeb080.js +1 -0
  151. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-6eb886e7b7e6785b.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/pages/systems-7b71274334c559a4.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-18534d2a79a3850b.js +1 -0
  154. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-75d41fde668b9025.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-dd43755b687c09a7.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/webpack-0a61b5bd21a41fe6.js +1 -0
  157. fides/ui-build/static/admin/_next/static/css/c693338e3bc8dcc6.css +1 -0
  158. fides/ui-build/static/admin/_next/static/nRQ3pmK_d3F5PJE39rP2h/_buildManifest.js +1 -0
  159. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  160. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  161. fides/ui-build/static/admin/add-systems.html +1 -1
  162. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  163. fides/ui-build/static/admin/consent/configure.html +1 -1
  164. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  165. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  166. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  167. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  168. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  169. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  170. fides/ui-build/static/admin/consent/properties.html +1 -1
  171. fides/ui-build/static/admin/consent/reporting.html +1 -1
  172. fides/ui-build/static/admin/consent.html +1 -1
  173. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  174. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  175. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  176. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  177. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  178. fides/ui-build/static/admin/data-catalog.html +1 -1
  179. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  180. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  181. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  182. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  183. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  184. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  185. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  186. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  187. fides/ui-build/static/admin/datamap.html +1 -1
  188. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  189. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  190. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  191. fides/ui-build/static/admin/dataset/new.html +1 -1
  192. fides/ui-build/static/admin/dataset.html +1 -1
  193. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  194. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  195. fides/ui-build/static/admin/datastore-connection.html +1 -1
  196. fides/ui-build/static/admin/images/connector-logos/salesforce.svg +41 -0
  197. fides/ui-build/static/admin/index.html +1 -1
  198. fides/ui-build/static/admin/integrations/[id].html +1 -1
  199. fides/ui-build/static/admin/integrations.html +1 -1
  200. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  201. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  202. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  203. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  204. fides/ui-build/static/admin/lib/fides.js +2 -2
  205. fides/ui-build/static/admin/login/[provider].html +1 -1
  206. fides/ui-build/static/admin/login.html +1 -1
  207. fides/ui-build/static/admin/messaging/[id].html +1 -1
  208. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  209. fides/ui-build/static/admin/messaging.html +1 -1
  210. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  211. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  212. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  213. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  214. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  215. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  216. fides/ui-build/static/admin/poc/forms.html +1 -1
  217. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  218. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  219. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  220. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  221. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  222. fides/ui-build/static/admin/privacy-requests.html +1 -1
  223. fides/ui-build/static/admin/properties/[id].html +1 -1
  224. fides/ui-build/static/admin/properties/add-property.html +1 -1
  225. fides/ui-build/static/admin/properties.html +1 -1
  226. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  227. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  228. fides/ui-build/static/admin/settings/about.html +1 -1
  229. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  230. fides/ui-build/static/admin/settings/consent.html +1 -1
  231. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  232. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  233. fides/ui-build/static/admin/settings/domains.html +1 -1
  234. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  235. fides/ui-build/static/admin/settings/locations.html +1 -1
  236. fides/ui-build/static/admin/settings/organization.html +1 -1
  237. fides/ui-build/static/admin/settings/regulations.html +1 -1
  238. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  239. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  240. fides/ui-build/static/admin/systems.html +1 -1
  241. fides/ui-build/static/admin/taxonomy.html +1 -1
  242. fides/ui-build/static/admin/user-management/new.html +1 -1
  243. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  244. fides/ui-build/static/admin/user-management.html +1 -1
  245. fides/api/service/privacy_request/dsr_package/templates/item.html +0 -37
  246. fides/ui-build/static/admin/_next/static/chunks/1099-667e84655846e78c.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/1100-0b01f500b1eaf60d.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/1817-951f58ddd5d46081.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/1904-964f8eb328dc2715.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/2310-744354001d01f366.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/2921-49af55ad7c631c93.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/3119-e36ae5071c8f27a5.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/3505-113f9c95d34b7aae.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/3513-5c2d412a84a78971.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/3872-45cc725e241211f0.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/3923-b4f701ada3ef0ee0.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/401-7e800aed05537126.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/4060-90a52a9afc655bfc.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/4121-66b0e00d5e7ae817.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/4132-9b1731bfec6ee537.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/4481-7f6710c928bb0cb0.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/5258-2079138c8cc34f6c.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/5404-2694509cf5fa96da.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/5487-2cbd8d2169eb2a65.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/5683-37137111b3e769fb.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/6202-081545c7822d09af.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/6277-459e054b2702c60e.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/641-7e4eef3222cbda70.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/6853-688df0b88fe65fd5.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/69-00cba94689b9e740.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/6954-4e313b4599b8763d.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/7553-08bc3d9f66695111.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/79-fc548561beed136f.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/796-d6586308ed44334b.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/7980-736f9fd1e749ddd2.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/8032-74d94f7bd5b81c89.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/8433-51870336908fb253.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/8499-1fd392d0be9e8ee4.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/8702-d1c8296f9f6afc10.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/9033-fdd87182c15b91e2.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/9187-851756440f79cd75.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/9327-6a53461c9764b16f.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/9494-1ffb888b95289891.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/9676.61cf5f6d6a083175.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/9767-afd674014a1d1152.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/404-ec04f826f3dd79ea.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-1bec086d567aacff.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-f68bf100e4e60e88.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-effde5cfe49de55f.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-ec95ed8cb0712828.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-4cc195e15e0c3cc8.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-be8972c79fb39705.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-ccf96207de3b74ea.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-b9823cc008372cee.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-373f5772ab41bc93.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-b9beeee1bde5ca79.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-6ab3a5baafebd199.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-8562790ae07f17c9.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/consent-42d4d2d6e0253671.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-9d1df6d890671b0c.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-7eb08af333baaa8e.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-bb57eed84f59a932.js +0 -1
  303. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-47eb34aef3e31ac6.js +0 -1
  304. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-76cefefc53e84c7f.js +0 -1
  305. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9d8e84a8b4bf568d.js +0 -1
  306. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-f208fef5e72dafd6.js +0 -1
  307. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-db45aa864e9dda8a.js +0 -1
  308. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d5cfdebc74654337.js +0 -1
  309. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-618b89228f83435e.js +0 -1
  310. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-12fc86f15a4c764e.js +0 -1
  311. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-c23d18a9b56c2e3c.js +0 -1
  312. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-e3b2d8e3980ab093.js +0 -1
  313. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-6e27257eccf65f01.js +0 -1
  314. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-bbac1f624424282d.js +0 -1
  315. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-84eb56f5a07bdf4f.js +0 -1
  316. fides/ui-build/static/admin/_next/static/chunks/pages/index-773182b5e35d0045.js +0 -1
  317. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-eb28c927da5bd653.js +0 -1
  318. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-781808bca01f8048.js +0 -1
  319. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-b51bee8680d66b20.js +0 -1
  320. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-1de479533f733fbd.js +0 -1
  321. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-7dc295b3ed3d2224.js +0 -1
  322. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-f64dac3392f5ded7.js +0 -1
  323. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-eb020bfac4bee532.js +0 -1
  324. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-0bd62e28b539e114.js +0 -1
  325. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-936877004113c2a6.js +0 -1
  326. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-6416f01524482af9.js +0 -1
  327. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-3f4e1313d1f2969b.js +0 -1
  328. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-1db7a54437db7db0.js +0 -1
  329. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-64236fd0141414fd.js +0 -1
  330. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-8cab04871908cfeb.js +0 -1
  331. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-150d40428245ee0c.js +0 -1
  332. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b6c876dceb16ad1b.js +0 -1
  333. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-20cdb2c8a03deae1.js +0 -1
  334. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-54bcc875592d1fb9.js +0 -1
  335. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-644dc669b508a79a.js +0 -1
  336. fides/ui-build/static/admin/_next/static/chunks/pages/properties-9a88220d03e7e02f.js +0 -1
  337. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-70dc1081df37ea69.js +0 -1
  338. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-3c71b4dbcb6fd6c9.js +0 -1
  339. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-7cb16e0000dd16c9.js +0 -1
  340. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-a18d8f12ee8dcf5d.js +0 -1
  341. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-dc220e116ad5c09e.js +0 -1
  342. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-55ddc5f25b86f28e.js +0 -1
  343. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-5ca7decded228bc8.js +0 -1
  344. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a6fafa1be2834c40.js +0 -1
  345. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-e633750d2b45ddd6.js +0 -1
  346. fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-3948686cbd372969.js +0 -1
  347. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-04ece499c22d23f4.js +0 -1
  348. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-7752305084280cca.js +0 -1
  349. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-9e5f9066be6f218d.js +0 -1
  350. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-86de9e6d72098e45.js +0 -1
  351. fides/ui-build/static/admin/_next/static/chunks/pages/systems-cac52e6c3abf6a15.js +0 -1
  352. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-60d5930b6855679b.js +0 -1
  353. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-b0f4c34752d32c73.js +0 -1
  354. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-7dee83dd6d9292aa.js +0 -1
  355. fides/ui-build/static/admin/_next/static/chunks/webpack-8457bad7859c44f0.js +0 -1
  356. fides/ui-build/static/admin/_next/static/css/1fdf5c593349dbc6.css +0 -1
  357. fides/ui-build/static/admin/_next/static/f_8LkSZkhtDM14f8gbC0b/_buildManifest.js +0 -1
  358. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/WHEEL +0 -0
  359. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/entry_points.txt +0 -0
  360. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/licenses/LICENSE +0 -0
  361. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/top_level.txt +0 -0
  362. /fides/ui-build/static/admin/_next/static/{f_8LkSZkhtDM14f8gbC0b → nRQ3pmK_d3F5PJE39rP2h}/_ssgManifest.js +0 -0
@@ -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
+ ]
@@ -38,7 +38,7 @@ class ManualTaskLogStatus(str, Enum):
38
38
 
39
39
  created = "created"
40
40
  updated = "updated"
41
- in_processing = "in_processing"
41
+ in_progress = "in_progress"
42
42
  complete = "complete"
43
43
  error = "error"
44
44
  retrying = "retrying"
@@ -32,7 +32,7 @@ class StatusType(str, EnumType):
32
32
  list[StatusType]: List of valid transitions
33
33
  """
34
34
  if current_status == cls.pending:
35
- return [cls.in_progress, cls.failed]
35
+ return [cls.in_progress, cls.failed, cls.completed]
36
36
  if current_status == cls.in_progress:
37
37
  return [cls.completed, cls.failed]
38
38
  if current_status == cls.completed:
@@ -77,6 +77,7 @@ class PrivacyRequestSource(str, EnumType):
77
77
  - Consent Webhook: Request created as a side-effect of a consent webhook request (bidirectional consent)
78
78
  - Fides.js: Request created as a side-effect of a privacy preference update from Fides.js
79
79
  - Dataset Test: Standalone dataset test
80
+ - Janus SDK: Request created from the Mobile SDK
80
81
  """
81
82
 
82
83
  privacy_center = "Privacy Center"
@@ -84,6 +85,7 @@ class PrivacyRequestSource(str, EnumType):
84
85
  consent_webhook = "Consent Webhook"
85
86
  fides_js = "Fides.js"
86
87
  dataset_test = "Dataset Test"
88
+ janus_sdk = "Janus SDK"
87
89
 
88
90
 
89
91
  class PrivacyRequestCreate(FidesSchema):
@@ -43,6 +43,7 @@ from fides.api.util.saas_util import (
43
43
  ALL_OBJECT_FIELDS,
44
44
  CUSTOM_PRIVACY_REQUEST_FIELDS,
45
45
  FIDESOPS_GROUPED_INPUTS,
46
+ FIELD_LIST,
46
47
  ISO_8601_DATETIME,
47
48
  MASKED_OBJECT_FIELDS,
48
49
  PRIVACY_REQUEST_ID,
@@ -353,6 +354,13 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
353
354
 
354
355
  param_values[UUID] = str(uuid4())
355
356
  param_values[ISO_8601_DATETIME] = datetime.now().date().isoformat()
357
+ param_values[FIELD_LIST] = ",".join(
358
+ [
359
+ field.name
360
+ for field in self.top_level_field_map().values()
361
+ if field.data_type() != "None"
362
+ ]
363
+ )
356
364
  if self.request_task and self.request_task.id:
357
365
  param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
358
366
  self.request_task
@@ -458,6 +466,13 @@ class SaaSQueryConfig(QueryConfig[SaaSRequestParams]):
458
466
  param_values[CUSTOM_PRIVACY_REQUEST_FIELDS] = custom_privacy_request_fields
459
467
  param_values[UUID] = str(uuid4())
460
468
  param_values[ISO_8601_DATETIME] = datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
469
+ param_values[FIELD_LIST] = ",".join(
470
+ [
471
+ field.name
472
+ for field in self.top_level_field_map().values()
473
+ if field.data_type() != "None"
474
+ ]
475
+ )
461
476
  if self.request_task and self.request_task.id:
462
477
  param_values[REPLY_TO_TOKEN] = generate_request_task_callback_jwe(
463
478
  self.request_task
@@ -0,0 +1,132 @@
1
+ import time as time_module
2
+ from dataclasses import dataclass
3
+ from typing import Any, Dict, Iterator, List, Optional, Tuple
4
+
5
+ from loguru import logger
6
+
7
+ from fides.api.models.attachment import Attachment, AttachmentType
8
+ from fides.api.schemas.storage.storage import StorageDetails
9
+
10
+
11
+ @dataclass
12
+ class AttachmentData:
13
+ """Data structure for attachment metadata and content.
14
+ Using a dataclass rather than a Pydantic model here for the following reasons:
15
+ - The data structure is simple and doesn't need complex validation.
16
+ - The fields being used have already been validated and are properly typed.
17
+ - The class is used internally for data transfer, not for API serialization.
18
+ - Performance is important since this is used in a data processing pipeline.
19
+ """
20
+
21
+ file_name: str
22
+ file_size: Optional[int]
23
+ download_url: Optional[str]
24
+ content_type: str
25
+ bucket_name: str
26
+ file_key: str
27
+ storage_key: str
28
+
29
+ def to_upload_dict(self) -> Dict[str, Any]:
30
+ """Convert to dictionary for upload, including presigned URL."""
31
+ return {
32
+ "file_name": self.file_name,
33
+ "file_size": self.file_size,
34
+ "download_url": self.download_url,
35
+ "content_type": self.content_type,
36
+ }
37
+
38
+ def to_storage_dict(self) -> Dict[str, Any]:
39
+ """Convert to dictionary for storage, including the elements needed to recreated the presigned URL."""
40
+ return {
41
+ "file_name": self.file_name,
42
+ "file_size": self.file_size,
43
+ "content_type": self.content_type,
44
+ "bucket_name": self.bucket_name,
45
+ "file_key": self.file_key,
46
+ "storage_key": self.storage_key,
47
+ }
48
+
49
+
50
+ def get_attachments_content(
51
+ loaded_attachments: List[Attachment],
52
+ ) -> Iterator[AttachmentData]:
53
+ """
54
+ Retrieves all attachments associated with a privacy request that are marked to be included with the access package.
55
+ Yields AttachmentData objects containing attachment metadata and download urls.
56
+ Uses generators to minimize memory usage.
57
+
58
+ Args:
59
+ loaded_attachments: List of Attachment objects to process
60
+
61
+ Yields:
62
+ AttachmentData object containing attachment metadata and url
63
+ """
64
+ start_time = time_module.time()
65
+ processed_count = 0
66
+ skipped_count = 0
67
+ error_count = 0
68
+ total_size = 0
69
+
70
+ for attachment in loaded_attachments:
71
+ if attachment.attachment_type != AttachmentType.include_with_access_package:
72
+ skipped_count += 1
73
+ continue
74
+
75
+ try:
76
+ # Get size and download URL using retrieve_attachment
77
+ size, url = attachment.retrieve_attachment()
78
+ total_size += size if size else 0
79
+ if url is None:
80
+ logger.warning(
81
+ "No download URL retrieved for attachment {}", attachment.file_name
82
+ )
83
+ skipped_count += 1
84
+ continue
85
+
86
+ processed_count += 1
87
+ yield AttachmentData(
88
+ file_name=attachment.file_name,
89
+ file_size=size,
90
+ download_url=str(url) if url else None,
91
+ content_type=attachment.content_type,
92
+ bucket_name=attachment.config.details[StorageDetails.BUCKET.value],
93
+ file_key=attachment.file_key,
94
+ storage_key=attachment.storage_key,
95
+ )
96
+
97
+ except Exception as e:
98
+ error_count += 1
99
+ logger.error(
100
+ "Error processing attachment {}: {}", attachment.file_name, str(e)
101
+ )
102
+ continue
103
+
104
+ # Log final metrics
105
+ time_taken = time_module.time() - start_time
106
+ logger.bind(
107
+ time_to_process=time_taken,
108
+ total_attachments=len(loaded_attachments),
109
+ processed_attachments=processed_count,
110
+ skipped_attachments=skipped_count,
111
+ error_attachments=error_count,
112
+ total_size_bytes=total_size,
113
+ ).info("Attachment processing complete")
114
+
115
+
116
+ def process_attachments_for_upload(
117
+ attachments: Iterator[AttachmentData],
118
+ ) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
119
+ """
120
+ Process attachments into separate upload and storage formats.
121
+ Returns both formats:
122
+ - upload_attachments: Used for uploading to access packages
123
+ - storage_attachments: Used for saving filtered access results
124
+ """
125
+ upload_attachments = []
126
+ storage_attachments = []
127
+
128
+ for attachment in attachments:
129
+ storage_attachments.append(attachment.to_storage_dict())
130
+ upload_attachments.append(attachment.to_upload_dict())
131
+
132
+ return upload_attachments, storage_attachments