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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. {ethyca_fides-2.63.1rc0.dist-info → ethyca_fides-2.63.3b0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.63.1rc0.dist-info → ethyca_fides-2.63.3b0.dist-info}/RECORD +241 -228
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/5efcdf18438e_add_manual_task_tables.py +160 -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 +2 -0
  8. fides/api/main.py +1 -0
  9. fides/api/models/attachment.py +36 -23
  10. fides/api/models/detection_discovery/monitor_task.py +1 -0
  11. fides/api/models/manual_tasks/__init__.py +8 -0
  12. fides/api/models/manual_tasks/manual_task.py +110 -0
  13. fides/api/models/manual_tasks/manual_task_log.py +100 -0
  14. fides/api/schemas/connection_configuration/connection_config.py +19 -4
  15. fides/api/schemas/manual_tasks/__init__.py +0 -0
  16. fides/api/schemas/manual_tasks/manual_task_schemas.py +79 -0
  17. fides/api/schemas/manual_tasks/manual_task_status.py +151 -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 +77 -1
  33. fides/api/util/saas_util.py +1 -0
  34. fides/config/redis_settings.py +99 -8
  35. fides/service/manual_tasks/__init__.py +0 -0
  36. fides/service/manual_tasks/manual_task_service.py +150 -0
  37. fides/service/messaging/aws_ses_service.py +5 -1
  38. fides/ui-build/static/admin/404.html +1 -1
  39. fides/ui-build/static/admin/_next/static/0S8UTwc7FKVdi3Eb4LgFK/_buildManifest.js +1 -0
  40. fides/ui-build/static/admin/_next/static/chunks/1099-f2199d5b88dd98b4.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/1100-d617215143d70d3d.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/155-8ad794121fef6281.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/1817-ddfdd6ed9529bba6.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/1904-e33cb75edb93d3d3.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/2310-efaa2a52fc487db4.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/2921-19664dd93e2bf1ea.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/3119-9be74ade1504a7e7.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/3505-f6d55694ca5c9816.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/3513-656df06b45fedba3.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/3872-09df90521f7db611.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/3923-3d80020d02819c33.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/401-710009c2a7408818.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/4060-4e196835f56cc326.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/4121-80ac9bcd08f9cd7a.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/4132-76ca1bcf79bf1d77.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/4481-be144b50994f5135.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/5258-8a1f7feddee7a960.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/5404-a8a82985736363f4.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/5487-483a111405f678e0.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/5683-7144f557d701406c.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/6202-86a62d94744e2c18.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/6277-0b1e3d23e97f5e19.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/6853-d9c6c55d8562bc9b.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/69-a4d64cabe750b286.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/6954-8ed05ffdbf2ec086.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/7553-77c9715868d6ad13.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/79-6c977013b6bedc23.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/796-1d77aa88b776ee4e.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/7980-3da0fe6938b0b758.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/8032-4b8bda7166eff954.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/8433-88fd946149dd1f27.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/8499-a65187ae77b7307b.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/{905-8ab919e7b274ed50.js → 905-5fe5124abfb5c542.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/9327-eb3b84680abcc660.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/9494-04a0483ed0ddad7c.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/9676.e60a53f1f5890847.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/9767-a3ed98edff04e6ed.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/pages/404-c50dccc133b332a9.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-33bc23b79bffe07c.js → _app-0e0fdbcc0ec1c76b.js} +10 -10
  81. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-3065022f370ec055.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-357ef3b269c576bb.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-e8ae218a9d124ba7.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-488507bb244cce9d.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-6f0b46ac2b112bfe.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-5024b4ab40ba024c.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-2b62e5facfc51808.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-71791459da78e35d.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-26a7d52615b1ebb8.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-25836dd5142f37e8.js +1 -0
  91. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-3a9021850242c78f.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-9a5d3cc5cbb4ef27.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/consent-9e21184279f8e126.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-64cea013d41e348a.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-b02050eb3b7113d4.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-ff211c7a968bda47.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-7f7435f28861ee78.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-ec4b981fd9cff542.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-18c144223277bc2e.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-e18f14b8d598e942.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-9af01b6cf4cbe8af.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-1987ef0d3c687aaa.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-979828f48148b37c.js +1 -0
  104. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e85c3537d3aade4a.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-6d44abbe7d454435.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-42f276660c107e1c.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-18ff06fc09c22c33.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-979eff6888e42b6b.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-343a3830b2d4cf22.js +1 -0
  110. fides/ui-build/static/admin/_next/static/chunks/pages/index-737b0c430bf2f7a0.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-63361d914d70d647.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-fd73f276dad7a06c.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-91e865a65a88d1a4.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-529c7e09b073edd2.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-6226faba9595da71.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-0f7d4390e01f4ffb.js +1 -0
  117. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-a4e470f75a5553f8.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d814c1c56b4b04d8.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-0f68f2be09df2c76.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-6b63d5c992466891.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-88eb9b98e8e4b426.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-a3da91fd04eec8f5.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-b2ea863afce1d7f0.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-0831dfaa65ce0d50.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-709676f00a491bca.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-0eac9951504b46a7.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-88e20023c30113df.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-3acc3107e9a21260.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-2bf13ee02d8d5ab9.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/properties-822eac07220f55f8.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f85f92726a61a668.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-88999260f855b448.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-928b0b69e05fd430.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-e090903a572cba68.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-f0c8e4eced9f5cc5.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-f7a271ee53cb4e51.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-611980eee1ce9c8a.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-382cb6df12684bf8.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-5d664f2a0f11b626.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-ba569d22e1e3f6df.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-dd903f6e03c4ee4e.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-fae8ecf7878bad2d.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-493dc9b4595c9fb4.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-2b540203a2d7b59d.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/systems-a278608ba0ddc66c.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-6d790458dd21dde7.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-eb30c9230a9ce9cc.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-381146aa81e3ffea.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/{webpack-8457bad7859c44f0.js → webpack-abfd03ce7f1e55ac.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/css/c3377f99bf988d68.css +1 -0
  151. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  152. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  153. fides/ui-build/static/admin/add-systems.html +1 -1
  154. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  155. fides/ui-build/static/admin/consent/configure.html +1 -1
  156. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  158. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  159. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  160. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  161. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  162. fides/ui-build/static/admin/consent/properties.html +1 -1
  163. fides/ui-build/static/admin/consent/reporting.html +1 -1
  164. fides/ui-build/static/admin/consent.html +1 -1
  165. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  166. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  167. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  168. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  169. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  170. fides/ui-build/static/admin/data-catalog.html +1 -1
  171. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  172. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  173. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  174. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  175. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  176. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  177. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  178. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  179. fides/ui-build/static/admin/datamap.html +1 -1
  180. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  181. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  182. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  183. fides/ui-build/static/admin/dataset/new.html +1 -1
  184. fides/ui-build/static/admin/dataset.html +1 -1
  185. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  186. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  187. fides/ui-build/static/admin/datastore-connection.html +1 -1
  188. fides/ui-build/static/admin/images/connector-logos/salesforce.svg +41 -0
  189. fides/ui-build/static/admin/index.html +1 -1
  190. fides/ui-build/static/admin/integrations/[id].html +1 -1
  191. fides/ui-build/static/admin/integrations.html +1 -1
  192. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  193. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  194. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  195. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  196. fides/ui-build/static/admin/lib/fides.js +2 -2
  197. fides/ui-build/static/admin/login/[provider].html +1 -1
  198. fides/ui-build/static/admin/login.html +1 -1
  199. fides/ui-build/static/admin/messaging/[id].html +1 -1
  200. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  201. fides/ui-build/static/admin/messaging.html +1 -1
  202. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  203. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  204. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  205. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  206. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  207. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  208. fides/ui-build/static/admin/poc/forms.html +1 -1
  209. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  210. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  211. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  212. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  213. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  214. fides/ui-build/static/admin/privacy-requests.html +1 -1
  215. fides/ui-build/static/admin/properties/[id].html +1 -1
  216. fides/ui-build/static/admin/properties/add-property.html +1 -1
  217. fides/ui-build/static/admin/properties.html +1 -1
  218. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  219. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  220. fides/ui-build/static/admin/settings/about.html +1 -1
  221. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  222. fides/ui-build/static/admin/settings/consent.html +1 -1
  223. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  224. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  225. fides/ui-build/static/admin/settings/domains.html +1 -1
  226. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  227. fides/ui-build/static/admin/settings/locations.html +1 -1
  228. fides/ui-build/static/admin/settings/organization.html +1 -1
  229. fides/ui-build/static/admin/settings/regulations.html +1 -1
  230. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  231. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  232. fides/ui-build/static/admin/systems.html +1 -1
  233. fides/ui-build/static/admin/taxonomy.html +1 -1
  234. fides/ui-build/static/admin/user-management/new.html +1 -1
  235. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  236. fides/ui-build/static/admin/user-management.html +1 -1
  237. fides/api/service/privacy_request/dsr_package/templates/item.html +0 -37
  238. fides/ui-build/static/admin/_next/static/PEElhfUdgE5bJjiyu5QCD/_buildManifest.js +0 -1
  239. fides/ui-build/static/admin/_next/static/chunks/1099-667e84655846e78c.js +0 -1
  240. fides/ui-build/static/admin/_next/static/chunks/1100-0b01f500b1eaf60d.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/1817-951f58ddd5d46081.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/1904-361e37a5811ed7fc.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/2310-744354001d01f366.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/2921-49af55ad7c631c93.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/3119-e36ae5071c8f27a5.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/3505-113f9c95d34b7aae.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/3513-5c2d412a84a78971.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/3872-45cc725e241211f0.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/3923-b4f701ada3ef0ee0.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/401-7e800aed05537126.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/4060-90a52a9afc655bfc.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4121-66b0e00d5e7ae817.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/4132-9b1731bfec6ee537.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/4481-7f6710c928bb0cb0.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/5258-2079138c8cc34f6c.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/5404-2694509cf5fa96da.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/5487-2cbd8d2169eb2a65.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/5683-37137111b3e769fb.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/6202-081545c7822d09af.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/6277-459e054b2702c60e.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/6853-688df0b88fe65fd5.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/69-00cba94689b9e740.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/6954-4e313b4599b8763d.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/7553-08bc3d9f66695111.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/79-fc548561beed136f.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/796-d6586308ed44334b.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/7980-736f9fd1e749ddd2.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/8032-74d94f7bd5b81c89.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/8433-51870336908fb253.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/8499-1fd392d0be9e8ee4.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/9033-fdd87182c15b91e2.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/9327-6a53461c9764b16f.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/9494-1ffb888b95289891.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/9676.61cf5f6d6a083175.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/9767-afd674014a1d1152.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/404-ec04f826f3dd79ea.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-1bec086d567aacff.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-f68bf100e4e60e88.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-effde5cfe49de55f.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-ec95ed8cb0712828.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-4cc195e15e0c3cc8.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-be8972c79fb39705.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-ccf96207de3b74ea.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-b9823cc008372cee.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-373f5772ab41bc93.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-b9beeee1bde5ca79.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-6ab3a5baafebd199.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-8562790ae07f17c9.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/consent-42d4d2d6e0253671.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-9d1df6d890671b0c.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-7eb08af333baaa8e.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-bb57eed84f59a932.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-47eb34aef3e31ac6.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-76cefefc53e84c7f.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9d8e84a8b4bf568d.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-c3eaadd88a2e6caa.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-db45aa864e9dda8a.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d5cfdebc74654337.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-618b89228f83435e.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-12fc86f15a4c764e.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-c23d18a9b56c2e3c.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-e3b2d8e3980ab093.js +0 -1
  303. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-6e27257eccf65f01.js +0 -1
  304. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-bbac1f624424282d.js +0 -1
  305. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-84eb56f5a07bdf4f.js +0 -1
  306. fides/ui-build/static/admin/_next/static/chunks/pages/index-773182b5e35d0045.js +0 -1
  307. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-eb28c927da5bd653.js +0 -1
  308. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-781808bca01f8048.js +0 -1
  309. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-b51bee8680d66b20.js +0 -1
  310. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-1de479533f733fbd.js +0 -1
  311. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-7dc295b3ed3d2224.js +0 -1
  312. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-f64dac3392f5ded7.js +0 -1
  313. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-eb020bfac4bee532.js +0 -1
  314. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-0bd62e28b539e114.js +0 -1
  315. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-936877004113c2a6.js +0 -1
  316. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-6416f01524482af9.js +0 -1
  317. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-3f4e1313d1f2969b.js +0 -1
  318. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-1db7a54437db7db0.js +0 -1
  319. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-64236fd0141414fd.js +0 -1
  320. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-8cab04871908cfeb.js +0 -1
  321. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-150d40428245ee0c.js +0 -1
  322. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b6c876dceb16ad1b.js +0 -1
  323. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-20cdb2c8a03deae1.js +0 -1
  324. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-54bcc875592d1fb9.js +0 -1
  325. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-644dc669b508a79a.js +0 -1
  326. fides/ui-build/static/admin/_next/static/chunks/pages/properties-9a88220d03e7e02f.js +0 -1
  327. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-70dc1081df37ea69.js +0 -1
  328. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-3c71b4dbcb6fd6c9.js +0 -1
  329. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-7cb16e0000dd16c9.js +0 -1
  330. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-a18d8f12ee8dcf5d.js +0 -1
  331. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-dc220e116ad5c09e.js +0 -1
  332. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-55ddc5f25b86f28e.js +0 -1
  333. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-5ca7decded228bc8.js +0 -1
  334. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a6fafa1be2834c40.js +0 -1
  335. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-e633750d2b45ddd6.js +0 -1
  336. fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-3948686cbd372969.js +0 -1
  337. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-04ece499c22d23f4.js +0 -1
  338. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-7752305084280cca.js +0 -1
  339. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-9e5f9066be6f218d.js +0 -1
  340. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-86de9e6d72098e45.js +0 -1
  341. fides/ui-build/static/admin/_next/static/chunks/pages/systems-cac52e6c3abf6a15.js +0 -1
  342. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-60d5930b6855679b.js +0 -1
  343. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-b0f4c34752d32c73.js +0 -1
  344. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-7dee83dd6d9292aa.js +0 -1
  345. fides/ui-build/static/admin/_next/static/css/1fdf5c593349dbc6.css +0 -1
  346. {ethyca_fides-2.63.1rc0.dist-info → ethyca_fides-2.63.3b0.dist-info}/WHEEL +0 -0
  347. {ethyca_fides-2.63.1rc0.dist-info → ethyca_fides-2.63.3b0.dist-info}/entry_points.txt +0 -0
  348. {ethyca_fides-2.63.1rc0.dist-info → ethyca_fides-2.63.3b0.dist-info}/licenses/LICENSE +0 -0
  349. {ethyca_fides-2.63.1rc0.dist-info → ethyca_fides-2.63.3b0.dist-info}/top_level.txt +0 -0
  350. /fides/ui-build/static/admin/_next/static/{PEElhfUdgE5bJjiyu5QCD → 0S8UTwc7FKVdi3Eb4LgFK}/_ssgManifest.js +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-06-12T09:56:31-0700",
11
+ "date": "2025-06-12T18:57:31-0300",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "273c62880da650c9930f107ddc22491c7caff338",
15
- "version": "2.63.1rc0"
14
+ "full-revisionid": "14baaf4b4e688a68ff32098124e78e6bab89dcb5",
15
+ "version": "2.63.3b0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,160 @@
1
+ """add manual task tables
2
+
3
+ Revision ID: 5efcdf18438e
4
+ Revises: c586a56c25e7
5
+ Create Date: 2025-06-04 17:24:00.300170
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy.dialects import postgresql
12
+ from sqlalchemy.sql import func
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = "5efcdf18438e"
16
+ down_revision = "c586a56c25e7"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ def upgrade():
22
+ # ### commands auto generated by Alembic - please adjust! ###
23
+ op.create_table(
24
+ "manual_task",
25
+ sa.Column("id", sa.String(), nullable=False),
26
+ sa.Column(
27
+ "created_at",
28
+ sa.DateTime(timezone=True),
29
+ nullable=False,
30
+ server_default=func.now(),
31
+ ),
32
+ sa.Column(
33
+ "updated_at",
34
+ sa.DateTime(timezone=True),
35
+ nullable=False,
36
+ server_default=func.now(),
37
+ ),
38
+ sa.Column(
39
+ "task_type", sa.String(), nullable=False, server_default="privacy_request"
40
+ ),
41
+ sa.Column("parent_entity_id", sa.String(), nullable=False),
42
+ sa.Column("parent_entity_type", sa.String(), nullable=False),
43
+ sa.Column("due_date", sa.DateTime(timezone=True), nullable=True),
44
+ sa.PrimaryKeyConstraint("id"),
45
+ sa.UniqueConstraint(
46
+ "parent_entity_id",
47
+ "parent_entity_type",
48
+ name="uq_manual_task_parent_entity",
49
+ ),
50
+ )
51
+
52
+ op.create_table(
53
+ "manual_task_reference",
54
+ sa.Column("id", sa.String(), nullable=False),
55
+ sa.Column(
56
+ "created_at",
57
+ sa.DateTime(timezone=True),
58
+ nullable=False,
59
+ server_default=func.now(),
60
+ ),
61
+ sa.Column(
62
+ "updated_at",
63
+ sa.DateTime(timezone=True),
64
+ nullable=False,
65
+ server_default=func.now(),
66
+ ),
67
+ sa.Column("task_id", sa.String(), nullable=False),
68
+ sa.Column("reference_id", sa.String(), nullable=False),
69
+ sa.Column("reference_type", sa.String(), nullable=False),
70
+ sa.ForeignKeyConstraint(
71
+ ["task_id"],
72
+ ["manual_task.id"],
73
+ ondelete="CASCADE",
74
+ ),
75
+ sa.PrimaryKeyConstraint("id"),
76
+ )
77
+
78
+ op.create_table(
79
+ "manual_task_log",
80
+ sa.Column("id", sa.String(), nullable=False),
81
+ sa.Column(
82
+ "created_at",
83
+ sa.DateTime(timezone=True),
84
+ nullable=False,
85
+ server_default=func.now(),
86
+ ),
87
+ sa.Column(
88
+ "updated_at",
89
+ sa.DateTime(timezone=True),
90
+ nullable=False,
91
+ server_default=func.now(),
92
+ ),
93
+ sa.Column("task_id", sa.String(), nullable=False),
94
+ sa.Column("config_id", sa.String(), nullable=True),
95
+ sa.Column("instance_id", sa.String(), nullable=True),
96
+ sa.Column("status", sa.String(), nullable=False),
97
+ sa.Column("message", sa.String(), nullable=True),
98
+ sa.Column("details", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
99
+ sa.ForeignKeyConstraint(
100
+ ["task_id"],
101
+ ["manual_task.id"],
102
+ ondelete="CASCADE",
103
+ ),
104
+ sa.PrimaryKeyConstraint("id"),
105
+ )
106
+
107
+ # Create indexes for manual_task
108
+ op.create_index("ix_manual_task_task_type", "manual_task", ["task_type"])
109
+ op.create_index(
110
+ "ix_manual_task_parent_entity",
111
+ "manual_task",
112
+ ["parent_entity_type", "parent_entity_id"],
113
+ )
114
+ op.create_index("ix_manual_task_due_date", "manual_task", ["due_date"])
115
+
116
+ # Create indexes for manual_task_reference
117
+ op.create_index(
118
+ "ix_manual_task_reference_task_id", "manual_task_reference", ["task_id"]
119
+ )
120
+ op.create_index(
121
+ "ix_manual_task_reference_reference",
122
+ "manual_task_reference",
123
+ ["reference_id", "reference_type"],
124
+ )
125
+
126
+ # Create indexes for manual_task_log
127
+ op.create_index("ix_manual_task_log_task_id", "manual_task_log", ["task_id"])
128
+ op.create_index("ix_manual_task_log_config_id", "manual_task_log", ["config_id"])
129
+ op.create_index(
130
+ "ix_manual_task_log_instance_id", "manual_task_log", ["instance_id"]
131
+ )
132
+ op.create_index("ix_manual_task_log_status", "manual_task_log", ["status"])
133
+ op.create_index("ix_manual_task_log_created_at", "manual_task_log", ["created_at"])
134
+
135
+ # ### end Alembic commands ###
136
+
137
+
138
+ def downgrade():
139
+ # ### commands auto generated by Alembic - please adjust! ###
140
+ # Drop indexes first
141
+ op.drop_index("ix_manual_task_log_created_at", table_name="manual_task_log")
142
+ op.drop_index("ix_manual_task_log_status", table_name="manual_task_log")
143
+ op.drop_index("ix_manual_task_log_instance_id", table_name="manual_task_log")
144
+ op.drop_index("ix_manual_task_log_config_id", table_name="manual_task_log")
145
+ op.drop_index("ix_manual_task_log_task_id", table_name="manual_task_log")
146
+ op.drop_index(
147
+ "ix_manual_task_reference_reference", table_name="manual_task_reference"
148
+ )
149
+ op.drop_index(
150
+ "ix_manual_task_reference_task_id", table_name="manual_task_reference"
151
+ )
152
+ op.drop_index("ix_manual_task_due_date", table_name="manual_task")
153
+ op.drop_index("ix_manual_task_parent_entity", table_name="manual_task")
154
+ op.drop_index("ix_manual_task_task_type", table_name="manual_task")
155
+
156
+ # Then drop tables
157
+ op.drop_table("manual_task_log")
158
+ op.drop_table("manual_task_reference")
159
+ op.drop_table("manual_task")
160
+ # ### end Alembic commands ###
@@ -22,6 +22,7 @@ from fides.api.schemas.connection_configuration import connection_secrets_schema
22
22
  from fides.api.schemas.connection_configuration.connection_config import (
23
23
  BulkPutConnectionConfiguration,
24
24
  ConnectionConfigurationResponse,
25
+ ConnectionConfigurationResponseWithSystemKey,
25
26
  CreateConnectionConfigurationWithSecrets,
26
27
  )
27
28
  from fides.api.schemas.connection_configuration.connection_secrets import (
@@ -154,13 +155,25 @@ def get_connections(
154
155
  @router.get(
155
156
  CONNECTION_BY_KEY,
156
157
  dependencies=[Security(verify_oauth_client, scopes=[CONNECTION_READ])],
157
- response_model=ConnectionConfigurationResponse,
158
+ response_model=ConnectionConfigurationResponseWithSystemKey,
158
159
  )
159
160
  def get_connection_detail(
160
161
  connection_key: FidesKey, db: Session = Depends(deps.get_db)
161
- ) -> ConnectionConfig:
162
+ ) -> ConnectionConfigurationResponseWithSystemKey:
162
163
  """Returns connection configuration with matching key."""
163
- return get_connection_config_or_error(db, connection_key)
164
+ connection_config = get_connection_config_or_error(db, connection_key)
165
+
166
+ # Convert to Pydantic model with all fields
167
+ response = ConnectionConfigurationResponseWithSystemKey.model_validate(
168
+ connection_config
169
+ )
170
+
171
+ # Override just the system_key field to use only the system's fides_key without fallback
172
+ response.system_key = (
173
+ connection_config.system.fides_key if connection_config.system else None
174
+ )
175
+
176
+ return response
164
177
 
165
178
 
166
179
  @router.patch(
@@ -274,9 +274,15 @@ def oauth_callback(code: str, state: str, db: Session = Depends(get_db)) -> Resp
274
274
 
275
275
  parsed_url = urlparse(authentication_request.referer)
276
276
  base_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
277
- system_key = connection_config.system.fides_key
277
+
278
+ if connection_config.system is not None:
279
+ system_key = connection_config.system.fides_key
280
+ redirect_path = f"/systems/configure/{system_key}"
281
+ else:
282
+ redirect_path = f"/integrations/{connection_config.key}"
283
+
278
284
  return RedirectResponse(
279
- url=f"{base_url}/systems/configure/{system_key}?status={test_status_value}"
285
+ url=f"{base_url}{redirect_path}?status={test_status_value}"
280
286
  )
281
287
  return PlainTextResponse(
282
288
  content=f"Connection test status: {test_status_value}. No referer URL available. Please navigate back to the Fides Admin UI.",
fides/api/db/base.py CHANGED
@@ -31,6 +31,8 @@ from fides.api.models.fides_user_respondent_email_verification import (
31
31
  )
32
32
  from fides.api.models.identity_salt import IdentitySalt
33
33
  from fides.api.models.location_regulation_selections import LocationRegulationSelections
34
+ from fides.api.models.manual_tasks.manual_task import ManualTask, ManualTaskReference
35
+ from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
34
36
  from fides.api.models.manual_webhook import AccessManualWebhook
35
37
  from fides.api.models.messaging import MessagingConfig
36
38
  from fides.api.models.messaging_template import MessagingTemplate
fides/api/main.py CHANGED
@@ -244,6 +244,7 @@ async def log_request(request: Request, call_next: Callable) -> Response:
244
244
  status_code=response.status_code,
245
245
  handler_time=f"{total_time}ms",
246
246
  path=request.url.path,
247
+ fides_client=request.headers.get("Fides-Client", "unknown"),
247
248
  ).info("Request received")
248
249
  return response
249
250
 
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  from enum import Enum as EnumType
3
+ from io import BytesIO
3
4
  from typing import IO, TYPE_CHECKING, Any, Tuple
4
5
 
5
6
  from fideslang.validation import AnyHttpUrlString
@@ -19,7 +20,6 @@ from fides.api.service.storage.s3 import (
19
20
  generic_upload_to_s3,
20
21
  )
21
22
  from fides.api.service.storage.util import AllowedFileType, get_local_filename
22
- from fides.config import CONFIG
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  from fides.api.models.comment import Comment
@@ -28,6 +28,11 @@ if TYPE_CHECKING:
28
28
  from fides.api.models.storage import StorageConfig
29
29
 
30
30
 
31
+ # This is 7 days in seconds and is currently the max allowed
32
+ # configurable expiration time for presigned URLs for both s3 and gcs.
33
+ MAX_TTL_SECONDS = 604800
34
+
35
+
31
36
  class AttachmentType(str, EnumType):
32
37
  """
33
38
  Enum for attachment types. Indicates attachment usage.
@@ -122,6 +127,11 @@ class Attachment(Base):
122
127
  """Returns the content type of the attachment."""
123
128
  return AllowedFileType[self.file_name.split(".")[-1]].value
124
129
 
130
+ @property
131
+ def file_key(self) -> str:
132
+ """Returns the file key of the attachment."""
133
+ return f"{self.id}/{self.file_name}"
134
+
125
135
  def upload(self, attachment: IO[bytes]) -> None:
126
136
  """Uploads an attachment to S3, GCS, or local storage."""
127
137
  if self.config.type == StorageType.s3:
@@ -130,7 +140,7 @@ class Attachment(Base):
130
140
  generic_upload_to_s3(
131
141
  storage_secrets=self.config.secrets,
132
142
  bucket_name=bucket_name,
133
- file_key=f"{self.id}/{self.file_name}",
143
+ file_key=self.file_key,
134
144
  document=attachment,
135
145
  auth_method=auth_method,
136
146
  )
@@ -142,7 +152,7 @@ class Attachment(Base):
142
152
  auth_method = self.config.details[StorageDetails.AUTH_METHOD.value]
143
153
  storage_client = get_gcs_client(auth_method, self.config.secrets)
144
154
  bucket = storage_client.bucket(bucket_name)
145
- blob = bucket.blob(f"{self.id}/{self.file_name}")
155
+ blob = bucket.blob(self.file_key)
146
156
 
147
157
  # Reset the file pointer to the beginning
148
158
  try:
@@ -155,7 +165,7 @@ class Attachment(Base):
155
165
  return
156
166
 
157
167
  if self.config.type == StorageType.local:
158
- filename = get_local_filename(f"{self.id}/{self.file_name}")
168
+ filename = get_local_filename(self.file_key)
159
169
 
160
170
  # Validate that attachment is a file-like object
161
171
  if not hasattr(attachment, "read"):
@@ -205,9 +215,10 @@ class Attachment(Base):
205
215
  size, url = generic_retrieve_from_s3(
206
216
  storage_secrets=self.config.secrets,
207
217
  bucket_name=bucket_name,
208
- file_key=f"{self.id}/{self.file_name}",
218
+ file_key=self.file_key,
209
219
  auth_method=auth_method,
210
220
  get_content=False,
221
+ ttl_seconds=MAX_TTL_SECONDS,
211
222
  )
212
223
  return size, url
213
224
 
@@ -216,19 +227,20 @@ class Attachment(Base):
216
227
  auth_method = self.config.details[StorageDetails.AUTH_METHOD.value]
217
228
  storage_client = get_gcs_client(auth_method, self.config.secrets)
218
229
  bucket = storage_client.bucket(bucket_name)
219
- blob = bucket.blob(f"{self.id}/{self.file_name}")
230
+ blob = bucket.blob(self.file_key)
220
231
 
221
232
  # Ensure we have the blob metadata
222
233
  blob.reload()
234
+ # Expiration is set to 7 days
223
235
  url = blob.generate_signed_url(
224
236
  version="v4",
225
- expiration=CONFIG.security.subject_request_download_link_ttl_seconds,
237
+ expiration=MAX_TTL_SECONDS,
226
238
  method="GET",
227
239
  )
228
240
  return blob.size, url
229
241
 
230
242
  if self.config.type == StorageType.local:
231
- filename = get_local_filename(f"{self.id}/{self.file_name}")
243
+ filename = get_local_filename(self.file_key)
232
244
  size = os.path.getsize(filename)
233
245
  return size, filename
234
246
 
@@ -236,7 +248,7 @@ class Attachment(Base):
236
248
 
237
249
  def retrieve_attachment_content(
238
250
  self,
239
- ) -> Tuple[int, bytes]:
251
+ ) -> Tuple[int, IO[bytes]]:
240
252
  """
241
253
  Retrieves the size of the attachment and its actual content.
242
254
  - For s3:
@@ -252,30 +264,33 @@ class Attachment(Base):
252
264
  if self.config.type == StorageType.s3:
253
265
  bucket_name = f"{self.config.details[StorageDetails.BUCKET.value]}"
254
266
  auth_method = self.config.details[StorageDetails.AUTH_METHOD.value]
255
- size, content = generic_retrieve_from_s3(
267
+ size, fileobj = generic_retrieve_from_s3(
256
268
  storage_secrets=self.config.secrets,
257
269
  bucket_name=bucket_name,
258
- file_key=f"{self.id}/{self.file_name}",
270
+ file_key=self.file_key,
259
271
  auth_method=auth_method,
260
272
  get_content=True,
261
273
  )
262
- return size, content
274
+ return size, fileobj
263
275
 
264
276
  if self.config.type == StorageType.gcs:
265
277
  bucket_name = f"{self.config.details[StorageDetails.BUCKET.value]}"
266
278
  auth_method = self.config.details[StorageDetails.AUTH_METHOD.value]
267
279
  storage_client = get_gcs_client(auth_method, self.config.secrets)
268
280
  bucket = storage_client.bucket(bucket_name)
269
- blob = bucket.blob(f"{self.id}/{self.file_name}")
281
+ blob = bucket.blob(self.file_key)
270
282
 
271
- content = blob.download_as_bytes()
272
- return len(content), content
283
+ fileobj = BytesIO()
284
+ blob.download_to_file(fileobj)
285
+ fileobj.seek(0) # Reset pointer to beginning after download
286
+ return blob.size, fileobj
273
287
 
274
288
  if self.config.type == StorageType.local:
275
- filename = get_local_filename(f"{self.id}/{self.file_name}")
276
- with open(filename, "rb") as file:
277
- content = file.read()
278
- size = len(content)
289
+ filename = get_local_filename(self.file_key)
290
+ size = os.path.getsize(filename)
291
+ with open(filename, "rb") as fileobj:
292
+ content = BytesIO(fileobj.read())
293
+ content.seek(0) # Reset pointer to beginning
279
294
  return size, content
280
295
 
281
296
  raise ValueError(f"Unsupported storage type: {self.config.type}")
@@ -288,7 +303,7 @@ class Attachment(Base):
288
303
  generic_delete_from_s3(
289
304
  storage_secrets=self.config.secrets,
290
305
  bucket_name=bucket_name,
291
- file_key=f"{self.id}/{self.file_name}",
306
+ file_key=self.file_key,
292
307
  auth_method=auth_method,
293
308
  )
294
309
  return
@@ -307,9 +322,7 @@ class Attachment(Base):
307
322
  return
308
323
 
309
324
  if self.config.type == StorageType.local:
310
- folder_path = os.path.dirname(
311
- get_local_filename(f"{self.id}/{self.file_name}")
312
- )
325
+ folder_path = os.path.dirname(get_local_filename(self.file_key))
313
326
  if os.path.exists(folder_path):
314
327
  import shutil
315
328
 
@@ -26,6 +26,7 @@ class MonitorTaskType(Enum):
26
26
  DETECTION = "detection"
27
27
  CLASSIFICATION = "classification"
28
28
  PROMOTION = "promotion"
29
+ REMOVAL_PROMOTION = "removal_promotion"
29
30
 
30
31
 
31
32
  class MonitorTask(WorkerTask, Base):
@@ -0,0 +1,8 @@
1
+ from fides.api.models.manual_tasks.manual_task import ManualTask, ManualTaskReference
2
+ from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
3
+
4
+ __all__ = [
5
+ "ManualTask",
6
+ "ManualTaskReference",
7
+ "ManualTaskLog",
8
+ ]
@@ -0,0 +1,110 @@
1
+ from typing import Any
2
+
3
+ from sqlalchemy import Column, DateTime, ForeignKey, String
4
+ from sqlalchemy.ext.declarative import declared_attr
5
+ from sqlalchemy.orm import Session, relationship
6
+
7
+ from fides.api.db.base_class import Base
8
+ from fides.api.db.util import EnumColumn
9
+ from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
10
+ from fides.api.schemas.manual_tasks.manual_task_schemas import (
11
+ ManualTaskLogStatus,
12
+ ManualTaskParentEntityType,
13
+ ManualTaskReferenceType,
14
+ ManualTaskType,
15
+ )
16
+
17
+
18
+ class ManualTask(Base):
19
+ """Model for storing manual tasks.
20
+
21
+ This model can be used for both privacy request tasks and general tasks.
22
+ For privacy requests, it replaces the functionality of manual webhooks.
23
+ For other use cases, it provides a flexible task management system.
24
+
25
+ There can only be one ManualTask per parent entity.
26
+ You can create multiple Configs for the same ManualTask.
27
+ """
28
+
29
+ @declared_attr
30
+ def __tablename__(cls) -> str:
31
+ """Overriding base class method to set the table name."""
32
+ return "manual_task"
33
+
34
+ # Database columns
35
+ task_type = Column(
36
+ EnumColumn(ManualTaskType),
37
+ nullable=False,
38
+ default=ManualTaskType.privacy_request,
39
+ )
40
+ parent_entity_id = Column(String, nullable=False)
41
+ parent_entity_type = Column(
42
+ EnumColumn(ManualTaskParentEntityType),
43
+ nullable=False,
44
+ default=ManualTaskParentEntityType.connection_config,
45
+ )
46
+ due_date = Column(DateTime, nullable=True)
47
+
48
+ # Relationships
49
+ references = relationship(
50
+ "ManualTaskReference",
51
+ back_populates="task",
52
+ uselist=True,
53
+ cascade="all, delete-orphan",
54
+ )
55
+ logs = relationship(
56
+ "ManualTaskLog",
57
+ back_populates="task",
58
+ primaryjoin="and_(ManualTask.id == ManualTaskLog.task_id)",
59
+ viewonly=True,
60
+ order_by="ManualTaskLog.created_at",
61
+ )
62
+
63
+ # Properties
64
+ @property
65
+ def assigned_users(self) -> list[str]:
66
+ """Get all users assigned to this task."""
67
+ if not self.references:
68
+ return []
69
+ return [
70
+ ref.reference_id
71
+ for ref in self.references
72
+ if ref.reference_type == ManualTaskReferenceType.assigned_user
73
+ ]
74
+
75
+ # CRUD Operations
76
+ @classmethod
77
+ def create(
78
+ cls, db: Session, *, data: dict[str, Any], check_name: bool = True
79
+ ) -> "ManualTask":
80
+ """Create a new manual task."""
81
+ task = super().create(db=db, data=data, check_name=check_name)
82
+ ManualTaskLog.create_log(
83
+ db=db,
84
+ task_id=task.id,
85
+ status=ManualTaskLogStatus.created,
86
+ message=f"Created manual task for {data['task_type']}",
87
+ )
88
+ return task
89
+
90
+
91
+ class ManualTaskReference(Base):
92
+ """Join table to associate manual tasks with multiple references.
93
+
94
+ A single task may have many references including privacy requests, configurations, and assigned users.
95
+ """
96
+
97
+ @declared_attr
98
+ def __tablename__(cls) -> str:
99
+ """Overriding base class method to set the table name."""
100
+ return "manual_task_reference"
101
+
102
+ # Database columns
103
+ task_id = Column(
104
+ String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
105
+ )
106
+ reference_id = Column(String, nullable=False)
107
+ reference_type = Column(EnumColumn(ManualTaskReferenceType), nullable=False)
108
+
109
+ # Relationships
110
+ task = relationship("ManualTask", back_populates="references")
@@ -0,0 +1,100 @@
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:
12
+ from fides.api.models.manual_tasks.manual_task import ManualTask
13
+
14
+
15
+ class ManualTaskLog(Base):
16
+ """Model for storing manual task execution logs."""
17
+
18
+ @declared_attr
19
+ def __tablename__(cls) -> str:
20
+ """Overriding base class method to set the table name."""
21
+ return "manual_task_log"
22
+
23
+ task_id = Column(
24
+ String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
25
+ )
26
+ # TODO: Add foreign key constraints when config and instance are implemented
27
+ config_id = Column(String, nullable=True)
28
+ instance_id = Column(String, nullable=True)
29
+ status = Column(String, nullable=False)
30
+ message = Column(String, nullable=True)
31
+ details = Column(JSONB, nullable=True)
32
+
33
+ # Relationships - using string references to avoid circular imports
34
+ task = relationship("ManualTask", back_populates="logs", foreign_keys=[task_id])
35
+ # TODO: Add config and instance relationships when they are implemented
36
+ # config = relationship("ManualTaskConfig", back_populates="logs")
37
+ # instance = relationship("ManualTaskInstance", back_populates="logs")
38
+
39
+ @classmethod
40
+ def create_log(
41
+ cls,
42
+ db: Session,
43
+ status: ManualTaskLogStatus,
44
+ task_id: str,
45
+ config_id: Optional[str] = None,
46
+ instance_id: Optional[str] = None,
47
+ message: Optional[str] = None,
48
+ details: Optional[dict[str, Any]] = None,
49
+ ) -> "ManualTaskLog":
50
+ """Create a new task log entry.
51
+
52
+ Args:
53
+ db: Database session
54
+ task_id: ID of the task
55
+ status: Status of the log entry
56
+ message: Optional message describing the event
57
+ details: Optional additional details about the event
58
+ """
59
+ data = {
60
+ "task_id": task_id,
61
+ "config_id": config_id,
62
+ "instance_id": instance_id,
63
+ "status": status,
64
+ "message": message,
65
+ "details": details,
66
+ }
67
+ return cls.create(db=db, data=data)
68
+
69
+ @classmethod
70
+ def create_error_log(
71
+ cls,
72
+ db: Session,
73
+ task_id: str,
74
+ message: str,
75
+ config_id: Optional[str] = None,
76
+ instance_id: Optional[str] = None,
77
+ details: Optional[dict[str, Any]] = None,
78
+ ) -> "ManualTaskLog":
79
+ """Create a new error log entry.
80
+
81
+ Args:
82
+ db: Database session
83
+ task_id: ID of the task
84
+ message: Error message describing what went wrong
85
+ config_id: Optional ID of the configuration
86
+ instance_id: Optional ID of the instance
87
+ details: Optional additional details about the error
88
+
89
+ Returns:
90
+ The created error log entry
91
+ """
92
+ return cls.create_log(
93
+ db=db,
94
+ status=ManualTaskLogStatus.error,
95
+ task_id=task_id,
96
+ config_id=config_id,
97
+ instance_id=instance_id,
98
+ message=message,
99
+ details=details,
100
+ )