ethyca-fides 2.57.1rc0__py2.py3-none-any.whl → 2.58.0rc0__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 (299) hide show
  1. {ethyca_fides-2.57.1rc0.dist-info → ethyca_fides-2.58.0rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.57.1rc0.dist-info → ethyca_fides-2.58.0rc0.dist-info}/RECORD +245 -230
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/1d2f04ac19f2_add_page_column_to_asset_table.py +49 -0
  5. fides/api/alembic/migrations/versions/7c3fbee90c78_add_user_assigned_data_uses_and_system_.py +54 -0
  6. fides/api/alembic/migrations/versions/9a1eacd2666b_add_description_column_to_asset.py +25 -0
  7. fides/api/api/v1/endpoints/config_endpoints.py +4 -2
  8. fides/api/api/v1/endpoints/generic_overrides.py +48 -6
  9. fides/api/graph/traversal.py +8 -0
  10. fides/api/models/asset.py +37 -18
  11. fides/api/models/attachment.py +11 -13
  12. fides/api/models/comment.py +17 -17
  13. fides/api/models/connectionconfig.py +1 -1
  14. fides/api/models/detection_discovery.py +12 -0
  15. fides/api/models/location_regulation_selections.py +1 -0
  16. fides/api/models/privacy_request/__init__.py +44 -0
  17. fides/api/models/privacy_request/consent.py +155 -0
  18. fides/api/models/privacy_request/execution_log.py +108 -0
  19. fides/api/models/{privacy_request.py → privacy_request/privacy_request.py} +82 -691
  20. fides/api/models/privacy_request/provided_identity.py +149 -0
  21. fides/api/models/privacy_request/request_task.py +284 -0
  22. fides/api/models/privacy_request/webhook.py +94 -0
  23. fides/api/models/sql_models.py +28 -5
  24. fides/api/oauth/jwt.py +18 -0
  25. fides/api/oauth/utils.py +11 -11
  26. fides/api/schemas/connection_configuration/connection_secrets_datahub.py +2 -4
  27. fides/api/schemas/dataset.py +22 -2
  28. fides/api/schemas/saas/strategy_configuration.py +1 -0
  29. fides/api/service/pagination/pagination_strategy_cursor.py +15 -1
  30. fides/api/service/pagination/pagination_strategy_link.py +1 -1
  31. fides/api/service/storage/s3.py +193 -0
  32. fides/api/service/storage/util.py +10 -0
  33. fides/api/tasks/storage.py +12 -111
  34. fides/config/__init__.py +1 -1
  35. fides/data/language/languages.yml +2 -0
  36. fides/data/location/locations.yml +244 -1
  37. fides/ui-build/static/admin/404.html +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/1100-053fc6b76c65a00f.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/{1150-73440d7b319558e8.js → 1150-035a721a04f4451e.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/1376-5cea5ef9362215e8.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/{2397-7177ecf4ebe68feb.js → 2397-ee53235fb21b5e97.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{255-bf1797f78249d090.js → 255-7db55b0e3a0f9dea.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/2fbcc6de-a6c61724c327e9fa.js +8 -0
  44. fides/ui-build/static/admin/_next/static/chunks/{3086-be6b52546c3efc90.js → 3086-b5054ec2c75700b9.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/3320-5dd62a256ecfc9c3.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/355-8a77c9a1cd027f2e.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/{3855-5c7b11871f59e0e0.js → 3855-b6b7865dedd7bc2a.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/{3872-f3d5054bdc584eaa.js → 3872-4e053c20d546f027.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/4060-8d165e1236ea521a.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/4450-36234280bee624ff.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/4481-aab99ff80f707473.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/4723-0a3c5e2ce143a7d0.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/{5258-3a650be9142cf914.js → 5258-0658dc2274df6832.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/5277-e8a036319456127f.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/{5480-f5bec5e881f72f8d.js → 5480-f49696df5e8ae500.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/{5487-d96e1abc93f92631.js → 5487-3ad50d21cdbc9209.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/{5826-16e497af363a0cbc.js → 5826-e5dcb4e68cfe6289.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/5973-52aee296edc44f7e.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +4 -0
  62. fides/ui-build/static/admin/_next/static/chunks/{6315-dee79f6861c94d2d.js → 6315-fa1519cdf080f42d.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/{6372-f1b54f3cb4888660.js → 6372-ca9c12ac8902365b.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/6527-0eed08abe252a918.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/678d4732-50255cc09048e643.js +2 -0
  66. fides/ui-build/static/admin/_next/static/chunks/{6853-cacea421af3bfc26.js → 6853-8941824350c3c1a8.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/6954-3b887fb444f9228c.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/{7088.0e7c92a7cbb57562.js → 7088.eb76fca286e5f2e6.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/7453-39761c38da31257e.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/{7751-25e0c1307988ffd7.js → 7751-a8f31c062d4cb09d.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/{79-ba88d0cf4c65aaa2.js → 79-f9b948ebb186900f.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/7980-4bd08957448dea32.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/7c79804f.7a7112aece470725.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/{8433-969280d321d1c3a2.js → 8433-b3008ecaf9834e7f.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/{8499-07507004e8275df2.js → 8499-43606100edf42fdf.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/8702-d1c8296f9f6afc10.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/{5908-532dfbc9d930f635.js → 9014-eeae6f581158e645.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/{9046-80f1ea44f89fe32c.js → 9046-04bd7becea207cb1.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/905-8ab919e7b274ed50.js +8 -0
  80. fides/ui-build/static/admin/_next/static/chunks/9187-851756440f79cd75.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/9282-2bfbdca45e84e810.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/9327-2cba327d10586683.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/{9392.97b2e3327dceb7c9.js → 9392.da35a8e778812d91.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/9676.f297a1347ac09c56.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/9767-1a23925d2cb27b51.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/{9999-f2e40d5b13343220.js → 9999-637e0e5341f15f4a.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/e3251fe7-5777b5d778e6fffa.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/main-24f422f93845a596.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/{main-app-2650f704701c6a7b.js → main-app-94a0711202e08b15.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/{404-1087258931760074.js → 404-b202c0d8f6fc75c3.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/_app-99e5e46de68a1e37.js +923 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-d7f60624cbc12217.js → manual-9acaab973dfe86e2.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-18b0b521255289a3.js → multiple-ba975134a85588f8.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d258f0c25fa020bf.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-b3b4d0a98450ffd1.js → ant-poc-b9932971a479f3a7.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-64f83e9a2b777bf3.js → add-vendors-b34e5324461d0c87.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-723cc3d4f5740ea6.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-443e6dd191ce5588.js → [id]-cf51752eb0902233.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-36162d5bea29dcc2.js → new-be194737b41ccec9.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-35e9df60b21e21a6.js → privacy-experience-c946b33b0322b8ad.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-2d651499c07d12d9.js → [id]-72251b48e2e03a1e.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-36e57d2f2446be82.js → new-9611dd42856d6062.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-da37afbe5ec81339.js → privacy-notices-ea57f9d6ad17e957.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-c57b209feef7c2da.js → properties-e5748812ba055a56.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-788cf0e34829af46.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-24bef021ee71e36c.js → consent-39d65f13cc8f1cf8.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-6cbd79481199812d.js → [resourceUrn]-ac033a16f043e6f9.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-46b9790da2fec05a.js → [projectUrn]-a29850536c85d4b8.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-1f965b9c496071d1.js → projects-c44ce244122e96d5.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-e7833c1c606081a9.js → [resourceUrn]-71e26d262afcaea5.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-bed368d048ea6883.js → resources-305555b74c357bf2.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-900004e402c31797.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-1a6cff1794122ace.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-5f9ef1f99818117c.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-d001337d1bb73bd1.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-1d7936f05d23097f.js → activity-11b3ce9f61d9bfe9.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-68122dbf449a11b4.js → [resourceUrn]-054ca46a782e99a5.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-0ceaf3c555e84714.js → detection-b75dd3e4306ac18e.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-22c27fe0f898ad2a.js → [resourceUrn]-1da20aeb6fc995e4.js} +1 -1
  120. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-8f2b102e19b0b8f2.js → discovery-cad50b0cc6d1050c.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-9cd0c40bef77b120.js → datamap-8cb714cdd44ac40e.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d79551d4c64c398c.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7e5df4a0de7540bb.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-e14c1c07658f8a10.js → [datasetId]-6ba18f92ba561114.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-803c1b577ab17ae3.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-fa743ddc7f89d76b.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-0616437e1a82d3ed.js → [id]-bbe1ca2793798e6b.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-f8218440494e8532.js → new-abc17fef69cd951b.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-a78a73b65929853a.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/fides-js-docs-80b241bf6cddb72e.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/{index-94e6d589c4edf360.js → index-bfaacdb55a5a6c9f.js} +1 -1
  132. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-d4329043219fed9b.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-ef8000d7388dc915.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-6b032de0a6c2c400.js → [id]-ad02e019b2467958.js} +1 -1
  135. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-c0d6ae68ff7979c6.js → add-template-f9693cb6a0b7ded8.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-1e60754abec1ee6b.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-bbe5854b7d19b7e9.js → [id]-fe765154315782cf.js} +1 -1
  138. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-f5f7a8069909ef24.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-9f7eaad05e5b9292.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-4bad69cd42c9722c.js → configure-2987edc77388e85a.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-d85c0d16ba09ba35.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-b4c808a8a0287d11.js → [id]-94e2faa73dd6a3e6.js} +1 -1
  143. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-5a701477b006a63b.js → add-property-630a6a3dd6502ba6.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-9a1899dfe052023e.js → properties-20ca2f963906674b.js} +1 -1
  145. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-afedc48ef4e7f858.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-d073be113e9ca7b0.js → about-a49d0f84cf0cf05e.js} +1 -1
  147. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-89524101b7279f6e.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-744e7bbc200557e7.js → custom-fields-52d030b1db2ca1b9.js} +1 -1
  149. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-c5cd5fb578de9515.js → domain-records-fa42d8f18df44927.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-24cba38685dc872c.js +1 -0
  151. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-39c7ae3602ac69b2.js → email-templates-6fd6071e2009b8f2.js} +1 -1
  152. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-45e33ba111f8f8b0.js → locations-66c757325cb58467.js} +1 -1
  153. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-a08693d0d1e10bc8.js +1 -0
  154. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-94975aeab348528e.js → regulations-c6c239996cfa6ae8.js} +1 -1
  155. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-151571cff4e85894.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-82d9af34546adaa2.js → [id]-4f5a28226575c976.js} +1 -1
  157. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-c320df35d51dc537.js → systems-abd68fc5ddde5482.js} +1 -1
  158. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-181ea5b0ac975239.js → taxonomy-16b4d75c49276add.js} +1 -1
  159. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-622e16a17a11c096.js → [id]-78eaf933f755bfe8.js} +1 -1
  160. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-aa872b21bb835d34.js → user-management-6c9ad62479a7d03e.js} +1 -1
  161. fides/ui-build/static/admin/_next/static/chunks/{webpack-4df2ba5ee2d40f0a.js → webpack-2c7ccac5843c4d8e.js} +1 -1
  162. fides/ui-build/static/admin/_next/static/css/113d823fe71f6af0.css +1 -0
  163. fides/ui-build/static/admin/_next/static/css/ab65b8cc3144bfc8.css +1 -0
  164. fides/ui-build/static/admin/_next/static/ynWf-N1tY5b4O-l9uuHAq/_buildManifest.js +1 -0
  165. fides/ui-build/static/admin/_next/static/ynWf-N1tY5b4O-l9uuHAq/_ssgManifest.js +1 -0
  166. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  167. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  168. fides/ui-build/static/admin/add-systems.html +1 -1
  169. fides/ui-build/static/admin/ant-poc.html +1 -1
  170. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  171. fides/ui-build/static/admin/consent/configure.html +1 -1
  172. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  173. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  174. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  175. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  176. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  177. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  178. fides/ui-build/static/admin/consent/properties.html +1 -1
  179. fides/ui-build/static/admin/consent/reporting.html +1 -1
  180. fides/ui-build/static/admin/consent.html +1 -1
  181. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  182. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  183. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  184. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  185. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  186. fides/ui-build/static/admin/data-catalog.html +1 -1
  187. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  188. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  189. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  190. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  191. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  192. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  193. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  194. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  195. fides/ui-build/static/admin/datamap.html +1 -1
  196. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  197. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  198. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  199. fides/ui-build/static/admin/dataset/new.html +1 -1
  200. fides/ui-build/static/admin/dataset.html +1 -1
  201. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  202. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  203. fides/ui-build/static/admin/datastore-connection.html +1 -1
  204. fides/ui-build/static/admin/index.html +1 -1
  205. fides/ui-build/static/admin/integrations/[id].html +1 -1
  206. fides/ui-build/static/admin/integrations.html +1 -1
  207. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  208. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  209. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  210. fides/ui-build/static/admin/lib/fides.js +2 -2
  211. fides/ui-build/static/admin/login/[provider].html +1 -1
  212. fides/ui-build/static/admin/login.html +1 -1
  213. fides/ui-build/static/admin/messaging/[id].html +1 -1
  214. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  215. fides/ui-build/static/admin/messaging.html +1 -1
  216. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  217. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  218. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  219. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  220. fides/ui-build/static/admin/privacy-requests.html +1 -1
  221. fides/ui-build/static/admin/properties/[id].html +1 -1
  222. fides/ui-build/static/admin/properties/add-property.html +1 -1
  223. fides/ui-build/static/admin/properties.html +1 -1
  224. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  225. fides/ui-build/static/admin/settings/about.html +1 -1
  226. fides/ui-build/static/admin/settings/consent.html +1 -1
  227. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  228. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  229. fides/ui-build/static/admin/settings/domains.html +1 -1
  230. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  231. fides/ui-build/static/admin/settings/locations.html +1 -1
  232. fides/ui-build/static/admin/settings/organization.html +1 -1
  233. fides/ui-build/static/admin/settings/regulations.html +1 -1
  234. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  235. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  236. fides/ui-build/static/admin/systems.html +1 -1
  237. fides/ui-build/static/admin/taxonomy.html +1 -1
  238. fides/ui-build/static/admin/user-management/new.html +1 -1
  239. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  240. fides/ui-build/static/admin/user-management.html +1 -1
  241. fides/ui-build/static/admin/_next/static/chunks/1995-0e4fc4f7b44ed72b.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/2780-8328de94968d05e4.js +0 -4
  243. fides/ui-build/static/admin/_next/static/chunks/3005-373de16453ed7eea.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/3320-87c75df57a47487e.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/3627-fb83adac32c128e6.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/3662-420d9807c30008ab.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/3949-9888699e2ac564c4.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/3967-845c902667e47c4f.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/3e38ba78-4487e45fd4ed2479.js +0 -2
  250. fides/ui-build/static/admin/_next/static/chunks/4481-ca8d2c75d634b6bc.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/4723-81d28e5be5c7b6d7.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4833-a85bd5d25ebc40c4.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/5246-9fc6af1a6499e0a4.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/5574-a4047e826a8cd4c3.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/5834-bd9ed01c4ab2ef5c.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/5960-8895f51b30c35798.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/5973-67c7562997f7d5cb.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/6277-515c922445b8edc5.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/6954-6eb480eb132239c3.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/7044-9dc90893067f38ae.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/7980-2597c279c30fbcda.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/7c79804f.26834f883d5ad770.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/8837-cf26e5ca1ae5aaf5.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/9282-1a5a2f6f4d9ed586.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/9676.f4d5977a5f148797.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/9767-4c591bd478c72650.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/main-ce7f38a12ea8c223.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/_app-9ceff88561dc1250.js +0 -909
  269. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-136bcbd20ac59bf5.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-e11ace4f273ebb47.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-97fea4ac45093cbd.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-942d68a88b321067.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-00526324583139ab.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-f0ab51d0d5f995de.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-2220c30c3863b5a5.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-ab9bc1a3640547db.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-17ec8385bb1fa6d4.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-740824dfa6823e26.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-5541ecd2f62711a5.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-b8eaa9b9d3832b30.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-a6448ce6ba7f0cf5.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-1a6965d78bfb26b0.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-f263e6bacf0f2d19.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-b96ee3fea3920fcf.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-1b0f9469cb65abfc.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-eebd2f4ead19cfd6.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-a3fa3ad77730a03b.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4769f55b138073f7.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-775f55b3f80cd452.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-14def4ca3cc9cda5.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-21f26c0dc4d09e9f.js +0 -1
  292. fides/ui-build/static/admin/_next/static/css/957d0e4fea846ff0.css +0 -1
  293. fides/ui-build/static/admin/_next/static/rOPehh5NMs1hjog7nTw1q/_buildManifest.js +0 -1
  294. fides/ui-build/static/admin/_next/static/rOPehh5NMs1hjog7nTw1q/_ssgManifest.js +0 -1
  295. {ethyca_fides-2.57.1rc0.dist-info → ethyca_fides-2.58.0rc0.dist-info}/LICENSE +0 -0
  296. {ethyca_fides-2.57.1rc0.dist-info → ethyca_fides-2.58.0rc0.dist-info}/WHEEL +0 -0
  297. {ethyca_fides-2.57.1rc0.dist-info → ethyca_fides-2.58.0rc0.dist-info}/entry_points.txt +0 -0
  298. {ethyca_fides-2.57.1rc0.dist-info → ethyca_fides-2.58.0rc0.dist-info}/top_level.txt +0 -0
  299. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-d6717378b42982d5.js → new-be690621a944bfe2.js} +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-03-25T12:32:49-0300",
11
+ "date": "2025-03-26T15:45:28-0400",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "e52bec9197d4b3ac45f875238ec25f7af6cf5db7",
15
- "version": "2.57.1rc0"
14
+ "full-revisionid": "66a04f627fb146468d57489cd6a92628dfa3703e",
15
+ "version": "2.58.0rc0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,49 @@
1
+ """
2
+ - add page column to asset table and
3
+ - change `Browser Request` values to `Browser request` StagedResource.resource_type column
4
+ - change `Browser Request` values to `Browser request` Asset.asset_type column
5
+
6
+ Revision ID: 1d2f04ac19f2
7
+ Revises: 7c3fbee90c78
8
+ Create Date: 2025-03-17 19:36:43.016383
9
+
10
+ """
11
+
12
+ import sqlalchemy as sa
13
+ from alembic import op
14
+ from sqlalchemy.dialects import postgresql
15
+
16
+ # revision identifiers, used by Alembic.
17
+ revision = "1d2f04ac19f2"
18
+ down_revision = "7c3fbee90c78"
19
+ branch_labels = None
20
+ depends_on = None
21
+
22
+
23
+ def upgrade():
24
+ # adds page column to asset table
25
+ op.add_column(
26
+ "asset",
27
+ sa.Column("page", sa.ARRAY(sa.String()), server_default="{}", nullable=False),
28
+ )
29
+
30
+ # changes `Browser Request` values to `Browser request` in the two tables where it shows up`
31
+ op.execute(
32
+ "UPDATE stagedresource SET resource_type = 'Browser request' WHERE resource_type = 'Browser Request'"
33
+ )
34
+ op.execute(
35
+ "UPDATE asset SET asset_type = 'Browser request' WHERE asset_type = 'Browser Request'"
36
+ )
37
+
38
+
39
+ def downgrade():
40
+ # drops page column from asset table
41
+ op.drop_column("asset", "page")
42
+
43
+ # changes `Browser request` values back to `Browser Request` in the two tables where it shows up
44
+ op.execute(
45
+ "UPDATE stagedresource SET resource_type = 'Browser Request' WHERE resource_type = 'Browser request'"
46
+ )
47
+ op.execute(
48
+ "UPDATE asset SET asset_type = 'Browser Request' WHERE asset_type = 'Browser request'"
49
+ )
@@ -0,0 +1,54 @@
1
+ """add user assigned data_uses and system_id columns to stagedresource
2
+
3
+ Revision ID: 7c3fbee90c78
4
+ Revises: 9a1eacd2666b
5
+ Create Date: 2025-03-04 15:00:23.874270
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy.dialects import postgresql
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "7c3fbee90c78"
15
+ down_revision = "9a1eacd2666b"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ op.add_column(
23
+ "stagedresource",
24
+ sa.Column(
25
+ "user_assigned_system_id", sa.VARCHAR(), autoincrement=False, nullable=True
26
+ ),
27
+ )
28
+ op.add_column(
29
+ "stagedresource",
30
+ sa.Column(
31
+ "user_assigned_data_uses",
32
+ postgresql.ARRAY(sa.VARCHAR()),
33
+ server_default=sa.text("'{}'::character varying[]"),
34
+ autoincrement=False,
35
+ nullable=False,
36
+ ),
37
+ )
38
+ # ### end Alembic commands ###
39
+ op.create_index(
40
+ "ix_stagedresource_user_assigned_system_id",
41
+ "stagedresource",
42
+ ["user_assigned_system_id"],
43
+ unique=False,
44
+ )
45
+
46
+
47
+ def downgrade():
48
+ # ### commands auto generated by Alembic - please adjust! ###
49
+ op.drop_column("stagedresource", "user_assigned_data_uses")
50
+ op.drop_column("stagedresource", "user_assigned_system_id")
51
+ # ### end Alembic commands ###
52
+ op.drop_index(
53
+ "ix_stagedresource_user_assigned_system_id", table_name="stagedresource"
54
+ )
@@ -0,0 +1,25 @@
1
+ """add description column to asset
2
+
3
+ Revision ID: 9a1eacd2666b
4
+ Revises: 69ad6d844e21
5
+ Create Date: 2025-02-28 13:59:26.022822
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy.dialects import postgresql
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "9a1eacd2666b"
15
+ down_revision = "69ad6d844e21"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ op.add_column("asset", sa.Column("description", sa.String(), nullable=True))
22
+
23
+
24
+ def downgrade():
25
+ op.drop_column("asset", "description")
@@ -58,8 +58,10 @@ def patch_settings(
58
58
  Only keys provided will be updated, others will be unaffected,
59
59
  i.e. true PATCH behavior.
60
60
  """
61
-
62
- pruned_data = data.model_dump(exclude_none=True)
61
+ # We use exclude_unset=True to ensure that only the provided keys are updated.
62
+ # This is particularly useful for allowing setting a specific key to None, while
63
+ # keeping the existing values for other keys that aren't provided in the payload data.
64
+ pruned_data = data.model_dump(exclude_unset=True)
63
65
  logger.info("PATCHing application settings")
64
66
  update_config: ApplicationConfig = ApplicationConfig.update_api_set(db, pruned_data)
65
67
 
@@ -9,7 +9,7 @@ from fideslang.models import Dataset as FideslangDataset
9
9
  from pydantic import ValidationError as PydanticValidationError
10
10
  from sqlalchemy import not_, select
11
11
  from sqlalchemy.ext.asyncio import AsyncSession
12
- from sqlalchemy.orm import Session
12
+ from sqlalchemy.orm import Session, load_only
13
13
  from starlette import status
14
14
  from starlette.status import (
15
15
  HTTP_200_OK,
@@ -22,9 +22,10 @@ from fides.api.common_exceptions import KeyOrNameAlreadyExists, ValidationError
22
22
  from fides.api.db.base_class import get_key_from_data
23
23
  from fides.api.db.crud import list_resource_query
24
24
  from fides.api.db.ctl_session import get_async_db
25
- from fides.api.models.connectionconfig import ConnectionConfig
25
+ from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
26
26
  from fides.api.models.datasetconfig import DatasetConfig
27
27
  from fides.api.oauth.utils import verify_oauth_client
28
+ from fides.api.schemas.dataset import DatasetResponse
28
29
  from fides.api.schemas.filter_params import FilterParams
29
30
  from fides.api.schemas.taxonomy_extensions import (
30
31
  DataCategory,
@@ -98,6 +99,11 @@ async def create_dataset(
98
99
  else exc.message
99
100
  ),
100
101
  )
102
+ except KeyOrNameAlreadyExists as exc:
103
+ raise HTTPException(
104
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
105
+ detail=str(exc),
106
+ )
101
107
 
102
108
 
103
109
  @dataset_router.put(
@@ -133,7 +139,7 @@ async def update_dataset(
133
139
  @dataset_router.get(
134
140
  "/dataset",
135
141
  dependencies=[Security(verify_oauth_client, scopes=[CTL_DATASET_READ])],
136
- response_model=Union[Page[FideslangDataset], List[FideslangDataset]],
142
+ response_model=Union[Page[DatasetResponse], List[DatasetResponse]],
137
143
  name="List datasets (optionally paginated)",
138
144
  )
139
145
  async def list_dataset_paginated(
@@ -144,7 +150,9 @@ async def list_dataset_paginated(
144
150
  data_categories: Optional[List[str]] = Query(None),
145
151
  exclude_saas_datasets: Optional[bool] = Query(False),
146
152
  only_unlinked_datasets: Optional[bool] = Query(False),
147
- ) -> Union[Page[FideslangDataset], List[FideslangDataset]]:
153
+ connection_type: Optional[ConnectionType] = Query(None),
154
+ minimal: Optional[bool] = Query(False),
155
+ ) -> Union[Page[DatasetResponse], List[DatasetResponse]]:
148
156
  """
149
157
  Get a list of all of the Datasets.
150
158
  If any pagination parameters (size or page) are provided, then the response will be paginated.
@@ -156,6 +164,25 @@ async def list_dataset_paginated(
156
164
 
157
165
  query = select(CtlDataset)
158
166
 
167
+ if minimal:
168
+ # .options() allows us to modify how the query loads data by configuring the query's loading behavior
169
+ # load_only() optimizes the query by only loading the specified columns from the database
170
+ # This reduces memory usage and query time by not loading unnecessary columns
171
+ # The columns specified below are the minimal set needed for the DatasetResponse model
172
+ query = query.options( # type: ignore[attr-defined]
173
+ load_only(
174
+ CtlDataset.id,
175
+ CtlDataset.fides_key,
176
+ CtlDataset.organization_fides_key,
177
+ CtlDataset.name,
178
+ CtlDataset.created_at,
179
+ CtlDataset.updated_at,
180
+ CtlDataset.meta,
181
+ CtlDataset.fides_meta,
182
+ CtlDataset.description,
183
+ )
184
+ )
185
+
159
186
  # Add filters for search and data categories
160
187
  filter_params = FilterParams(search=search, data_categories=data_categories)
161
188
  filtered_query = apply_filters_to_query(
@@ -165,6 +192,13 @@ async def list_dataset_paginated(
165
192
  filter_params=filter_params,
166
193
  )
167
194
 
195
+ # If applicable, filter by connection type
196
+ if connection_type:
197
+ filtered_query = filtered_query.where(
198
+ CtlDataset.fides_meta["namespace"]["connection_type"].as_string()
199
+ == connection_type.value
200
+ )
201
+
168
202
  # If applicable, keep only unlinked datasets
169
203
  if only_unlinked_datasets:
170
204
  linked_datasets = select([DatasetConfig.ctl_dataset_id])
@@ -182,10 +216,18 @@ async def list_dataset_paginated(
182
216
  )
183
217
 
184
218
  if not page and not size:
185
- return await list_resource_query(db, filtered_query, CtlDataset)
219
+ results = await list_resource_query(db, filtered_query, CtlDataset)
220
+ response = [
221
+ DatasetResponse.model_validate(result.__dict__) for result in results
222
+ ]
223
+ return response
186
224
 
187
225
  pagination_params = Params(page=page or 1, size=size or 50)
188
- return await async_paginate(db, filtered_query, pagination_params)
226
+ results = await async_paginate(db, filtered_query, pagination_params)
227
+ results.items = [ # type: ignore[attr-defined]
228
+ DatasetResponse.model_validate(result.__dict__) for result in results.items # type: ignore[attr-defined]
229
+ ]
230
+ return results
189
231
 
190
232
 
191
233
  @dataset_router.get(
@@ -270,6 +270,14 @@ class BaseTraversal:
270
270
  [key.value for key in remaining_node_keys],
271
271
  )
272
272
 
273
+ # filter out remaining_edges if the nodes they link are allowed to remain unreachable
274
+ remaining_edges = {
275
+ edge
276
+ for edge in remaining_edges
277
+ if edge.f1.collection_address() in remaining_node_keys
278
+ and edge.f2.collection_address() in remaining_node_keys
279
+ }
280
+
273
281
  # error if there are edges that have not been visited
274
282
  if remaining_edges:
275
283
  logger.error(
fides/api/models/asset.py CHANGED
@@ -38,6 +38,8 @@ class Asset(Base):
38
38
  locations = Column(ARRAY(String), server_default="{}", nullable=False)
39
39
  with_consent = Column(BOOLEAN, default=False, nullable=False)
40
40
  data_uses = Column(ARRAY(String), server_default="{}", nullable=False)
41
+ description = Column(String, nullable=True)
42
+ page = Column(ARRAY(String), server_default="{}", nullable=False)
41
43
 
42
44
  # generic object to store additional attributes, specific to asset type
43
45
  meta = Column(
@@ -93,9 +95,11 @@ class Asset(Base):
93
95
  - asset_type
94
96
  - domain
95
97
  - base_url (if applicable)
96
- - system_id.
98
+ - system_id
99
+
100
+ If you provide the ID of an existing asset it will be updated with any provided data
97
101
  """
98
- if (
102
+ if "id" not in data and (
99
103
  "name" not in data
100
104
  or "asset_type" not in data
101
105
  or "domain" not in data
@@ -105,25 +109,40 @@ class Asset(Base):
105
109
  "name, asset_type, domain, and system_id are required fields on assets"
106
110
  )
107
111
 
108
- result = await async_session.execute(
109
- select(cls).where( # type: ignore[arg-type, call-arg]
110
- cls.name == data["name"],
111
- cls.asset_type == data["asset_type"],
112
- cls.domain == data["domain"],
113
- cls.system_id == data["system_id"],
114
- cls.base_url == data.get("base_url"),
115
- )
116
- )
117
- existing_record = result.scalars().first()
118
112
  record_id: str
119
- if existing_record:
120
- await async_session.execute(
121
- update(cls).where(cls.id == existing_record.id).values(data) # type: ignore[arg-type]
113
+
114
+ if "id" in data:
115
+ result = await async_session.execute(
116
+ select(cls).where(cls.id == data["id"]) # type: ignore[arg-type]
122
117
  )
123
- record_id = existing_record.id
118
+ existing_record = result.scalars().first()
119
+ if existing_record:
120
+ await async_session.execute(
121
+ update(cls).where(cls.id == existing_record.id).values(data) # type: ignore[arg-type]
122
+ )
123
+ record_id = existing_record.id
124
+ else:
125
+ raise ValueError(f"Asset with id {data['id']} does not exist")
124
126
  else:
125
- result = await async_session.execute(insert(cls).values(data)) # type: ignore[arg-type]
126
- record_id = result.inserted_primary_key.id
127
+ result = await async_session.execute(
128
+ select(cls).where( # type: ignore[arg-type, call-arg]
129
+ cls.name == data["name"],
130
+ cls.asset_type == data["asset_type"],
131
+ cls.domain == data["domain"],
132
+ cls.base_url == data.get("base_url"),
133
+ cls.system_id == data["system_id"],
134
+ )
135
+ )
136
+
137
+ existing_record = result.scalars().first()
138
+ if existing_record:
139
+ await async_session.execute(
140
+ update(cls).where(cls.id == existing_record.id).values(data) # type: ignore[arg-type]
141
+ )
142
+ record_id = existing_record.id
143
+ else:
144
+ result = await async_session.execute(insert(cls).values(data)) # type: ignore[arg-type]
145
+ record_id = result.inserted_primary_key.id
127
146
 
128
147
  result = await async_session.execute(select(cls).where(cls.id == record_id)) # type: ignore[arg-type]
129
148
  return result.scalars().first()
@@ -1,6 +1,6 @@
1
1
  import os
2
2
  from enum import Enum as EnumType
3
- from typing import Any, Optional
3
+ from typing import IO, Any, Optional
4
4
 
5
5
  from loguru import logger as log
6
6
  from sqlalchemy import Column
@@ -13,12 +13,14 @@ from fides.api.db.base_class import Base
13
13
  from fides.api.models.fides_user import FidesUser # pylint: disable=unused-import
14
14
  from fides.api.models.storage import StorageConfig # pylint: disable=unused-import
15
15
  from fides.api.schemas.storage.storage import StorageDetails, StorageType
16
- from fides.api.tasks.storage import (
17
- LOCAL_FIDES_UPLOAD_DIRECTORY,
16
+ from fides.api.service.storage.s3 import (
18
17
  generic_delete_from_s3,
19
18
  generic_retrieve_from_s3,
19
+ generic_upload_to_s3,
20
+ )
21
+ from fides.api.service.storage.util import (
22
+ LOCAL_FIDES_UPLOAD_DIRECTORY,
20
23
  get_local_filename,
21
- upload_to_s3,
22
24
  )
23
25
 
24
26
 
@@ -91,7 +93,6 @@ class Attachment(Base):
91
93
 
92
94
  user = relationship(
93
95
  "FidesUser",
94
- backref="attachments",
95
96
  lazy="selectin",
96
97
  uselist=False,
97
98
  )
@@ -109,18 +110,15 @@ class Attachment(Base):
109
110
  uselist=False,
110
111
  )
111
112
 
112
- def upload(self, attachment: bytes) -> None:
113
+ def upload(self, attachment: IO[bytes]) -> None:
113
114
  """Uploads an attachment to S3 or local storage."""
114
115
  if self.config.type == StorageType.s3:
115
116
  bucket_name = f"{self.config.details[StorageDetails.BUCKET.value]}"
116
117
  auth_method = self.config.details[StorageDetails.AUTH_METHOD.value]
117
- upload_to_s3(
118
+ generic_upload_to_s3(
118
119
  storage_secrets=self.config.secrets,
119
- data={},
120
120
  bucket_name=bucket_name,
121
121
  file_key=self.id,
122
- resp_format=self.config.format,
123
- privacy_request=None,
124
122
  document=attachment,
125
123
  auth_method=auth_method,
126
124
  )
@@ -130,7 +128,7 @@ class Attachment(Base):
130
128
  if self.config.type == StorageType.local:
131
129
  filename = get_local_filename(self.id)
132
130
  with open(filename, "wb") as file:
133
- file.write(attachment)
131
+ file.write(attachment.read())
134
132
  return
135
133
 
136
134
  raise ValueError(f"Unsupported storage type: {self.config.type}")
@@ -150,7 +148,7 @@ class Attachment(Base):
150
148
  if self.config.type == StorageType.local:
151
149
  filename = f"{LOCAL_FIDES_UPLOAD_DIRECTORY}/{self.id}"
152
150
  with open(filename, "rb") as file:
153
- return file.read()
151
+ return file.read(), filename
154
152
 
155
153
  raise ValueError(f"Unsupported storage type: {self.config.type}")
156
154
 
@@ -180,7 +178,7 @@ class Attachment(Base):
180
178
  db: Session,
181
179
  *,
182
180
  data: dict[str, Any],
183
- attachment_file: bytes,
181
+ attachment_file: IO[bytes],
184
182
  check_name: bool = False,
185
183
  ) -> "Attachment":
186
184
  """Creates a new attachment record in the database and uploads the attachment to S3."""
@@ -1,5 +1,5 @@
1
1
  from enum import Enum as EnumType
2
- from typing import Any
2
+ from typing import TYPE_CHECKING, Any
3
3
 
4
4
  from sqlalchemy import Column
5
5
  from sqlalchemy import Enum as EnumColumn
@@ -8,8 +8,10 @@ from sqlalchemy.ext.declarative import declared_attr
8
8
  from sqlalchemy.orm import Session, relationship
9
9
 
10
10
  from fides.api.db.base_class import Base
11
- from fides.api.models.attachment import Attachment, AttachmentReference
12
- from fides.api.models.fides_user import FidesUser # pylint: disable=unused-import
11
+
12
+ if TYPE_CHECKING:
13
+ from fides.api.models.attachment import Attachment
14
+ from fides.api.models.fides_user import FidesUser
13
15
 
14
16
 
15
17
  class CommentType(str, EnumType):
@@ -78,7 +80,6 @@ class Comment(Base):
78
80
 
79
81
  user = relationship(
80
82
  "FidesUser",
81
- backref="comments",
82
83
  lazy="selectin",
83
84
  uselist=False,
84
85
  )
@@ -90,20 +91,19 @@ class Comment(Base):
90
91
  uselist=True,
91
92
  )
92
93
 
93
- def get_attachments(self, db: Session) -> list[Attachment]:
94
- """Retrieve all attachments associated with this comment."""
95
- stmt = (
96
- db.query(Attachment)
97
- .join(
98
- AttachmentReference, Attachment.id == AttachmentReference.attachment_id
99
- )
100
- .where(AttachmentReference.reference_id == self.id)
101
- )
102
- return db.execute(stmt).scalars().all()
94
+ attachments = relationship(
95
+ "Attachment",
96
+ secondary="attachment_reference",
97
+ primaryjoin="Comment.id == AttachmentReference.reference_id",
98
+ secondaryjoin="Attachment.id == AttachmentReference.attachment_id",
99
+ order_by="Attachment.created_at",
100
+ uselist=True,
101
+ )
103
102
 
104
103
  def delete(self, db: Session) -> None:
105
104
  """Delete the comment and all associated references."""
106
- attachments = self.get_attachments(db)
107
- for attachment in attachments:
108
- attachment.delete(db)
105
+ # Delete the comment
106
+ for attachment in self.attachments:
107
+ if len(attachment.references) == 1:
108
+ attachment.delete(db)
109
109
  db.delete(self)
@@ -186,7 +186,7 @@ class ConnectionConfig(Base):
186
186
  )
187
187
  ),
188
188
  nullable=True,
189
- ) # Type bytea in the db
189
+ ) # Type bytes in the db
190
190
  last_test_timestamp = Column(DateTime(timezone=True))
191
191
  last_test_succeeded = Column(Boolean)
192
192
  disabled = Column(Boolean, server_default="f", default=False)
@@ -277,6 +277,18 @@ class StagedResource(Base):
277
277
  server_default="{}",
278
278
  default=dict,
279
279
  )
280
+ user_assigned_data_uses = Column(
281
+ ARRAY(String),
282
+ nullable=False,
283
+ server_default="{}",
284
+ default=dict,
285
+ )
286
+ user_assigned_system_id = Column(
287
+ String,
288
+ ForeignKey(System.id_field_path),
289
+ nullable=True,
290
+ index=True,
291
+ )
280
292
 
281
293
  # pointers to child and parent URNs
282
294
  children = Column(
@@ -317,6 +317,7 @@ class Location(LocationRegulationBase):
317
317
 
318
318
  belongs_to: List[str] = []
319
319
  regulation: List[str] = []
320
+ is_country: bool = False
320
321
 
321
322
 
322
323
  class LocationGroup(Location):
@@ -0,0 +1,44 @@
1
+ from .consent import Consent, ConsentRequest
2
+ from .execution_log import (
3
+ COMPLETED_EXECUTION_LOG_STATUSES,
4
+ EXITED_EXECUTION_LOG_STATUSES,
5
+ ExecutionLog,
6
+ can_run_checkpoint,
7
+ )
8
+ from .privacy_request import (
9
+ CustomPrivacyRequestField,
10
+ PrivacyRequest,
11
+ PrivacyRequestError,
12
+ PrivacyRequestNotifications,
13
+ )
14
+ from .provided_identity import ProvidedIdentity, ProvidedIdentityType
15
+ from .request_task import RequestTask, TraversalDetails
16
+ from .webhook import (
17
+ CallbackType,
18
+ SecondPartyRequestFormat,
19
+ generate_request_callback_pre_approval_jwe,
20
+ generate_request_callback_resume_jwe,
21
+ generate_request_task_callback_jwe,
22
+ )
23
+
24
+ __all__ = [
25
+ "CallbackType",
26
+ "Consent",
27
+ "ConsentRequest",
28
+ "COMPLETED_EXECUTION_LOG_STATUSES",
29
+ "EXITED_EXECUTION_LOG_STATUSES",
30
+ "CustomPrivacyRequestField",
31
+ "ExecutionLog",
32
+ "PrivacyRequest",
33
+ "PrivacyRequestError",
34
+ "PrivacyRequestNotifications",
35
+ "ProvidedIdentity",
36
+ "ProvidedIdentityType",
37
+ "RequestTask",
38
+ "SecondPartyRequestFormat",
39
+ "TraversalDetails",
40
+ "can_run_checkpoint",
41
+ "generate_request_callback_pre_approval_jwe",
42
+ "generate_request_callback_resume_jwe",
43
+ "generate_request_task_callback_jwe",
44
+ ]