ethyca-fides 2.70.6rc0__py2.py3-none-any.whl → 2.71.0__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 (250) hide show
  1. {ethyca_fides-2.70.6rc0.dist-info → ethyca_fides-2.71.0.dist-info}/METADATA +5 -3
  2. {ethyca_fides-2.70.6rc0.dist-info → ethyca_fides-2.71.0.dist-info}/RECORD +240 -218
  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-10a36584c399526c.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]-7dac2302f573f5ee.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]-bd1042a0e9be6aff.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/new-469ad83c8cfa1290.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-0f1d833282f09684.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/t-PRt7eeD3YslOxniAZyz/_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/lib/fides-headless.js +1 -1
  122. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  123. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  124. fides/ui-build/static/admin/lib/fides.js +2 -2
  125. fides/ui-build/static/admin/login/[provider].html +1 -1
  126. fides/ui-build/static/admin/login.html +1 -1
  127. fides/ui-build/static/admin/messaging/[id].html +1 -1
  128. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  129. fides/ui-build/static/admin/messaging.html +1 -1
  130. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  131. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  132. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  133. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  134. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  135. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  136. fides/ui-build/static/admin/poc/forms.html +1 -1
  137. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  138. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  139. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  140. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  141. fides/ui-build/static/admin/privacy-requests.html +1 -1
  142. fides/ui-build/static/admin/properties/[id].html +1 -1
  143. fides/ui-build/static/admin/properties/add-property.html +1 -1
  144. fides/ui-build/static/admin/properties.html +1 -1
  145. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  146. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  147. fides/ui-build/static/admin/settings/about.html +1 -1
  148. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  149. fides/ui-build/static/admin/settings/consent.html +1 -1
  150. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -0
  151. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -0
  152. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  153. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  154. fides/ui-build/static/admin/settings/domains.html +1 -1
  155. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  156. fides/ui-build/static/admin/settings/locations.html +1 -1
  157. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
  158. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
  159. fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
  160. fides/ui-build/static/admin/settings/organization.html +1 -1
  161. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  162. fides/ui-build/static/admin/settings/regulations.html +1 -1
  163. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  164. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  165. fides/ui-build/static/admin/systems.html +1 -1
  166. fides/ui-build/static/admin/taxonomy.html +1 -1
  167. fides/ui-build/static/admin/user-management/new.html +1 -1
  168. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  169. fides/ui-build/static/admin/user-management.html +1 -1
  170. fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +0 -1
  171. fides/ui-build/static/admin/_next/static/chunks/3550-d04125c828d591a1.js +0 -1
  172. fides/ui-build/static/admin/_next/static/chunks/6419-d0c00d661b01f8fa.js +0 -1
  173. fides/ui-build/static/admin/_next/static/chunks/7725-dd6736855807936a.js +0 -1
  174. fides/ui-build/static/admin/_next/static/chunks/9951-651d521d9a02b6df.js +0 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b0e3f1886de28d66.js +0 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-26ce8fc493993765.js +0 -1
  177. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-07848c232d960f6a.js +0 -1
  178. fides/ui-build/static/admin/_next/static/css/1866822702989bb3.css +0 -1
  179. fides/ui-build/static/admin/_next/static/nSpa3QTJVmyWqT-f7zRw4/_buildManifest.js +0 -1
  180. {ethyca_fides-2.70.6rc0.dist-info → ethyca_fides-2.71.0.dist-info}/WHEEL +0 -0
  181. {ethyca_fides-2.70.6rc0.dist-info → ethyca_fides-2.71.0.dist-info}/entry_points.txt +0 -0
  182. {ethyca_fides-2.70.6rc0.dist-info → ethyca_fides-2.71.0.dist-info}/licenses/LICENSE +0 -0
  183. {ethyca_fides-2.70.6rc0.dist-info → ethyca_fides-2.71.0.dist-info}/top_level.txt +0 -0
  184. /fides/ui-build/static/admin/_next/static/chunks/{1115-7888473b3dc28cda.js → 1115-90baef2a89f361ad.js} +0 -0
  185. /fides/ui-build/static/admin/_next/static/chunks/{1817-ee9e29a6b8c4af50.js → 1817-ca6473f31a67a804.js} +0 -0
  186. /fides/ui-build/static/admin/_next/static/chunks/{2040-ab6212a3074f34f9.js → 2040-fdecc41a18e40bdc.js} +0 -0
  187. /fides/ui-build/static/admin/_next/static/chunks/{3585-451504ea5ed7a1ea.js → 3585-efd5d41f08e180c4.js} +0 -0
  188. /fides/ui-build/static/admin/_next/static/chunks/{3696-c25dc8d1b0e1aee1.js → 3696-90c8b336bbc46782.js} +0 -0
  189. /fides/ui-build/static/admin/_next/static/chunks/{3872-3514b712afd683c0.js → 3872-04d3afbfa41a7782.js} +0 -0
  190. /fides/ui-build/static/admin/_next/static/chunks/{3923-a551756b413367ea.js → 3923-98bea73b618292aa.js} +0 -0
  191. /fides/ui-build/static/admin/_next/static/chunks/{4608-b22905c65f61db15.js → 4608-a9941d0c236ebca1.js} +0 -0
  192. /fides/ui-build/static/admin/_next/static/chunks/{502-a40d39e615f7b664.js → 502-d3ecae97b67befbd.js} +0 -0
  193. /fides/ui-build/static/admin/_next/static/chunks/{5185-33f50cf9ae17b42e.js → 5185-51eaa78e3ed6bfb7.js} +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/{5574-b8c4cba5a6938c00.js → 5574-c31ea831371610d5.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/{5783-8de76df87af55e98.js → 5783-d119cb132abd8a91.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/{6084-2cd165179c428a6f.js → 6084-d0943ee628bf4388.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/{6416-264aadc6b336ee0a.js → 6416-0ccadfefcdad00cc.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/{6882-447f15e87b8c48a5.js → 6882-10296485ec326e6b.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/{6954-599f2de2c902e9b2.js → 6954-4b24e1731c1cc3b3.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/{7158-835ba42fd881d8dd.js → 7158-04745cc8d684b2e7.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/{7630-e7ea13be69c118a1.js → 7630-d0d3a0fe3f95e971.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/{796-e07ac2c543f569e3.js → 796-02086581996a0548.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/chunks/{8002-25fd174aec9b077b.js → 8002-ed832921ad190832.js} +0 -0
  204. /fides/ui-build/static/admin/_next/static/chunks/{9226-2f960b7ca530642a.js → 9226-4a7027057f55ca2a.js} +0 -0
  205. /fides/ui-build/static/admin/_next/static/chunks/{9826-c02be5882205bbbc.js → 9826-ccedc28e978ca9e1.js} +0 -0
  206. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-83ed7da0bb90b0a5.js → multiple-2ca59996860a33c5.js} +0 -0
  207. /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-f90aa48500c1cbde.js → add-systems-58920afe2b67f952.js} +0 -0
  208. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-46b88bda3d7b15c5.js → add-vendors-7a258b7ecd6da4b8.js} +0 -0
  209. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-c0db068d1863222f.js → configure-fb5017ff5fa54fcc.js} +0 -0
  210. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-92a337ee96845af2.js → privacy-experience-92182be6603c2842.js} +0 -0
  211. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-1fd2cda8707314f6.js → [id]-9c23fbe813c997d0.js} +0 -0
  212. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2987e397445713c5.js → new-0e5e38bbcfe59fd2.js} +0 -0
  213. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-59a8aff5935482ec.js → privacy-notices-ab54b19609bff325.js} +0 -0
  214. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-e5a33654a2dfaf35.js → consent-d2bf72508c3cad55.js} +0 -0
  215. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-6a4b0d49dcbf17a8.js → [projectUrn]-4a1af12d2d7cd660.js} +0 -0
  216. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-be7b385073f22414.js → projects-99573a1ee3ef8f4c.js} +0 -0
  217. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-af80fdca3bbdc82f.js → resources-6e429b7511028d60.js} +0 -0
  218. /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-351caadeef03876a.js → data-catalog-56fd0f3e465e52b6.js} +0 -0
  219. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-1554afcb8b9da2ab.js → action-center-040813022f0890c9.js} +0 -0
  220. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-0497f3ffdb632516.js → [resourceUrn]-844a8de0d1b506e2.js} +0 -0
  221. /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-a780390da99f3e43.js → detection-11b07cf2d91b17ef.js} +0 -0
  222. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-ef71f387fbbab425.js → [...subfieldNames]-d4031e438c363fff.js} +0 -0
  223. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-d790553662caf5c3.js → [collectionName]-9463af37079762d0.js} +0 -0
  224. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-cb63db8594fe8dc1.js → [datasetId]-60a4a9eb4aab4c11.js} +0 -0
  225. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-78e052c8f95110c4.js → new-ea198c4a7869f402.js} +0 -0
  226. /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-d6d7ee8bd8858a8a.js → dataset-0e3a6ac4797ffbbb.js} +0 -0
  227. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-a832084ce294f8af.js → datastore-connection-223c2d1ded51bfb1.js} +0 -0
  228. /fides/ui-build/static/admin/_next/static/chunks/pages/{index-269b8f81546dad66.js → index-b74d1e8608ae5b5d.js} +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-d8c5c03fb2f31d65.js → [id]-e8d2140787045acd.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-0e0c06e3c8aabe02.js → add-template-e3f93462a08251bf.js} +0 -0
  231. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-3f15804cf9625f01.js → messaging-b5f7d6afdecd013d.js} +0 -0
  232. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-e551fccfcaae76e7.js → table-migration-29fb7b39f8962650.js} +0 -0
  233. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-1b38b656807ed0cd.js → storage-648d775d0fce49dc.js} +0 -0
  234. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-b00532a0ad4f6927.js → configure-8f577df28ebca869.js} +0 -0
  235. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-322a01e2bceab3fb.js → [id]-57a75c7e9659271a.js} +0 -0
  236. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-777ed2d73812043d.js → add-property-8964c2300206bc89.js} +0 -0
  237. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-55e36839d219a503.js → consent-e5d781b28f8e29c8.js} +0 -0
  238. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-7ddf9d992fe714a6.js → domain-records-744f669431b84f71.js} +0 -0
  239. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-7c78ae51f0dd7102.js → domains-a3275554ffe8e640.js} +0 -0
  240. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-05ffbda19ab894b9.js → email-templates-604790638c656fbd.js} +0 -0
  241. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-77fb85bdd0be42b5.js → locations-be2a885150adc133.js} +0 -0
  242. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{messaging-providers-6c51ffd46bb598e7.js → messaging-providers-8d92be437793c96f.js} +0 -0
  243. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-44456bfe54ac4ad5.js → organization-3c86162afe9759df.js} +0 -0
  244. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-fbe7e8030d837aed.js → privacy-requests-8cbdfd08e0fa88fb.js} +0 -0
  245. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-2866ac99faa5a542.js → regulations-4fe3b90747d885e5.js} +0 -0
  246. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-a86bafe1b4e1205f.js → test-datasets-2deb6becece69d46.js} +0 -0
  247. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-6304dad2c5fab694.js → new-629c88e90699369b.js} +0 -0
  248. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-ff4711db191099cd.js → [id]-98f737e735eaa0f0.js} +0 -0
  249. /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-82fcf1151e2fe2ba.js → user-management-562624e5461083ec.js} +0 -0
  250. /fides/ui-build/static/admin/_next/static/{nSpa3QTJVmyWqT-f7zRw4 → t-PRt7eeD3YslOxniAZyz}/_ssgManifest.js +0 -0
