ethyca-fides 2.70.5rc0__py2.py3-none-any.whl → 2.71.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.

Potentially problematic release.


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

Files changed (246) hide show
  1. {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0rc0.dist-info}/METADATA +5 -3
  2. {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0rc0.dist-info}/RECORD +236 -214
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/0eef0016cf06_adding_oauth2_config_for_.py +69 -0
  5. fides/api/alembic/migrations/versions/9e0dcbf67b9f_add_digest_config.py +84 -0
  6. fides/api/alembic/migrations/versions/a8e0c016afd_add_classification_benchmark_table.py +126 -0
  7. fides/api/alembic/migrations/versions/cd8649be3a2b_add_classifications_and_user_assigned_.py +74 -0
  8. fides/api/alembic/migrations/versions/e2cda8d6abc3_add_dismissed_in_activity_view_to_.py +29 -0
  9. fides/api/api/v1/endpoints/connection_endpoints.py +153 -2
  10. fides/api/api/v1/endpoints/privacy_request_endpoints.py +18 -2
  11. fides/api/db/base.py +2 -0
  12. fides/api/db/crud.py +30 -2
  13. fides/api/db/database.py +1 -1
  14. fides/api/db/safe_crud.py +377 -0
  15. fides/api/migrations/post_upgrade_index_creation.py +10 -0
  16. fides/api/models/conditional_dependency/__init__.py +0 -0
  17. fides/api/models/conditional_dependency/conditional_dependency_base.py +82 -0
  18. fides/api/models/connection_oauth_credentials.py +57 -0
  19. fides/api/models/connectionconfig.py +7 -0
  20. fides/api/models/detection_discovery/__init__.py +2 -0
  21. fides/api/models/detection_discovery/classification_benchmark.py +140 -0
  22. fides/api/models/detection_discovery/core.py +11 -0
  23. fides/api/models/detection_discovery/monitor_task.py +2 -1
  24. fides/api/models/digest/__init__.py +10 -0
  25. fides/api/models/digest/conditional_dependencies.py +9 -0
  26. fides/api/models/digest/digest_config.py +76 -0
  27. fides/api/models/manual_task/conditional_dependency.py +21 -77
  28. fides/api/models/policy.py +24 -0
  29. fides/api/models/privacy_notice.py +1 -1
  30. fides/api/models/privacy_request/privacy_request.py +68 -0
  31. fides/api/models/privacy_request/webhook.py +3 -1
  32. fides/api/oauth/roles.py +2 -0
  33. fides/api/schemas/connection_configuration/connection_oauth_config.py +42 -0
  34. fides/api/schemas/privacy_request.py +5 -2
  35. fides/api/schemas/user.py +2 -2
  36. fides/api/service/connectors/http_connector.py +48 -12
  37. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +2 -2
  38. fides/api/service/storage/streaming/smart_open_streaming_storage.py +36 -28
  39. fides/api/service/storage/util.py +11 -102
  40. fides/api/task/conditional_dependencies/sql_schemas.py +301 -0
  41. fides/api/task/conditional_dependencies/sql_translator.py +757 -0
  42. fides/api/task/manual/manual_task_utils.py +5 -6
  43. fides/common/api/v1/urn_registry.py +1 -0
  44. fides/ui-build/static/admin/404.html +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/155-047c3806cc41295e.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/{3700-dc3f05d21e2a5ff6.js → 3700-08e0703b1ef770da.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/{504-afd3588f1908ac33.js → 504-88caa30c03374e9b.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/5643-de406832755d9515.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/{7476-0b6e114658b15eaa.js → 7476-d055aa931da47ac0.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-a4e3c999afb28ee7.js → _app-a77584f9ad3334af.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-939253f8daf349b2.js → manual-75e99306393938e8.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-293c1f2d9aefb447.js → [resourceUrn]-2fa4b3a58f75f81d.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-18501152fa1e4f40.js → [resourceUrn]-5b31e3d7727b917a.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2e1e2b7808d3b21f.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-e8ec4080d9a3e22f.js → [monitorId]-0d512528b498d75c.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-1901c26cdde820da.js → [resourceUrn]-5525cf287d4ab493.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-0cea22af5929c81f.js → discovery-ed4723e1b67d890e.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-619f27c745188adb.js → datamap-15616bea02397ef4.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-cc149157d290a94d.js → [id]-816e02b6cbe4a684.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-4c9fb068a5561658.js → new-b6838162200141b3.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-8b13bb5f7bee61c6.js → [id]-01e025f878ba806c.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-6f109ef64304ef59.js → integrations-14120a529d7dac27.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-8566e3b7b2a632fa.js → [id]-82ebad17eb17c149.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-2c82cf73d20416f2.js → privacy-requests-7af00f72cf694077.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-5b423687e227ad4d.js → datamap-f7753e9effae3816.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/[id]-a653c05606c53063.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-90848e4a15057af1.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-5edfec10a945ca43.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-b0d93bf478bf63ee.js → [key]-77239269acc2d31a.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-084f9756b9987285.js → new-8bf1821722b082e9.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-1895c6a13b543436.js → [id]-547c6ef0ad52b85d.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-d266cc062b56beb2.js → systems-7238e025208078ec.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-a8cfa7de4948b374.js +1 -0
  79. fides/ui-build/static/admin/_next/static/css/64fac6fb884435c2.css +1 -0
  80. fides/ui-build/static/admin/_next/static/fY61mOXDNbYtO-3MNEDrx/_buildManifest.js +1 -0
  81. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  82. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  83. fides/ui-build/static/admin/add-systems.html +1 -1
  84. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  85. fides/ui-build/static/admin/consent/configure.html +1 -1
  86. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  87. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  88. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  89. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  90. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  91. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  92. fides/ui-build/static/admin/consent/properties.html +1 -1
  93. fides/ui-build/static/admin/consent/reporting.html +1 -1
  94. fides/ui-build/static/admin/consent.html +1 -1
  95. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  96. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  97. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  98. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  99. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  100. fides/ui-build/static/admin/data-catalog.html +1 -1
  101. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  102. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  103. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  104. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  105. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  106. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  107. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  108. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  109. fides/ui-build/static/admin/datamap.html +1 -1
  110. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  111. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  112. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  113. fides/ui-build/static/admin/dataset/new.html +1 -1
  114. fides/ui-build/static/admin/dataset.html +1 -1
  115. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  116. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  117. fides/ui-build/static/admin/datastore-connection.html +1 -1
  118. fides/ui-build/static/admin/index.html +1 -1
  119. fides/ui-build/static/admin/integrations/[id].html +1 -1
  120. fides/ui-build/static/admin/integrations.html +1 -1
  121. fides/ui-build/static/admin/login/[provider].html +1 -1
  122. fides/ui-build/static/admin/login.html +1 -1
  123. fides/ui-build/static/admin/messaging/[id].html +1 -1
  124. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  125. fides/ui-build/static/admin/messaging.html +1 -1
  126. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  127. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  128. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  129. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  130. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  131. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  132. fides/ui-build/static/admin/poc/forms.html +1 -1
  133. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  134. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  135. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  136. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  137. fides/ui-build/static/admin/privacy-requests.html +1 -1
  138. fides/ui-build/static/admin/properties/[id].html +1 -1
  139. fides/ui-build/static/admin/properties/add-property.html +1 -1
  140. fides/ui-build/static/admin/properties.html +1 -1
  141. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  142. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  143. fides/ui-build/static/admin/settings/about.html +1 -1
  144. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  145. fides/ui-build/static/admin/settings/consent.html +1 -1
  146. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -0
  147. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -0
  148. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  149. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  150. fides/ui-build/static/admin/settings/domains.html +1 -1
  151. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  152. fides/ui-build/static/admin/settings/locations.html +1 -1
  153. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
  154. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
  155. fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
  156. fides/ui-build/static/admin/settings/organization.html +1 -1
  157. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  158. fides/ui-build/static/admin/settings/regulations.html +1 -1
  159. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  160. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  161. fides/ui-build/static/admin/systems.html +1 -1
  162. fides/ui-build/static/admin/taxonomy.html +1 -1
  163. fides/ui-build/static/admin/user-management/new.html +1 -1
  164. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  165. fides/ui-build/static/admin/user-management.html +1 -1
  166. fides/ui-build/static/admin/_next/static/PZe9jkBWNOGDEEZ4Y_Rvq/_buildManifest.js +0 -1
  167. fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +0 -1
  168. fides/ui-build/static/admin/_next/static/chunks/3550-d04125c828d591a1.js +0 -1
  169. fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +0 -1
  170. fides/ui-build/static/admin/_next/static/chunks/7725-dd6736855807936a.js +0 -1
  171. fides/ui-build/static/admin/_next/static/chunks/9951-651d521d9a02b6df.js +0 -1
  172. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b0e3f1886de28d66.js +0 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-26ce8fc493993765.js +0 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-07848c232d960f6a.js +0 -1
  175. fides/ui-build/static/admin/_next/static/css/1866822702989bb3.css +0 -1
  176. {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0rc0.dist-info}/WHEEL +0 -0
  177. {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0rc0.dist-info}/entry_points.txt +0 -0
  178. {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0rc0.dist-info}/licenses/LICENSE +0 -0
  179. {ethyca_fides-2.70.5rc0.dist-info → ethyca_fides-2.71.0rc0.dist-info}/top_level.txt +0 -0
  180. /fides/ui-build/static/admin/_next/static/chunks/{1115-7888473b3dc28cda.js → 1115-90baef2a89f361ad.js} +0 -0
  181. /fides/ui-build/static/admin/_next/static/chunks/{1817-ee9e29a6b8c4af50.js → 1817-ca6473f31a67a804.js} +0 -0
  182. /fides/ui-build/static/admin/_next/static/chunks/{2040-ab6212a3074f34f9.js → 2040-fdecc41a18e40bdc.js} +0 -0
  183. /fides/ui-build/static/admin/_next/static/chunks/{3585-451504ea5ed7a1ea.js → 3585-efd5d41f08e180c4.js} +0 -0
  184. /fides/ui-build/static/admin/_next/static/chunks/{3696-c25dc8d1b0e1aee1.js → 3696-90c8b336bbc46782.js} +0 -0
  185. /fides/ui-build/static/admin/_next/static/chunks/{3872-3514b712afd683c0.js → 3872-04d3afbfa41a7782.js} +0 -0
  186. /fides/ui-build/static/admin/_next/static/chunks/{3923-a551756b413367ea.js → 3923-98bea73b618292aa.js} +0 -0
  187. /fides/ui-build/static/admin/_next/static/chunks/{4608-b22905c65f61db15.js → 4608-a9941d0c236ebca1.js} +0 -0
  188. /fides/ui-build/static/admin/_next/static/chunks/{502-a40d39e615f7b664.js → 502-d3ecae97b67befbd.js} +0 -0
  189. /fides/ui-build/static/admin/_next/static/chunks/{5185-33f50cf9ae17b42e.js → 5185-51eaa78e3ed6bfb7.js} +0 -0
  190. /fides/ui-build/static/admin/_next/static/chunks/{5574-b8c4cba5a6938c00.js → 5574-c31ea831371610d5.js} +0 -0
  191. /fides/ui-build/static/admin/_next/static/chunks/{5783-8de76df87af55e98.js → 5783-d119cb132abd8a91.js} +0 -0
  192. /fides/ui-build/static/admin/_next/static/chunks/{6084-2cd165179c428a6f.js → 6084-d0943ee628bf4388.js} +0 -0
  193. /fides/ui-build/static/admin/_next/static/chunks/{6416-264aadc6b336ee0a.js → 6416-0ccadfefcdad00cc.js} +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/{6882-447f15e87b8c48a5.js → 6882-10296485ec326e6b.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/{6954-599f2de2c902e9b2.js → 6954-4b24e1731c1cc3b3.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/{7158-835ba42fd881d8dd.js → 7158-04745cc8d684b2e7.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/{7630-e7ea13be69c118a1.js → 7630-d0d3a0fe3f95e971.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/{796-e07ac2c543f569e3.js → 796-02086581996a0548.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/{8002-25fd174aec9b077b.js → 8002-ed832921ad190832.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/{9226-2f960b7ca530642a.js → 9226-4a7027057f55ca2a.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/{9826-c02be5882205bbbc.js → 9826-ccedc28e978ca9e1.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-83ed7da0bb90b0a5.js → multiple-2ca59996860a33c5.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-f90aa48500c1cbde.js → add-systems-58920afe2b67f952.js} +0 -0
  204. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-46b88bda3d7b15c5.js → add-vendors-7a258b7ecd6da4b8.js} +0 -0
  205. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-c0db068d1863222f.js → configure-fb5017ff5fa54fcc.js} +0 -0
  206. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-92a337ee96845af2.js → privacy-experience-92182be6603c2842.js} +0 -0
  207. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-1fd2cda8707314f6.js → [id]-9c23fbe813c997d0.js} +0 -0
  208. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2987e397445713c5.js → new-0e5e38bbcfe59fd2.js} +0 -0
  209. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-59a8aff5935482ec.js → privacy-notices-ab54b19609bff325.js} +0 -0
  210. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-e5a33654a2dfaf35.js → consent-d2bf72508c3cad55.js} +0 -0
  211. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-6a4b0d49dcbf17a8.js → [projectUrn]-4a1af12d2d7cd660.js} +0 -0
  212. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-be7b385073f22414.js → projects-99573a1ee3ef8f4c.js} +0 -0
  213. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-af80fdca3bbdc82f.js → resources-6e429b7511028d60.js} +0 -0
  214. /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-351caadeef03876a.js → data-catalog-56fd0f3e465e52b6.js} +0 -0
  215. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-1554afcb8b9da2ab.js → action-center-040813022f0890c9.js} +0 -0
  216. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-0497f3ffdb632516.js → [resourceUrn]-844a8de0d1b506e2.js} +0 -0
  217. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-a780390da99f3e43.js → detection-11b07cf2d91b17ef.js} +0 -0
  218. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-ef71f387fbbab425.js → [...subfieldNames]-d4031e438c363fff.js} +0 -0
  219. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-d790553662caf5c3.js → [collectionName]-9463af37079762d0.js} +0 -0
  220. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-cb63db8594fe8dc1.js → [datasetId]-60a4a9eb4aab4c11.js} +0 -0
  221. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-78e052c8f95110c4.js → new-ea198c4a7869f402.js} +0 -0
  222. /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-d6d7ee8bd8858a8a.js → dataset-0e3a6ac4797ffbbb.js} +0 -0
  223. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-a832084ce294f8af.js → datastore-connection-223c2d1ded51bfb1.js} +0 -0
  224. /fides/ui-build/static/admin/_next/static/chunks/pages/{index-269b8f81546dad66.js → index-b74d1e8608ae5b5d.js} +0 -0
  225. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-d8c5c03fb2f31d65.js → [id]-e8d2140787045acd.js} +0 -0
  226. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-0e0c06e3c8aabe02.js → add-template-e3f93462a08251bf.js} +0 -0
  227. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-3f15804cf9625f01.js → messaging-b5f7d6afdecd013d.js} +0 -0
  228. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-e551fccfcaae76e7.js → table-migration-29fb7b39f8962650.js} +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-1b38b656807ed0cd.js → storage-648d775d0fce49dc.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-b00532a0ad4f6927.js → configure-8f577df28ebca869.js} +0 -0
  231. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-322a01e2bceab3fb.js → [id]-57a75c7e9659271a.js} +0 -0
  232. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-777ed2d73812043d.js → add-property-8964c2300206bc89.js} +0 -0
  233. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-55e36839d219a503.js → consent-e5d781b28f8e29c8.js} +0 -0
  234. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-7ddf9d992fe714a6.js → domain-records-744f669431b84f71.js} +0 -0
  235. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-7c78ae51f0dd7102.js → domains-a3275554ffe8e640.js} +0 -0
  236. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-05ffbda19ab894b9.js → email-templates-604790638c656fbd.js} +0 -0
  237. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-77fb85bdd0be42b5.js → locations-be2a885150adc133.js} +0 -0
  238. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{messaging-providers-6c51ffd46bb598e7.js → messaging-providers-8d92be437793c96f.js} +0 -0
  239. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-44456bfe54ac4ad5.js → organization-3c86162afe9759df.js} +0 -0
  240. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-fbe7e8030d837aed.js → privacy-requests-8cbdfd08e0fa88fb.js} +0 -0
  241. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-2866ac99faa5a542.js → regulations-4fe3b90747d885e5.js} +0 -0
  242. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-a86bafe1b4e1205f.js → test-datasets-2deb6becece69d46.js} +0 -0
  243. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-6304dad2c5fab694.js → new-629c88e90699369b.js} +0 -0
  244. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-ff4711db191099cd.js → [id]-98f737e735eaa0f0.js} +0 -0
  245. /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-82fcf1151e2fe2ba.js → user-management-562624e5461083ec.js} +0 -0
  246. /fides/ui-build/static/admin/_next/static/{PZe9jkBWNOGDEEZ4Y_Rvq → fY61mOXDNbYtO-3MNEDrx}/_ssgManifest.js +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-09-24T16:39:08-0400",
