ethyca-fides 2.70.4b0__py2.py3-none-any.whl → 2.70.4rc0__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.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/METADATA +3 -3
  2. {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.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 +26 -6
  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/{gAyR6aUQCeUTA_oMVYpBp → FsUI1o1jlJ3c5YMu0fXdv}/_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-de41f80e35acbde0.js → _app-cbfaf762a0d853be.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.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/WHEEL +0 -0
  123. {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/entry_points.txt +0 -0
  124. {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/licenses/LICENSE +0 -0
  125. {ethyca_fides-2.70.4b0.dist-info → ethyca_fides-2.70.4rc0.dist-info}/top_level.txt +0 -0
  126. /fides/ui-build/static/admin/_next/static/{gAyR6aUQCeUTA_oMVYpBp → FsUI1o1jlJ3c5YMu0fXdv}/_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
@@ -1,126 +0,0 @@
1
- """Add classification benchmark table
2
-
3
- Revision ID: a8e0c016afd
4
- Revises: 4d8c0fcc5771
5
- Create Date: 2024-12-19 12:00:00.000000
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 = "a8e0c016afd"
15
- down_revision = "4d8c0fcc5771"
16
- branch_labels = None
17
- depends_on = None
18
-
19
-
20
- def upgrade():
21
- # ### commands auto generated by Alembic - please adjust! ###
22
- op.create_table(
23
- "classification_benchmark",
24
- sa.Column("id", sa.String(length=255), nullable=False),
25
- sa.Column(
26
- "created_at",
27
- sa.DateTime(timezone=True),
28
- server_default=sa.text("now()"),
29
- nullable=True,
30
- ),
31
- sa.Column(
32
- "updated_at",
33
- sa.DateTime(timezone=True),
34
- server_default=sa.text("now()"),
35
- nullable=True,
36
- ),
37
- sa.Column(
38
- "monitor_config_key",
39
- sa.String(),
40
- sa.ForeignKey("monitorconfig.key", ondelete="CASCADE"),
41
- nullable=False,
42
- ),
43
- sa.Column(
44
- "dataset_fides_key",
45
- sa.String(),
46
- sa.ForeignKey("ctl_datasets.fides_key", ondelete="CASCADE"),
47
- nullable=False,
48
- ),
49
- sa.Column(
50
- "resource_urns",
51
- postgresql.ARRAY(sa.String()),
52
- nullable=False,
53
- server_default="{}",
54
- ),
55
- sa.Column(
56
- "overall_metrics",
57
- postgresql.JSONB(astext_type=sa.Text()),
58
- nullable=True,
59
- server_default=None,
60
- ),
61
- sa.Column(
62
- "field_accuracy_details",
63
- postgresql.ARRAY(postgresql.JSONB(astext_type=sa.Text())),
64
- nullable=False,
65
- server_default="{}",
66
- ),
67
- sa.Column(
68
- "status",
69
- sa.String(length=50),
70
- nullable=False,
71
- server_default="pending",
72
- ),
73
- sa.Column(
74
- "messages",
75
- postgresql.ARRAY(sa.String()),
76
- nullable=False,
77
- server_default="{}",
78
- ),
79
- sa.PrimaryKeyConstraint("id"),
80
- )
81
- op.create_index(
82
- op.f("ix_classification_benchmark_id"),
83
- "classification_benchmark",
84
- ["id"],
85
- unique=False,
86
- )
87
- op.create_index(
88
- op.f("ix_classification_benchmark_monitor_config_key"),
89
- "classification_benchmark",
90
- ["monitor_config_key"],
91
- unique=False,
92
- )
93
- op.create_index(
94
- op.f("ix_classification_benchmark_dataset_fides_key"),
95
- "classification_benchmark",
96
- ["dataset_fides_key"],
97
- unique=False,
98
- )
99
- op.create_index(
100
- op.f("ix_classification_benchmark_status"),
101
- "classification_benchmark",
102
- ["status"],
103
- unique=False,
104
- )
105
- # ### end Alembic commands ###
106
-
107
-
108
- def downgrade():
109
- # ### commands auto generated by Alembic - please adjust! ###
110
- op.drop_index(
111
- op.f("ix_classification_benchmark_status"),
112
- table_name="classification_benchmark",
113
- )
114
- op.drop_index(
115
- op.f("ix_classification_benchmark_dataset_fides_key"),
116
- table_name="classification_benchmark",
117
- )
118
- op.drop_index(
119
- op.f("ix_classification_benchmark_monitor_config_key"),
120
- table_name="classification_benchmark",
121
- )
122
- op.drop_index(
123
- op.f("ix_classification_benchmark_id"), table_name="classification_benchmark"
124
- )
125
- op.drop_table("classification_benchmark")
126
- # ### end Alembic commands ###
@@ -1,74 +0,0 @@
1
- """add classifications and user_assigned_data_categories indices
2
-
3
- Revision ID: cd8649be3a2b
4
- Revises: a8e0c016afd
5
- Create Date: 2025-09-19 13:49:02.762672
6
-
7
- """
8
-
9
- import sqlalchemy as sa
10
- from alembic import op
11
- from loguru import logger
12
-
13
- # revision identifiers, used by Alembic.
14
- revision = "cd8649be3a2b"
15
- down_revision = "a8e0c016afd"
16
- branch_labels = None
17
- depends_on = None
18
-
19
- """
20
- WARNING - Conditional migration based on table size
21
- """
22
-
23
-
24
- def upgrade():
25
- # Check stagedresource table size
26
- connection = op.get_bind()
27
-
28
- # Check stagedresource table size to decide if we should create indexes immediately
29
- table_size = connection.execute(
30
- sa.text("SELECT COUNT(*) FROM stagedresource")
31
- ).scalar()
32
-
33
- if table_size < 1000000:
34
- logger.info(
35
- f"stagedresource table has {table_size} rows, creating GIN indices directly"
36
- )
37
-
38
- # Create GIN index for user_assigned_data_categories array operations (&&, @>, <@)
39
- op.execute(
40
- "CREATE INDEX idx_stagedresource_user_categories_gin "
41
- "ON stagedresource USING GIN (user_assigned_data_categories)"
42
- )
43
-
44
- # Create GIN index for classifications array operations (&&, @>, <@)
45
- op.execute(
46
- "CREATE INDEX idx_stagedresource_classifications_gin "
47
- "ON stagedresource USING GIN (classifications)"
48
- )
49
-
50
- logger.info("GIN indices created successfully")
51
-
52
- else:
53
- logger.warning(
54
- "The stagedresource table has more than 1 million rows, "
55
- "skipping index creation. Indexes will be created during application startup "
56
- "via post_upgrade_index_creation.py"
57
- )
58
-
59
-
60
- def downgrade():
61
- # Drop indices in reverse order
62
- logger.info("Dropping GIN indices for stagedresource arrays")
63
-
64
- try:
65
- op.drop_index("idx_stagedresource_classifications_gin", "stagedresource")
66
- logger.info("Dropped classifications GIN index")
67
- except Exception as e:
68
- logger.warning(f"Could not drop classifications index: {e}")
69
-
70
- try:
71
- op.drop_index("idx_stagedresource_user_categories_gin", "stagedresource")
72
- logger.info("Dropped user_assigned_data_categories GIN index")
73
- except Exception as e:
74
- logger.warning(f"Could not drop user_categories index: {e}")
fides/api/db/safe_crud.py DELETED
@@ -1,377 +0,0 @@
1
- """
2
- This module contains "safe" versions of CRUD operations that do NOT
3
- manually manage database transactions. Transaction management is left
4
- to the calling code (endpoints, services) to handle at the appropriate
5
- boundary.
6
-
7
- Use functions from this module instead of fides.api.db.crud
8
- """
9
-
10
- from collections import defaultdict
11
- from typing import Any, Dict, List, Tuple, Type, TypeVar
12
-
13
- from fastapi import HTTPException
14
- from loguru import logger as log
15
- from sqlalchemy import and_, column
16
- from sqlalchemy import delete as _delete
17
- from sqlalchemy import or_
18
- from sqlalchemy import update as _update
19
- from sqlalchemy.dialects.postgresql import Insert as _insert
20
- from sqlalchemy.exc import IntegrityError, SQLAlchemyError
21
- from sqlalchemy.ext.asyncio import AsyncSession
22
- from sqlalchemy.future import select
23
- from sqlalchemy.sql import Select
24
- from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
25
-
26
- from fides.api.models.sql_models import ( # type: ignore[attr-defined]
27
- CustomField,
28
- CustomFieldDefinition,
29
- FidesBase,
30
- ResourceTypes,
31
- )
32
- from fides.api.util import errors
33
-
34
- # Helps return type be linked to the type of the parameter
35
- T = TypeVar("T", bound="FidesBase")
36
-
37
-
38
- # CRUD Functions
39
- async def create_resource(
40
- sql_model: Type[T], resource_dict: Dict, async_session: AsyncSession
41
- ) -> T:
42
- """
43
- Create a resource in the database.
44
-
45
- This version does NOT manually manage transactions - transaction management
46
- is left to the calling code.
47
- """
48
- with log.contextualize(
49
- sql_model=sql_model.__name__, fides_key=resource_dict["fides_key"]
50
- ):
51
-
52
- existing_resource = await get_resource(
53
- sql_model, resource_dict["fides_key"], async_session, raise_not_found=False
54
- )
55
-
56
- if existing_resource is not None:
57
- already_exists_error = errors.AlreadyExistsError(
58
- sql_model.__name__, resource_dict["fides_key"]
59
- )
60
- log.bind(error=already_exists_error.detail["error"]).info( # type: ignore[index]
61
- "Failed to insert resource"
62
- )
63
- raise already_exists_error
64
-
65
- try:
66
- log.debug("Creating resource")
67
- query = _insert(sql_model.__table__).values(resource_dict)
68
- await async_session.execute(query)
69
- except SQLAlchemyError as e:
70
- log.exception(f"Failed to create resource with error: '{e}'")
71
- sa_error = errors.QueryError()
72
- raise sa_error
73
-
74
- return await get_resource(sql_model, resource_dict["fides_key"], async_session)
75
-
76
-
77
- async def get_custom_fields_filtered(
78
- async_session: AsyncSession,
79
- resource_types_to_ids: Dict[ResourceTypes, List[str]] = defaultdict(list),
80
- ) -> FidesBase:
81
- """
82
- Utility function to construct a filtered query for custom field values based on provided mapping of
83
- resource types to resource IDs.
84
-
85
- Only custom fields with an "active" CustomFieldDefinition are returned.
86
-
87
- This is for use in bulk querying of custom fields, to avoid multiple round trips to the db.
88
- """
89
- with log.contextualize(model=CustomField):
90
- try:
91
- log.debug("Fetching resource")
92
- query = select(
93
- CustomField.resource_id,
94
- CustomField.value,
95
- CustomFieldDefinition.resource_type,
96
- CustomFieldDefinition.name,
97
- CustomFieldDefinition.field_type,
98
- ).join(
99
- CustomFieldDefinition,
100
- CustomFieldDefinition.id == CustomField.custom_field_definition_id,
101
- )
102
-
103
- criteria = [
104
- and_(
105
- CustomFieldDefinition.resource_type == resource_type.value,
106
- CustomField.resource_id.in_(resource_ids),
107
- # pylint: disable=singleton-comparison
108
- CustomFieldDefinition.active == True,
109
- )
110
- for resource_type, resource_ids in resource_types_to_ids.items()
111
- ]
112
- query = query.where(or_(False, *criteria))
113
- result = await async_session.execute(query)
114
- return result.mappings().all()
115
- except SQLAlchemyError as e:
116
- sa_error = errors.QueryError()
117
- log.exception(f"Failed to fetch custom fields with error: '{e}'")
118
- raise sa_error
119
-
120
-
121
- async def get_resource(
122
- sql_model: Type[T],
123
- fides_key: str,
124
- async_session: AsyncSession,
125
- raise_not_found: bool = True,
126
- ) -> T:
127
- """
128
- Get a resource from the database by its FidesKey.
129
-
130
- Returns a SQLAlchemy model of that resource.
131
-
132
- This version does NOT manually manage transactions - transaction management
133
- is left to the calling code.
134
- """
135
- with log.contextualize(sql_model=sql_model.__name__, fides_key=fides_key):
136
- try:
137
- log.debug("Fetching resource")
138
- query = select(sql_model).where(sql_model.fides_key == fides_key)
139
- result = await async_session.execute(query)
140
- except SQLAlchemyError as e:
141
- sa_error = errors.QueryError()
142
- log.exception(f"Failed to fetch resource with error: '{e}'")
143
- raise sa_error
144
-
145
- sql_resource = result.scalars().first()
146
- if sql_resource is None and raise_not_found:
147
- not_found_error = errors.NotFoundError(sql_model.__name__, fides_key)
148
- log.bind(error=not_found_error.detail["error"]).info("Resource not found") # type: ignore[index]
149
- raise not_found_error
150
-
151
- return sql_resource
152
-
153
-
154
- async def get_resource_with_custom_fields(
155
- sql_model: Type[T], fides_key: str, async_session: AsyncSession
156
- ) -> Dict[str, Any]:
157
- """Get a resource from the database by its FidesKey including it's custom fields.
158
-
159
- Returns a dictionary of that resource.
160
-
161
- This version does NOT manually manage transactions - transaction management
162
- is left to the calling code.
163
- """
164
- resource: T = await get_resource(sql_model, fides_key, async_session)
165
- resource_dict = resource.__dict__
166
- resource_dict.pop("_sa_instance_state", None)
167
-
168
- with log.contextualize(sql_model=sql_model.__name__, fides_key=fides_key):
169
- try:
170
- log.debug("Fetching custom fields for resource")
171
- query = (
172
- select(CustomFieldDefinition.name, CustomField.value)
173
- .join(
174
- CustomField,
175
- CustomField.custom_field_definition_id == CustomFieldDefinition.id,
176
- )
177
- .where(
178
- (CustomField.resource_id == resource.fides_key)
179
- & ( # pylint: disable=singleton-comparison
180
- CustomFieldDefinition.active == True
181
- )
182
- )
183
- )
184
- result = await async_session.execute(query)
185
- except SQLAlchemyError as e:
186
- sa_error = errors.QueryError()
187
- log.exception(f"Failed to fetch custom fields with error: '{e}'")
188
- raise sa_error
189
-
190
- custom_fields = result.mappings().all()
191
-
192
- if not custom_fields:
193
- return resource_dict
194
-
195
- for field in custom_fields:
196
- if field["name"] in resource_dict:
197
- resource_dict[field["name"]] = (
198
- f"{resource_dict[field['name']]}, {', '.join(field['value'])}"
199
- )
200
- else:
201
- resource_dict[field["name"]] = ", ".join(field["value"])
202
-
203
- return resource_dict
204
-
205
-
206
- async def list_resource(sql_model: Type[T], async_session: AsyncSession) -> List[T]:
207
- """
208
- Get a list of all of the resources of this type from the database.
209
-
210
- Returns a list of SQLAlchemy models of that resource type.
211
-
212
- This version does NOT manually manage transactions - transaction management
213
- is left to the calling code.
214
- """
215
- query = select(sql_model)
216
- return await list_resource_query(async_session, query, sql_model)
217
-
218
-
219
- async def list_resource_query(
220
- async_session: AsyncSession, query: Select, sql_model: Type[T]
221
- ) -> List[T]:
222
- """
223
- Utility function to wrap a select query in generic "list_resource" execution handling.
224
- Wrapping includes execution against the DB session, logging and error handling.
225
-
226
- This version does NOT manually manage transactions - transaction management
227
- is left to the calling code.
228
- """
229
-
230
- with log.contextualize(sql_model=sql_model.__name__):
231
- try:
232
- log.debug("Fetching resources")
233
- result = await async_session.execute(query)
234
- sql_resources = result.scalars().all()
235
- except SQLAlchemyError as e:
236
- log.exception(f"Failed to fetch resources with error: '{e}'")
237
- sa_error = errors.QueryError()
238
- raise sa_error
239
-
240
- return sql_resources
241
-
242
-
243
- async def update_resource(
244
- sql_model: Type[T], resource_dict: Dict, async_session: AsyncSession
245
- ) -> Dict:
246
- """
247
- Update a resource in the database by its fides_key.
248
-
249
- This version does NOT manually manage transactions - transaction management
250
- is left to the calling code.
251
- """
252
-
253
- with log.contextualize(
254
- sql_model=sql_model.__name__, fides_key=resource_dict["fides_key"]
255
- ):
256
- await get_resource(sql_model, resource_dict["fides_key"], async_session)
257
-
258
- try:
259
- log.debug("Updating resource")
260
- await async_session.execute(
261
- _update(sql_model.__table__)
262
- .where(sql_model.fides_key == resource_dict["fides_key"])
263
- .values(resource_dict)
264
- )
265
- except SQLAlchemyError as e:
266
- log.exception(f"Failed to update resource with error: '{e}'")
267
- sa_error = errors.QueryError()
268
- raise sa_error
269
-
270
- return await get_resource(sql_model, resource_dict["fides_key"], async_session)
271
-
272
-
273
- async def upsert_resources(
274
- sql_model: Type[T], resource_dicts: List[Dict], async_session: AsyncSession
275
- ) -> Tuple[int, int]:
276
- """
277
- Insert new resources into the database. If a resource already exists,
278
- update it by it's fides_key.
279
-
280
- Returns a Tuple containing the counts of inserted and updated rows.
281
-
282
- This version does NOT manually manage transactions - transaction management
283
- is left to the calling code.
284
- """
285
-
286
- with log.contextualize(
287
- sql_model=sql_model.__name__,
288
- fides_keys=[resource["fides_key"] for resource in resource_dicts],
289
- ):
290
- try:
291
- log.debug("Upserting resources")
292
- insert_stmt = (
293
- _insert(sql_model.__table__)
294
- .values(resource_dicts)
295
- .returning(
296
- (column("xmax") == 0), # Row was inserted
297
- (column("xmax") != 0), # Row was updated
298
- )
299
- )
300
-
301
- excluded = dict(insert_stmt.excluded.items()) # type: ignore[attr-defined]
302
- excluded.pop("id", None) # If updating, don't update the "id"
303
-
304
- result = await async_session.execute(
305
- insert_stmt.on_conflict_do_update(
306
- index_elements=["fides_key"],
307
- set_=excluded,
308
- )
309
- )
310
-
311
- inserts, updates = 0, 0
312
- for xmax in result:
313
- inserts += 1 if xmax[0] else 0
314
- updates += 1 if xmax[1] else 0
315
-
316
- return (inserts, updates)
317
-
318
- except SQLAlchemyError as e:
319
- log.exception(f"Failed to upsert resources with error: '{e}'")
320
- sa_error = errors.QueryError()
321
- raise sa_error
322
-
323
-
324
- async def delete_resource(
325
- sql_model: Type[T], fides_key: str, async_session: AsyncSession
326
- ) -> T:
327
- """
328
- Delete a resource by its fides_key.
329
-
330
- If the resource has child keys referring to it, also delete those.
331
-
332
- This version does NOT manually manage transactions - transaction management
333
- is left to the calling code.
334
- """
335
-
336
- with log.contextualize(sql_model=sql_model.__name__, fides_key=fides_key):
337
- sql_resource = await get_resource(sql_model, fides_key, async_session)
338
-
339
- try:
340
- # Automatically delete related resources if they are CTL objects
341
- if hasattr(sql_model, "parent_key"):
342
- log.debug("Deleting resource and its children")
343
- query = (
344
- _delete(sql_model.__table__)
345
- .where(
346
- or_(
347
- sql_model.fides_key == fides_key,
348
- sql_model.fides_key.like(f"{fides_key}.%"),
349
- )
350
- )
351
- .execution_options(synchronize_session=False)
352
- )
353
- else:
354
- log.debug("Deleting resource")
355
- query = _delete(sql_model.__table__).where(
356
- sql_model.fides_key == fides_key
357
- )
358
- await async_session.execute(query)
359
- except IntegrityError as err:
360
- raw_error_text: str = err.orig.args[0]
361
-
362
- if "violates foreign key constraint" in raw_error_text:
363
- error_message = "Failed to delete resource! Foreign key constraint found, try deleting related resources first."
364
- else:
365
- error_message = "Failed to delete resource!"
366
-
367
- log.bind(error="SQL Query integrity error!").error(raw_error_text)
368
- raise HTTPException(
369
- status_code=HTTP_422_UNPROCESSABLE_ENTITY,
370
- detail=error_message,
371
- )
372
- except SQLAlchemyError as e:
373
- log.exception(f"Failed to delete resource with error: '{e}'")
374
- sa_error = errors.QueryError()
375
- raise sa_error
376
-
377
- return sql_resource
File without changes
@@ -1,82 +0,0 @@
1
- from enum import Enum
2
- from typing import Any, Optional
3
-
4
- from sqlalchemy import Column, Integer, String
5
- from sqlalchemy.dialects.postgresql import JSONB
6
- from sqlalchemy.orm import Session
7
-
8
- from fides.api.db.base_class import Base
9
- from fides.api.db.util import EnumColumn
10
- from fides.api.task.conditional_dependencies.schemas import (
11
- Condition,
12
- ConditionGroup,
13
- ConditionLeaf,
14
- )
15
-
16
-
17
- class ConditionalDependencyType(str, Enum):
18
- """Shared enum for conditional dependency node types."""
19
-
20
- leaf = "leaf"
21
- group = "group"
22
-
23
-
24
- class ConditionalDependencyBase(Base):
25
- """Abstract base class for all conditional dependency models."""
26
-
27
- __abstract__ = True
28
-
29
- # Tree structure - parent_id defined in concrete classes for proper foreign keys
30
- condition_type = Column(EnumColumn(ConditionalDependencyType), nullable=False)
31
-
32
- # Condition details (for leaf nodes)
33
- field_address = Column(String(255), nullable=True) # For leaf conditions
34
- operator = Column(String, nullable=True) # For leaf conditions
35
- value = Column(JSONB, nullable=True) # For leaf conditions
36
- logical_operator = Column(String, nullable=True) # 'and' or 'or' for groups
37
-
38
- # Ordering
39
- sort_order = Column(Integer, nullable=False, default=0)
40
-
41
- def to_condition_leaf(self) -> ConditionLeaf:
42
- """Convert to ConditionLeaf if this is a leaf condition"""
43
- if self.condition_type != "leaf":
44
- raise ValueError("Cannot convert group condition to leaf")
45
-
46
- return ConditionLeaf(
47
- field_address=self.field_address, operator=self.operator, value=self.value
48
- )
49
-
50
- def to_condition_group(self) -> ConditionGroup:
51
- """Convert to ConditionGroup if this is a group condition"""
52
- if self.condition_type != "group":
53
- raise ValueError("Cannot convert leaf condition to group")
54
-
55
- # Recursively build children
56
- child_conditions = []
57
- children_list = [child for child in self.children] # type: ignore[attr-defined]
58
- for child in sorted(children_list, key=lambda x: x.sort_order):
59
- if child.condition_type == "leaf":
60
- child_conditions.append(child.to_condition_leaf())
61
- else:
62
- child_conditions.append(child.to_condition_group())
63
-
64
- return ConditionGroup(
65
- logical_operator=self.logical_operator, conditions=child_conditions
66
- )
67
-
68
- @classmethod
69
- def get_root_condition(
70
- cls, db: Session, *args: Any, **kwargs: Any
71
- ) -> Optional[Condition]:
72
- """Get the root condition for a parent entity - implemented by subclasses
73
-
74
- Args:
75
- db: Database session
76
- *args: Additional positional arguments specific to each implementation
77
- **kwargs: Additional keyword arguments specific to each implementation
78
-
79
- Returns:
80
- Optional[Condition]: Root condition or None if not found
81
- """
82
- raise NotImplementedError("Subclasses must implement get_root_condition")