ethyca-fides 2.57.1b7__py2.py3-none-any.whl → 2.57.1b9__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 (256) hide show
  1. {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/RECORD +221 -216
  3. fides/_version.py +3 -3
  4. fides/api/api/v1/endpoints/generic_overrides.py +43 -6
  5. fides/api/main.py +4 -1
  6. fides/api/models/attachment.py +5 -5
  7. fides/api/models/connectionconfig.py +1 -1
  8. fides/api/oauth/utils.py +11 -11
  9. fides/api/schemas/dataset.py +22 -2
  10. fides/api/service/privacy_request/request_runner_service.py +8 -4
  11. fides/api/service/storage/s3.py +119 -59
  12. fides/api/tasks/__init__.py +3 -1
  13. fides/ui-build/static/admin/404.html +1 -1
  14. fides/ui-build/static/admin/_next/static/chunks/1100-053fc6b76c65a00f.js +1 -0
  15. fides/ui-build/static/admin/_next/static/chunks/{1150-d4a5eef84e70de22.js → 1150-035a721a04f4451e.js} +1 -1
  16. fides/ui-build/static/admin/_next/static/chunks/1376-5cea5ef9362215e8.js +1 -0
  17. fides/ui-build/static/admin/_next/static/chunks/{2397-c6d0dcb3b921555f.js → 2397-ee53235fb21b5e97.js} +1 -1
  18. fides/ui-build/static/admin/_next/static/chunks/{255-bf1797f78249d090.js → 255-7db55b0e3a0f9dea.js} +1 -1
  19. fides/ui-build/static/admin/_next/static/chunks/2fbcc6de-a6c61724c327e9fa.js +8 -0
  20. fides/ui-build/static/admin/_next/static/chunks/{3086-d099019708303444.js → 3086-b5054ec2c75700b9.js} +1 -1
  21. fides/ui-build/static/admin/_next/static/chunks/{3320-317483e6c10bae51.js → 3320-5dd62a256ecfc9c3.js} +1 -1
  22. fides/ui-build/static/admin/_next/static/chunks/{355-6a87b50acf54e985.js → 355-8a77c9a1cd027f2e.js} +1 -1
  23. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  24. fides/ui-build/static/admin/_next/static/chunks/{3855-4d5d936a58a0dd5f.js → 3855-b6b7865dedd7bc2a.js} +1 -1
  25. fides/ui-build/static/admin/_next/static/chunks/{3872-2b2bf5ebd4b0a70f.js → 3872-4e053c20d546f027.js} +1 -1
  26. fides/ui-build/static/admin/_next/static/chunks/{3662-6a0cafa3023aa7a2.js → 4060-8d165e1236ea521a.js} +1 -1
  27. fides/ui-build/static/admin/_next/static/chunks/{4481-f2f57e7a75a90e79.js → 4481-142e5a922d5a5548.js} +1 -1
  28. fides/ui-build/static/admin/_next/static/chunks/{4723-1a785d558dfb6441.js → 4723-0a3c5e2ce143a7d0.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/{5258-a05dcab2f9315dab.js → 5258-0658dc2274df6832.js} +1 -1
  30. fides/ui-build/static/admin/_next/static/chunks/5277-e8a036319456127f.js +1 -0
  31. fides/ui-build/static/admin/_next/static/chunks/{5480-c6c1fb87006e471a.js → 5480-f49696df5e8ae500.js} +1 -1
  32. fides/ui-build/static/admin/_next/static/chunks/{5487-509639439bf9fb46.js → 5487-3ad50d21cdbc9209.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +1 -0
  34. fides/ui-build/static/admin/_next/static/chunks/{5826-e3970cd9440be33b.js → 5826-e5dcb4e68cfe6289.js} +1 -1
  35. fides/ui-build/static/admin/_next/static/chunks/5973-9c58e4cce2f343a8.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/605-e692e9cfea2e2cb8.js +1 -0
  37. fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +4 -0
  38. fides/ui-build/static/admin/_next/static/chunks/{6315-daf94fa7520fb253.js → 6315-fa1519cdf080f42d.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{6372-41afe1e6a9181cc7.js → 6372-ca9c12ac8902365b.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/6527-0eed08abe252a918.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/678d4732-50255cc09048e643.js +2 -0
  42. fides/ui-build/static/admin/_next/static/chunks/{6853-7f95c36e396d3fb8.js → 6853-8941824350c3c1a8.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{6954-f7daf613febc36ef.js → 6954-3b887fb444f9228c.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{7088.0e7c92a7cbb57562.js → 7088.eb76fca286e5f2e6.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{7434-3d4a0beb84ec57f7.js → 7434-e6fc02c2dd852991.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{7751-130668529ab1d0b6.js → 7751-a8f31c062d4cb09d.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/{79-1c326c00cf111c00.js → 79-f9b948ebb186900f.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/{7980-91800d54c5964ba3.js → 7980-4bd08957448dea32.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/7c79804f.7a7112aece470725.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/{8433-b2a96b825124b596.js → 8433-b3008ecaf9834e7f.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{8499-34620330ecf2ac53.js → 8499-43606100edf42fdf.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/8702-d1c8296f9f6afc10.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/{5908-532dfbc9d930f635.js → 9014-eeae6f581158e645.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/{9046-e7b9a3fd010b01ad.js → 9046-04bd7becea207cb1.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/905-8ab919e7b274ed50.js +8 -0
  56. fides/ui-build/static/admin/_next/static/chunks/9187-851756440f79cd75.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/9282-2bfbdca45e84e810.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/9327-2cba327d10586683.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/{9392.97b2e3327dceb7c9.js → 9392.da35a8e778812d91.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/9676.f297a1347ac09c56.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/9767-1a23925d2cb27b51.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/{9999-8600f6f495a80b38.js → 9999-637e0e5341f15f4a.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/e3251fe7-5777b5d778e6fffa.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/main-24f422f93845a596.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/{main-app-2650f704701c6a7b.js → main-app-94a0711202e08b15.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/{404-8e0baa6e128803ab.js → 404-b202c0d8f6fc75c3.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/_app-44256886387d7e3e.js +923 -0
  68. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-f8c0b05aae0bbcd1.js → manual-c2705210ce986109.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-6a7208eee5e588fb.js → multiple-ba975134a85588f8.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-a33f82e79cb09478.js → add-systems-d258f0c25fa020bf.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-39267961e03be6c5.js → ant-poc-b9932971a479f3a7.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-ba0c5fa9764cbd89.js → add-vendors-b34e5324461d0c87.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-723cc3d4f5740ea6.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-c02510104f9e503a.js → [id]-cf51752eb0902233.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-e96415629f3b4223.js → new-be194737b41ccec9.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-ed38f18c095141fe.js → privacy-experience-c946b33b0322b8ad.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-66827da90b8a2d1e.js → [id]-72251b48e2e03a1e.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-13d48f980bf707e5.js → new-9611dd42856d6062.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-7339b3cdf5d4da32.js → privacy-notices-ea57f9d6ad17e957.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-b5b3196eba90246a.js → properties-e5748812ba055a56.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-38b8ec1a221610ff.js → reporting-ae66e1a7e146a4de.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-df2388d953c85c2a.js → consent-39d65f13cc8f1cf8.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-5e851b9f27bda8a4.js → [resourceUrn]-ac033a16f043e6f9.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-9f9112b22fdfb32a.js → [projectUrn]-a29850536c85d4b8.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-ddca867936c89a72.js → projects-c44ce244122e96d5.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-85e3d6f1b2afd3e7.js → [resourceUrn]-71e26d262afcaea5.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-9831226436d884b5.js → resources-305555b74c357bf2.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-1a3bb713fc7bc298.js → data-catalog-900004e402c31797.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-5892ca5d93ea6165.js → [systemId]-5182d356672a3b02.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-5c37c3ad1c3cfba5.js → [monitorId]-7c74373a4d666a3d.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-02439d3aeecfb4b9.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-a0749240265da17d.js → activity-11b3ce9f61d9bfe9.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-68122dbf449a11b4.js → [resourceUrn]-054ca46a782e99a5.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-0ceaf3c555e84714.js → detection-b75dd3e4306ac18e.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-22c27fe0f898ad2a.js → [resourceUrn]-1da20aeb6fc995e4.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-8f2b102e19b0b8f2.js → discovery-cad50b0cc6d1050c.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-819ac99e7a56465a.js → datamap-8cb714cdd44ac40e.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d79551d4c64c398c.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7e5df4a0de7540bb.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-aaedf8f2a849c97f.js → [datasetId]-6ba18f92ba561114.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-803c1b577ab17ae3.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-fa743ddc7f89d76b.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-f68c3ee92505994f.js → [id]-bbe1ca2793798e6b.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-89bc670d278e3749.js → new-abc17fef69cd951b.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-a78a73b65929853a.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/fides-js-docs-80b241bf6cddb72e.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/pages/{index-1072281d6cfe8295.js → index-bfaacdb55a5a6c9f.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-3742c349e9a0020d.js → [id]-d4329043219fed9b.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-577b95cb0006f387.js → integrations-adb6aced3bdb4899.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-268918d8c1dfe82a.js → [id]-ad02e019b2467958.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-cd75949bee7497b6.js → add-template-f9693cb6a0b7ded8.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-1e60754abec1ee6b.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-d1f4178b8a7e2145.js → [id]-fe765154315782cf.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-f5f7a8069909ef24.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-9f7eaad05e5b9292.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-37e800a20e654064.js → configure-2987edc77388e85a.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-729fa8ed0f10bc8e.js → privacy-requests-d85c0d16ba09ba35.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-92145503c4d2d75e.js → [id]-94e2faa73dd6a3e6.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-ab94805694ebd35c.js → add-property-630a6a3dd6502ba6.js} +1 -1
  120. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-5e623dcd92418638.js → properties-20ca2f963906674b.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-afedc48ef4e7f858.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-175d39bdd74f148c.js → about-a49d0f84cf0cf05e.js} +1 -1
  123. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-89524101b7279f6e.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-1262d596c0cdcd81.js → custom-fields-52d030b1db2ca1b9.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-f0c6e6034d37dbcf.js → domain-records-fa42d8f18df44927.js} +1 -1
  126. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-24cba38685dc872c.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-6ee49492a7769f89.js → email-templates-6fd6071e2009b8f2.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-deb754d42982562b.js → locations-66c757325cb58467.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-f45920358a405167.js → organization-a08693d0d1e10bc8.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-f9e97decfe56b018.js → regulations-c6c239996cfa6ae8.js} +1 -1
  131. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-151571cff4e85894.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-c234398ee8265485.js → [id]-d3ea9034461511cd.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-4d6a17a7a24aca97.js → systems-abd68fc5ddde5482.js} +1 -1
  134. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-46f47c04a01319cf.js → taxonomy-16b4d75c49276add.js} +1 -1
  135. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-5b752ba934baee94.js → [id]-78eaf933f755bfe8.js} +1 -1
  136. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-4fbb29cf0a611aae.js → user-management-6c9ad62479a7d03e.js} +1 -1
  137. fides/ui-build/static/admin/_next/static/chunks/{webpack-815e3c35038201da.js → webpack-2c7ccac5843c4d8e.js} +1 -1
  138. fides/ui-build/static/admin/_next/static/css/{dd9922a434d21e22.css → 113d823fe71f6af0.css} +1 -1
  139. fides/ui-build/static/admin/_next/static/css/ab65b8cc3144bfc8.css +1 -0
  140. fides/ui-build/static/admin/_next/static/yhm3LM_VFpK2KeFRFEQyN/_buildManifest.js +1 -0
  141. fides/ui-build/static/admin/_next/static/yhm3LM_VFpK2KeFRFEQyN/_ssgManifest.js +1 -0
  142. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  143. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  144. fides/ui-build/static/admin/add-systems.html +1 -1
  145. fides/ui-build/static/admin/ant-poc.html +1 -1
  146. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  147. fides/ui-build/static/admin/consent/configure.html +1 -1
  148. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  149. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  150. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  151. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  152. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  153. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  154. fides/ui-build/static/admin/consent/properties.html +1 -1
  155. fides/ui-build/static/admin/consent/reporting.html +1 -1
  156. fides/ui-build/static/admin/consent.html +1 -1
  157. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  158. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  159. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  160. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  161. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  162. fides/ui-build/static/admin/data-catalog.html +1 -1
  163. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  164. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  165. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  166. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  167. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  168. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  169. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  170. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  171. fides/ui-build/static/admin/datamap.html +1 -1
  172. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  173. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  174. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  175. fides/ui-build/static/admin/dataset/new.html +1 -1
  176. fides/ui-build/static/admin/dataset.html +1 -1
  177. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  178. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  179. fides/ui-build/static/admin/datastore-connection.html +1 -1
  180. fides/ui-build/static/admin/index.html +1 -1
  181. fides/ui-build/static/admin/integrations/[id].html +1 -1
  182. fides/ui-build/static/admin/integrations.html +1 -1
  183. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  184. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  185. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  186. fides/ui-build/static/admin/lib/fides.js +2 -2
  187. fides/ui-build/static/admin/login/[provider].html +1 -1
  188. fides/ui-build/static/admin/login.html +1 -1
  189. fides/ui-build/static/admin/messaging/[id].html +1 -1
  190. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  191. fides/ui-build/static/admin/messaging.html +1 -1
  192. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  193. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  194. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  195. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  196. fides/ui-build/static/admin/privacy-requests.html +1 -1
  197. fides/ui-build/static/admin/properties/[id].html +1 -1
  198. fides/ui-build/static/admin/properties/add-property.html +1 -1
  199. fides/ui-build/static/admin/properties.html +1 -1
  200. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  201. fides/ui-build/static/admin/settings/about.html +1 -1
  202. fides/ui-build/static/admin/settings/consent.html +1 -1
  203. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  204. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  205. fides/ui-build/static/admin/settings/domains.html +1 -1
  206. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  207. fides/ui-build/static/admin/settings/locations.html +1 -1
  208. fides/ui-build/static/admin/settings/organization.html +1 -1
  209. fides/ui-build/static/admin/settings/regulations.html +1 -1
  210. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  211. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  212. fides/ui-build/static/admin/systems.html +1 -1
  213. fides/ui-build/static/admin/taxonomy.html +1 -1
  214. fides/ui-build/static/admin/user-management/new.html +1 -1
  215. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  216. fides/ui-build/static/admin/user-management.html +1 -1
  217. fides/ui-build/static/admin/_next/static/chunks/1376-c177d8d0c60b1166.js +0 -1
  218. fides/ui-build/static/admin/_next/static/chunks/1995-0e4fc4f7b44ed72b.js +0 -1
  219. fides/ui-build/static/admin/_next/static/chunks/2201-0452b4135058f0fc.js +0 -1
  220. fides/ui-build/static/admin/_next/static/chunks/2780-8328de94968d05e4.js +0 -4
  221. fides/ui-build/static/admin/_next/static/chunks/3005-373de16453ed7eea.js +0 -1
  222. fides/ui-build/static/admin/_next/static/chunks/302-fb0e3cd140c4364d.js +0 -1
  223. fides/ui-build/static/admin/_next/static/chunks/3967-845c902667e47c4f.js +0 -1
  224. fides/ui-build/static/admin/_next/static/chunks/3e38ba78-4487e45fd4ed2479.js +0 -2
  225. fides/ui-build/static/admin/_next/static/chunks/4833-a85bd5d25ebc40c4.js +0 -1
  226. fides/ui-build/static/admin/_next/static/chunks/5246-ac8b0fcb44b00af7.js +0 -1
  227. fides/ui-build/static/admin/_next/static/chunks/5960-8895f51b30c35798.js +0 -1
  228. fides/ui-build/static/admin/_next/static/chunks/6362-0ca70f8cfd020723.js +0 -1
  229. fides/ui-build/static/admin/_next/static/chunks/7495-b7fa6fdbd910bd72.js +0 -1
  230. fides/ui-build/static/admin/_next/static/chunks/7c79804f.26834f883d5ad770.js +0 -1
  231. fides/ui-build/static/admin/_next/static/chunks/8837-cf26e5ca1ae5aaf5.js +0 -1
  232. fides/ui-build/static/admin/_next/static/chunks/9282-6ee061da1eb51d65.js +0 -1
  233. fides/ui-build/static/admin/_next/static/chunks/9676.f4d5977a5f148797.js +0 -1
  234. fides/ui-build/static/admin/_next/static/chunks/main-ce7f38a12ea8c223.js +0 -1
  235. fides/ui-build/static/admin/_next/static/chunks/pages/_app-e53d13729068a001.js +0 -909
  236. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-1af99ffa7a507e86.js +0 -1
  237. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-4fac7e0a54eebc32.js +0 -1
  238. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-259d4a94861afe2b.js +0 -1
  239. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-25283f5bcac8fa73.js +0 -1
  240. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-45016545c099e183.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-5ddd3cd7d29e89c0.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-61adfcd5f7f69101.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-5a161e167c251519.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-c3e234ad95e6e213.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-347e203faa31716f.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-710839776b9995ce.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ff6edba56dfec090.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-ad368857e86fe01b.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-ae133b6e8e1107f2.js +0 -1
  250. fides/ui-build/static/admin/_next/static/dctUooMB4AAq5YqgLKNt9/_buildManifest.js +0 -1
  251. fides/ui-build/static/admin/_next/static/dctUooMB4AAq5YqgLKNt9/_ssgManifest.js +0 -1
  252. {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/LICENSE +0 -0
  253. {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/WHEEL +0 -0
  254. {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/entry_points.txt +0 -0
  255. {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/top_level.txt +0 -0
  256. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-d6717378b42982d5.js → new-be690621a944bfe2.js} +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-03-21T12:37:34-0500",
11
+ "date": "2025-03-25T09:07:13-0600",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "b0eb1b3cd0cf9c73be52faa4d927a9dd386c1285",
15
- "version": "2.57.1b7"
14
+ "full-revisionid": "f52807e5c7ef5abb74a0d6550ba1a62e53fa1d45",
15
+ "version": "2.57.1b9"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -9,7 +9,7 @@ from fideslang.models import Dataset as FideslangDataset
9
9
  from pydantic import ValidationError as PydanticValidationError
10
10
  from sqlalchemy import not_, select
11
11
  from sqlalchemy.ext.asyncio import AsyncSession
12
- from sqlalchemy.orm import Session
12
+ from sqlalchemy.orm import Session, load_only
13
13
  from starlette import status
14
14
  from starlette.status import (
15
15
  HTTP_200_OK,
@@ -22,9 +22,10 @@ from fides.api.common_exceptions import KeyOrNameAlreadyExists, ValidationError
22
22
  from fides.api.db.base_class import get_key_from_data
23
23
  from fides.api.db.crud import list_resource_query
24
24
  from fides.api.db.ctl_session import get_async_db
25
- from fides.api.models.connectionconfig import ConnectionConfig
25
+ from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
26
26
  from fides.api.models.datasetconfig import DatasetConfig
27
27
  from fides.api.oauth.utils import verify_oauth_client
28
+ from fides.api.schemas.dataset import DatasetResponse
28
29
  from fides.api.schemas.filter_params import FilterParams
29
30
  from fides.api.schemas.taxonomy_extensions import (
30
31
  DataCategory,
@@ -138,7 +139,7 @@ async def update_dataset(
138
139
  @dataset_router.get(
139
140
  "/dataset",
140
141
  dependencies=[Security(verify_oauth_client, scopes=[CTL_DATASET_READ])],
141
- response_model=Union[Page[FideslangDataset], List[FideslangDataset]],
142
+ response_model=Union[Page[DatasetResponse], List[DatasetResponse]],
142
143
  name="List datasets (optionally paginated)",
143
144
  )
144
145
  async def list_dataset_paginated(
@@ -149,7 +150,9 @@ async def list_dataset_paginated(
149
150
  data_categories: Optional[List[str]] = Query(None),
150
151
  exclude_saas_datasets: Optional[bool] = Query(False),
151
152
  only_unlinked_datasets: Optional[bool] = Query(False),
152
- ) -> Union[Page[FideslangDataset], List[FideslangDataset]]:
153
+ connection_type: Optional[ConnectionType] = Query(None),
154
+ minimal: Optional[bool] = Query(False),
155
+ ) -> Union[Page[DatasetResponse], List[DatasetResponse]]:
153
156
  """
154
157
  Get a list of all of the Datasets.
155
158
  If any pagination parameters (size or page) are provided, then the response will be paginated.
@@ -161,6 +164,25 @@ async def list_dataset_paginated(
161
164
 
162
165
  query = select(CtlDataset)
163
166
 
167
+ if minimal:
168
+ # .options() allows us to modify how the query loads data by configuring the query's loading behavior
169
+ # load_only() optimizes the query by only loading the specified columns from the database
170
+ # This reduces memory usage and query time by not loading unnecessary columns
171
+ # The columns specified below are the minimal set needed for the DatasetResponse model
172
+ query = query.options( # type: ignore[attr-defined]
173
+ load_only(
174
+ CtlDataset.id,
175
+ CtlDataset.fides_key,
176
+ CtlDataset.organization_fides_key,
177
+ CtlDataset.name,
178
+ CtlDataset.created_at,
179
+ CtlDataset.updated_at,
180
+ CtlDataset.meta,
181
+ CtlDataset.fides_meta,
182
+ CtlDataset.description,
183
+ )
184
+ )
185
+
164
186
  # Add filters for search and data categories
165
187
  filter_params = FilterParams(search=search, data_categories=data_categories)
166
188
  filtered_query = apply_filters_to_query(
@@ -170,6 +192,13 @@ async def list_dataset_paginated(
170
192
  filter_params=filter_params,
171
193
  )
172
194
 
195
+ # If applicable, filter by connection type
196
+ if connection_type:
197
+ filtered_query = filtered_query.where(
198
+ CtlDataset.fides_meta["namespace"]["connection_type"].as_string()
199
+ == connection_type.value
200
+ )
201
+
173
202
  # If applicable, keep only unlinked datasets
174
203
  if only_unlinked_datasets:
175
204
  linked_datasets = select([DatasetConfig.ctl_dataset_id])
@@ -187,10 +216,18 @@ async def list_dataset_paginated(
187
216
  )
188
217
 
189
218
  if not page and not size:
190
- return await list_resource_query(db, filtered_query, CtlDataset)
219
+ results = await list_resource_query(db, filtered_query, CtlDataset)
220
+ response = [
221
+ DatasetResponse.model_validate(result.__dict__) for result in results
222
+ ]
223
+ return response
191
224
 
192
225
  pagination_params = Params(page=page or 1, size=size or 50)
193
- return await async_paginate(db, filtered_query, pagination_params)
226
+ results = await async_paginate(db, filtered_query, pagination_params)
227
+ results.items = [ # type: ignore[attr-defined]
228
+ DatasetResponse.model_validate(result.__dict__) for result in results.items # type: ignore[attr-defined]
229
+ ]
230
+ return results
194
231
 
195
232
 
196
233
  @dataset_router.get(
fides/api/main.py CHANGED
@@ -232,10 +232,13 @@ async def log_request(request: Request, call_next: Callable) -> Response:
232
232
  response = Response(status_code=500)
233
233
 
234
234
  handler_time = datetime.now() - start
235
+
236
+ # Take the total time in seconds and convert it to milliseconds, rounding to 3 decimal places
237
+ total_time = round(handler_time.total_seconds() * 1000, 3)
235
238
  logger.bind(
236
239
  method=request.method,
237
240
  status_code=response.status_code,
238
- handler_time=f"{round(handler_time.microseconds * 0.001,3)}ms",
241
+ handler_time=f"{total_time}ms",
239
242
  path=request.url.path,
240
243
  ).info("Request received")
241
244
  return response
@@ -1,6 +1,6 @@
1
1
  import os
2
2
  from enum import Enum as EnumType
3
- from typing import Any, Optional
3
+ from typing import IO, Any, Optional
4
4
 
5
5
  from loguru import logger as log
6
6
  from sqlalchemy import Column
@@ -110,7 +110,7 @@ class Attachment(Base):
110
110
  uselist=False,
111
111
  )
112
112
 
113
- def upload(self, attachment: bytes) -> None:
113
+ def upload(self, attachment: IO[bytes]) -> None:
114
114
  """Uploads an attachment to S3 or local storage."""
115
115
  if self.config.type == StorageType.s3:
116
116
  bucket_name = f"{self.config.details[StorageDetails.BUCKET.value]}"
@@ -128,7 +128,7 @@ class Attachment(Base):
128
128
  if self.config.type == StorageType.local:
129
129
  filename = get_local_filename(self.id)
130
130
  with open(filename, "wb") as file:
131
- file.write(attachment)
131
+ file.write(attachment.read())
132
132
  return
133
133
 
134
134
  raise ValueError(f"Unsupported storage type: {self.config.type}")
@@ -148,7 +148,7 @@ class Attachment(Base):
148
148
  if self.config.type == StorageType.local:
149
149
  filename = f"{LOCAL_FIDES_UPLOAD_DIRECTORY}/{self.id}"
150
150
  with open(filename, "rb") as file:
151
- return file.read()
151
+ return file.read(), filename
152
152
 
153
153
  raise ValueError(f"Unsupported storage type: {self.config.type}")
154
154
 
@@ -178,7 +178,7 @@ class Attachment(Base):
178
178
  db: Session,
179
179
  *,
180
180
  data: dict[str, Any],
181
- attachment_file: bytes,
181
+ attachment_file: IO[bytes],
182
182
  check_name: bool = False,
183
183
  ) -> "Attachment":
184
184
  """Creates a new attachment record in the database and uploads the attachment to S3."""
@@ -186,7 +186,7 @@ class ConnectionConfig(Base):
186
186
  )
187
187
  ),
188
188
  nullable=True,
189
- ) # Type bytea in the db
189
+ ) # Type bytes in the db
190
190
  last_test_timestamp = Column(DateTime(timezone=True))
191
191
  last_test_succeeded = Column(Boolean)
192
192
  disabled = Column(Boolean, server_default="f", default=False)
fides/api/oauth/utils.py CHANGED
@@ -339,7 +339,16 @@ def has_permissions(
339
339
  has_role: bool = _has_scope_via_role(
340
340
  token_data=token_data, client=client, endpoint_scopes=endpoint_scopes
341
341
  )
342
- return has_direct_scope or has_role
342
+
343
+ has_required_permissions = has_direct_scope or has_role
344
+ if not has_required_permissions:
345
+ scopes_required = ",".join(endpoint_scopes.scopes)
346
+ logger.debug(
347
+ "Authorization failed. Missing required scopes: {}. Neither direct scopes nor role-derived scopes were sufficient.",
348
+ scopes_required,
349
+ )
350
+
351
+ return has_required_permissions
343
352
 
344
353
 
345
354
  def _has_scope_via_role(
@@ -385,16 +394,7 @@ def _has_direct_scopes(
385
394
 
386
395
  def has_scope_subset(user_scopes: List[str], endpoint_scopes: SecurityScopes) -> bool:
387
396
  """Are the required scopes a subset of the scopes belonging to the user?"""
388
- if not set(endpoint_scopes.scopes).issubset(user_scopes):
389
- scopes_required = ",".join(endpoint_scopes.scopes)
390
- scopes_provided = ",".join(user_scopes)
391
- logger.debug(
392
- "Auth token missing required scopes: {}. Scopes provided: {}.",
393
- scopes_required,
394
- scopes_provided,
395
- )
396
- return False
397
- return True
397
+ return set(endpoint_scopes.scopes).issubset(user_scopes)
398
398
 
399
399
 
400
400
  def create_temporary_user_for_login_flow(config: FidesConfig) -> FidesUser:
@@ -1,8 +1,8 @@
1
1
  from typing import Any, Dict, List, Optional, Union
2
2
 
3
- from fideslang.models import Dataset
3
+ from fideslang.models import Dataset, DatasetCollection
4
4
  from fideslang.validation import FidesKey
5
- from pydantic import ConfigDict
5
+ from pydantic import ConfigDict, Field
6
6
 
7
7
  from fides.api.schemas.api import BulkResponse, BulkUpdateFailed
8
8
  from fides.api.schemas.base_class import FidesSchema
@@ -72,3 +72,23 @@ class DatasetReachability(FidesSchema):
72
72
 
73
73
  reachable: bool
74
74
  details: Optional[Union[str, List[Dict[str, Any]]]]
75
+
76
+
77
+ class DatasetResponse(Dataset):
78
+ """
79
+ Dataset response model for API endpoints.
80
+
81
+ Note: This class extends the Dataset model from fideslang rather than having a proper
82
+ dedicated API response model. We had to make the collections field
83
+ Optional and allow null values to support the minimal=true parameter in API responses,
84
+ even though collections is required in the base fideslang Dataset model.
85
+ """
86
+
87
+ collections: Optional[List[DatasetCollection]] = Field( # type: ignore
88
+ description="An array of objects that describe the Dataset's collections.",
89
+ default=None,
90
+ )
91
+
92
+ model_config = ConfigDict(
93
+ extra="ignore", from_attributes=False, coerce_numbers_to_str=True
94
+ )
@@ -67,7 +67,6 @@ from fides.api.tasks import DatabaseTask, celery_app
67
67
  from fides.api.tasks.scheduled.scheduler import scheduler
68
68
  from fides.api.util.collection_util import Row
69
69
  from fides.api.util.logger import Pii, _log_exception, _log_warning
70
- from fides.api.util.logger_context_utils import LoggerContextKeys, log_context
71
70
  from fides.common.api.v1.urn_registry import (
72
71
  PRIVACY_REQUEST_TRANSFER_TO_PARENT,
73
72
  V1_URL_PREFIX,
@@ -270,7 +269,8 @@ def upload_access_results( # pylint: disable=R0912
270
269
 
271
270
 
272
271
  @celery_app.task(base=DatabaseTask, bind=True)
273
- @log_context(capture_args={"privacy_request_id": LoggerContextKeys.privacy_request_id})
272
+ # TODO: Add log_context back in, this is just for some temporary testing
273
+ # @log_context(capture_args={"privacy_request_id": LoggerContextKeys.privacy_request_id})
274
274
  def run_privacy_request(
275
275
  self: DatabaseTask,
276
276
  privacy_request_id: str,
@@ -290,7 +290,10 @@ def run_privacy_request(
290
290
  """
291
291
  resume_step: Optional[CurrentStep] = CurrentStep(from_step) if from_step else None # type: ignore
292
292
  if from_step:
293
- logger.info("Resuming privacy request from checkpoint: '{}'", from_step)
293
+ with logger.contextualize(
294
+ privacy_request_id=privacy_request_id,
295
+ ):
296
+ logger.info("Resuming privacy request from checkpoint: '{}'", from_step)
294
297
 
295
298
  with self.get_new_session() as session:
296
299
  privacy_request = PrivacyRequest.get(db=session, object_id=privacy_request_id)
@@ -302,7 +305,8 @@ def run_privacy_request(
302
305
  with logger.contextualize(
303
306
  privacy_request_source=(
304
307
  privacy_request.source.value if privacy_request.source else None
305
- )
308
+ ),
309
+ privacy_request_id=privacy_request.id,
306
310
  ):
307
311
  if privacy_request.status == PrivacyRequestStatus.canceled:
308
312
  logger.info("Terminating privacy request: request canceled.")
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from io import BytesIO
4
- from typing import Any, Dict, Optional
3
+ from typing import IO, Any, Dict, Optional, Tuple
5
4
 
6
5
  from boto3.s3.transfer import TransferConfig
7
6
  from botocore.exceptions import ClientError, ParamValidationError
@@ -12,11 +11,34 @@ from fides.api.schemas.storage.storage import StorageSecrets
12
11
  from fides.api.util.aws_util import get_s3_client
13
12
  from fides.config import CONFIG
14
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
+
15
36
 
16
37
  def create_presigned_url_for_s3(
17
38
  s3_client: Any, bucket_name: str, file_key: str
18
39
  ) -> AnyHttpUrlString:
19
- """ "Generate a presigned URL to share an S3 object
40
+ """
41
+ Generates a presigned URL to share an S3 object
20
42
 
21
43
  :param s3_client: s3 base client
22
44
  :param bucket_name: string
@@ -38,52 +60,68 @@ def generic_upload_to_s3( # pylint: disable=R0913
38
60
  bucket_name: str,
39
61
  file_key: str,
40
62
  auth_method: str,
41
- document: BytesIO,
63
+ document: IO[bytes],
64
+ size_threshold: int = LARGE_FILE_THRESHOLD, # 5 MB threshold
42
65
  ) -> Optional[AnyHttpUrlString]:
43
66
  """
44
67
  Uploads arbitrary data to S3 returned from an access request.
45
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
46
75
  """
47
76
  logger.info("Starting S3 Upload of {}", file_key)
48
77
 
49
- try:
50
- s3_client = get_s3_client(auth_method, storage_secrets)
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
+ )
51
85
 
52
- # Define a transfer configuration for multipart uploads
53
- transfer_config = TransferConfig(
54
- multipart_threshold=5 * 1024 * 1024, # 5 MB threshold for multipart uploads
55
- multipart_chunksize=5 * 1024 * 1024, # 5 MB chunk size
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,
56
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
57
98
 
58
- try:
59
- # Check if the document is a file-like object or raw bytes
60
- if isinstance(document, bytes):
61
- document = BytesIO(document) # Wrap raw bytes in a file-like object
62
-
63
- # Use upload_fileobj for efficient uploads (handles both small and large files)
64
- s3_client.upload_fileobj(
65
- Fileobj=document,
66
- Bucket=bucket_name,
67
- Key=file_key,
68
- Config=transfer_config,
69
- )
70
- except Exception as e:
71
- logger.error("Encountered error while uploading S3 object: {}", e)
72
- raise e
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)
73
102
 
74
- # Generate a presigned URL for the uploaded file
75
- presigned_url: AnyHttpUrlString = create_presigned_url_for_s3(
76
- s3_client, bucket_name, file_key
77
- )
78
103
 
79
- return presigned_url
80
- except ClientError as e:
81
- logger.error(
82
- "Encountered error while uploading and generating link for S3 object: {}", e
83
- )
84
- raise e
85
- except ParamValidationError as e:
86
- raise ValueError(f"The parameters you provided are incorrect: {e}")
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)
87
125
 
88
126
 
89
127
  def generic_retrieve_from_s3(
@@ -91,23 +129,44 @@ def generic_retrieve_from_s3(
91
129
  bucket_name: str,
92
130
  file_key: str,
93
131
  auth_method: str,
94
- ) -> Optional[BytesIO]:
95
- """Retrieves arbitrary data from s3"""
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
+ """
96
146
  logger.info("Starting S3 Retrieve of {}", file_key)
97
147
 
148
+ s3_client = maybe_get_s3_client(auth_method, storage_secrets)
98
149
  try:
99
- s3_client = get_s3_client(auth_method, storage_secrets)
100
- 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
101
156
  response = s3_client.get_object(Bucket=bucket_name, Key=file_key)
102
- return response["Body"].read()
103
- except Exception as e:
104
- logger.error("Encountered error while retrieving s3 object: {}", e)
105
- raise e
106
- except ClientError as e:
107
- logger.error("Encountered error while retrieving s3 object: {}", e)
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)
108
169
  raise e
109
- except ParamValidationError as e:
110
- raise ValueError(f"The parameters you provided are incorrect: {e}")
111
170
 
112
171
 
113
172
  def generic_delete_from_s3(
@@ -116,18 +175,19 @@ def generic_delete_from_s3(
116
175
  file_key: str,
117
176
  auth_method: str,
118
177
  ) -> None:
119
- """Deletes arbitrary data from s3"""
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
+ """
120
186
  logger.info("Starting S3 Delete of {}", file_key)
121
187
 
188
+ s3_client = maybe_get_s3_client(auth_method, storage_secrets)
122
189
  try:
123
- s3_client = get_s3_client(auth_method, storage_secrets)
124
- try:
125
- s3_client.delete_object(Bucket=bucket_name, Key=file_key)
126
- except Exception as e:
127
- logger.error("Encountered error while deleting s3 object: {}", e)
128
- raise e
129
- except ClientError as e:
190
+ s3_client.delete_object(Bucket=bucket_name, Key=file_key)
191
+ except Exception as e:
130
192
  logger.error("Encountered error while deleting s3 object: {}", e)
131
193
  raise e
132
- except ParamValidationError as e:
133
- raise ValueError(f"The parameters you provided are incorrect: {e}")
@@ -79,7 +79,9 @@ class DatabaseTask(Task): # pylint: disable=W0223
79
79
  # but a new session is instantiated each time the method is invoked
80
80
  # to prevent session overlap when requests are executing concurrently
81
81
  # when in task_always_eager mode (i.e. without proper workers)
82
- return self._sessionmaker()
82
+ new_session = self._sessionmaker()
83
+ logger.debug(f"DatabaseTaskSession ID: {id(new_session)}. Self ID: {id(self)}")
84
+ return new_session
83
85
 
84
86
 
85
87
  def _create_celery(config: FidesConfig = CONFIG) -> Celery:
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/dd9922a434d21e22.css" as="style"/><link rel="stylesheet" href="/_next/static/css/dd9922a434d21e22.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-815e3c35038201da.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-ce7f38a12ea8c223.js" defer=""></script><script src="/_next/static/chunks/pages/_app-e53d13729068a001.js" defer=""></script><script src="/_next/static/chunks/pages/404-8e0baa6e128803ab.js" defer=""></script><script src="/_next/static/dctUooMB4AAq5YqgLKNt9/_buildManifest.js" defer=""></script><script src="/_next/static/dctUooMB4AAq5YqgLKNt9/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"dctUooMB4AAq5YqgLKNt9","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/113d823fe71f6af0.css" as="style"/><link rel="stylesheet" href="/_next/static/css/113d823fe71f6af0.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-2c7ccac5843c4d8e.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-24f422f93845a596.js" defer=""></script><script src="/_next/static/chunks/pages/_app-44256886387d7e3e.js" defer=""></script><script src="/_next/static/chunks/pages/404-b202c0d8f6fc75c3.js" defer=""></script><script src="/_next/static/yhm3LM_VFpK2KeFRFEQyN/_buildManifest.js" defer=""></script><script src="/_next/static/yhm3LM_VFpK2KeFRFEQyN/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"yhm3LM_VFpK2KeFRFEQyN","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
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)}}]);