ethyca-fides 2.70.2__py2.py3-none-any.whl → 2.70.3__py2.py3-none-any.whl

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

Potentially problematic release.


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

Files changed (207) hide show
  1. {ethyca_fides-2.70.2.dist-info → ethyca_fides-2.70.3.dist-info}/METADATA +3 -3
  2. {ethyca_fides-2.70.2.dist-info → ethyca_fides-2.70.3.dist-info}/RECORD +199 -205
  3. fides/_version.py +3 -3
  4. fides/api/db/crud.py +2 -30
  5. fides/api/db/database.py +1 -1
  6. fides/api/migrations/post_upgrade_index_creation.py +0 -10
  7. fides/api/models/detection_discovery/__init__.py +0 -2
  8. fides/api/models/detection_discovery/core.py +0 -11
  9. fides/api/models/manual_task/conditional_dependency.py +77 -21
  10. fides/api/models/policy.py +0 -24
  11. fides/api/models/privacy_notice.py +1 -1
  12. fides/api/models/privacy_request/privacy_request.py +0 -68
  13. fides/api/models/privacy_request/webhook.py +1 -3
  14. fides/api/oauth/roles.py +0 -2
  15. fides/api/schemas/privacy_request.py +2 -4
  16. fides/api/schemas/user.py +2 -2
  17. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +2 -2
  18. fides/api/service/storage/streaming/smart_open_streaming_storage.py +28 -36
  19. fides/api/service/storage/util.py +102 -11
  20. fides/api/task/manual/manual_task_utils.py +6 -5
  21. fides/ui-build/static/admin/404.html +1 -1
  22. fides/ui-build/static/admin/_next/static/{r0t_DqbS4N6n72z4Ct57R → -eKdE8M4rs5hZQfN84j51}/_buildManifest.js +1 -1
  23. fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +1 -0
  24. fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-0b6e114658b15eaa.js} +1 -1
  25. fides/ui-build/static/admin/_next/static/chunks/{7725-fdc4298dfbea6f80.js → 7725-dd6736855807936a.js} +1 -1
  26. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-91cae6157e6f09b5.js → _app-a4e3c999afb28ee7.js} +1 -1
  27. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b0e3f1886de28d66.js +1 -0
  28. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-9f6c82e14ff2cad2.js → [id]-8b13bb5f7bee61c6.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-ebc9c90fe99ee68d.js → integrations-6f109ef64304ef59.js} +1 -1
  30. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-f8e3f63bea43db3b.js → [id]-8566e3b7b2a632fa.js} +1 -1
  31. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  32. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  33. fides/ui-build/static/admin/add-systems.html +1 -1
  34. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  35. fides/ui-build/static/admin/consent/configure.html +1 -1
  36. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  37. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  38. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  39. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  40. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  41. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  42. fides/ui-build/static/admin/consent/properties.html +1 -1
  43. fides/ui-build/static/admin/consent/reporting.html +1 -1
  44. fides/ui-build/static/admin/consent.html +1 -1
  45. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  46. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  47. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  48. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  49. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  50. fides/ui-build/static/admin/data-catalog.html +1 -1
  51. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  52. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  53. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  54. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  55. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  56. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  57. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  58. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  59. fides/ui-build/static/admin/datamap.html +1 -1
  60. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  61. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  62. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  63. fides/ui-build/static/admin/dataset/new.html +1 -1
  64. fides/ui-build/static/admin/dataset.html +1 -1
  65. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  66. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  67. fides/ui-build/static/admin/datastore-connection.html +1 -1
  68. fides/ui-build/static/admin/index.html +1 -1
  69. fides/ui-build/static/admin/integrations/[id].html +1 -1
  70. fides/ui-build/static/admin/integrations.html +1 -1
  71. fides/ui-build/static/admin/login/[provider].html +1 -1
  72. fides/ui-build/static/admin/login.html +1 -1
  73. fides/ui-build/static/admin/messaging/[id].html +1 -1
  74. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  75. fides/ui-build/static/admin/messaging.html +1 -1
  76. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  77. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  78. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  79. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  80. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  81. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  82. fides/ui-build/static/admin/poc/forms.html +1 -1
  83. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  84. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  85. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  86. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  87. fides/ui-build/static/admin/privacy-requests.html +1 -1
  88. fides/ui-build/static/admin/properties/[id].html +1 -1
  89. fides/ui-build/static/admin/properties/add-property.html +1 -1
  90. fides/ui-build/static/admin/properties.html +1 -1
  91. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  92. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  93. fides/ui-build/static/admin/settings/about.html +1 -1
  94. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  95. fides/ui-build/static/admin/settings/consent.html +1 -1
  96. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  97. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  98. fides/ui-build/static/admin/settings/domains.html +1 -1
  99. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  100. fides/ui-build/static/admin/settings/locations.html +1 -1
  101. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
  102. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
  103. fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
  104. fides/ui-build/static/admin/settings/organization.html +1 -1
  105. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  106. fides/ui-build/static/admin/settings/regulations.html +1 -1
  107. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  108. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  109. fides/ui-build/static/admin/systems.html +1 -1
  110. fides/ui-build/static/admin/taxonomy.html +1 -1
  111. fides/ui-build/static/admin/user-management/new.html +1 -1
  112. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  113. fides/ui-build/static/admin/user-management.html +1 -1
  114. fides/api/alembic/migrations/versions/a8e0c016afd_add_classification_benchmark_table.py +0 -126
  115. fides/api/alembic/migrations/versions/cd8649be3a2b_add_classifications_and_user_assigned_.py +0 -74
  116. fides/api/db/safe_crud.py +0 -377
  117. fides/api/models/conditional_dependency/__init__.py +0 -0
  118. fides/api/models/conditional_dependency/conditional_dependency_base.py +0 -82
  119. fides/api/models/detection_discovery/classification_benchmark.py +0 -140
  120. fides/ui-build/static/admin/_next/static/chunks/155-047c3806cc41295e.js +0 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3d03cd31cd99fa07.js +0 -1
  122. {ethyca_fides-2.70.2.dist-info → ethyca_fides-2.70.3.dist-info}/WHEEL +0 -0
  123. {ethyca_fides-2.70.2.dist-info → ethyca_fides-2.70.3.dist-info}/entry_points.txt +0 -0
  124. {ethyca_fides-2.70.2.dist-info → ethyca_fides-2.70.3.dist-info}/licenses/LICENSE +0 -0
  125. {ethyca_fides-2.70.2.dist-info → ethyca_fides-2.70.3.dist-info}/top_level.txt +0 -0
  126. /fides/ui-build/static/admin/_next/static/{r0t_DqbS4N6n72z4Ct57R → -eKdE8M4rs5hZQfN84j51}/_ssgManifest.js +0 -0
  127. /fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-7888473b3dc28cda.js} +0 -0
  128. /fides/ui-build/static/admin/_next/static/chunks/{1817-dbde9966025d7970.js → 1817-ee9e29a6b8c4af50.js} +0 -0
  129. /fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-ab6212a3074f34f9.js} +0 -0
  130. /fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-c25dc8d1b0e1aee1.js} +0 -0
  131. /fides/ui-build/static/admin/_next/static/chunks/{3700-865408b36fbee782.js → 3700-dc3f05d21e2a5ff6.js} +0 -0
  132. /fides/ui-build/static/admin/_next/static/chunks/{3872-04d3afbfa41a7782.js → 3872-3514b712afd683c0.js} +0 -0
  133. /fides/ui-build/static/admin/_next/static/chunks/{4608-a9941d0c236ebca1.js → 4608-b22905c65f61db15.js} +0 -0
  134. /fides/ui-build/static/admin/_next/static/chunks/{502-d3ecae97b67befbd.js → 502-a40d39e615f7b664.js} +0 -0
  135. /fides/ui-build/static/admin/_next/static/chunks/{5185-51eaa78e3ed6bfb7.js → 5185-33f50cf9ae17b42e.js} +0 -0
  136. /fides/ui-build/static/admin/_next/static/chunks/{5574-c31ea831371610d5.js → 5574-b8c4cba5a6938c00.js} +0 -0
  137. /fides/ui-build/static/admin/_next/static/chunks/{5783-8f5713517ebc35f3.js → 5783-8de76df87af55e98.js} +0 -0
  138. /fides/ui-build/static/admin/_next/static/chunks/{6084-dc473a58c3e2889b.js → 6084-2cd165179c428a6f.js} +0 -0
  139. /fides/ui-build/static/admin/_next/static/chunks/{6416-0ccadfefcdad00cc.js → 6416-264aadc6b336ee0a.js} +0 -0
  140. /fides/ui-build/static/admin/_next/static/chunks/{6882-10296485ec326e6b.js → 6882-447f15e87b8c48a5.js} +0 -0
  141. /fides/ui-build/static/admin/_next/static/chunks/{6954-4b24e1731c1cc3b3.js → 6954-599f2de2c902e9b2.js} +0 -0
  142. /fides/ui-build/static/admin/_next/static/chunks/{7158-04745cc8d684b2e7.js → 7158-835ba42fd881d8dd.js} +0 -0
  143. /fides/ui-build/static/admin/_next/static/chunks/{7630-d0d3a0fe3f95e971.js → 7630-e7ea13be69c118a1.js} +0 -0
  144. /fides/ui-build/static/admin/_next/static/chunks/{796-876998c86754da97.js → 796-e07ac2c543f569e3.js} +0 -0
  145. /fides/ui-build/static/admin/_next/static/chunks/{8002-ed832921ad190832.js → 8002-25fd174aec9b077b.js} +0 -0
  146. /fides/ui-build/static/admin/_next/static/chunks/{9226-4a7027057f55ca2a.js → 9226-2f960b7ca530642a.js} +0 -0
  147. /fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-c02be5882205bbbc.js} +0 -0
  148. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-16ecb33f09224fbb.js → manual-939253f8daf349b2.js} +0 -0
  149. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2ca59996860a33c5.js → multiple-83ed7da0bb90b0a5.js} +0 -0
  150. /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-caff552fce501f82.js → add-systems-f90aa48500c1cbde.js} +0 -0
  151. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-46b88bda3d7b15c5.js} +0 -0
  152. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-259ad2e10fe6f413.js → configure-c0db068d1863222f.js} +0 -0
  153. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-7e78616b7b048978.js → privacy-experience-92a337ee96845af2.js} +0 -0
  154. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-9c23fbe813c997d0.js → [id]-1fd2cda8707314f6.js} +0 -0
  155. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-0e5e38bbcfe59fd2.js → new-2987e397445713c5.js} +0 -0
  156. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-3ff2fd2570f02f1c.js → privacy-notices-59a8aff5935482ec.js} +0 -0
  157. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-e5a33654a2dfaf35.js} +0 -0
  158. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-06a08970907ed3f0.js → [resourceUrn]-293c1f2d9aefb447.js} +0 -0
  159. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-4a1af12d2d7cd660.js → [projectUrn]-6a4b0d49dcbf17a8.js} +0 -0
  160. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-99573a1ee3ef8f4c.js → projects-be7b385073f22414.js} +0 -0
  161. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-4c84d952bb1db690.js → [resourceUrn]-18501152fa1e4f40.js} +0 -0
  162. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-6e429b7511028d60.js → resources-af80fdca3bbdc82f.js} +0 -0
  163. /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-56fd0f3e465e52b6.js → data-catalog-351caadeef03876a.js} +0 -0
  164. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-b74dfaf4f4126e57.js → [monitorId]-e8ec4080d9a3e22f.js} +0 -0
  165. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-040813022f0890c9.js → action-center-1554afcb8b9da2ab.js} +0 -0
  166. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-0497f3ffdb632516.js} +0 -0
  167. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-a780390da99f3e43.js} +0 -0
  168. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-65dc7f5a2ce3eae7.js → [resourceUrn]-1901c26cdde820da.js} +0 -0
  169. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-4d378516817cf00b.js → discovery-0cea22af5929c81f.js} +0 -0
  170. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-4a05303416dcb657.js → datamap-619f27c745188adb.js} +0 -0
  171. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-d4031e438c363fff.js → [...subfieldNames]-ef71f387fbbab425.js} +0 -0
  172. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-9463af37079762d0.js → [collectionName]-d790553662caf5c3.js} +0 -0
  173. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-60a4a9eb4aab4c11.js → [datasetId]-cb63db8594fe8dc1.js} +0 -0
  174. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-910e28bce6a98f3d.js → new-78e052c8f95110c4.js} +0 -0
  175. /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-108630926347724e.js → dataset-d6d7ee8bd8858a8a.js} +0 -0
  176. /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-5119e6602507157f.js → [id]-cc149157d290a94d.js} +0 -0
  177. /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cda4e7b5b888e17c.js → new-4c9fb068a5561658.js} +0 -0
  178. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-223c2d1ded51bfb1.js → datastore-connection-a832084ce294f8af.js} +0 -0
  179. /fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-269b8f81546dad66.js} +0 -0
  180. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-e8d2140787045acd.js → [id]-d8c5c03fb2f31d65.js} +0 -0
  181. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-e3f93462a08251bf.js → add-template-0e0c06e3c8aabe02.js} +0 -0
  182. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-b5f7d6afdecd013d.js → messaging-3f15804cf9625f01.js} +0 -0
  183. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-329333a88f3826eb.js → table-migration-e551fccfcaae76e7.js} +0 -0
  184. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-648d775d0fce49dc.js → storage-1b38b656807ed0cd.js} +0 -0
  185. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-b00532a0ad4f6927.js} +0 -0
  186. /fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-1eeb320867dbebf4.js → privacy-requests-2c82cf73d20416f2.js} +0 -0
  187. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-322a01e2bceab3fb.js} +0 -0
  188. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-777ed2d73812043d.js} +0 -0
  189. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-1ae1257f5b388924.js → consent-55e36839d219a503.js} +0 -0
  190. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-c2f1376aca192114.js → custom-fields-26ce8fc493993765.js} +0 -0
  191. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-586505df9d853f1f.js → domain-records-7ddf9d992fe714a6.js} +0 -0
  192. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-a3275554ffe8e640.js → domains-7c78ae51f0dd7102.js} +0 -0
  193. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-05ffbda19ab894b9.js} +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-77fb85bdd0be42b5.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-8df31428446a6a96.js → [key]-b0d93bf478bf63ee.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-af1471bf4571d5d3.js → new-084f9756b9987285.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{messaging-providers-8d92be437793c96f.js → messaging-providers-6c51ffd46bb598e7.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-44456bfe54ac4ad5.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-8cbdfd08e0fa88fb.js → privacy-requests-fbe7e8030d837aed.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-2866ac99faa5a542.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-2deb6becece69d46.js → test-datasets-a86bafe1b4e1205f.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-589952aa1a31c33d.js → [id]-1895c6a13b543436.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/chunks/pages/{systems-916238dcc0596957.js → systems-d266cc062b56beb2.js} +0 -0
  204. /fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-616f5a7cbb99e46d.js → taxonomy-07848c232d960f6a.js} +0 -0
  205. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-6304dad2c5fab694.js} +0 -0
  206. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-ff4711db191099cd.js} +0 -0
  207. /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-82fcf1151e2fe2ba.js} +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-09-19T17:26:35-0700",