@@ -0,0 +1,140 @@
1
+ """
2
+ Database model for classification benchmark results.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ from datetime import datetime
8
+ from typing import Optional
9
+
10
+ from sqlalchemy import ARRAY, Column, ForeignKey, String
11
+ from sqlalchemy.dialects.postgresql import JSONB
12
+ from sqlalchemy.ext.declarative import declared_attr
13
+ from sqlalchemy.ext.mutable import MutableDict
14
+ from sqlalchemy.orm import Query, RelationshipProperty, Session, relationship
15
+
16
+ from fides.api.db.base_class import Base, FidesBase
17
+ from fides.api.models.detection_discovery.core import MonitorConfig
18
+ from fides.api.models.sql_models import Dataset # type: ignore[attr-defined]
19
+
20
+
21
+ class ClassificationBenchmark(Base, FidesBase):
22
+ """
23
+ Database model for storing classification benchmark results.
24
+
25
+ This model stores the results of classification accuracy benchmarks that compare
26
+ system-assigned classifications on staged resources with ground truth data from datasets.
27
+ """
28
+
29
+ @declared_attr
30
+ def __tablename__(self) -> str:
31
+ return "classification_benchmark"
32
+
33
+ # Foreign key relationships
34
+ monitor_config_key = Column(
35
+ String,
36
+ ForeignKey(MonitorConfig.key, ondelete="CASCADE"),
37
+ nullable=False,
38
+ index=True,
39
+ )
40
+ dataset_fides_key = Column(
41
+ String,
42
+ ForeignKey(Dataset.fides_key, ondelete="CASCADE"),
43
+ nullable=False,
44
+ index=True,
45
+ )
46
+
47
+ # Resource URNs (array of strings)
48
+ resource_urns = Column(
49
+ ARRAY(String),
50
+ nullable=False,
51
+ server_default="{}",
52
+ default=list,
53
+ )
54
+
55
+ # Overall accuracy metrics stored as JSONB
56
+ overall_metrics = Column(
57
+ MutableDict.as_mutable(JSONB),
58
+ nullable=True,
59
+ server_default=None,
60
+ default=None,
61
+ )
62
+
63
+ # Field-level accuracy details stored as JSONB array
64
+ field_accuracy_details = Column(
65
+ ARRAY(JSONB),
66
+ nullable=False,
67
+ server_default="{}",
68
+ default=list,
69
+ )
70
+
71
+ # Status and messages for tracking benchmark execution
72
+ status = Column(
73
+ String,
74
+ nullable=False,
75
+ server_default="'pending'",
76
+ default="pending",
77
+ index=True,
78
+ )
79
+ messages = Column(
80
+ ARRAY(String),
81
+ nullable=False,
82
+ server_default="{}",
83
+ default=list,
84
+ )
85
+
86
+ # Relationships
87
+ monitor_config: RelationshipProperty[MonitorConfig] = relationship(
88
+ MonitorConfig,
89
+ foreign_keys=[monitor_config_key],
90
+ primaryjoin="ClassificationBenchmark.monitor_config_key == MonitorConfig.key",
91
+ )
92
+
93
+ dataset: RelationshipProperty[Dataset] = relationship(
94
+ Dataset,
95
+ foreign_keys=[dataset_fides_key],
96
+ primaryjoin="ClassificationBenchmark.dataset_fides_key == Dataset.fides_key",
97
+ )
98
+
99
+ @classmethod
100
+ def list_benchmarks(
101
+ cls,
102
+ db: Session,
103
+ monitor_config_key: Optional[str] = None,
104
+ dataset_fides_key: Optional[str] = None,
105
+ created_after: Optional[datetime] = None,
106
+ created_before: Optional[datetime] = None,
107
+ status: Optional[str] = None,
108
+ ) -> Query:
109
+ """
110
+ Get a filtered query for benchmarks.
111
+
112
+ Args:
113
+ db: Database session
114
+ monitor_config_key: Filter by monitor config key
115
+ dataset_fides_key: Filter by dataset fides key
116
+ created_after: Filter by creation date (inclusive)
117
+ created_before: Filter by creation date (exclusive)
118
+ status: Filter by status
119
+ Returns:
120
+ Filtered query (not executed)
121
+ """
122
+ # Build the query with filters
123
+ query = db.query(cls)
124
+
125
+ # Apply filters
126
+ if monitor_config_key:
127
+ query = query.filter(cls.monitor_config_key == monitor_config_key)
128
+ if dataset_fides_key:
129
+ query = query.filter(cls.dataset_fides_key == dataset_fides_key)
130
+ if created_after:
131
+ query = query.filter(cls.created_at >= created_after)
132
+ if created_before:
133
+ query = query.filter(cls.created_at < created_before)
134
+ if status:
135
+ query = query.filter(cls.status == status)
136
+
137
+ # Apply sorting
138
+ query = query.order_by(cls.created_at.desc())
139
+
140
+ return query
@@ -599,6 +599,17 @@ 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
+ ),
602
613
  )
603
614
 
604
615
  @classmethod
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from enum import Enum
4
4
  from typing import List, Optional
5
5
 
6
- from sqlalchemy import ARRAY, Column
6
+ from sqlalchemy import ARRAY, Boolean, Column
7
7
  from sqlalchemy import Enum as SQLAlchemyEnum
8
8
  from sqlalchemy import ForeignKey, String
9
9
  from sqlalchemy.dialects.postgresql import JSONB
@@ -51,6 +51,7 @@ class MonitorTask(WorkerTask, Base):
51
51
  )
52
52
  staged_resource_urns = Column(ARRAY(String), nullable=True)
53
53
  child_resource_urns = Column(ARRAY(String), nullable=True)
54
+ dismissed = Column(Boolean, nullable=False, default=False)
54
55
 
55
56
  monitor_config = relationship(MonitorConfig, cascade="all, delete")
56
57
  execution_logs = relationship(
@@ -0,0 +1,10 @@
1
+ """Digest models package."""
2
+
3
+ from fides.api.models.digest.conditional_dependencies import DigestConditionType
4
+ from fides.api.models.digest.digest_config import DigestConfig, DigestType
5
+
6
+ __all__ = [
7
+ "DigestConfig",
8
+ "DigestType",
9
+ "DigestConditionType",
10
+ ]
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ class DigestConditionType(str, Enum):
5
+ """Types of digest conditions - each can have their own tree."""
6
+
7
+ RECEIVER = "receiver"
8
+ CONTENT = "content"
9
+ PRIORITY = "priority"
@@ -0,0 +1,76 @@
1
+ from enum import Enum
2
+ from typing import Optional, Union
3
+
4
+ from sqlalchemy import Boolean, Column, DateTime, String, Text
5
+ from sqlalchemy.dialects.postgresql import JSONB
6
+ from sqlalchemy.ext.declarative import declared_attr
7
+ from sqlalchemy.orm import Session
8
+
9
+ from fides.api.db.base_class import Base
10
+ from fides.api.db.util import EnumColumn
11
+ from fides.api.models.digest.conditional_dependencies import DigestConditionType
12
+ from fides.api.schemas.messaging.messaging import MessagingMethod
13
+ from fides.api.task.conditional_dependencies.schemas import (
14
+ Condition,
15
+ ConditionGroup,
16
+ ConditionLeaf,
17
+ )
18
+
19
+
20
+ class DigestType(str, Enum):
21
+ """Types of digests that can be configured."""
22
+
23
+ MANUAL_TASKS = "manual_tasks"
24
+ PRIVACY_REQUESTS = "privacy_requests"
25
+ # More types can be added here
26
+
27
+
28
+ class DigestConfig(Base):
29
+ """Generic configuration for any type of digest."""
30
+
31
+ @declared_attr
32
+ def __tablename__(cls) -> str:
33
+ return "digest_config"
34
+
35
+ # Digest identification
36
+ digest_type = Column(EnumColumn(DigestType), nullable=False, index=True)
37
+ name = Column(String(255), nullable=False)
38
+ description = Column(Text, nullable=True)
39
+
40
+ # Configuration
41
+ enabled = Column(Boolean, nullable=False, default=True, index=True)
42
+ messaging_service_type = Column(
43
+ EnumColumn(MessagingMethod),
44
+ nullable=False,
45
+ default=MessagingMethod.EMAIL,
46
+ index=True,
47
+ )
48
+ cron_expression = Column(String(100), nullable=False, default="0 9 * * 1")
49
+ timezone = Column(String(50), nullable=False, default="US/Eastern")
50
+ last_sent_at = Column(DateTime(timezone=True), nullable=True)
51
+ next_scheduled_at = Column(DateTime(timezone=True), nullable=True, index=True)
52
+ config_metadata = Column(JSONB, nullable=True, default={})
53
+
54
+ def get_receiver_conditions(
55
+ self, db: Session
56
+ ) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
57
+ """Get receiver conditions for this digest config."""
58
+ raise NotImplementedError("Conditions are not implemented for digests")
59
+
60
+ def get_content_conditions(
61
+ self, db: Session
62
+ ) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
63
+ """Get content conditions for this digest config."""
64
+ raise NotImplementedError("Conditions are not implemented for digests")
65
+
66
+ def get_priority_conditions(
67
+ self, db: Session
68
+ ) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
69
+ """Get priority conditions for this digest config."""
70
+ raise NotImplementedError("Conditions are not implemented for digests")
71
+
72
+ def get_all_conditions(
73
+ self, db: Session
74
+ ) -> dict["DigestConditionType", Optional[Condition]]:
75
+ """Get all condition types for this digest config."""
76
+ raise NotImplementedError("Conditions are not implemented for digests")
@@ -1,13 +1,14 @@
1
- from enum import Enum
2
- from typing import TYPE_CHECKING, Optional, Union
1
+ from typing import TYPE_CHECKING, Any, Optional, Union
3
2
 
4
- from sqlalchemy import Column, ForeignKey, Index, Integer, String
5
- from sqlalchemy.dialects.postgresql import JSONB
3
+ from sqlalchemy import Column, ForeignKey, Index, String
6
4
  from sqlalchemy.ext.declarative import declared_attr
7
5
  from sqlalchemy.orm import Session, relationship
8
6
 
9
- from fides.api.db.base_class import Base, FidesBase
10
- from fides.api.db.util import EnumColumn
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
+ )
11
12
  from fides.api.task.conditional_dependencies.schemas import (
12
13
  ConditionGroup,
13
14
  ConditionLeaf,
@@ -17,42 +18,16 @@ if TYPE_CHECKING:
17
18
  from fides.api.models.manual_task.manual_task import ManualTask
18
19
 
19
20
 
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."""
21
+ class ManualTaskConditionalDependency(ConditionalDependencyBase):
22
+ """Manual task conditional dependencies - single type hierarchy."""
46
23
 