11
+ "date": "2025-09-24T16:33:32-0400",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "b6ea73ff2f2245e67ca50d550cd9560fb3072f44",
15
- "version": "2.70.5rc0"
14
+ "full-revisionid": "32f4216c8a85464d318fc4088c1f99d8e5e8d86e",
15
+ "version": "2.71.0rc0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -0,0 +1,69 @@
1
+ """Adding OAuth2 config for ConnectionConfig
2
+
3
+ Revision ID: 0eef0016cf06
4
+ Revises: 9e0dcbf67b9f
5
+ Create Date: 2025-09-12 01:06:26.838560
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ import sqlalchemy_utils
11
+ from alembic import op
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "0eef0016cf06"
15
+ down_revision = "9e0dcbf67b9f"
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
+ "oauth_config",
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("connection_config_id", sa.String(), nullable=False),
38
+ sa.Column(
39
+ "grant_type",
40
+ sa.Enum(
41
+ "authorization_code",
42
+ "client_credentials",
43
+ "password",
44
+ "implicit",
45
+ name="oauthgranttype",
46
+ ),
47
+ nullable=False,
48
+ ),
49
+ sa.Column("token_url", sa.String(), nullable=False),
50
+ sa.Column("scope", sa.String(), nullable=True),
51
+ sa.Column("client_id", sa.String(), nullable=False),
52
+ sa.Column(
53
+ "client_secret", sqlalchemy_utils.types.StringEncryptedType, nullable=False
54
+ ),
55
+ sa.ForeignKeyConstraint(
56
+ ["connection_config_id"],
57
+ ["connectionconfig.id"],
58
+ ),
59
+ sa.PrimaryKeyConstraint("id"),
60
+ )
61
+ op.create_index(op.f("ix_oauth_config_id"), "oauth_config", ["id"], unique=False)
62
+ # ### end Alembic commands ###
63
+
64
+
65
+ def downgrade():
66
+ # ### commands auto generated by Alembic - please adjust! ###
67
+ op.drop_index(op.f("ix_oauth_config_id"), table_name="oauth_config")
68
+ op.drop_table("oauth_config")
69
+ # ### end Alembic commands ###
@@ -0,0 +1,84 @@
1
+ """add digest config
2
+
3
+ Revision ID: 9e0dcbf67b9f
4
+ Revises: cd8649be3a2b
5
+ Create Date: 2025-09-22 20:23:48.258509
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 = "9e0dcbf67b9f"
15
+ down_revision = "cd8649be3a2b"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade():
21
+ op.create_table(
22
+ "digest_config",
23
+ sa.Column("id", sa.String(length=255), nullable=False),
24
+ sa.Column(
25
+ "created_at",
26
+ sa.DateTime(timezone=True),
27
+ server_default=sa.text("now()"),
28
+ nullable=True,
29
+ ),
30
+ sa.Column(
31
+ "updated_at",
32
+ sa.DateTime(timezone=True),
33
+ server_default=sa.text("now()"),
34
+ nullable=True,
35
+ ),
36
+ sa.Column("digest_type", sa.String(length=255), nullable=False),
37
+ sa.Column("name", sa.String(length=255), nullable=False),
38
+ sa.Column("description", sa.Text(), nullable=True),
39
+ sa.Column("enabled", sa.Boolean(), nullable=False),
40
+ sa.Column("messaging_service_type", sa.String(length=255), nullable=False),
41
+ sa.Column("cron_expression", sa.String(length=100), nullable=False),
42
+ sa.Column("timezone", sa.String(length=50), nullable=False),
43
+ sa.Column("last_sent_at", sa.DateTime(timezone=True), nullable=True),
44
+ sa.Column("next_scheduled_at", sa.DateTime(timezone=True), nullable=True),
45
+ sa.Column(
46
+ "config_metadata", postgresql.JSONB(astext_type=sa.Text()), nullable=True
47
+ ),
48
+ sa.PrimaryKeyConstraint("id"),
49
+ )
50
+ op.create_index(
51
+ op.f("ix_digest_config_digest_type"),
52
+ "digest_config",
53
+ ["digest_type"],
54
+ unique=False,
55
+ )
56
+ op.create_index(
57
+ op.f("ix_digest_config_enabled"), "digest_config", ["enabled"], unique=False
58
+ )
59
+ op.create_index(op.f("ix_digest_config_id"), "digest_config", ["id"], unique=False)
60
+ op.create_index(
61
+ op.f("ix_digest_config_messaging_service_type"),
62
+ "digest_config",
63
+ ["messaging_service_type"],
64
+ unique=False,
65
+ )
66
+ op.create_index(
67
+ op.f("ix_digest_config_next_scheduled_at"),
68
+ "digest_config",
69
+ ["next_scheduled_at"],
70
+ unique=False,
71
+ )
72
+
73
+
74
+ def downgrade():
75
+ op.drop_index(
76
+ op.f("ix_digest_config_next_scheduled_at"), table_name="digest_config"
77
+ )
78
+ op.drop_index(
79
+ op.f("ix_digest_config_messaging_service_type"), table_name="digest_config"
80
+ )
81
+ op.drop_index(op.f("ix_digest_config_id"), table_name="digest_config")
82
+ op.drop_index(op.f("ix_digest_config_enabled"), table_name="digest_config")
83
+ op.drop_index(op.f("ix_digest_config_digest_type"), table_name="digest_config")
84
+ op.drop_table("digest_config")
@@ -0,0 +1,126 @@
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 ###
@@ -0,0 +1,74 @@
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}")
@@ -0,0 +1,29 @@
1
+ """add_dismissed_to_monitor_task
2
+
3
+ Revision ID: e2cda8d6abc3
4
+ Revises: 0eef0016cf06
5
+ Create Date: 2025-09-17 23:37:49.678071
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "e2cda8d6abc3"
14
+ down_revision = "0eef0016cf06"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ # Add the dismissed column to monitortask table
21
+ op.add_column(
22
+ "monitortask",
23
+ sa.Column("dismissed", sa.Boolean(), nullable=False, server_default="f"),
24
+ )
25
+
26
+
27
+ def downgrade():
28
+ # Remove the dismissed column from monitortask table
29
+ op.drop_column("monitortask", "dismissed")
@@ -2,7 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Annotated, Any, Dict, List, Optional
4
4
 
5
- from fastapi import Depends
5
+ import sqlalchemy
6
+ from fastapi import Depends, HTTPException
6
7
  from fastapi.params import Query, Security
7
8
  from fastapi_pagination import Page, Params
8
9
  from fastapi_pagination.bases import AbstractPage
@@ -13,9 +14,15 @@ from pydantic import Field
13
14
  from sqlalchemy import null, or_
14
15
  from sqlalchemy.orm import Session
15
16
  from sqlalchemy_utils import escape_like
16
- from starlette.status import HTTP_200_OK, HTTP_204_NO_CONTENT
17
+ from starlette.status import (
18
+ HTTP_200_OK,
19
+ HTTP_204_NO_CONTENT,
20
+ HTTP_404_NOT_FOUND,
21
+ HTTP_422_UNPROCESSABLE_ENTITY,
22
+ )
17
23
 
18
24
  from fides.api.api import deps
25
+ from fides.api.models.connection_oauth_credentials import OAuthConfig
19
26
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
20
27
  from fides.api.oauth.utils import verify_oauth_client
21
28
  from fides.api.schemas.connection_configuration import connection_secrets_schemas
@@ -25,6 +32,9 @@ from fides.api.schemas.connection_configuration.connection_config import (
25
32
  ConnectionConfigurationResponseWithSystemKey,
26
33
  CreateConnectionConfigurationWithSecrets,
27
34
  )
35
+ from fides.api.schemas.connection_configuration.connection_oauth_config import (
36
+ OAuthConfigSchema,
37
+ )
28
38
  from fides.api.schemas.connection_configuration.connection_secrets import (
29
39
  TestStatusMessage,
30
40
  )
@@ -45,6 +55,7 @@ from fides.common.api.scope_registry import (
45
55
  )
46
56
  from fides.common.api.v1.urn_registry import (
47
57
  CONNECTION_BY_KEY,
58
+ CONNECTION_OAUTH,
48
59
  CONNECTION_SECRETS,
49
60
  CONNECTION_TEST,
50
61
  CONNECTIONS,
@@ -312,3 +323,143 @@ def test_connection_config_secrets(
312
323
  connection_config = get_connection_config_or_error(db, connection_key)
313
324
  msg = f"Test completed for ConnectionConfig with key: {connection_key}."
314
325
  return connection_status(connection_config, msg, db)
326
+
327
+
328
+ @router.put(
329
+ CONNECTION_OAUTH,
330
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTION_CREATE_OR_UPDATE])],
331
+ status_code=HTTP_200_OK,
332
+ )
333
+ def put_connection_oauth_config(
334
+ connection_key: FidesKey,
335
+ *,
336
+ oauth_config: OAuthConfigSchema,
337
+ db: Session = Depends(deps.get_db),
338
+ verify: Optional[bool] = True,
339
+ ) -> TestStatusMessage:
340
+ """
341
+ Create or update the OAuth2 configuration for a given connection.
342
+ """
343
+ connection_config = get_connection_config_or_error(db, connection_key)
344
+
345
+ if connection_config.connection_type != ConnectionType.https:
346
+ raise HTTPException(
347
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
348
+ detail="OAuth2 configuration can only be set for HTTPS connections.",
349
+ )
350
+
351
+ logger.info("Updating OAuth2 config for '{}'", connection_key)
352
+ connection_config.oauth_config = OAuthConfig(
353
+ **oauth_config.model_dump(mode="json") # type: ignore[arg-type]
354
+ )
355
+ connection_config.save(db=db)
356
+
357
+ msg = (
358
+ f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
359
+ )
360
+
361
+ if verify:
362
+ return connection_status(connection_config, msg, db)
363
+
364
+ return TestStatusMessage(msg=msg, test_status=None)
365
+
366
+
367
+ @router.delete(
368
+ CONNECTION_OAUTH,
369
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTION_CREATE_OR_UPDATE])],
370
+ status_code=HTTP_204_NO_CONTENT,
371
+ response_model=None,
372
+ )
373
+ def delete_connection_oauth_config(
374
+ connection_key: FidesKey,
375
+ *,
376
+ db: Session = Depends(deps.get_db),
377
+ ) -> None:
378
+ """
379
+ Delete the OAuth2 configuration for a given connection.
380
+ """
381
+ connection_config = get_connection_config_or_error(db, connection_key)
382
+
383
+ if connection_config.connection_type != ConnectionType.https:
384
+ raise HTTPException(
385
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
386
+ detail="OAuth2 configuration can only be deleted for HTTPS connections",
387
+ )
388
+
389
+ if not connection_config.oauth_config:
390
+ raise HTTPException(
391
+ status_code=HTTP_404_NOT_FOUND,
392
+ detail="No OAuth2 configuration found to delete.",
393
+ )
394
+
395
+ logger.info("Deleting OAuth2 config for '{}'", connection_key)
396
+ connection_config.oauth_config = None
397
+ connection_config.save(db=db)
398
+
399
+
400
+ @router.patch(
401
+ CONNECTION_OAUTH,
402
+ dependencies=[Security(verify_oauth_client, scopes=[CONNECTION_CREATE_OR_UPDATE])],
403
+ status_code=HTTP_200_OK,
404
+ )
405
+ def patch_connection_oauth_config(
406
+ connection_key: FidesKey,
407
+ *,
408
+ oauth_config: OAuthConfigSchema,
409
+ db: Session = Depends(deps.get_db),
410
+ verify: Optional[bool] = True,
411
+ ) -> TestStatusMessage:
412
+ """
413
+ Partially update the OAuth2 configuration for a given connection.
414
+ """
415
+ connection_config = get_connection_config_or_error(db, connection_key)
416
+
417
+ if connection_config.connection_type != ConnectionType.https:
418
+ raise HTTPException(
419
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
420
+ detail="OAuth2 configuration can only be set for HTTPS connections.",
421
+ )
422
+
423
+ existing_oauth_config: Optional[Dict[str, Any]] = (
424
+ {
425
+ "grant_type": connection_config.oauth_config.grant_type.value,
426
+ "token_url": connection_config.oauth_config.token_url,
427
+ "scope": connection_config.oauth_config.scope,
428
+ "client_id": connection_config.oauth_config.client_id,
429
+ "client_secret": connection_config.oauth_config.client_secret,
430
+ }
431
+ if connection_config.oauth_config
432
+ else None
433
+ )
434
+
435
+ # Combine the existing config with the new config overlaid
436
+ patched_oauth_config = {}
437
+ if existing_oauth_config:
438
+ patched_oauth_config = {**existing_oauth_config}
439
+
440
+ patched_oauth_config = {
441
+ **patched_oauth_config,
442
+ **{k: v for (k, v) in oauth_config.model_dump(mode="json").items() if v is not None}, # type: ignore[dict-item]
443
+ }
444
+
445
+ logger.info("Patching OAuth2 config for '{}'", connection_key)
446
+ validated_config = OAuthConfigSchema.model_validate(patched_oauth_config)
447
+ try:
448
+ connection_config.oauth_config = OAuthConfig(
449
+ **validated_config.model_dump(mode="json")
450
+ )
451
+ connection_config.save(db=db)
452
+ except sqlalchemy.exc.IntegrityError as exc:
453
+ raise HTTPException(
454
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
455
+ detail="Invalid OAuth2 configuration.",
456
+ ) from exc
457
+
458
+ msg = (
459
+ f"OAuth2 configuration updated for ConnectionConfig with key: {connection_key}."
460
+ )
461
+
462
+ if verify:
463
+ return connection_status(connection_config, msg, db)
464
+
465
+ return TestStatusMessage(msg=msg, test_status=None)
@@ -4,7 +4,7 @@ import csv
4
4
  import io
5
5
  import json
6
6
  from collections import defaultdict
7
- from datetime import datetime, timezone
7
+ from datetime import datetime, timedelta, timezone
8
8
  from typing import (
9
9
  Annotated,
10
10
  Any,
@@ -285,15 +285,19 @@ def privacy_request_csv_download(
285
285
  "Status",
286
286
  "Request Type",
287
287
  "Time Received",
288
+ "Deadline",
288
289
  "Reviewed By",
289
290
  "Request ID",
290
291
  "Time Approved/Denied",
291
292
  "Denial Reason",
293
+ "Last Updated",
294
+ "Completed On",
292
295
  ]
293
296
  + identity_columns
294
297
  + with_prefix("Custom Field", list(custom_field_columns.values()))
295
298
  )
296
299
 
300
+ pr: PrivacyRequest
297
301
  for pr in privacy_request_query:
298
302
  denial_reason = (
299
303
  denial_audit_logs[pr.id]
@@ -301,14 +305,26 @@ def privacy_request_csv_download(
301
305
  else None
302
306
  )
303
307
 
308
+ action_types: List[str] = []
309
+ if pr and pr.policy:
310
+ for rule in pr.policy.rules or []: # type: ignore
311
+ action_types.append(rule.action_type)
312
+
313
+ deadline: Optional[datetime] = None
314
+ if pr.days_left and pr.created_at:
315
+ deadline = pr.created_at + timedelta(days=pr.days_left)
316
+
304
317
  static_cells = [
305
318
  pr.status.value if pr.status else None,
306
- pr.policy.rules[0].action_type if len(pr.policy.rules) > 0 else None,
319
+ ("+".join(action_types)),
307
320
  pr.created_at,
321
+ deadline,
308
322
  pr.reviewed_by,
309
323
  pr.id,
310
324
  pr.reviewed_at,
311
325
  denial_reason,
326
+ pr.updated_at,
327
+ pr.finalized_at,
312
328
  ]
313
329
 
314
330
  identity_cells = extract_identity_cells(identity_columns, pr)
fides/api/db/base.py CHANGED
@@ -9,6 +9,7 @@ from fides.api.models.audit_log import AuditLog
9
9
  from fides.api.models.authentication_request import AuthenticationRequest
10
10
  from fides.api.models.client import ClientDetail
11
11
  from fides.api.models.comment import Comment, CommentReference
12
+ from fides.api.models.connection_oauth_credentials import OAuthConfig
12
13
  from fides.api.models.connectionconfig import ConnectionConfig
13
14
  from fides.api.models.consent_automation import ConsentAutomation
14
15
  from fides.api.models.custom_asset import CustomAsset
@@ -22,6 +23,7 @@ from fides.api.models.detection_discovery.monitor_task import (
22
23
  MonitorTaskExecutionLog,
23
24
  )
24
25
  from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
26
+ from fides.api.models.digest import DigestConfig
25
27
  from fides.api.models.event_audit import EventAudit
26
28
  from fides.api.models.experience_notices import ExperienceNotices
27
29
  from fides.api.models.fides_cloud import FidesCloud