ethyca-fides 2.57.1b9__py2.py3-none-any.whl → 2.57.1rc0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. {ethyca_fides-2.57.1b9.dist-info → ethyca_fides-2.57.1rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.57.1b9.dist-info → ethyca_fides-2.57.1rc0.dist-info}/RECORD +228 -243
  3. fides/_version.py +3 -3
  4. fides/api/api/v1/endpoints/config_endpoints.py +2 -4
  5. fides/api/api/v1/endpoints/generic_overrides.py +6 -48
  6. fides/api/models/asset.py +18 -37
  7. fides/api/models/attachment.py +13 -11
  8. fides/api/models/comment.py +17 -17
  9. fides/api/models/connectionconfig.py +1 -1
  10. fides/api/models/detection_discovery.py +0 -12
  11. fides/api/models/location_regulation_selections.py +0 -1
  12. fides/api/models/{privacy_request/privacy_request.py → privacy_request.py} +691 -82
  13. fides/api/models/sql_models.py +5 -28
  14. fides/api/oauth/jwt.py +0 -18
  15. fides/api/oauth/utils.py +11 -11
  16. fides/api/schemas/dataset.py +2 -22
  17. fides/api/schemas/saas/strategy_configuration.py +0 -1
  18. fides/api/service/pagination/pagination_strategy_cursor.py +1 -15
  19. fides/api/service/pagination/pagination_strategy_link.py +1 -1
  20. fides/api/tasks/storage.py +111 -12
  21. fides/config/__init__.py +1 -1
  22. fides/data/language/languages.yml +0 -2
  23. fides/data/location/locations.yml +1 -244
  24. fides/ui-build/static/admin/404.html +1 -1
  25. fides/ui-build/static/admin/_next/static/chunks/{1150-035a721a04f4451e.js → 1150-73440d7b319558e8.js} +1 -1
  26. fides/ui-build/static/admin/_next/static/chunks/1995-0e4fc4f7b44ed72b.js +1 -0
  27. fides/ui-build/static/admin/_next/static/chunks/{2397-ee53235fb21b5e97.js → 2397-7177ecf4ebe68feb.js} +1 -1
  28. fides/ui-build/static/admin/_next/static/chunks/{255-7db55b0e3a0f9dea.js → 255-bf1797f78249d090.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/2780-8328de94968d05e4.js +4 -0
  30. fides/ui-build/static/admin/_next/static/chunks/3005-373de16453ed7eea.js +1 -0
  31. fides/ui-build/static/admin/_next/static/chunks/{3086-b5054ec2c75700b9.js → 3086-be6b52546c3efc90.js} +1 -1
  32. fides/ui-build/static/admin/_next/static/chunks/3320-87c75df57a47487e.js +1 -0
  33. fides/ui-build/static/admin/_next/static/chunks/3627-fb83adac32c128e6.js +1 -0
  34. fides/ui-build/static/admin/_next/static/chunks/3662-420d9807c30008ab.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/{3855-b6b7865dedd7bc2a.js → 3855-5c7b11871f59e0e0.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/{3872-4e053c20d546f027.js → 3872-f3d5054bdc584eaa.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/3949-9888699e2ac564c4.js +1 -0
  38. fides/ui-build/static/admin/_next/static/chunks/3967-845c902667e47c4f.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/3e38ba78-4487e45fd4ed2479.js +2 -0
  40. fides/ui-build/static/admin/_next/static/chunks/4481-ca8d2c75d634b6bc.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/4723-81d28e5be5c7b6d7.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/4833-a85bd5d25ebc40c4.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/5246-9fc6af1a6499e0a4.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/{5258-0658dc2274df6832.js → 5258-3a650be9142cf914.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{5480-f49696df5e8ae500.js → 5480-f5bec5e881f72f8d.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{5487-3ad50d21cdbc9209.js → 5487-d96e1abc93f92631.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/5574-a4047e826a8cd4c3.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/{5826-e5dcb4e68cfe6289.js → 5826-16e497af363a0cbc.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/5834-bd9ed01c4ab2ef5c.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/{9014-eeae6f581158e645.js → 5908-532dfbc9d930f635.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/5960-8895f51b30c35798.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/{5973-9c58e4cce2f343a8.js → 5973-67c7562997f7d5cb.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/6277-515c922445b8edc5.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/{6315-fa1519cdf080f42d.js → 6315-dee79f6861c94d2d.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/{6372-ca9c12ac8902365b.js → 6372-f1b54f3cb4888660.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/{6853-8941824350c3c1a8.js → 6853-cacea421af3bfc26.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/6954-6eb480eb132239c3.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/7044-9dc90893067f38ae.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/{7088.eb76fca286e5f2e6.js → 7088.0e7c92a7cbb57562.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/{7751-a8f31c062d4cb09d.js → 7751-25e0c1307988ffd7.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/{79-f9b948ebb186900f.js → 79-ba88d0cf4c65aaa2.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/7980-2597c279c30fbcda.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/7c79804f.26834f883d5ad770.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/{8433-b3008ecaf9834e7f.js → 8433-969280d321d1c3a2.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/{8499-43606100edf42fdf.js → 8499-07507004e8275df2.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/8837-cf26e5ca1ae5aaf5.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/{9046-04bd7becea207cb1.js → 9046-80f1ea44f89fe32c.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/9282-1a5a2f6f4d9ed586.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/{9392.da35a8e778812d91.js → 9392.97b2e3327dceb7c9.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/9676.f4d5977a5f148797.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/9767-4c591bd478c72650.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/{9999-637e0e5341f15f4a.js → 9999-f2e40d5b13343220.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/{main-app-94a0711202e08b15.js → main-app-2650f704701c6a7b.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/main-ce7f38a12ea8c223.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/pages/{404-b202c0d8f6fc75c3.js → 404-1087258931760074.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/_app-9ceff88561dc1250.js +909 -0
  77. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-c2705210ce986109.js → manual-d7f60624cbc12217.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-ba975134a85588f8.js → multiple-18b0b521255289a3.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-136bcbd20ac59bf5.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-b9932971a479f3a7.js → ant-poc-b3b4d0a98450ffd1.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-b34e5324461d0c87.js → add-vendors-64f83e9a2b777bf3.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-e11ace4f273ebb47.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-cf51752eb0902233.js → [id]-443e6dd191ce5588.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-be194737b41ccec9.js → new-36162d5bea29dcc2.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-c946b33b0322b8ad.js → privacy-experience-35e9df60b21e21a6.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-72251b48e2e03a1e.js → [id]-2d651499c07d12d9.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-9611dd42856d6062.js → new-36e57d2f2446be82.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-ea57f9d6ad17e957.js → privacy-notices-da37afbe5ec81339.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-e5748812ba055a56.js → properties-c57b209feef7c2da.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-ae66e1a7e146a4de.js → reporting-97fea4ac45093cbd.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-39d65f13cc8f1cf8.js → consent-24bef021ee71e36c.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-ac033a16f043e6f9.js → [resourceUrn]-6cbd79481199812d.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-a29850536c85d4b8.js → [projectUrn]-46b9790da2fec05a.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-c44ce244122e96d5.js → projects-1f965b9c496071d1.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-71e26d262afcaea5.js → [resourceUrn]-e7833c1c606081a9.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-305555b74c357bf2.js → resources-bed368d048ea6883.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-942d68a88b321067.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-00526324583139ab.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-f0ab51d0d5f995de.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-2220c30c3863b5a5.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-11b3ce9f61d9bfe9.js → activity-1d7936f05d23097f.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-054ca46a782e99a5.js → [resourceUrn]-68122dbf449a11b4.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-b75dd3e4306ac18e.js → detection-0ceaf3c555e84714.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-1da20aeb6fc995e4.js → [resourceUrn]-22c27fe0f898ad2a.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-cad50b0cc6d1050c.js → discovery-8f2b102e19b0b8f2.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-8cb714cdd44ac40e.js → datamap-9cd0c40bef77b120.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-ab9bc1a3640547db.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-17ec8385bb1fa6d4.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-6ba18f92ba561114.js → [datasetId]-e14c1c07658f8a10.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-740824dfa6823e26.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-5541ecd2f62711a5.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-bbe1ca2793798e6b.js → [id]-0616437e1a82d3ed.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-abc17fef69cd951b.js → new-f8218440494e8532.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-b8eaa9b9d3832b30.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/{index-bfaacdb55a5a6c9f.js → index-94e6d589c4edf360.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-a6448ce6ba7f0cf5.js +1 -0
  117. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-1a6965d78bfb26b0.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-ad02e019b2467958.js → [id]-6b032de0a6c2c400.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-f9693cb6a0b7ded8.js → add-template-c0d6ae68ff7979c6.js} +1 -1
  120. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-f263e6bacf0f2d19.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-fe765154315782cf.js → [id]-bbe5854b7d19b7e9.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-b96ee3fea3920fcf.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-1b0f9469cb65abfc.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-2987edc77388e85a.js → configure-4bad69cd42c9722c.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-eebd2f4ead19cfd6.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-94e2faa73dd6a3e6.js → [id]-b4c808a8a0287d11.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-630a6a3dd6502ba6.js → add-property-5a701477b006a63b.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-20ca2f963906674b.js → properties-9a1899dfe052023e.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-a3fa3ad77730a03b.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-a49d0f84cf0cf05e.js → about-d073be113e9ca7b0.js} +1 -1
  131. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4769f55b138073f7.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-52d030b1db2ca1b9.js → custom-fields-744e7bbc200557e7.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-fa42d8f18df44927.js → domain-records-c5cd5fb578de9515.js} +1 -1
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-775f55b3f80cd452.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-6fd6071e2009b8f2.js → email-templates-39c7ae3602ac69b2.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-66c757325cb58467.js → locations-45e33ba111f8f8b0.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-14def4ca3cc9cda5.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-c6c239996cfa6ae8.js → regulations-94975aeab348528e.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-21f26c0dc4d09e9f.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-d3ea9034461511cd.js → [id]-82d9af34546adaa2.js} +1 -1
  141. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-abd68fc5ddde5482.js → systems-c320df35d51dc537.js} +1 -1
  142. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-16b4d75c49276add.js → taxonomy-181ea5b0ac975239.js} +1 -1
  143. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-78eaf933f755bfe8.js → [id]-622e16a17a11c096.js} +1 -1
  144. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-6c9ad62479a7d03e.js → user-management-aa872b21bb835d34.js} +1 -1
  145. fides/ui-build/static/admin/_next/static/chunks/{webpack-2c7ccac5843c4d8e.js → webpack-4df2ba5ee2d40f0a.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/css/957d0e4fea846ff0.css +1 -0
  147. fides/ui-build/static/admin/_next/static/rOPehh5NMs1hjog7nTw1q/_buildManifest.js +1 -0
  148. fides/ui-build/static/admin/_next/static/rOPehh5NMs1hjog7nTw1q/_ssgManifest.js +1 -0
  149. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  150. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  151. fides/ui-build/static/admin/add-systems.html +1 -1
  152. fides/ui-build/static/admin/ant-poc.html +1 -1
  153. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  154. fides/ui-build/static/admin/consent/configure.html +1 -1
  155. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  156. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  158. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  159. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  160. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  161. fides/ui-build/static/admin/consent/properties.html +1 -1
  162. fides/ui-build/static/admin/consent/reporting.html +1 -1
  163. fides/ui-build/static/admin/consent.html +1 -1
  164. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  165. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  166. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  167. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  168. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  169. fides/ui-build/static/admin/data-catalog.html +1 -1
  170. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  171. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  172. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  173. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  174. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  175. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  176. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  177. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  178. fides/ui-build/static/admin/datamap.html +1 -1
  179. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  180. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  181. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  182. fides/ui-build/static/admin/dataset/new.html +1 -1
  183. fides/ui-build/static/admin/dataset.html +1 -1
  184. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  185. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  186. fides/ui-build/static/admin/datastore-connection.html +1 -1
  187. fides/ui-build/static/admin/index.html +1 -1
  188. fides/ui-build/static/admin/integrations/[id].html +1 -1
  189. fides/ui-build/static/admin/integrations.html +1 -1
  190. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  191. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  192. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  193. fides/ui-build/static/admin/lib/fides.js +2 -2
  194. fides/ui-build/static/admin/login/[provider].html +1 -1
  195. fides/ui-build/static/admin/login.html +1 -1
  196. fides/ui-build/static/admin/messaging/[id].html +1 -1
  197. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  198. fides/ui-build/static/admin/messaging.html +1 -1
  199. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  200. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  201. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  202. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  203. fides/ui-build/static/admin/privacy-requests.html +1 -1
  204. fides/ui-build/static/admin/properties/[id].html +1 -1
  205. fides/ui-build/static/admin/properties/add-property.html +1 -1
  206. fides/ui-build/static/admin/properties.html +1 -1
  207. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  208. fides/ui-build/static/admin/settings/about.html +1 -1
  209. fides/ui-build/static/admin/settings/consent.html +1 -1
  210. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  211. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  212. fides/ui-build/static/admin/settings/domains.html +1 -1
  213. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  214. fides/ui-build/static/admin/settings/locations.html +1 -1
  215. fides/ui-build/static/admin/settings/organization.html +1 -1
  216. fides/ui-build/static/admin/settings/regulations.html +1 -1
  217. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  218. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  219. fides/ui-build/static/admin/systems.html +1 -1
  220. fides/ui-build/static/admin/taxonomy.html +1 -1
  221. fides/ui-build/static/admin/user-management/new.html +1 -1
  222. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  223. fides/ui-build/static/admin/user-management.html +1 -1
  224. fides/api/alembic/migrations/versions/1d2f04ac19f2_add_page_column_to_asset_table.py +0 -49
  225. fides/api/alembic/migrations/versions/7c3fbee90c78_add_user_assigned_data_uses_and_system_.py +0 -54
  226. fides/api/alembic/migrations/versions/9a1eacd2666b_add_description_column_to_asset.py +0 -25
  227. fides/api/models/privacy_request/__init__.py +0 -44
  228. fides/api/models/privacy_request/consent.py +0 -155
  229. fides/api/models/privacy_request/execution_log.py +0 -108
  230. fides/api/models/privacy_request/provided_identity.py +0 -149
  231. fides/api/models/privacy_request/request_task.py +0 -284
  232. fides/api/models/privacy_request/webhook.py +0 -94
  233. fides/api/service/storage/s3.py +0 -193
  234. fides/api/service/storage/util.py +0 -10
  235. fides/ui-build/static/admin/_next/static/chunks/1100-053fc6b76c65a00f.js +0 -1
  236. fides/ui-build/static/admin/_next/static/chunks/1376-5cea5ef9362215e8.js +0 -1
  237. fides/ui-build/static/admin/_next/static/chunks/2fbcc6de-a6c61724c327e9fa.js +0 -8
  238. fides/ui-build/static/admin/_next/static/chunks/3320-5dd62a256ecfc9c3.js +0 -1
  239. fides/ui-build/static/admin/_next/static/chunks/355-8a77c9a1cd027f2e.js +0 -1
  240. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/4060-8d165e1236ea521a.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/4481-142e5a922d5a5548.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/4723-0a3c5e2ce143a7d0.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/5277-e8a036319456127f.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/605-e692e9cfea2e2cb8.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +0 -4
  248. fides/ui-build/static/admin/_next/static/chunks/6527-0eed08abe252a918.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/678d4732-50255cc09048e643.js +0 -2
  250. fides/ui-build/static/admin/_next/static/chunks/6954-3b887fb444f9228c.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/7434-e6fc02c2dd852991.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/7980-4bd08957448dea32.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/7c79804f.7a7112aece470725.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/8702-d1c8296f9f6afc10.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/905-8ab919e7b274ed50.js +0 -8
  256. fides/ui-build/static/admin/_next/static/chunks/9187-851756440f79cd75.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/9282-2bfbdca45e84e810.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/9327-2cba327d10586683.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/9676.f297a1347ac09c56.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/9767-1a23925d2cb27b51.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/e3251fe7-5777b5d778e6fffa.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/main-24f422f93845a596.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/pages/_app-44256886387d7e3e.js +0 -923
  264. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d258f0c25fa020bf.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-723cc3d4f5740ea6.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-900004e402c31797.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5182d356672a3b02.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-7c74373a4d666a3d.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-02439d3aeecfb4b9.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d79551d4c64c398c.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7e5df4a0de7540bb.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-803c1b577ab17ae3.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-fa743ddc7f89d76b.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-a78a73b65929853a.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/fides-js-docs-80b241bf6cddb72e.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-d4329043219fed9b.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adb6aced3bdb4899.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-1e60754abec1ee6b.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-f5f7a8069909ef24.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-9f7eaad05e5b9292.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-d85c0d16ba09ba35.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-afedc48ef4e7f858.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-89524101b7279f6e.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-24cba38685dc872c.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-a08693d0d1e10bc8.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-151571cff4e85894.js +0 -1
  287. fides/ui-build/static/admin/_next/static/css/113d823fe71f6af0.css +0 -1
  288. fides/ui-build/static/admin/_next/static/css/ab65b8cc3144bfc8.css +0 -1
  289. fides/ui-build/static/admin/_next/static/yhm3LM_VFpK2KeFRFEQyN/_buildManifest.js +0 -1
  290. fides/ui-build/static/admin/_next/static/yhm3LM_VFpK2KeFRFEQyN/_ssgManifest.js +0 -1
  291. {ethyca_fides-2.57.1b9.dist-info → ethyca_fides-2.57.1rc0.dist-info}/LICENSE +0 -0
  292. {ethyca_fides-2.57.1b9.dist-info → ethyca_fides-2.57.1rc0.dist-info}/WHEEL +0 -0
  293. {ethyca_fides-2.57.1b9.dist-info → ethyca_fides-2.57.1rc0.dist-info}/entry_points.txt +0 -0
  294. {ethyca_fides-2.57.1b9.dist-info → ethyca_fides-2.57.1rc0.dist-info}/top_level.txt +0 -0
  295. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-be690621a944bfe2.js → new-d6717378b42982d5.js} +0 -0
@@ -1,284 +0,0 @@
1
- # pylint: disable=R0401, C0302
2
-
3
- from __future__ import annotations
4
-
5
- from typing import TYPE_CHECKING, List, Optional, Tuple
6
-
7
- from loguru import logger
8
- from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
9
- from sqlalchemy.dialects.postgresql import JSONB
10
- from sqlalchemy.ext.mutable import MutableDict, MutableList
11
- from sqlalchemy.orm import Query, Session, relationship
12
- from sqlalchemy_utils.types.encrypted.encrypted_type import (
13
- AesGcmEngine,
14
- StringEncryptedType,
15
- )
16
-
17
- from fides.api.db.base_class import Base # type: ignore[attr-defined]
18
- from fides.api.db.base_class import JSONTypeOverride
19
- from fides.api.db.util import EnumColumn
20
- from fides.api.graph.config import (
21
- ROOT_COLLECTION_ADDRESS,
22
- TERMINATOR_ADDRESS,
23
- CollectionAddress,
24
- )
25
- from fides.api.models.privacy_request.execution_log import (
26
- COMPLETED_EXECUTION_LOG_STATUSES,
27
- )
28
- from fides.api.schemas.base_class import FidesSchema
29
- from fides.api.schemas.policy import ActionType
30
- from fides.api.schemas.privacy_request import ExecutionLogStatus
31
- from fides.api.util.cache import (
32
- FidesopsRedis,
33
- celery_tasks_in_flight,
34
- get_async_task_tracking_cache_key,
35
- get_cache,
36
- )
37
- from fides.api.util.collection_util import Row
38
- from fides.config import CONFIG
39
-
40
- if TYPE_CHECKING:
41
- from fides.api.models.privacy_request.privacy_request import PrivacyRequest
42
-
43
-
44
- class TraversalDetails(FidesSchema):
45
- """Schema to format saving pre-calculated traversal details on RequestTask.traversal_details"""
46
-
47
- dataset_connection_key: str
48
- incoming_edges: List[Tuple[str, str]]
49
- outgoing_edges: List[Tuple[str, str]]
50
- input_keys: List[str]
51
- skipped_nodes: Optional[List[Tuple[str, str]]] = None
52
-
53
- # TODO: remove this method once we support custom request fields in DSR graph.
54
- @classmethod
55
- def create_empty_traversal(cls, connection_key: str) -> TraversalDetails:
56
- """
57
- Creates an "empty" TraversalDetails object that only has the dataset connection key set.
58
- This is a bit of a hacky workaround needed to implement the Dynamic Erasure Emails feature,
59
- but we should no longer need it once the custom_request_fields are included in our graph
60
- traversal
61
- """
62
- return cls(
63
- dataset_connection_key=connection_key,
64
- incoming_edges=[],
65
- outgoing_edges=[],
66
- input_keys=[],
67
- skipped_nodes=[],
68
- )
69
-
70
-
71
- class RequestTask(Base):
72
- """
73
- An individual Task for a Privacy Request.
74
-
75
- When we execute a PrivacyRequest, we build a graph by combining the current datasets with the identity data
76
- and we save the nodes (collections) in the graph as Request Tasks.
77
-
78
- Currently, we build access, erasure, and consent Request Tasks.
79
- """
80
-
81
- privacy_request_id = Column(
82
- String,
83
- ForeignKey("privacyrequest.id", ondelete="SET NULL"),
84
- nullable=True,
85
- index=True,
86
- )
87
-
88
- # Identifiers of this request task
89
- collection_address = Column(
90
- String, nullable=False, index=True
91
- ) # Of the format dataset_name:collection_name for convenience
92
- dataset_name = Column(String, nullable=False, index=True)
93
- collection_name = Column(String, nullable=False, index=True)
94
- action_type = Column(EnumColumn(ActionType), nullable=False, index=True)
95
-
96
- # Note that RequestTasks share statuses with ExecutionLogs. When a RequestTask changes state, an ExecutionLog
97
- # is also created with that state. These are tied tightly together in GraphTask.
98
- status = Column(
99
- EnumColumn(
100
- ExecutionLogStatus,
101
- native_enum=False,
102
- values_callable=lambda x: [
103
- i.value for i in x
104
- ], # Using ExecutionLogStatus values in database, even though app is using the names.
105
- ), # character varying in database
106
- index=True,
107
- nullable=False,
108
- )
109
-
110
- upstream_tasks = Column(
111
- MutableList.as_mutable(JSONB)
112
- ) # List of collection address strings
113
- downstream_tasks = Column(
114
- MutableList.as_mutable(JSONB)
115
- ) # List of collection address strings
116
- all_descendant_tasks = Column(
117
- MutableList.as_mutable(JSONB)
118
- ) # All tasks that can be reached by the current task. This is useful when this task fails,
119
- # and we can mark every single one of these as failed.
120
-
121
- # Raw data retrieved from an access request is stored here. This contains all of the
122
- # intermediate data we retrieved, needed for downstream tasks, but hasn't been filtered
123
- # by data category for the end user.
124
- access_data = Column( # An encrypted JSON String - saved as a list of Rows
125
- StringEncryptedType(
126
- type_in=JSONTypeOverride,
127
- key=CONFIG.security.app_encryption_key,
128
- engine=AesGcmEngine,
129
- padding="pkcs5",
130
- ),
131
- )
132
-
133
- # This is the raw access data saved in erasure format (with placeholders preserved) to perform a masking request.
134
- # First saved on the access node, and then copied to the corresponding erasure node.
135
- data_for_erasures = Column( # An encrypted JSON String - saved as a list of rows
136
- StringEncryptedType(
137
- type_in=JSONTypeOverride,
138
- key=CONFIG.security.app_encryption_key,
139
- engine=AesGcmEngine,
140
- padding="pkcs5",
141
- ),
142
- )
143
-
144
- # Written after an erasure is completed
145
- rows_masked = Column(Integer)
146
- # Written after a consent request is completed - not all consent
147
- # connectors will end up sending a request
148
- consent_sent = Column(Boolean)
149
-
150
- # For async tasks awaiting callback
151
- callback_succeeded = Column(Boolean)
152
-
153
- # Stores a serialized collection that can be transformed back into a Collection to help
154
- # execute the current task
155
- collection = Column(MutableDict.as_mutable(JSONB))
156
- # Stores key details from traversal.traverse in the format of TraversalDetails
157
- traversal_details = Column(MutableDict.as_mutable(JSONB))
158
-
159
- privacy_request = relationship(
160
- "PrivacyRequest",
161
- back_populates="request_tasks",
162
- uselist=False,
163
- )
164
-
165
- @property
166
- def request_task_address(self) -> CollectionAddress:
167
- """Convert the collection_address into Collection Address format"""
168
- return CollectionAddress.from_string(self.collection_address)
169
-
170
- @property
171
- def is_root_task(self) -> bool:
172
- """Convenience helper for asserting whether the task is a root task"""
173
- return self.request_task_address == ROOT_COLLECTION_ADDRESS
174
-
175
- @property
176
- def is_terminator_task(self) -> bool:
177
- """Convenience helper for asserting whether the task is a terminator task"""
178
- return self.request_task_address == TERMINATOR_ADDRESS
179
-
180
- def get_cached_task_id(self) -> Optional[str]:
181
- """Gets the cached celery task ID for this request task."""
182
- cache: FidesopsRedis = get_cache()
183
- task_id = cache.get(get_async_task_tracking_cache_key(self.id))
184
- return task_id
185
-
186
- def get_access_data(self) -> List[Row]:
187
- """Helper to retrieve access data or default to empty list"""
188
- return self.access_data or []
189
-
190
- def get_data_for_erasures(self) -> List[Row]:
191
- """Helper to retrieve erasure data needed to build masking requests or default to empty list"""
192
- return self.data_for_erasures or []
193
-
194
- def update_status(self, db: Session, status: ExecutionLogStatus) -> None:
195
- """Helper method to update a task's status"""
196
- self.status = status
197
- self.save(db)
198
-
199
- def get_tasks_with_same_action_type(
200
- self, db: Session, collection_address_str: str
201
- ) -> Query:
202
- """Fetch task on the same privacy request and action type as current by collection address"""
203
- return db.query(RequestTask).filter(
204
- RequestTask.privacy_request_id == self.privacy_request_id,
205
- RequestTask.action_type == self.action_type,
206
- RequestTask.collection_address == collection_address_str,
207
- )
208
-
209
- def get_pending_downstream_tasks(self, db: Session) -> Query:
210
- """Returns the immediate downstream task objects that are still pending"""
211
- return db.query(RequestTask).filter(
212
- RequestTask.privacy_request_id == self.privacy_request_id,
213
- RequestTask.action_type == self.action_type,
214
- RequestTask.collection_address.in_(self.downstream_tasks or []),
215
- RequestTask.status == ExecutionLogStatus.pending,
216
- )
217
-
218
- def can_queue_request_task(self, db: Session, should_log: bool = False) -> bool:
219
- """Returns True if upstream tasks are complete and the current Request Task
220
- is not running in another celery task.
221
-
222
- This check ignores its database status - that is checked elsewhere.
223
- """
224
- return self.upstream_tasks_complete(
225
- db, should_log
226
- ) and not self.request_task_running(should_log)
227
-
228
- def upstream_tasks_complete(self, db: Session, should_log: bool = False) -> bool:
229
- """Determines if all of the upstream tasks of the current task are complete"""
230
- upstream_tasks: Query = self.upstream_tasks_objects(db)
231
- tasks_complete: bool = all(
232
- upstream_task.status in COMPLETED_EXECUTION_LOG_STATUSES
233
- for upstream_task in upstream_tasks
234
- ) and upstream_tasks.count() == len(self.upstream_tasks or [])
235
-
236
- if not tasks_complete and should_log:
237
- logger.debug(
238
- "Upstream tasks incomplete for {} task {}.",
239
- self.action_type.value,
240
- self.collection_address,
241
- )
242
-
243
- return tasks_complete
244
-
245
- def upstream_tasks_objects(self, db: Session) -> Query:
246
- """Returns Request Task objects that are upstream of the current Request Task"""
247
- upstream_tasks: Query = db.query(RequestTask).filter(
248
- RequestTask.privacy_request_id == self.privacy_request_id,
249
- RequestTask.collection_address.in_(self.upstream_tasks or []),
250
- RequestTask.action_type == self.action_type,
251
- )
252
- return upstream_tasks
253
-
254
- def request_task_running(self, should_log: bool = False) -> bool:
255
- """Returns a rough measure if the Request Task is already running -
256
- not 100% accurate.
257
-
258
- This is further only applicable if you are running workers and
259
- CONFIG.execution.task_always_eager=False. This is just an extra check to reduce possible
260
- over-scheduling, but it is also okay if the same node runs multiple times.
261
- """
262
- celery_task_id: Optional[str] = self.get_cached_task_id()
263
- if not celery_task_id:
264
- return False
265
-
266
- if should_log:
267
- logger.debug(
268
- "Celery Task ID {} found for {} task {}.",
269
- celery_task_id,
270
- self.action_type.value,
271
- self.collection_address,
272
- )
273
-
274
- task_in_flight: bool = celery_tasks_in_flight([celery_task_id])
275
-
276
- if task_in_flight and should_log:
277
- logger.debug(
278
- "Celery Task {} already processing for {} task {}.",
279
- celery_task_id,
280
- self.action_type.value,
281
- self.collection_address,
282
- )
283
-
284
- return task_in_flight
@@ -1,94 +0,0 @@
1
- # pylint: disable=R0401, C0302
2
-
3
- from __future__ import annotations
4
-
5
- import json
6
- from datetime import datetime
7
- from enum import Enum as EnumType
8
- from typing import Optional
9
-
10
- from pydantic import BaseModel, ConfigDict
11
-
12
- from fides.api.models.policy import PolicyPreWebhook, WebhookDirection
13
- from fides.api.models.pre_approval_webhook import PreApprovalWebhook
14
- from fides.api.models.privacy_request.request_task import RequestTask
15
- from fides.api.oauth.jwt import generate_jwe
16
- from fides.api.schemas.external_https import RequestTaskJWE, WebhookJWE
17
- from fides.api.schemas.policy import ActionType
18
- from fides.api.schemas.privacy_request import PrivacyRequestStatus
19
- from fides.api.schemas.redis_cache import Identity
20
- from fides.common.api.scope_registry import (
21
- PRIVACY_REQUEST_CALLBACK_RESUME,
22
- PRIVACY_REQUEST_REVIEW,
23
- )
24
- from fides.config import CONFIG
25
-
26
-
27
- class CallbackType(EnumType):
28
- """We currently have three types of Webhooks: pre-approval, pre (-execution), post (-execution)"""
29
-
30
- pre_approval = "pre_approval"
31
- pre = "pre" # pre-execution
32
- post = "post" # post-execution
33
-
34
-
35
- class SecondPartyRequestFormat(BaseModel):
36
- """
37
- The request body we will use when calling a user's HTTP endpoint from fides.api
38
- This class is defined here to avoid circular import issues between this file and
39
- models.policy
40
- """
41
-
42
- privacy_request_id: str
43
- privacy_request_status: PrivacyRequestStatus
44
- direction: WebhookDirection
45
- callback_type: CallbackType
46
- identity: Identity
47
- policy_action: Optional[ActionType] = None
48
- model_config = ConfigDict(use_enum_values=True)
49
-
50
-
51
- def generate_request_callback_resume_jwe(webhook: PolicyPreWebhook) -> str:
52
- """
53
- Generate a JWE to be used to resume privacy request execution.
54
- """
55
- jwe = WebhookJWE(
56
- webhook_id=webhook.id,
57
- scopes=[PRIVACY_REQUEST_CALLBACK_RESUME],
58
- iat=datetime.now().isoformat(),
59
- )
60
- return generate_jwe(
61
- json.dumps(jwe.model_dump(mode="json")),
62
- CONFIG.security.app_encryption_key,
63
- )
64
-
65
-
66
- def generate_request_callback_pre_approval_jwe(webhook: PreApprovalWebhook) -> str:
67
- """
68
- Generate a JWE to be used to mark privacy requests as eligible / not-eligible for pre approval.
69
- """
70
- jwe = WebhookJWE(
71
- webhook_id=webhook.id,
72
- scopes=[PRIVACY_REQUEST_REVIEW],
73
- iat=datetime.now().isoformat(),
74
- )
75
- return generate_jwe(
76
- json.dumps(jwe.model_dump(mode="json")),
77
- CONFIG.security.app_encryption_key,
78
- )
79
-
80
-
81
- def generate_request_task_callback_jwe(request_task: RequestTask) -> str:
82
- """
83
- Generate a JWE to be used to resume privacy request execution when a
84
- callback endpoint is hit for a RequestTask
85
- """
86
- jwe = RequestTaskJWE(
87
- request_task_id=request_task.id,
88
- scopes=[PRIVACY_REQUEST_CALLBACK_RESUME],
89
- iat=datetime.now().isoformat(),
90
- )
91
- return generate_jwe(
92
- json.dumps(jwe.model_dump(mode="json")),
93
- CONFIG.security.app_encryption_key,
94
- )
@@ -1,193 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import IO, Any, Dict, Optional, Tuple
4
-
5
- from boto3.s3.transfer import TransferConfig
6
- from botocore.exceptions import ClientError, ParamValidationError
7
- from fideslang.validation import AnyHttpUrlString
8
- from loguru import logger
9
-
10
- from fides.api.schemas.storage.storage import StorageSecrets
11
- from fides.api.util.aws_util import get_s3_client
12
- from fides.config import CONFIG
13
-
14
- LARGE_FILE_THRESHOLD = 5 * 1024 * 1024 # 5 MB threshold for large files
15
- LARGE_FILE_WARNING_TEXT = (
16
- "File is too large to display directly. Please use the provided link to download."
17
- )
18
-
19
-
20
- def maybe_get_s3_client(
21
- auth_method: str, storage_secrets: Dict[StorageSecrets, Any]
22
- ) -> Any:
23
- """
24
- Returns an S3 client if the client can be created successfully, otherwise raises an exception.
25
- """
26
- try:
27
- return get_s3_client(auth_method, storage_secrets)
28
- except ClientError as e:
29
- logger.error(
30
- "Encountered error while uploading and generating link for S3 object: {}", e
31
- )
32
- raise e
33
- except ParamValidationError as e:
34
- raise ValueError(f"The parameters you provided are incorrect: {e}")
35
-
36
-
37
- def create_presigned_url_for_s3(
38
- s3_client: Any, bucket_name: str, file_key: str
39
- ) -> AnyHttpUrlString:
40
- """
41
- Generates a presigned URL to share an S3 object
42
-
43
- :param s3_client: s3 base client
44
- :param bucket_name: string
45
- :param file_key: string
46
- :return: Presigned URL as string.
47
- """
48
- response = s3_client.generate_presigned_url(
49
- "get_object",
50
- Params={"Bucket": bucket_name, "Key": file_key},
51
- ExpiresIn=CONFIG.security.subject_request_download_link_ttl_seconds,
52
- )
53
-
54
- # The response contains the presigned URL
55
- return response
56
-
57
-
58
- def generic_upload_to_s3( # pylint: disable=R0913
59
- storage_secrets: Dict[StorageSecrets, Any],
60
- bucket_name: str,
61
- file_key: str,
62
- auth_method: str,
63
- document: IO[bytes],
64
- size_threshold: int = LARGE_FILE_THRESHOLD, # 5 MB threshold
65
- ) -> Optional[AnyHttpUrlString]:
66
- """
67
- Uploads arbitrary data to S3 returned from an access request.
68
- Handles both small and large uploads.
69
-
70
- :param storage_secrets: S3 storage secrets
71
- :param bucket_name: Name of the S3 bucket
72
- :param file_key: Key of the file in the bucket
73
- :param auth_method: Authentication method for S3
74
- :param document: File contents to upload
75
- """
76
- logger.info("Starting S3 Upload of {}", file_key)
77
-
78
- s3_client = maybe_get_s3_client(auth_method, storage_secrets)
79
-
80
- # Define a transfer configuration for multipart uploads
81
- transfer_config = TransferConfig(
82
- multipart_threshold=size_threshold,
83
- multipart_chunksize=size_threshold,
84
- )
85
-
86
- # Use upload_fileobj for efficient uploads (handles both small and large files)
87
- try:
88
- # Use upload_fileobj for efficient uploads (handles both small and large files)
89
- s3_client.upload_fileobj(
90
- Fileobj=document,
91
- Bucket=bucket_name,
92
- Key=file_key,
93
- Config=transfer_config,
94
- )
95
- except Exception as e:
96
- logger.error(f"Failed to upload file {file_key} to bucket {bucket_name}: {e}")
97
- raise e # Re-raise the exception if you want it to propagate
98
-
99
- # Generate a presigned URL for the uploaded file
100
- logger.info(f"Successfully uploaded file {file_key} to bucket {bucket_name}")
101
- return create_presigned_url_for_s3(s3_client, bucket_name, file_key)
102
-
103
-
104
- def generic_download_from_s3(
105
- storage_secrets: Dict[StorageSecrets, Any],
106
- bucket_name: str,
107
- file_key: str,
108
- auth_method: str,
109
- ) -> Optional[AnyHttpUrlString]:
110
- """
111
- Returns a presigned URL for downloading an S3 object.
112
-
113
- :param storage_secrets: S3 storage secrets
114
- :param bucket_name: Name of the S3 bucket
115
- :param file_key: Key of the file in the bucket
116
- :param auth_method: Authentication method for S3
117
- :return: A presigned URL (str) for the S3 object
118
- """
119
- logger.info("Generating presigned URL for downloading file: {}", file_key)
120
-
121
- s3_client = maybe_get_s3_client(auth_method, storage_secrets)
122
-
123
- # Generate a presigned URL for the file
124
- return create_presigned_url_for_s3(s3_client, bucket_name, file_key)
125
-
126
-
127
- def generic_retrieve_from_s3(
128
- storage_secrets: Dict[StorageSecrets, Any],
129
- bucket_name: str,
130
- file_key: str,
131
- auth_method: str,
132
- size_threshold: int = LARGE_FILE_THRESHOLD, # 5 MB threshold
133
- ) -> Tuple[str, AnyHttpUrlString]:
134
- """
135
- Retrieves arbitrary data from S3.
136
- Returns the file contents and presigned url to download the file if the file is small,
137
- or a warning message with the presigned URL to download the file if it is large.
138
-
139
- :param storage_secrets: S3 storage secrets
140
- :param bucket_name: Name of the S3 bucket
141
- :param file_key: Key of the file in the bucket
142
- :param auth_method: Authentication method for S3
143
- :param size_threshold: Size threshold in bytes to determine small vs large files
144
- :return: File contents (BytesIO) for small files or a presigned URL (str) for large files
145
- """
146
- logger.info("Starting S3 Retrieve of {}", file_key)
147
-
148
- s3_client = maybe_get_s3_client(auth_method, storage_secrets)
149
- try:
150
- # Get the object metadata to check its size
151
- head_response = s3_client.head_object(Bucket=bucket_name, Key=file_key)
152
- file_size = head_response["ContentLength"]
153
-
154
- if file_size <= size_threshold:
155
- # File is small, return its contents and presigned url
156
- response = s3_client.get_object(Bucket=bucket_name, Key=file_key)
157
- return response["Body"].read(), create_presigned_url_for_s3(
158
- s3_client, bucket_name, file_key
159
- )
160
-
161
- # File is large, return warning text and a presigned URL
162
- return (
163
- LARGE_FILE_WARNING_TEXT,
164
- create_presigned_url_for_s3(s3_client, bucket_name, file_key),
165
- )
166
-
167
- except Exception as e:
168
- logger.error("Encountered error while retrieving S3 object: {}", e)
169
- raise e
170
-
171
-
172
- def generic_delete_from_s3(
173
- storage_secrets: Dict[StorageSecrets, Any],
174
- bucket_name: str,
175
- file_key: str,
176
- auth_method: str,
177
- ) -> None:
178
- """
179
- Deletes arbitrary data from s3
180
-
181
- :param storage_secrets: S3 storage secrets
182
- :param bucket_name: Name of the S3 bucket
183
- :param file_key: Key of the file in the bucket
184
- :param auth_method: Authentication method for S3
185
- """
186
- logger.info("Starting S3 Delete of {}", file_key)
187
-
188
- s3_client = maybe_get_s3_client(auth_method, storage_secrets)
189
- try:
190
- s3_client.delete_object(Bucket=bucket_name, Key=file_key)
191
- except Exception as e:
192
- logger.error("Encountered error while deleting s3 object: {}", e)
193
- raise e
@@ -1,10 +0,0 @@
1
- import os
2
-
3
- LOCAL_FIDES_UPLOAD_DIRECTORY = "fides_uploads"
4
-
5
-
6
- def get_local_filename(file_key: str) -> str:
7
- """Verifies that the local storage directory exists"""
8
- if not os.path.exists(LOCAL_FIDES_UPLOAD_DIRECTORY):
9
- os.makedirs(LOCAL_FIDES_UPLOAD_DIRECTORY)
10
- return f"{LOCAL_FIDES_UPLOAD_DIRECTORY}/{file_key}"
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1100],{58754:function(e,t,n){var r=n(24246),i=n(77181),s=n(70788);t.Z=e=>{let{heading:t,breadcrumbItems:n,isSticky:a=!0,children:o,rightContent:l,style:u,...c}=e;return(0,r.jsxs)("div",{...c,style:a?{position:"sticky",top:"-24px",paddingTop:"24px",paddingBottom:"24px",paddingLeft:"40px",marginLeft:"-40px",paddingRight:"40px",marginRight:"-40px",marginTop:"-24px",left:0,zIndex:20,backgroundColor:"white",...u}:{paddingBottom:"24px",...u},children:[(0,r.jsxs)(i.jqI,{justify:"space-between",children:["string"==typeof t?(0,r.jsx)(i.X6q,{className:n||o?"pb-4":void 0,fontSize:"2xl","data-testid":"page-heading",children:t}):t,l&&(0,r.jsx)("div",{"data-testid":"page-header-right-content",children:l})]}),!!n&&(0,r.jsx)(s.m,{className:o?"pb-4":void 0,items:n,"data-testid":"page-breadcrumb"}),o]})}},10342:function(e,t,n){var r=n(24246),i=n(77181),s=n(91613);t.Z=e=>{let{title:t,tooltip:n,children:a,...o}=e;return(0,r.jsxs)(i.xuv,{borderRadius:"md",border:"1px solid",borderColor:"gray.200",...o,children:[(0,r.jsxs)(i.X6q,{as:"h3",fontSize:"sm",fontWeight:"semibold",color:"gray.700",py:4,px:6,backgroundColor:"gray.50",borderRadius:"md",textAlign:"left",children:[t,n?(0,r.jsx)(i.xvT,{as:"span",mx:1,children:(0,r.jsx)(s.Z,{label:n})}):void 0]}),(0,r.jsx)(i.Kqy,{p:6,spacing:6,children:a})]})}},70788:function(e,t,n){n.d(t,{m:function(){return u}});var r=n(24246),i=n(77181),s=n(79894),a=n.n(s),o=n(27378);let{Text:l}=i.AntTypography,u=e=>{let{items:t,...n}=e,s=(0,o.useMemo)(()=>null==t?void 0:t.map((e,n)=>{let s=n===t.length-1,o={...e},u=o.onClick&&!o.href;return("string"==typeof o.title&&(o.title=(0,r.jsx)(l,{style:{color:"inherit",maxWidth:s?void 0:400},ellipsis:!s,children:o.title})),u)?o.title=(0,r.jsx)(i.wpx,{type:"text",size:"small",icon:o.icon,onClick:o.onClick,className:"ant-breadcrumb-link -mt-px px-1 text-inherit",children:o.title}):(o.icon&&(o.title=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"anticon align-text-bottom",children:o.icon}),o.title]})),o.href&&o.title&&(o.title=(0,r.jsx)(a(),{href:o.href,className:"ant-breadcrumb-link",children:o.title}),delete o.href)),o}),[t]);return(0,r.jsx)(i.zrq,{items:s,...n})}},67810:function(e,t,n){n.d(t,{Z:function(){return s}}),(r=i||(i={})).PRIVACY_REQUEST_REVIEW_APPROVE="privacy_request_review_approve",r.PRIVACY_REQUEST_REVIEW_DENY="privacy_request_review_deny",r.PRIVACY_REQUEST_RECEIPT="privacy_request_receipt",r.PRIVACY_REQUEST_COMPLETE_ACCESS="privacy_request_complete_access",r.PRIVACY_REQUEST_COMPLETE_DELETION="privacy_request_complete_deletion",r.SUBJECT_IDENTITY_VERIFICATION="subject_identity_verification";var r,i,s={[i.PRIVACY_REQUEST_COMPLETE_ACCESS]:"Access request completed",[i.PRIVACY_REQUEST_COMPLETE_DELETION]:"Erasure request completed",[i.PRIVACY_REQUEST_RECEIPT]:"Privacy request received",[i.PRIVACY_REQUEST_REVIEW_APPROVE]:"Privacy request approved",[i.PRIVACY_REQUEST_REVIEW_DENY]:"Privacy request denied",[i.SUBJECT_IDENTITY_VERIFICATION]:"Subject identity verification"}},20149:function(e,t,n){var r=n(24246),i=n(77830),s=n(77181),a=n(34090),o=n(86677),l=n(16134),u=n(10342),c=n(40324),d=n(51472),p=n(67810),m=n(64826);let g=()=>{var e;let t=(0,l.C)(m.Zp),n=(0,l.C)(m.G1);(0,m.gz)({page:t,size:n});let i=(0,l.C)(m.YO),{values:s,setFieldValue:o}=(0,a.u6)();return(0,r.jsx)(d.Z,{label:"Associated properties",addButtonLabel:"Add property",idField:"id",nameField:"name",allItems:i.map(e=>({id:e.id,name:e.name})),values:null!==(e=s.properties)&&void 0!==e?e:[],setValues:e=>o("properties",e),draggable:!0,maxHeight:100,baseTestId:"property"})};t.Z=e=>{let{template:t,handleSubmit:n,handleDelete:l}=e,d=(0,o.useRouter)(),m=()=>{d.push(i.q)},f={type:t.type,content:t.content,properties:t.properties||[],is_enabled:t.is_enabled,id:t.id||""};return(0,r.jsx)(a.J9,{enableReinitialize:!0,initialValues:f,onSubmit:n,children:e=>{let{dirty:t,isValid:n,isSubmitting:i}=e;return(0,r.jsxs)(a.l0,{style:{paddingTop:"12px",paddingBottom:"12px"},children:[(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsxs)(u.Z,{title:"".concat(p.Z[f.type]),children:[(0,r.jsx)(c.j0,{isRequired:!0,label:"Email subject",name:"content.subject",variant:"stacked"}),(0,r.jsx)(c.Ks,{isRequired:!0,label:"Message body",name:"content.body",value:"test",variant:"stacked",resize:!0}),(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsx)(g,{})}),(0,r.jsx)(c.w8,{name:"is_enabled",label:"Enable message",variant:"switchFirst"})]})}),(0,r.jsxs)(s.kCb,{justifyContent:"space-between",width:"100%",paddingTop:2,children:[f.id&&l&&(0,r.jsx)(s.wpx,{"data-testid":"delete-template-button",loading:!1,className:"mr-3",onClick:l,children:"Delete"}),(0,r.jsxs)(s.kCb,{justifyContent:"right",width:"100%",paddingTop:2,children:[(0,r.jsx)(s.wpx,{loading:!1,className:"mr-3",onClick:m,children:"Cancel"}),(0,r.jsx)(s.wpx,{htmlType:"submit",type:"primary",disabled:i||!t||!n,loading:i,"data-testid":"submit-btn",children:"Save"})]})]})]})}})}},5058:function(e,t,n){n.d(t,{Vw:function(){return s},ms:function(){return r},pS:function(){return i},vm:function(){return a}});let{useGetSummaryMessagingTemplatesQuery:r,usePutMessagingTemplateByIdMutation:i,useCreateMessagingTemplateByTypeMutation:s,usePatchMessagingTemplateByIdMutation:a}=n(78780).u.injectEndpoints({endpoints:e=>({getSummaryMessagingTemplates:e.query({query:e=>({method:"GET",url:"plus/messaging/templates/summary",params:e}),providesTags:()=>["Property-Specific Messaging Templates"]}),putMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PUT",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),patchMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PATCH",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),createMessagingTemplateByType:e.mutation({query:e=>{let{templateType:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"POST",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},47466:function(e,t,n){n.d(t,{KC:function(){return a},ew:function(){return o},gQ:function(){return s},jM:function(){return r},lE:function(){return i}});let{useGetMessagingTemplatesQuery:r,useUpdateMessagingTemplatesMutation:i,useGetMessagingTemplateByIdQuery:s,useGetMessagingTemplateDefaultQuery:a,useDeleteMessagingTemplateByIdMutation:o}=n(78780).u.injectEndpoints({endpoints:e=>({getMessagingTemplates:e.query({query:()=>({url:"messaging/templates"}),providesTags:()=>["Messaging Templates"]}),updateMessagingTemplates:e.mutation({query:e=>({url:"messaging/templates",method:"PUT",body:e}),invalidatesTags:()=>["Messaging Templates"]}),getMessagingTemplateById:e.query({query:e=>({url:"/messaging/templates/".concat(e)}),providesTags:()=>["Property-Specific Messaging Templates"]}),getMessagingTemplateDefault:e.query({query:e=>({url:"/messaging/templates/default/".concat(e)})}),deleteMessagingTemplateById:e.mutation({query:e=>({url:"/messaging/templates/".concat(e),method:"DELETE"}),invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},31883:function(e,t,n){n.d(t,{Bw:function(){return r.Bw},D4:function(){return r.D4}});var r=n(19043)},11055:function(e,t,n){n.d(t,{M:function(){return d}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),o=n(18397),l=n(42308),u=n(25431),c=n(39556);let d=(0,s.forwardRef)(function({children:e,as:t="ul",axis:n="y",onReorder:d,values:g,...f},y){let h=(0,l.h)(()=>o.E[t]),x=[],E=(0,s.useRef)(!1);return(0,i.k)(!!g,"Reorder.Group must be provided a values prop"),(0,s.useEffect)(()=>{E.current=!1}),(0,r.jsx)(h,{...f,ref:y,ignoreStrict:!0,children:(0,r.jsx)(a.Y.Provider,{value:{axis:n,registerItem:(e,t)=>{let r=x.findIndex(t=>e===t.value);-1!==r?x[r].layout=t[n]:x.push({value:e,layout:t[n]}),x.sort(m)},updateOrder:(e,t,n)=>{if(E.current)return;let r=function(e,t,n,r){if(!r)return e;let i=e.findIndex(e=>e.value===t);if(-1===i)return e;let s=r>0?1:-1,a=e[i+s];if(!a)return e;let o=e[i],l=a.layout,d=(0,c.t)(l.min,l.max,.5);return 1===s&&o.layout.max+n>d||-1===s&&o.layout.min+n<d?(0,u.uo)(e,i,i+s):e}(x,e,t,n);x!==r&&(E.current=!0,d(r.map(p).filter(e=>-1!==g.indexOf(e))))}},children:e})})});function p(e){return e.value}function m(e,t){return e.layout.min-t.layout.min}},7078:function(e,t,n){n.d(t,{e:function(){return T}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),o=n(18397),l=n(42308),u=n(69222),c=n(67412);function d(e){let t=(0,l.h)(()=>(0,u.BX)(e)),{isStatic:n}=(0,s.useContext)(c._);if(n){let[,n]=(0,s.useState)(e);(0,s.useEffect)(()=>t.on("change",n),[])}return t}var p=n(13998);let m=e=>e&&"object"==typeof e&&e.mix,g=e=>m(e)?e.mix:void 0;var f=n(64306),y=n(95984);function h(e,t){let n=d(t()),r=()=>n.set(t());return r(),(0,f.L)(()=>{let t=()=>y.Wi.preRender(r,!1,!0),n=e.map(e=>e.on("change",t));return()=>{n.forEach(e=>e()),(0,y.Pn)(r)}}),n}function x(e,t){let n=(0,l.h)(()=>[]);return h(e,()=>{n.length=0;let r=e.length;for(let t=0;t<r;t++)n[t]=e[t].get();return t(n)})}var E=n(3522);function v(e,t=0){return(0,E.i)(e)?e:d(t)}let T=(0,s.forwardRef)(function({children:e,style:t={},value:n,as:c="li",onDrag:d,layout:m=!0,...f},y){let E=(0,l.h)(()=>o.E[c]),T=(0,s.useContext)(a.Y),b={x:v(t.x),y:v(t.y)},_=function(e,t,n,r){if("function"==typeof e)return function(e){u.S1.current=[],e();let t=h(u.S1.current,e);return u.S1.current=void 0,t}(e);let i="function"==typeof t?t:function(...e){let t=!Array.isArray(e[0]),n=t?0:-1,r=e[0+n],i=e[1+n],s=e[2+n],a=e[3+n],o=(0,p.s)(i,s,{mixer:g(s[0]),...a});return t?o(r):o}(t,void 0,void 0);return Array.isArray(e)?x(e,i):x([e],([e])=>i(e))}([b.x,b.y],([e,t])=>e||t?1:"unset");(0,i.k)(!!T,"Reorder.Item must be a child of Reorder.Group");let{axis:C,registerItem:j,updateOrder:R}=T;return(0,r.jsx)(E,{drag:C,...f,dragSnapToOrigin:!0,style:{...t,x:b.x,y:b.y,zIndex:_},layout:m,onDrag:(e,t)=>{let{velocity:r}=t;r[C]&&R(n,b[C].get(),r[C]),d&&d(e,t)},onLayoutMeasure:e=>j(n,e),ref:y,ignoreStrict:!0,children:e})})},40976:function(e,t,n){n.d(t,{Y:function(){return r}});let r=(0,n(27378).createContext)(null)},47397:function(e,t,n){n.d(t,{o:function(){return a}});var r=n(42308);class i{constructor(){this.componentControls=new Set}subscribe(e){return this.componentControls.add(e),()=>this.componentControls.delete(e)}start(e,t){this.componentControls.forEach(n=>{n.start(e.nativeEvent||e,t)})}}let s=()=>new i;function a(){return(0,r.h)(s)}},76649:function(e,t,n){n.d(t,{Ln:function(){return r}});let r=(e,t)=>s(e,t),i=Symbol("SOME"),s=(e,t)=>"string"==typeof e?e===typeof t:Array.isArray(e)?i in e?e.some(e=>s(e,t)):!!Array.isArray(t)&&(0===e.length||t.every(t=>e.some(e=>s(e,t)))):"object"==typeof t&&null!==t&&Object.entries(e).every(([e,n])=>s(n,t[e]));class a{static narrow(e){return new a(t=>r(e,t))}constructor(e){this.NF=void 0,this.NF=e}satisfied(e){return this.NF(e)}build(e){return e}and(e){let t=this.NF,n=e instanceof a?e.NF:e instanceof Function?e:t=>r(e,t);return new a(e=>t(e)&&n(e))}}new a(e=>!0)}}]);