47
24
  @declared_attr
48
25
  def __tablename__(cls) -> str:
49
- """Overriding base class method to set the table name."""
50
26
  return "manual_task_conditional_dependency"
51
27
 
52
28
  # We need to redefine it here so that self-referential relationships
53
29
  # can properly reference the `id` column instead of the built-in Python function.
54
30
  id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
55
-
56
31
  # Foreign key relationships
57
32
  manual_task_id = Column(
58
33
  String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
@@ -63,18 +38,6 @@ class ManualTaskConditionalDependency(Base):
63
38
  nullable=True,
64
39
  )
65
40
 
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
-
78
41
  __table_args__ = (
79
42
  Index("ix_manual_task_conditional_dependency_manual_task_id", "manual_task_id"),
80
43
  Index("ix_manual_task_conditional_dependency_parent_id", "parent_id"),
@@ -97,38 +60,20 @@ class ManualTaskConditionalDependency(Base):
97
60
  foreign_keys=[parent_id],
98
61
  )
99
62
 
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
-
127
63
  @classmethod
128
64
  def get_root_condition(
129
- cls, db: Session, manual_task_id: str
65
+ cls, db: Session, *args: Any, **kwargs: Any
130
66
  ) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
131
- """Get the root condition for a config"""
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]
132
77
  root = (
133
78
  db.query(cls)
134
79
  .filter(cls.manual_task_id == manual_task_id, cls.parent_id.is_(None))
@@ -138,7 +83,6 @@ class ManualTaskConditionalDependency(Base):
138
83
  if not root:
139
84
  return None
140
85
 
141
- if root.condition_type == "leaf":
86
+ if root.condition_type == ConditionalDependencyType.leaf:
142
87
  return root.to_condition_leaf()
143
-
144
88
  return root.to_condition_group()
@@ -177,6 +177,30 @@ 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
+
180
204
 
181
205
  def _get_ref_from_taxonomy(
182
206
  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(Enum):
44
+ class ConsentMechanism(str, Enum):
45
45
  """
46
46
  Enum is not formalized in the DB because it may be subject to frequent change
47
47
  """
@@ -261,6 +261,12 @@ 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
+
264
270
  pre_approval_webhook_replies = relationship(
265
271
  PreApprovalWebhookReply,
266
272
  back_populates="privacy_request",
@@ -355,6 +361,64 @@ class PrivacyRequest(
355
361
 
356
362
  return super().create(db=db, data=data, check_name=check_name)
357
363
 
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
+
358
422
  def clear_cached_values(self) -> None:
359
423
  """
360
424
  Clears all cached values associated with this privacy request from Redis.
@@ -903,6 +967,8 @@ class PrivacyRequest(
903
967
  callback_type=CallbackType.pre_approval,
904
968
  identity=self.get_cached_identity_data(),
905
969
  policy_action=policy_action,
970
+ privacy_request=self.to_safe_dict(),
971
+ timestamp=datetime.utcnow(),
906
972
  )
907
973
  headers = {
908
974
  "reply-to-approve": f"/privacy-request/{self.id}/pre-approve/eligible",
@@ -943,6 +1009,8 @@ class PrivacyRequest(
943
1009
  callback_type=webhook.prefix,
944
1010
  identity=self.get_cached_identity_data(),
945
1011
  policy_action=policy_action,
1012
+ privacy_request=self.to_safe_dict(),
1013
+ timestamp=datetime.utcnow(),
946
1014
  )
947
1015
 
948
1016
  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 Optional
8
+ from typing import Any, Dict, Optional
9
9
 
10
10
  from pydantic import BaseModel, ConfigDict
11
11
 
@@ -51,6 +51,8 @@ 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
54
56
 
55
57
 
56
58
  def generate_request_callback_resume_jwe(webhook: PolicyPreWebhook) -> str:
fides/api/oauth/roles.py CHANGED
@@ -26,6 +26,7 @@ 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,
29
30
  PRIVACY_REQUEST_DELETE,
30
31
  PRIVACY_REQUEST_EMAIL_INTEGRATIONS_SEND,
31
32
  PRIVACY_REQUEST_MANUAL_STEPS_RESPOND,
@@ -88,6 +89,7 @@ approver_scopes = [
88
89
  PRIVACY_REQUEST_UPLOAD_DATA,
89
90
  PRIVACY_REQUEST_VIEW_DATA,
90
91
  PRIVACY_REQUEST_DELETE,
92
+ PRIVACY_REQUEST_CREATE, # allows approvers to create new privacy requests
91
93
  USER_READ, # allows approver to view user management table and update their own password
92
94
  PRIVACY_REQUEST_MANUAL_STEPS_REVIEW, # allows approvers to see all manual steps
93
95
  ]
@@ -0,0 +1,42 @@
1
+ from enum import Enum
2
+ from typing import Optional
3
+
4
+ from pydantic import BaseModel, ConfigDict, Field
5
+
6
+ from fides.api.schemas.base_class import NoValidationSchema
7
+
8
+
9
+ class OAuthGrantType(str, Enum):
10
+ """OAuth2 grant types supported by the system"""
11
+
12
+ client_credentials = "client_credentials"
13
+
14
+
15
+ class OAuthConfigSchema(BaseModel):
16
+ """Schema for OAuth2 configuration used in API requests"""
17
+
18
+ grant_type: Optional[OAuthGrantType] = None
19
+ token_url: Optional[str] = None
20
+ scope: Optional[str] = None
21
+ client_id: Optional[str] = None
22
+ client_secret: Optional[str] = Field(json_schema_extra={"sensitive": True})
23
+
24
+ model_config = ConfigDict(
25
+ from_attributes=True, use_enum_values=True, extra="forbid"
26
+ )
27
+
28
+
29
+ class OAuthConfigResponse(BaseModel):
30
+ """Schema for OAuth2 configuration used in API responses with masked sensitive fields"""
31
+
32
+ grant_type: OAuthGrantType
33
+ token_url: str
34
+ scope: Optional[str] = None
35
+ client_id: str
36
+ client_secret: str = "**********" # Always masked in responses
37
+
38
+ model_config = ConfigDict(from_attributes=True, use_enum_values=True)
39
+
40
+
41
+ class OAuthConfigDocsSchema(OAuthConfigSchema, NoValidationSchema):
42
+ """OAuth2 Config Schema for API Docs"""
@@ -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 PrivacyRequestReviewer
17
+ from fides.api.schemas.user import PrivacyRequestUser
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,7 +316,9 @@ 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
- reviewer: Optional[PrivacyRequestReviewer] = None
319
+ submitted_by: Optional[str] = None
320
+ reviewer: Optional[PrivacyRequestUser] = None
321
+ submitter: Optional[PrivacyRequestUser] = None
320
322
  finished_processing_at: Optional[datetime] = None
321
323
  identity_verified_at: Optional[datetime] = None
322
324
  paused_at: Optional[datetime] = None
@@ -340,6 +342,7 @@ class PrivacyRequestResponse(FidesSchema):
340
342
  deleted_by: Optional[str] = None
341
343
  finalized_at: Optional[datetime] = None
342
344
  finalized_by: Optional[str] = None
345
+
343
346
  model_config = ConfigDict(from_attributes=True, use_enum_values=True)
344
347
 
345
348
 
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 PrivacyRequestReviewer(FidesSchema):
14
- """Data we can expose via the PrivacyRequest.reviewer relation"""
13
+ class PrivacyRequestUser(FidesSchema):
14
+ """Data we can expose via PrivacyRequest user relations (reviewer, submitter, etc.)"""
15
15
 
16
16
  id: str
17
17
  username: str