11
+ "date": "2025-09-19T20:10:22-0700",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "fe651d7445cf98722c20b976cf2ebf8b4807527e",
15
- "version": "2.70.2"
14
+ "full-revisionid": "0da25ea6ae44ca2dc4211c18b4d0bc24b6aee66b",
15
+ "version": "2.70.3"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
fides/api/db/crud.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """
2
- DEPRECATED: This module uses manual transaction handling which can
3
- lead to unexpected behavior. Use fides.api.db.safe_crud instead.
2
+ Contains all of the generic CRUD endpoints that can be
3
+ generated programmatically for each resource.
4
4
  """
5
5
 
6
6
  from collections import defaultdict
@@ -18,7 +18,6 @@ from sqlalchemy.ext.asyncio import AsyncSession
18
18
  from sqlalchemy.future import select
19
19
  from sqlalchemy.sql import Select
20
20
  from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
21
- from typing_extensions import deprecated
22
21
 
23
22
  from fides.api.models.sql_models import ( # type: ignore[attr-defined]
24
23
  CustomField,
@@ -33,9 +32,6 @@ T = TypeVar("T", bound="FidesBase")
33
32
 
34
33
 
35
34
  # CRUD Functions
36
- @deprecated(
37
- "This function uses a manual session.begin() which can lead to unexpected transaction handling. Use create_resource from safe_crud instead."
38
- )
39
35
  async def create_resource(
40
36
  sql_model: Type[T], resource_dict: Dict, async_session: AsyncSession
41
37
  ) -> T:
@@ -70,9 +66,6 @@ async def create_resource(
70
66
  return await get_resource(sql_model, resource_dict["fides_key"], async_session)
71
67
 
72
68
 
73
- @deprecated(
74
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use get_custom_fields_filtered from safe_crud instead."
75
- )
76
69
  async def get_custom_fields_filtered(
77
70
  async_session: AsyncSession,
78
71
  resource_types_to_ids: Dict[ResourceTypes, List[str]] = defaultdict(list),
@@ -118,9 +111,6 @@ async def get_custom_fields_filtered(
118
111
  raise sa_error
119
112
 
120
113
 
121
- @deprecated(
122
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use get_resource from safe_crud instead."
123
- )
124
114
  async def get_resource(
125
115
  sql_model: Type[T],
126
116
  fides_key: str,
@@ -152,9 +142,6 @@ async def get_resource(
152
142
  return sql_resource
153
143
 
154
144
 
155
- @deprecated(
156
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use get_resource_with_custom_fields from safe_crud instead."
157
- )
158
145
  async def get_resource_with_custom_fields(
159
146
  sql_model: Type[T], fides_key: str, async_session: AsyncSession
160
147
  ) -> Dict[str, Any]:
@@ -206,9 +193,6 @@ async def get_resource_with_custom_fields(
206
193
  return resource_dict
207
194
 
208
195
 
209
- @deprecated(
210
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use list_resource from safe_crud instead."
211
- )
212
196
  async def list_resource(sql_model: Type[T], async_session: AsyncSession) -> List[T]:
213
197
  """
214
198
  Get a list of all of the resources of this type from the database.
@@ -219,9 +203,6 @@ async def list_resource(sql_model: Type[T], async_session: AsyncSession) -> List
219
203
  return await list_resource_query(async_session, query, sql_model)
220
204
 
221
205
 
222
- @deprecated(
223
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use list_resource_query from safe_crud instead."
224
- )
225
206
  async def list_resource_query(
226
207
  async_session: AsyncSession, query: Select, sql_model: Type[T]
227
208
  ) -> List[T]:
@@ -244,9 +225,6 @@ async def list_resource_query(
244
225
  return sql_resources
245
226
 
246
227
 
247
- @deprecated(
248
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use update_resource from safe_crud instead."
249
- )
250
228
  async def update_resource(
251
229
  sql_model: Type[T], resource_dict: Dict, async_session: AsyncSession
252
230
  ) -> Dict:
@@ -273,9 +251,6 @@ async def update_resource(
273
251
  return await get_resource(sql_model, resource_dict["fides_key"], async_session)
274
252
 
275
253
 
276
- @deprecated(
277
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use upsert_resources from safe_crud instead."
278
- )
279
254
  async def upsert_resources(
280
255
  sql_model: Type[T], resource_dicts: List[Dict], async_session: AsyncSession
281
256
  ) -> Tuple[int, int]:
@@ -325,9 +300,6 @@ async def upsert_resources(
325
300
  raise sa_error
326
301
 
327
302
 
328
- @deprecated(
329
- "This function uses manual session.begin() which can lead to unexpected transaction handling. Use delete_resource from safe_crud instead."
330
- )
331
303
  async def delete_resource(
332
304
  sql_model: Type[T], fides_key: str, async_session: AsyncSession
333
305
  ) -> T:
fides/api/db/database.py CHANGED
@@ -159,5 +159,5 @@ def check_missing_migrations(database_url: str) -> None:
159
159
  result = command.autogen.compare_metadata(migration_context, Base.metadata) # type: ignore[attr-defined]
160
160
 
161
161
  if result:
162
- raise SystemExit("Migration needs to be generated!")
162
+ raise SystemExit("Migrations needs to be generated!")
163
163
  print("No migrations need to be generated.")
@@ -153,16 +153,6 @@ TABLE_OBJECT_MAP: Dict[str, List[Dict[str, str]]] = {
153
153
  "statement": "CREATE INDEX CONCURRENTLY ix_stagedresource_system_vendor_consent ON stagedresource (system_id, vendor_id, (meta->>'consent_aggregated'))",
154
154
  "type": "index",
155
155
  },
156
- {
157
- "name": "idx_stagedresource_user_categories_gin",
158
- "statement": "CREATE INDEX CONCURRENTLY idx_stagedresource_user_categories_gin ON stagedresource USING GIN (user_assigned_data_categories)",
159
- "type": "index",
160
- },
161
- {
162
- "name": "idx_stagedresource_classifications_gin",
163
- "statement": "CREATE INDEX CONCURRENTLY idx_stagedresource_classifications_gin ON stagedresource USING GIN (classifications)",
164
- "type": "index",
165
- },
166
156
  ],
167
157
  }
168
158
 
@@ -1,4 +1,3 @@
1
- from .classification_benchmark import ClassificationBenchmark
2
1
  from .core import (
3
2
  DiffStatus,
4
3
  MonitorConfig,
@@ -19,7 +18,6 @@ from .monitor_task import (
19
18
  )
20
19
 
21
20
  __all__ = [
22
- "ClassificationBenchmark",
23
21
  "DiffStatus",
24
22
  "MonitorConfig",
25
23
  "MonitorExecution",
@@ -599,17 +599,6 @@ class StagedResource(Base):
599
599
  "vendor_id",
600
600
  text("(meta->>'consent_aggregated')"),
601
601
  ),
602
- # GIN indices for array operations (&&, @>, <@)
603
- Index(
604
- "idx_stagedresource_classifications_gin",
605
- "classifications",
606
- postgresql_using="gin",
607
- ),
608
- Index(
609
- "idx_stagedresource_user_categories_gin",
610
- "user_assigned_data_categories",
611
- postgresql_using="gin",
612
- ),
613
602
  )
614
603
 
615
604
  @classmethod
@@ -1,14 +1,13 @@
1
- from typing import TYPE_CHECKING, Any, Optional, Union
1
+ from enum import Enum
2
+ from typing import TYPE_CHECKING, Optional, Union
2
3
 
3
- from sqlalchemy import Column, ForeignKey, Index, String
4
+ from sqlalchemy import Column, ForeignKey, Index, Integer, String
5
+ from sqlalchemy.dialects.postgresql import JSONB
4
6
  from sqlalchemy.ext.declarative import declared_attr
5
7
  from sqlalchemy.orm import Session, relationship
6
8
 
7
- from fides.api.db.base_class import FidesBase
8
- from fides.api.models.conditional_dependency.conditional_dependency_base import (
9
- ConditionalDependencyBase,
10
- ConditionalDependencyType,
11
- )
9
+ from fides.api.db.base_class import Base, FidesBase
10
+ from fides.api.db.util import EnumColumn
12
11
  from fides.api.task.conditional_dependencies.schemas import (
13
12
  ConditionGroup,
14
13
  ConditionLeaf,
@@ -18,16 +17,42 @@ if TYPE_CHECKING:
18
17
  from fides.api.models.manual_task.manual_task import ManualTask
19
18
 
20
19
 
21
- class ManualTaskConditionalDependency(ConditionalDependencyBase):
22
- """Manual task conditional dependencies - single type hierarchy."""
20
+ class ManualTaskConditionalDependencyType(str, Enum):
21
+ """Enum for manual task conditional dependency types.
22
+
23
+ This enum defines the two types of nodes in a conditional dependency tree:
24
+
25
+ - leaf: A terminal node that represents a single condition (e.g., "user.age >= 18")
26
+ - group: A non-terminal node that groups multiple conditions with logical operators (AND/OR)
27
+
28
+ Examples:
29
+ leaf: Used for simple field comparisons like:
30
+ - "user.name exists"
31
+ - "user.age >= 18"
32
+ - "billing.subscription.status == 'active'"
33
+
34
+ group: Used to combine multiple conditions with logical operators:
35
+ - AND group: "user.age >= 18 AND user.active == true"
36
+ - OR group: "user.role == 'admin' OR user.verified == true"
37
+ - Nested groups: "(user.age >= 18 AND (user.role == 'admin' OR user.verified == true))"
38
+ """
39
+
40
+ leaf = "leaf"
41
+ group = "group"
42
+
43
+
44
+ class ManualTaskConditionalDependency(Base):
45
+ """Model for storing conditional dependencies."""
23
46
 
24
47
  @declared_attr
25
48
  def __tablename__(cls) -> str:
49
+ """Overriding base class method to set the table name."""
26
50
  return "manual_task_conditional_dependency"
27
51
 
28
52
  # We need to redefine it here so that self-referential relationships
29
53
  # can properly reference the `id` column instead of the built-in Python function.
30
54
  id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
55
+
31
56
  # Foreign key relationships
32
57
  manual_task_id = Column(
33
58
  String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
@@ -38,6 +63,18 @@ class ManualTaskConditionalDependency(ConditionalDependencyBase):
38
63
  nullable=True,
39
64
  )
40
65
 
66
+ # Condition metadata
67
+ condition_type = Column(
68
+ EnumColumn(ManualTaskConditionalDependencyType), nullable=False
69
+ ) # leaf or group
70
+ field_address = Column(String, nullable=True) # For leaf conditions
71
+ operator = Column(String, nullable=True) # For leaf conditions
72
+ value = Column(JSONB, nullable=True) # For leaf conditions
73
+ logical_operator = Column(String, nullable=True) # 'and' or 'or' for groups
74
+
75
+ # Ordering
76
+ sort_order = Column(Integer, nullable=False, default=0)
77
+
41
78
  __table_args__ = (
42
79
  Index("ix_manual_task_conditional_dependency_manual_task_id", "manual_task_id"),
43
80
  Index("ix_manual_task_conditional_dependency_parent_id", "parent_id"),
@@ -60,20 +97,38 @@ class ManualTaskConditionalDependency(ConditionalDependencyBase):
60
97
  foreign_keys=[parent_id],
61
98
  )
62
99
 
100
+ def to_condition_leaf(self) -> ConditionLeaf:
101
+ """Convert to ConditionLeaf if this is a leaf condition"""
102
+ if self.condition_type != "leaf":
103
+ raise ValueError("Cannot convert group condition to leaf")
104
+
105
+ return ConditionLeaf(
106
+ field_address=self.field_address, operator=self.operator, value=self.value
107
+ )
108
+
109
+ def to_condition_group(self) -> ConditionGroup:
110
+ """Convert to ConditionGroup if this is a group condition"""
111
+ if self.condition_type != "group":
112
+ raise ValueError("Cannot convert leaf condition to group")
113
+
114
+ # Recursively build children
115
+ child_conditions = []
116
+ children_list = [child for child in self.children] # type: ignore[attr-defined]
117
+ for child in sorted(children_list, key=lambda x: x.sort_order):
118
+ if child.condition_type == "leaf":
119
+ child_conditions.append(child.to_condition_leaf())
120
+ else:
121
+ child_conditions.append(child.to_condition_group())
122
+
123
+ return ConditionGroup(
124
+ logical_operator=self.logical_operator, conditions=child_conditions
125
+ )
126
+
63
127
  @classmethod
64
128
  def get_root_condition(
65
- cls, db: Session, *args: Any, **kwargs: Any
129
+ cls, db: Session, manual_task_id: str
66
130
  ) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
67
- """Get the root condition for a manual task
68
-
69
- Args:
70
- db: Database session
71
- manual_task_id: ID of the manual task (first positional arg)
72
- """
73
- if not args:
74
- raise ValueError("manual_task_id is required as first positional argument")
75
-
76
- manual_task_id = args[0]
131
+ """Get the root condition for a config"""
77
132
  root = (
78
133
  db.query(cls)
79
134
  .filter(cls.manual_task_id == manual_task_id, cls.parent_id.is_(None))
@@ -83,6 +138,7 @@ class ManualTaskConditionalDependency(ConditionalDependencyBase):
83
138
  if not root:
84
139
  return None
85
140
 
86
- if root.condition_type == ConditionalDependencyType.leaf:
141
+ if root.condition_type == "leaf":
87
142
  return root.to_condition_leaf()
143
+
88
144
  return root.to_condition_group()
@@ -177,30 +177,6 @@ class Policy(Base):
177
177
  for category in node.get_data_categories()
178
178
  )
179
179
 
180
- def to_safe_dict(self) -> Dict[str, Any]:
181
- """
182
- Returns a dictionary representation of the Policy, excluding sensitive information.
183
- """
184
- return {
185
- "id": self.id,
186
- "name": self.name,
187
- "key": self.key,
188
- "drp_action": self.drp_action.value if self.drp_action else None, # type: ignore[attr-defined]
189
- "execution_timeframe": self.execution_timeframe,
190
- "client_id": self.client_id,
191
- "rules": [
192
- {
193
- "id": rule.id,
194
- "name": rule.name,
195
- "key": rule.key,
196
- "action_type": rule.action_type.value,
197
- "masking_strategy": rule.masking_strategy,
198
- "storage_destination_id": rule.storage_destination_id,
199
- }
200
- for rule in self.rules # type: ignore[attr-defined]
201
- ],
202
- }
203
-
204
180
 
205
181
  def _get_ref_from_taxonomy(
206
182
  fides_key: FidesKey,
@@ -41,7 +41,7 @@ class UserConsentPreference(Enum):
41
41
  tcf = "tcf" # Overall preference set for TCF where there are numerous preferences under the single notice
42
42
 
43
43
 
44
- class ConsentMechanism(str, Enum):
44
+ class ConsentMechanism(Enum):
45
45
  """
46
46
  Enum is not formalized in the DB because it may be subject to frequent change
47
47
  """
@@ -261,12 +261,6 @@ class PrivacyRequest(
261
261
  foreign_keys=[reviewed_by],
262
262
  )
263
263
 
264
- submitter = relationship(
265
- FidesUser,
266
- backref=backref("submitted_privacy_requests", passive_deletes=True),
267
- foreign_keys=[submitted_by],
268
- )
269
-
270
264
  pre_approval_webhook_replies = relationship(
271
265
  PreApprovalWebhookReply,
272
266
  back_populates="privacy_request",
@@ -361,64 +355,6 @@ class PrivacyRequest(
361
355
 
362
356
  return super().create(db=db, data=data, check_name=check_name)
363
357
 
364
- def to_safe_dict(self) -> Dict[str, Any]:
365
- """
366
- Return a dict representation of the PrivacyRequest, excluding any fields
367
- that may contain sensitive information.
368
- """
369
- return {
370
- "id": self.id,
371
- "external_id": self.external_id,
372
- "status": self.status.value,
373
- "requested_at": (
374
- self.requested_at.isoformat() if self.requested_at else None
375
- ),
376
- "started_processing_at": (
377
- self.started_processing_at.isoformat()
378
- if self.started_processing_at
379
- else None
380
- ),
381
- "finished_processing_at": (
382
- self.finished_processing_at.isoformat()
383
- if self.finished_processing_at
384
- else None
385
- ),
386
- "reviewed_at": self.reviewed_at.isoformat() if self.reviewed_at else None,
387
- "reviewed_by": self.reviewed_by,
388
- "finalized_at": (
389
- self.finalized_at.isoformat() if self.finalized_at else None
390
- ),
391
- "finalized_by": self.finalized_by,
392
- "submitted_by": self.submitted_by,
393
- "custom_privacy_request_fields_approved_by": (
394
- self.custom_privacy_request_fields_approved_by
395
- ),
396
- "identity_verified_at": (
397
- self.identity_verified_at.isoformat()
398
- if self.identity_verified_at
399
- else None
400
- ),
401
- "custom_privacy_request_fields_approved_at": (
402
- self.custom_privacy_request_fields_approved_at.isoformat()
403
- if self.custom_privacy_request_fields_approved_at
404
- else None
405
- ),
406
- "client_id": self.client_id,
407
- "origin": self.origin,
408
- "policy_id": self.policy_id,
409
- "policy": self.policy.to_safe_dict() if self.policy else None,
410
- "property_id": self.property_id,
411
- "cancel_reason": self.cancel_reason,
412
- "canceled_at": self.canceled_at.isoformat() if self.canceled_at else None,
413
- "consent_preferences": self.consent_preferences,
414
- "source": self.source.value if self.source else None,
415
- "paused_at": self.paused_at.isoformat() if self.paused_at else None,
416
- "due_date": self.due_date.isoformat() if self.due_date else None,
417
- "days_left": self.days_left,
418
- "custom_fields": self.get_persisted_custom_privacy_request_fields() if self.custom_fields else None, # type: ignore[attr-defined]
419
- "location": self.location,
420
- }
421
-
422
358
  def clear_cached_values(self) -> None:
423
359
  """
424
360
  Clears all cached values associated with this privacy request from Redis.
@@ -967,8 +903,6 @@ class PrivacyRequest(
967
903
  callback_type=CallbackType.pre_approval,
968
904
  identity=self.get_cached_identity_data(),
969
905
  policy_action=policy_action,
970
- privacy_request=self.to_safe_dict(),
971
- timestamp=datetime.utcnow(),
972
906
  )
973
907
  headers = {
974
908
  "reply-to-approve": f"/privacy-request/{self.id}/pre-approve/eligible",
@@ -1009,8 +943,6 @@ class PrivacyRequest(
1009
943
  callback_type=webhook.prefix,
1010
944
  identity=self.get_cached_identity_data(),
1011
945
  policy_action=policy_action,
1012
- privacy_request=self.to_safe_dict(),
1013
- timestamp=datetime.utcnow(),
1014
946
  )
1015
947
 
1016
948
  headers = {}
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import json
6
6
  from datetime import datetime
7
7
  from enum import Enum as EnumType
8
- from typing import Any, Dict, Optional
8
+ from typing import Optional
9
9
 
10
10
  from pydantic import BaseModel, ConfigDict
11
11
 
@@ -51,8 +51,6 @@ class SecondPartyRequestFormat(BaseModel):
51
51
  identity: Identity
52
52
  policy_action: Optional[ActionType] = None
53
53
  model_config = ConfigDict(use_enum_values=True)
54
- privacy_request: Dict[str, Any]
55
- timestamp: datetime
56
54
 
57
55
 
58
56
  def generate_request_callback_resume_jwe(webhook: PolicyPreWebhook) -> str:
fides/api/oauth/roles.py CHANGED
@@ -26,7 +26,6 @@ from fides.common.api.scope_registry import (
26
26
  PRIVACY_EXPERIENCE_READ,
27
27
  PRIVACY_NOTICE_READ,
28
28
  PRIVACY_REQUEST_CALLBACK_RESUME,
29
- PRIVACY_REQUEST_CREATE,
30
29
  PRIVACY_REQUEST_DELETE,
31
30
  PRIVACY_REQUEST_EMAIL_INTEGRATIONS_SEND,
32
31
  PRIVACY_REQUEST_MANUAL_STEPS_RESPOND,
@@ -89,7 +88,6 @@ approver_scopes = [
89
88
  PRIVACY_REQUEST_UPLOAD_DATA,
90
89
  PRIVACY_REQUEST_VIEW_DATA,
91
90
  PRIVACY_REQUEST_DELETE,
92
- PRIVACY_REQUEST_CREATE, # allows approvers to create new privacy requests
93
91
  USER_READ, # allows approver to view user management table and update their own password
94
92
  PRIVACY_REQUEST_MANUAL_STEPS_REVIEW, # allows approvers to see all manual steps
95
93
  ]
@@ -14,7 +14,7 @@ from fides.api.schemas.base_class import FidesSchema
14
14
  from fides.api.schemas.policy import ActionType, CurrentStep
15
15
  from fides.api.schemas.policy import PolicyResponse as PolicySchema
16
16
  from fides.api.schemas.redis_cache import CustomPrivacyRequestField, Identity
17
- from fides.api.schemas.user import PrivacyRequestUser
17
+ from fides.api.schemas.user import PrivacyRequestReviewer
18
18
  from fides.api.util.collection_util import Row
19
19
  from fides.api.util.encryption.aes_gcm_encryption_scheme import verify_encryption_key
20
20
  from fides.api.util.enums import ColumnSort
@@ -316,9 +316,7 @@ class PrivacyRequestResponse(FidesSchema):
316
316
  started_processing_at: Optional[datetime] = None
317
317
  reviewed_at: Optional[datetime] = None
318
318
  reviewed_by: Optional[str] = None
319
- submitted_by: Optional[str] = None
320
- reviewer: Optional[PrivacyRequestUser] = None
321
- submitter: Optional[PrivacyRequestUser] = None
319
+ reviewer: Optional[PrivacyRequestReviewer] = None
322
320
  finished_processing_at: Optional[datetime] = None
323
321
  identity_verified_at: Optional[datetime] = None
324
322
  paused_at: Optional[datetime] = None
fides/api/schemas/user.py CHANGED
@@ -10,8 +10,8 @@ from fides.api.schemas.base_class import FidesSchema
10
10
  from fides.api.schemas.oauth import AccessToken
11
11
 
12
12
 
13
- class PrivacyRequestUser(FidesSchema):
14
- """Data we can expose via PrivacyRequest user relations (reviewer, submitter, etc.)"""
13
+ class PrivacyRequestReviewer(FidesSchema):
14
+ """Data we can expose via the PrivacyRequest.reviewer relation"""
15
15
 
16
16
  id: str
17
17
  username: str
@@ -26,7 +26,7 @@ from fides.api.service.storage.util import (
26
26
  is_attachment_field,
27
27
  process_attachment_naming,
28
28
  process_attachments_contextually,
29
- resolve_path_from_context,
29
+ resolve_directory_from_context,
30
30
  )
31
31
  from fides.api.util.storage_util import StorageJSONEncoder, format_size
32
32
  from fides.config import CONFIG
@@ -226,7 +226,7 @@ class DSRReportBuilder:
226
226
  file_size = format_attachment_size(attachment.get("file_size"))
227
227
 
228
228
  # Determine the actual directory for this attachment based on its context
229
- actual_directory = resolve_path_from_context(attachment, directory)
229
+ actual_directory = resolve_directory_from_context(attachment, directory)
230
230
 
231
231
  # Generate attachment URL using shared utility with actual storage path
232
232
  download_url = attachment.get("download_url")