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.
- {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/METADATA +1 -1
- {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/RECORD +221 -216
- fides/_version.py +3 -3
- fides/api/api/v1/endpoints/generic_overrides.py +43 -6
- fides/api/main.py +4 -1
- fides/api/models/attachment.py +5 -5
- fides/api/models/connectionconfig.py +1 -1
- fides/api/oauth/utils.py +11 -11
- fides/api/schemas/dataset.py +22 -2
- fides/api/service/privacy_request/request_runner_service.py +8 -4
- fides/api/service/storage/s3.py +119 -59
- fides/api/tasks/__init__.py +3 -1
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1100-053fc6b76c65a00f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{1150-d4a5eef84e70de22.js → 1150-035a721a04f4451e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1376-5cea5ef9362215e8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{2397-c6d0dcb3b921555f.js → 2397-ee53235fb21b5e97.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{255-bf1797f78249d090.js → 255-7db55b0e3a0f9dea.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/2fbcc6de-a6c61724c327e9fa.js +8 -0
- fides/ui-build/static/admin/_next/static/chunks/{3086-d099019708303444.js → 3086-b5054ec2c75700b9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3320-317483e6c10bae51.js → 3320-5dd62a256ecfc9c3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{355-6a87b50acf54e985.js → 355-8a77c9a1cd027f2e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3855-4d5d936a58a0dd5f.js → 3855-b6b7865dedd7bc2a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3872-2b2bf5ebd4b0a70f.js → 3872-4e053c20d546f027.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{3662-6a0cafa3023aa7a2.js → 4060-8d165e1236ea521a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4481-f2f57e7a75a90e79.js → 4481-142e5a922d5a5548.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4723-1a785d558dfb6441.js → 4723-0a3c5e2ce143a7d0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5258-a05dcab2f9315dab.js → 5258-0658dc2274df6832.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5277-e8a036319456127f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5480-c6c1fb87006e471a.js → 5480-f49696df5e8ae500.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{5487-509639439bf9fb46.js → 5487-3ad50d21cdbc9209.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/570-c99f07161bd339cd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5826-e3970cd9440be33b.js → 5826-e5dcb4e68cfe6289.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5973-9c58e4cce2f343a8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/605-e692e9cfea2e2cb8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6060-cb1ab5be7067bf7b.js +4 -0
- fides/ui-build/static/admin/_next/static/chunks/{6315-daf94fa7520fb253.js → 6315-fa1519cdf080f42d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6372-41afe1e6a9181cc7.js → 6372-ca9c12ac8902365b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6527-0eed08abe252a918.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/678d4732-50255cc09048e643.js +2 -0
- fides/ui-build/static/admin/_next/static/chunks/{6853-7f95c36e396d3fb8.js → 6853-8941824350c3c1a8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{6954-f7daf613febc36ef.js → 6954-3b887fb444f9228c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7088.0e7c92a7cbb57562.js → 7088.eb76fca286e5f2e6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7434-3d4a0beb84ec57f7.js → 7434-e6fc02c2dd852991.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7751-130668529ab1d0b6.js → 7751-a8f31c062d4cb09d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{79-1c326c00cf111c00.js → 79-f9b948ebb186900f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{7980-91800d54c5964ba3.js → 7980-4bd08957448dea32.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/7c79804f.7a7112aece470725.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{8433-b2a96b825124b596.js → 8433-b3008ecaf9834e7f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{8499-34620330ecf2ac53.js → 8499-43606100edf42fdf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/8702-d1c8296f9f6afc10.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5908-532dfbc9d930f635.js → 9014-eeae6f581158e645.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{9046-e7b9a3fd010b01ad.js → 9046-04bd7becea207cb1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/905-8ab919e7b274ed50.js +8 -0
- fides/ui-build/static/admin/_next/static/chunks/9187-851756440f79cd75.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9282-2bfbdca45e84e810.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9327-2cba327d10586683.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9392.97b2e3327dceb7c9.js → 9392.da35a8e778812d91.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9676.f297a1347ac09c56.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9767-1a23925d2cb27b51.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9999-8600f6f495a80b38.js → 9999-637e0e5341f15f4a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/e3251fe7-5777b5d778e6fffa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/main-24f422f93845a596.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{main-app-2650f704701c6a7b.js → main-app-94a0711202e08b15.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{404-8e0baa6e128803ab.js → 404-b202c0d8f6fc75c3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/_app-44256886387d7e3e.js +923 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-f8c0b05aae0bbcd1.js → manual-c2705210ce986109.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-6a7208eee5e588fb.js → multiple-ba975134a85588f8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-a33f82e79cb09478.js → add-systems-d258f0c25fa020bf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{ant-poc-39267961e03be6c5.js → ant-poc-b9932971a479f3a7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-ba0c5fa9764cbd89.js → add-vendors-b34e5324461d0c87.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-723cc3d4f5740ea6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-c02510104f9e503a.js → [id]-cf51752eb0902233.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-e96415629f3b4223.js → new-be194737b41ccec9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-ed38f18c095141fe.js → privacy-experience-c946b33b0322b8ad.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-66827da90b8a2d1e.js → [id]-72251b48e2e03a1e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-13d48f980bf707e5.js → new-9611dd42856d6062.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-7339b3cdf5d4da32.js → privacy-notices-ea57f9d6ad17e957.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-b5b3196eba90246a.js → properties-e5748812ba055a56.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-38b8ec1a221610ff.js → reporting-ae66e1a7e146a4de.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{consent-df2388d953c85c2a.js → consent-39d65f13cc8f1cf8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-5e851b9f27bda8a4.js → [resourceUrn]-ac033a16f043e6f9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-9f9112b22fdfb32a.js → [projectUrn]-a29850536c85d4b8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-ddca867936c89a72.js → projects-c44ce244122e96d5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-85e3d6f1b2afd3e7.js → [resourceUrn]-71e26d262afcaea5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-9831226436d884b5.js → resources-305555b74c357bf2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-1a3bb713fc7bc298.js → data-catalog-900004e402c31797.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-5892ca5d93ea6165.js → [systemId]-5182d356672a3b02.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-5c37c3ad1c3cfba5.js → [monitorId]-7c74373a4d666a3d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-02439d3aeecfb4b9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-a0749240265da17d.js → activity-11b3ce9f61d9bfe9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-68122dbf449a11b4.js → [resourceUrn]-054ca46a782e99a5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-0ceaf3c555e84714.js → detection-b75dd3e4306ac18e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-22c27fe0f898ad2a.js → [resourceUrn]-1da20aeb6fc995e4.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-8f2b102e19b0b8f2.js → discovery-cad50b0cc6d1050c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-819ac99e7a56465a.js → datamap-8cb714cdd44ac40e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d79551d4c64c398c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7e5df4a0de7540bb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-aaedf8f2a849c97f.js → [datasetId]-6ba18f92ba561114.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-803c1b577ab17ae3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-fa743ddc7f89d76b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-f68c3ee92505994f.js → [id]-bbe1ca2793798e6b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-89bc670d278e3749.js → new-abc17fef69cd951b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-a78a73b65929853a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/fides-js-docs-80b241bf6cddb72e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{index-1072281d6cfe8295.js → index-bfaacdb55a5a6c9f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-3742c349e9a0020d.js → [id]-d4329043219fed9b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-577b95cb0006f387.js → integrations-adb6aced3bdb4899.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-268918d8c1dfe82a.js → [id]-ad02e019b2467958.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-cd75949bee7497b6.js → add-template-f9693cb6a0b7ded8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-1e60754abec1ee6b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-d1f4178b8a7e2145.js → [id]-fe765154315782cf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-f5f7a8069909ef24.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-9f7eaad05e5b9292.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-37e800a20e654064.js → configure-2987edc77388e85a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-729fa8ed0f10bc8e.js → privacy-requests-d85c0d16ba09ba35.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-92145503c4d2d75e.js → [id]-94e2faa73dd6a3e6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-ab94805694ebd35c.js → add-property-630a6a3dd6502ba6.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-5e623dcd92418638.js → properties-20ca2f963906674b.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-afedc48ef4e7f858.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-175d39bdd74f148c.js → about-a49d0f84cf0cf05e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-89524101b7279f6e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-1262d596c0cdcd81.js → custom-fields-52d030b1db2ca1b9.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-f0c6e6034d37dbcf.js → domain-records-fa42d8f18df44927.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-24cba38685dc872c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-6ee49492a7769f89.js → email-templates-6fd6071e2009b8f2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-deb754d42982562b.js → locations-66c757325cb58467.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-f45920358a405167.js → organization-a08693d0d1e10bc8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-f9e97decfe56b018.js → regulations-c6c239996cfa6ae8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-151571cff4e85894.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-c234398ee8265485.js → [id]-d3ea9034461511cd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{systems-4d6a17a7a24aca97.js → systems-abd68fc5ddde5482.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-46f47c04a01319cf.js → taxonomy-16b4d75c49276add.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-5b752ba934baee94.js → [id]-78eaf933f755bfe8.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-4fbb29cf0a611aae.js → user-management-6c9ad62479a7d03e.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{webpack-815e3c35038201da.js → webpack-2c7ccac5843c4d8e.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/{dd9922a434d21e22.css → 113d823fe71f6af0.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/ab65b8cc3144bfc8.css +1 -0
- fides/ui-build/static/admin/_next/static/yhm3LM_VFpK2KeFRFEQyN/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/yhm3LM_VFpK2KeFRFEQyN/_ssgManifest.js +1 -0
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/ant-poc.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
- fides/ui-build/static/admin/lib/fides.js +2 -2
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1376-c177d8d0c60b1166.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1995-0e4fc4f7b44ed72b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2201-0452b4135058f0fc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/2780-8328de94968d05e4.js +0 -4
- fides/ui-build/static/admin/_next/static/chunks/3005-373de16453ed7eea.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/302-fb0e3cd140c4364d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3967-845c902667e47c4f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3e38ba78-4487e45fd4ed2479.js +0 -2
- fides/ui-build/static/admin/_next/static/chunks/4833-a85bd5d25ebc40c4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5246-ac8b0fcb44b00af7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5960-8895f51b30c35798.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6362-0ca70f8cfd020723.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7495-b7fa6fdbd910bd72.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7c79804f.26834f883d5ad770.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8837-cf26e5ca1ae5aaf5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9282-6ee061da1eb51d65.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9676.f4d5977a5f148797.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/main-ce7f38a12ea8c223.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/_app-e53d13729068a001.js +0 -909
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-1af99ffa7a507e86.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-4fac7e0a54eebc32.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-259d4a94861afe2b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-25283f5bcac8fa73.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-45016545c099e183.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-5ddd3cd7d29e89c0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-61adfcd5f7f69101.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/messaging-5a161e167c251519.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-c3e234ad95e6e213.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-347e203faa31716f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-710839776b9995ce.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ff6edba56dfec090.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-ad368857e86fe01b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-ae133b6e8e1107f2.js +0 -1
- fides/ui-build/static/admin/_next/static/dctUooMB4AAq5YqgLKNt9/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/dctUooMB4AAq5YqgLKNt9/_ssgManifest.js +0 -1
- {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/LICENSE +0 -0
- {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.57.1b7.dist-info → ethyca_fides-2.57.1b9.dist-info}/top_level.txt +0 -0
- /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-
|
11
|
+
"date": "2025-03-25T09:07:13-0600",
|
12
12
|
"dirty": false,
|
13
13
|
"error": null,
|
14
|
-
"full-revisionid": "
|
15
|
-
"version": "2.57.
|
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[
|
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
|
-
|
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
|
-
|
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
|
-
|
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"{
|
241
|
+
handler_time=f"{total_time}ms",
|
239
242
|
path=request.url.path,
|
240
243
|
).info("Request received")
|
241
244
|
return response
|
fides/api/models/attachment.py
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
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:
|
fides/api/schemas/dataset.py
CHANGED
@@ -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
|
-
|
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.
|
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.")
|
fides/api/service/storage/s3.py
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from
|
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
|
-
"""
|
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:
|
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
|
-
|
50
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
59
|
-
|
60
|
-
|
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
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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
|
-
|
95
|
-
|
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
|
-
|
100
|
-
|
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
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
-
"""
|
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
|
124
|
-
|
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}")
|
fides/api/tasks/__init__.py
CHANGED
@@ -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
|
-
|
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/
|
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)}}]);
|