ethyca-fides 2.69.3b0__py2.py3-none-any.whl → 2.69.3b1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (234) hide show
  1. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/RECORD +226 -214
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
  5. fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
  6. fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
  7. fides/api/api/v1/endpoints/system.py +140 -55
  8. fides/api/db/base.py +2 -0
  9. fides/api/main.py +2 -0
  10. fides/api/models/asset.py +2 -0
  11. fides/api/models/detection_discovery/web_monitor.py +61 -0
  12. fides/api/models/sql_models.py +8 -0
  13. fides/api/models/system_group.py +85 -0
  14. fides/api/schemas/saas/saas_config.py +2 -17
  15. fides/api/schemas/saas/strategy_configuration.py +12 -0
  16. fides/api/schemas/system.py +8 -0
  17. fides/api/service/async_dsr/async_dsr_service.py +130 -10
  18. fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
  19. fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
  20. fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
  21. fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
  22. fides/api/service/connectors/saas_connector.py +25 -7
  23. fides/api/service/deps.py +7 -0
  24. fides/api/service/privacy_request/request_service.py +29 -20
  25. fides/api/service/strategy.py +6 -3
  26. fides/api/task/graph_task.py +1 -2
  27. fides/api/util/filter_utils.py +0 -3
  28. fides/service/system/__init__.py +0 -0
  29. fides/service/system/system_service.py +138 -0
  30. fides/ui-build/static/admin/404.html +1 -1
  31. fides/ui-build/static/admin/_next/static/_b75ACzlGNz3tZqGUPTE5/_buildManifest.js +1 -0
  32. fides/ui-build/static/admin/_next/static/chunks/{1345-5e1c5b66e25c566e.js → 1345-1961771e9619db39.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{1817-0ca16d288fad916d.js → 1817-9423665774c2c08f.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/{3620-602eb74dc896d556.js → 3620-34355b0c44325537.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/3642-c052564812532324.js +1 -0
  37. fides/ui-build/static/admin/_next/static/chunks/{3729-c17ac8031a4c4fd1.js → 3729-c8accd71498f6fe4.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-0565d44d150c985a.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{3872-f78dec02f0d959ae.js → 3872-c022bb7259a9f323.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/{4164-355644b916ae0094.js → 4164-cadb4c6528662248.js} +1 -1
  41. fides/ui-build/static/admin/_next/static/chunks/{4608-be8cba73f5d7c326.js → 4608-caa9cb70fb66ac99.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{4786-61154adf88e448e1.js → 4786-d2b03ba5c82a02ed.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{4831-fd99c0b3784de128.js → 4831-c0d20b2a0b7332bb.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{4844-46324c3d848b8b6a.js → 4844-e5064a161a7e5a12.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{5258-e880b606a2293803.js → 5258-0062e0a1e4f8c03e.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{5487-02d00bad7c6830e0.js → 5487-46774dc9df554af1.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/{6084-c153669d5567e242.js → 6084-2c7b81cbcae7e3b4.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-8fb39280a8f0eb89.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/6954-3b26ff8259c4d5c3.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/{7476-45c5088baa8b66af.js → 7476-fdd0eb08a12e0334.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{787-a8c7eab617e2fceb.js → 787-f2eca25837ff7305.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/{79-65674011d455af4d.js → 79-68834fd07d69f428.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/{8002-24af20d679efc04e.js → 8002-193a97fe4de8b779.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/{9046-712156d461165f56.js → 9046-1afcfb1c4dbdd6c6.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-0c8a80f01e431957.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-a653cee14ce2366b.js} +9 -9
  57. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-bd0d82078e67cac3.js → add-systems-0a2b2f4a30245089.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-dff842dbed2bc6c8.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-23d3e50db42f31b3.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-75be0acd400cf527.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-30108b00ac769fc3.js → data-catalog-9fa11c01b44ba8f1.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-fb16cb8fd2b3826f.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a481a5be96dede96.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-9a81d42a474e1e48.js → action-center-6c65b86a61340753.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-b6ae7adb8ef0b525.js → activity-7fe1ca395914f77f.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-e32fccc4ca520d2b.js → new-85b28db67d96f201.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-7c59a6abf6ba6207.js → dataset-409fe1a086fb7d38.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-785205655317b1d3.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-a6985f77afbc5bc0.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/{index-6cd8708106331b8d.js → index-bf3042fdbfb12b3d.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-5d40db1ce8810e1d.js → [id]-e545f8ef5c945f45.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-f297e6cdb9fe97b9.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-0f25a76dd18c5e20.js → [id]-6e864b293571a508.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-ad6ad3e5bd72765d.js → messaging-0fc3f1f3b1cd6f2a.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-6032d82f0fc2893d.js → storage-089c166287a89166.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-baf31c3e4b081046.js → privacy-requests-73be3cfaaa95ece4.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-adbea0f9fd21ff3a.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-c64b87694eda4785.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-93a978443bf299db.js → consent-d502bf1e7580df06.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-9ecb803099082bf4.js → custom-fields-b841d63011827b43.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-e29384f7a3db5221.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-f547f1f33c12faf3.js → organization-88f6badc1bb38b97.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-20b1193ed76c56b0.js → test-datasets-0366184eda09a933.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/systems-f4bf47ed2c4746ba.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-4d7827fc9c46b6b8.js → taxonomy-2d9548cfa6086e8f.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-763861f5eb207db5.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-98a3277820e232c7.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.css +1 -0
  89. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  90. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  91. fides/ui-build/static/admin/add-systems.html +1 -1
  92. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  93. fides/ui-build/static/admin/consent/configure.html +1 -1
  94. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  95. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  96. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  97. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  98. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  99. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  100. fides/ui-build/static/admin/consent/properties.html +1 -1
  101. fides/ui-build/static/admin/consent/reporting.html +1 -1
  102. fides/ui-build/static/admin/consent.html +1 -1
  103. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  104. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  105. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  106. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  107. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  108. fides/ui-build/static/admin/data-catalog.html +1 -1
  109. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  110. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  111. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  112. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  113. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  114. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  115. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  116. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  117. fides/ui-build/static/admin/datamap.html +1 -1
  118. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  119. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  120. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  121. fides/ui-build/static/admin/dataset/new.html +1 -1
  122. fides/ui-build/static/admin/dataset.html +1 -1
  123. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  124. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  125. fides/ui-build/static/admin/datastore-connection.html +1 -1
  126. fides/ui-build/static/admin/index.html +1 -1
  127. fides/ui-build/static/admin/integrations/[id].html +1 -1
  128. fides/ui-build/static/admin/integrations.html +1 -1
  129. fides/ui-build/static/admin/login/[provider].html +1 -1
  130. fides/ui-build/static/admin/login.html +1 -1
  131. fides/ui-build/static/admin/messaging/[id].html +1 -1
  132. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  133. fides/ui-build/static/admin/messaging.html +1 -1
  134. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  135. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  136. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  137. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  138. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  139. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  140. fides/ui-build/static/admin/poc/forms.html +1 -1
  141. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  142. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  143. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  144. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  145. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  146. fides/ui-build/static/admin/privacy-requests.html +1 -1
  147. fides/ui-build/static/admin/properties/[id].html +1 -1
  148. fides/ui-build/static/admin/properties/add-property.html +1 -1
  149. fides/ui-build/static/admin/properties.html +1 -1
  150. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  151. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  152. fides/ui-build/static/admin/settings/about.html +1 -1
  153. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  154. fides/ui-build/static/admin/settings/consent.html +1 -1
  155. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  156. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  157. fides/ui-build/static/admin/settings/domains.html +1 -1
  158. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  159. fides/ui-build/static/admin/settings/locations.html +1 -1
  160. fides/ui-build/static/admin/settings/organization.html +1 -1
  161. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  162. fides/ui-build/static/admin/settings/regulations.html +1 -1
  163. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  164. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  165. fides/ui-build/static/admin/systems.html +1 -1
  166. fides/ui-build/static/admin/taxonomy.html +1 -1
  167. fides/ui-build/static/admin/user-management/new.html +1 -1
  168. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  169. fides/ui-build/static/admin/user-management.html +1 -1
  170. fides/ui-build/static/admin/_next/static/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
  171. fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
  172. fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
  177. fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
  178. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/WHEEL +0 -0
  179. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/entry_points.txt +0 -0
  180. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/licenses/LICENSE +0 -0
  181. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b1.dist-info}/top_level.txt +0 -0
  182. /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → _b75ACzlGNz3tZqGUPTE5}/_ssgManifest.js +0 -0
  183. /fides/ui-build/static/admin/_next/static/chunks/{1099-79646e64f26d62fa.js → 1099-718ce18b9bd70cdb.js} +0 -0
  184. /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-765918f8aa37fdb2.js} +0 -0
  185. /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-23df37eef17d6ea2.js} +0 -0
  186. /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-45f399d4d1325340.js} +0 -0
  187. /fides/ui-build/static/admin/_next/static/chunks/{4808-dd4157aa72648068.js → 4808-57c5ac15fd8b0d81.js} +0 -0
  188. /fides/ui-build/static/admin/_next/static/chunks/{549-38ea1d91ee2addaa.js → 549-170c96caa601e15a.js} +0 -0
  189. /fides/ui-build/static/admin/_next/static/chunks/{7630-7ed6c6117775dffe.js → 7630-8613916021366672.js} +0 -0
  190. /fides/ui-build/static/admin/_next/static/chunks/{796-9e1ca1a4030707c5.js → 796-8fbae2fc714e7a3a.js} +0 -0
  191. /fides/ui-build/static/admin/_next/static/chunks/{9826-dbae8dee941a7fac.js → 9826-d49a56431e896acb.js} +0 -0
  192. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-8d9c703c96662265.js} +0 -0
  193. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-adaec1ec185160af.js} +0 -0
  194. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-20050dbae806179d.js} +0 -0
  195. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-7b8cec88b5ad53d1.js} +0 -0
  196. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-7207ab23bdb36ce8.js → configure-b7b7fb3e8b2ea816.js} +0 -0
  197. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-c30382719d6f797a.js} +0 -0
  198. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-074cdbfc678ba791.js} +0 -0
  199. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-bcddda632b4df409.js} +0 -0
  200. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-17cdca29c6d4cdd6.js} +0 -0
  201. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-3e8bdefe714254ec.js → consent-9b4e0a08ae6216c7.js} +0 -0
  202. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-d0dbba5bff738b57.js} +0 -0
  203. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-8ffd8d148269d323.js} +0 -0
  204. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-5f2d7b24804f861f.js → projects-25c5916c8357f98d.js} +0 -0
  205. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-cfc118e68285405c.js} +0 -0
  206. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-9b7e4b86b1e8a40a.js} +0 -0
  207. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-c7390e046b2e2b7f.js → datamap-ea1eabce2a3fc2c7.js} +0 -0
  208. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-dfd71c1e9c458b89.js → [...subfieldNames]-3c629aecee30c575.js} +0 -0
  209. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-7cdc42ec5493b83d.js → [collectionName]-a13ea13e0316d5a2.js} +0 -0
  210. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-e12b11ba15bc3fc1.js → [datasetId]-a6ae353b3b1536cc.js} +0 -0
  211. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-cce20440b177050b.js → datastore-connection-93d5c01dd927bad2.js} +0 -0
  212. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-f03f1fdaa1f5a0c6.js} +0 -0
  213. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-8f90e275e932940b.js} +0 -0
  214. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-68385a251c7ade5f.js} +0 -0
  215. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-fc7d652910f3ad8d.js} +0 -0
  216. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-fb6e6f4b276b6189.js} +0 -0
  217. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-00869abf79950a9a.js} +0 -0
  218. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-5716d749236c9f70.js} +0 -0
  219. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-d6dfb9daa3935db3.js} +0 -0
  220. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-9697549bce7060be.js} +0 -0
  221. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-888656ae0bd40f62.js} +0 -0
  222. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-d83e5bd52a638234.js → configure-5a3cd9b14a37ef27.js} +0 -0
  223. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-3d2a77cb07aa8dc0.js} +0 -0
  224. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-210e7e3b3d776d44.js} +0 -0
  225. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-18257b6a70fa8a97.js} +0 -0
  226. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-a82f3df840d5c1b5.js → alpha-b678e7577eef5e5c.js} +0 -0
  227. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-d06fb16487705b9d.js → about-3f3039c7e86cab2f.js} +0 -0
  228. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-16fdd91a81074dd1.js → domain-records-50f9b26c6907d6de.js} +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-4cdd6001e7cb9aee.js → domains-5ae0d30eb3b770ab.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-1914de830ce5cfc4.js → email-templates-f5924e64a15a0dc3.js} +0 -0
  231. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-2ecc073f41628f62.js → privacy-requests-d5f8db89c7e91a02.js} +0 -0
  232. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-46d06037fcadaf00.js} +0 -0
  233. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-a659f18a30ef89f3.js} +0 -0
  234. /fides/ui-build/static/admin/_next/static/chunks/{webpack-678e89d68dbcd94f.js → webpack-606818148553db7b.js} +0 -0
@@ -0,0 +1,85 @@
1
+ from enum import Enum
2
+
3
+ from citext import CIText
4
+ from sqlalchemy import ARRAY, Column
5
+ from sqlalchemy import Enum as EnumColumn
6
+ from sqlalchemy import ForeignKey, String, UniqueConstraint
7
+ from sqlalchemy.ext.declarative import declared_attr
8
+ from sqlalchemy.orm import relationship
9
+
10
+ from fides.api.db.base_class import Base
11
+ from fides.api.models.fides_user import FidesUser
12
+ from fides.api.models.sql_models import System # type: ignore[attr-defined]
13
+
14
+
15
+ class CustomTaxonomyColor(str, Enum):
16
+ WHITE = "taxonomy_white"
17
+ RED = "taxonomy_red"
18
+ ORANGE = "taxonomy_orange"
19
+ YELLOW = "taxonomy_yellow"
20
+ GREEN = "taxonomy_green"
21
+ BLUE = "taxonomy_blue"
22
+ PURPLE = "taxonomy_purple"
23
+ SANDSTONE = "sandstone"
24
+ MINOS = "minos"
25
+
26
+
27
+ class SystemGroup(Base):
28
+ @declared_attr
29
+ def __tablename__(self) -> str:
30
+ return "system_group"
31
+
32
+ fides_key = Column(
33
+ String,
34
+ ForeignKey("taxonomy_element.fides_key", ondelete="CASCADE"),
35
+ nullable=False,
36
+ unique=True,
37
+ index=True,
38
+ )
39
+ label_color = Column(
40
+ EnumColumn(CustomTaxonomyColor, values_callable=lambda x: [i.value for i in x]),
41
+ nullable=True,
42
+ )
43
+ data_steward_username = Column(
44
+ CIText,
45
+ ForeignKey(FidesUser.username, ondelete="SET NULL"),
46
+ index=True,
47
+ nullable=True,
48
+ )
49
+ data_uses = Column(
50
+ ARRAY(String),
51
+ nullable=False,
52
+ server_default="{}",
53
+ default=list,
54
+ ) # a list of `fides_key`s of `DataUse` records
55
+ data_steward = relationship(
56
+ "FidesUser", foreign_keys=[data_steward_username], lazy="selectin"
57
+ )
58
+
59
+ systems = relationship(
60
+ System,
61
+ secondary="system_group_member",
62
+ back_populates="system_groups",
63
+ viewonly=True,
64
+ )
65
+
66
+
67
+ class SystemGroupMember(Base):
68
+ @declared_attr
69
+ def __tablename__(self) -> str:
70
+ return "system_group_member"
71
+
72
+ system_group_id = Column(
73
+ String(255), ForeignKey("system_group.id", ondelete="CASCADE"), index=True
74
+ )
75
+ system_id = Column(
76
+ String(255), ForeignKey("ctl_systems.id", ondelete="CASCADE"), index=True
77
+ )
78
+
79
+ __table_args__ = (
80
+ UniqueConstraint(
81
+ "system_group_id",
82
+ "system_id",
83
+ name="uq_system_group_member_group_system",
84
+ ),
85
+ )
@@ -1,4 +1,3 @@
1
- from enum import Enum
2
1
  from typing import Any, Dict, List, Optional, Set, Union
3
2
 
4
3
  from fideslang.models import FidesCollectionKey, FidesDatasetReference
@@ -69,7 +68,7 @@ class Strategy(BaseModel):
69
68
  """General shape for swappable strategies (ex: auth, processors, pagination, etc.)"""
70
69
 
71
70
  strategy: str
72
- configuration: Dict[str, Any]
71
+ configuration: Optional[Dict[str, Any]] = None
73
72
 
74
73
 
75
74
  class ClientConfig(BaseModel):
@@ -90,20 +89,6 @@ class QueryParam(BaseModel):
90
89
  value: Union[int, str]
91
90
 
92
91
 
93
- class AsyncStrategy(Enum):
94
- """Async strategies: supports callback for now, but could be
95
- extended to polling as well in the future"""
96
-
97
- callback = "callback"
98
-
99
-
100
- class AsyncConfig(BaseModel):
101
- """Async config only has strategy for now, but could be
102
- extended with other configuration options when we add polling"""
103
-
104
- strategy: AsyncStrategy
105
-
106
-
107
92
  class SaaSRequest(BaseModel):
108
93
  """
109
94
  A single request with static or dynamic path, headers, query, and body params.
@@ -126,7 +111,7 @@ class SaaSRequest(BaseModel):
126
111
  grouped_inputs: Optional[List[str]] = []
127
112
  ignore_errors: Optional[Union[bool, List[int]]] = False
128
113
  rate_limit_config: Optional[RateLimitConfig] = None
129
- async_config: Optional[AsyncConfig] = None
114
+ async_config: Optional[Strategy] = None
130
115
  skip_missing_param_values: Optional[bool] = (
131
116
  False # Skip instead of raising an exception if placeholders can't be populated in body
132
117
  )
@@ -178,3 +178,15 @@ class OAuth2ClientCredentialsConfiguration(OAuth2BaseConfiguration):
178
178
  """
179
179
 
180
180
  refresh_request: Optional[SaaSRequest] = Field(exclude=True)
181
+
182
+
183
+ class PollingAsyncDSRConfiguration(StrategyConfiguration):
184
+ """
185
+ Configuration for polling async DSR requests.
186
+ """
187
+
188
+ status_request: SaaSRequest
189
+ status_path: str
190
+ status_completed_value: Optional[str] = None
191
+ result_request: SaaSRequest
192
+ result_path: str
@@ -2,6 +2,7 @@ from datetime import datetime
2
2
  from typing import Any, Dict, List, Optional, Sequence
3
3
 
4
4
  from fideslang.models import PrivacyDeclaration, System
5
+ from fideslang.validation import FidesKey
5
6
  from pydantic import ConfigDict, Field
6
7
  from pydantic.main import BaseModel
7
8
 
@@ -61,3 +62,10 @@ class SystemHistoryResponse(BaseModel):
61
62
  after: Dict[str, Any]
62
63
  created_at: datetime
63
64
  model_config = ConfigDict(from_attributes=True)
65
+
66
+
67
+ class AssignStewardRequest(BaseModel):
68
+ """Request schema for assigning a data steward to one or more systems."""
69
+
70
+ data_steward: str
71
+ system_keys: List[FidesKey]
@@ -1,3 +1,5 @@
1
+ from typing import Any, Dict
2
+
1
3
  from loguru import logger
2
4
  from sqlalchemy.orm import Session
3
5
 
@@ -5,7 +7,22 @@ from fides.api.common_exceptions import PrivacyRequestError
5
7
  from fides.api.models.connectionconfig import ConnectionConfig
6
8
  from fides.api.models.datasetconfig import DatasetConfig
7
9
  from fides.api.models.privacy_request import PrivacyRequest, RequestTask
10
+ from fides.api.models.worker_task import ExecutionLogStatus
11
+ from fides.api.schemas.policy import ActionType
8
12
  from fides.api.schemas.privacy_request import PrivacyRequestStatus
13
+ from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
14
+ from fides.api.service.async_dsr.async_dsr_strategy_polling import (
15
+ PollingAsyncDSRStrategy,
16
+ )
17
+ from fides.api.service.connectors.query_configs.saas_query_config import SaaSQueryConfig
18
+ from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
19
+ from fides.api.service.connectors.saas_connector import SaaSConnector
20
+ from fides.api.task.execute_request_tasks import (
21
+ create_graph_task,
22
+ log_task_queued,
23
+ queue_request_task,
24
+ )
25
+ from fides.api.task.graph_task import GraphTask
9
26
  from fides.api.task.task_resources import TaskResources
10
27
 
11
28
 
@@ -16,6 +33,9 @@ def requeue_polling_request(
16
33
  """Re-queue a Privacy request that polls async tasks for a given privacy request"""
17
34
  # Check that the privacy request is approved or in processing
18
35
  privacy_request: PrivacyRequest = async_task.privacy_request
36
+ logger.info(
37
+ f"Privacy request {privacy_request.id} status: {privacy_request.status.value}"
38
+ )
19
39
 
20
40
  if privacy_request.status not in [
21
41
  PrivacyRequestStatus.approved,
@@ -41,16 +61,23 @@ def requeue_polling_request(
41
61
  async_task,
42
62
  db,
43
63
  ) as resources:
44
- # graph_task: GraphTask = create_graph_task(db, async_task, resources)
45
- # Currently, upstream tasks and "input keys" (which are built by data dependencies)
46
- # are the same, but they may not be the same in the future.
47
- # upstream_tasks = async_task.upstream_tasks_objects(db)
48
- # upstream_access_data: List[List[Row]] = _build_upstream_access_data(
49
- # graph_task.execution_node.input_keys, upstream_tasks
50
- # )
51
- # TODO: Implement the polling strategy
52
- logger.info(f"found resources: {resources}")
53
- return None
64
+ graph_task: GraphTask = create_graph_task(db, async_task, resources)
65
+
66
+ saas_connector: SaaSConnector = graph_task.connector # type: ignore
67
+ saas_connector.set_privacy_request_state(
68
+ privacy_request,
69
+ graph_task.execution_node,
70
+ async_task,
71
+ )
72
+ query_config: SaaSQueryConfig = saas_connector.query_config(
73
+ graph_task.execution_node
74
+ ) # type: ignore
75
+ if async_task.action_type == ActionType.access:
76
+ logger.info(f"Executing read polling requests for {async_task.id}")
77
+
78
+ execute_read_polling_requests(db, async_task, query_config, saas_connector)
79
+ elif async_task.action_type == ActionType.erasure:
80
+ execute_erasure_polling_requests(db, async_task, query_config)
54
81
 
55
82
 
56
83
  def get_connection_config_from_task(
@@ -64,6 +91,7 @@ def get_connection_config_from_task(
64
91
  raise PrivacyRequestError(
65
92
  f"DatasetConfig with fides_key {request_task.dataset_name} not found."
66
93
  )
94
+
67
95
  connection_config = ConnectionConfig.get(
68
96
  db=db, object_id=dataset_config.connection_config_id
69
97
  )
@@ -73,3 +101,95 @@ def get_connection_config_from_task(
73
101
  )
74
102
 
75
103
  return connection_config
104
+
105
+
106
+ def execute_read_polling_requests(
107
+ db: Session,
108
+ async_task: RequestTask,
109
+ query_config: SaaSQueryConfig,
110
+ connector: SaaSConnector,
111
+ ) -> None:
112
+ """Execute the read polling requests for a given privacy request"""
113
+ read_requests = query_config.get_read_requests_by_identity()
114
+ logger.info(f"Read requests: {read_requests}")
115
+ for read_request in read_requests:
116
+ if read_request.async_config:
117
+ strategy: PollingAsyncDSRStrategy = AsyncDSRStrategy.get_strategy( # type: ignore
118
+ read_request.async_config.strategy,
119
+ read_request.async_config.configuration,
120
+ )
121
+ client: AuthenticatedClient = connector.create_client()
122
+
123
+ # Get missing parameters from available context
124
+ privacy_request: PrivacyRequest = async_task.privacy_request
125
+ secrets: Dict[str, Any] = connector.secrets
126
+ identity_data = {
127
+ **privacy_request.get_persisted_identity().labeled_dict(),
128
+ **privacy_request.get_cached_identity_data(),
129
+ }
130
+
131
+ status = strategy.get_status_request(
132
+ client,
133
+ secrets,
134
+ identity_data,
135
+ )
136
+
137
+ if status:
138
+ execute_read_result_request(
139
+ db,
140
+ async_task,
141
+ strategy,
142
+ client,
143
+ secrets,
144
+ identity_data,
145
+ )
146
+ else:
147
+ logger.info(f"Polling request - {async_task.id} still not Ready. ")
148
+ continue
149
+
150
+
151
+ def execute_read_result_request(
152
+ db: Session,
153
+ async_task: RequestTask,
154
+ strategy: PollingAsyncDSRStrategy,
155
+ client: AuthenticatedClient,
156
+ secrets: Dict[str, Any],
157
+ identity_data: Dict[str, Any],
158
+ ) -> None:
159
+
160
+ result = strategy.get_result_request(
161
+ client,
162
+ secrets,
163
+ identity_data,
164
+ )
165
+ logger.info(f"Result: {result}")
166
+ if result:
167
+ # Save updated data back to the request task.
168
+ async_task.access_data = result
169
+ logger.info(
170
+ f"Polling request - {async_task.id} is ready. Added {len(result) if isinstance(result, list) else 1} results"
171
+ )
172
+
173
+ else:
174
+ async_task.access_data = []
175
+ logger.info(
176
+ f"Polling request - {async_task.id} is ready but returned no results"
177
+ )
178
+
179
+ async_task.callback_succeeded = (
180
+ True # Setting this task as successful, so it wont loop anymore
181
+ )
182
+ async_task.update_status(db, ExecutionLogStatus.pending)
183
+ async_task.save(db)
184
+ log_task_queued(async_task, "callback")
185
+ queue_request_task(async_task, privacy_request_proceed=True)
186
+
187
+
188
+ def execute_erasure_polling_requests(
189
+ db: Session,
190
+ async_task: RequestTask,
191
+ query_config: SaaSQueryConfig,
192
+ ) -> None:
193
+ """Execute the erasure polling requests for a given privacy request"""
194
+ # TODO: Implement erasure polling logic
195
+ logger.info(f"Erasure polling not yet implemented. Task {async_task.id} passed")
@@ -0,0 +1,5 @@
1
+ from fides.api.service.strategy import Strategy
2
+
3
+
4
+ class AsyncDSRStrategy(Strategy):
5
+ """Abstract base class for async DSR strategies"""
@@ -0,0 +1,16 @@
1
+ from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
2
+
3
+
4
+ class CallbackAsyncDSRStrategy(AsyncDSRStrategy):
5
+ """
6
+ Strategy for callback async DSR requests.
7
+
8
+ This strategy has no methods since the callback is handled by the callback endpoint
9
+ we still require the strategy to be defined to notify that the request is awaiting async processing
10
+ and follows the AsyncDSRStrategy interface.
11
+ """
12
+
13
+ name = "callback"
14
+
15
+ def __init__(self) -> None:
16
+ pass
@@ -0,0 +1,63 @@
1
+ from enum import Enum
2
+ from typing import Any, Dict, List
3
+
4
+ from pydantic import ValidationError
5
+
6
+ from fides.api.common_exceptions import NoSuchStrategyException
7
+ from fides.api.common_exceptions import ValidationError as FidesopsValidationError
8
+ from fides.api.schemas.saas.strategy_configuration import StrategyConfiguration
9
+ from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
10
+ from fides.api.service.async_dsr.async_dsr_strategy_callback import (
11
+ CallbackAsyncDSRStrategy,
12
+ )
13
+ from fides.api.service.async_dsr.async_dsr_strategy_polling import (
14
+ PollingAsyncDSRStrategy,
15
+ )
16
+
17
+
18
+ class SupportedAsyncDSRStrategies(Enum):
19
+ """
20
+ The supported async DSR strategies for handling asynchronous data subject requests.
21
+ """
22
+
23
+ callback = CallbackAsyncDSRStrategy
24
+ polling = PollingAsyncDSRStrategy
25
+
26
+ @classmethod
27
+ def __contains__(cls, item: str) -> bool:
28
+ try:
29
+ cls[item]
30
+ except KeyError:
31
+ return False
32
+
33
+ return True
34
+
35
+
36
+ def get_strategy(
37
+ strategy_name: str,
38
+ configuration: Dict[str, Any],
39
+ ) -> AsyncDSRStrategy:
40
+ """
41
+ Returns the strategy given the name and configuration.
42
+ Raises NoSuchStrategyException if the strategy does not exist
43
+ """
44
+ if not SupportedAsyncDSRStrategies.__contains__(strategy_name):
45
+ valid_strategies = ", ".join(get_strategy_names())
46
+ raise NoSuchStrategyException(
47
+ f"Strategy '{strategy_name}' does not exist. Valid strategies are [{valid_strategies}]"
48
+ )
49
+ strategy = SupportedAsyncDSRStrategies[strategy_name].value
50
+ if strategy.configuration_model is None:
51
+ return strategy()
52
+ try:
53
+ strategy_config: StrategyConfiguration = strategy.configuration_model(
54
+ **configuration
55
+ )
56
+ return strategy(configuration=strategy_config)
57
+ except ValidationError as e:
58
+ raise FidesopsValidationError(message=str(e))
59
+
60
+
61
+ def get_strategy_names() -> List[str]:
62
+ """Returns all supported async DSR strategies"""
63
+ return [s.name for s in SupportedAsyncDSRStrategies]
@@ -0,0 +1,94 @@
1
+ from typing import Any, Dict, List
2
+
3
+ import pydash
4
+ from requests import Response
5
+
6
+ from fides.api.common_exceptions import PrivacyRequestError
7
+ from fides.api.schemas.saas.strategy_configuration import PollingAsyncDSRConfiguration
8
+ from fides.api.service.async_dsr.async_dsr_strategy import AsyncDSRStrategy
9
+ from fides.api.service.connectors.saas.authenticated_client import AuthenticatedClient
10
+ from fides.api.util.collection_util import Row
11
+ from fides.api.util.saas_util import map_param_values
12
+
13
+
14
+ class PollingAsyncDSRStrategy(AsyncDSRStrategy):
15
+ """
16
+ Strategy for polling async DSR requests.
17
+ """
18
+
19
+ name = "polling"
20
+ configuration_model = PollingAsyncDSRConfiguration
21
+
22
+ def __init__(self, configuration: PollingAsyncDSRConfiguration):
23
+ self.status_request = configuration.status_request
24
+ self.status_path = configuration.status_path
25
+ self.status_completed_value = configuration.status_completed_value
26
+ self.result_request = configuration.result_request
27
+ self.result_path = configuration.result_path
28
+
29
+ def get_status_request(
30
+ self,
31
+ client: AuthenticatedClient,
32
+ secrets: Dict[str, Any],
33
+ identity_data: Dict[str, Any],
34
+ ) -> bool:
35
+ """Executes the status requests, and move forward if its true"""
36
+ param_values = secrets.copy()
37
+ param_values.update(identity_data)
38
+ prepared_status_request = map_param_values(
39
+ "status", "polling request", self.status_request, param_values
40
+ )
41
+
42
+ response: Response = client.send(prepared_status_request)
43
+
44
+ if response.ok:
45
+ status_path_value = pydash.get(response.json(), self.status_path)
46
+ # If the status path value is a boolean, return it
47
+ if isinstance(status_path_value, bool):
48
+ return status_path_value
49
+
50
+ # if the status path is a string, check if its the expected string value
51
+ if isinstance(status_path_value, str):
52
+ if status_path_value == self.status_completed_value:
53
+ return True
54
+
55
+ return False
56
+
57
+ # if the status path is a list, check if the first element is the expected string value
58
+ if isinstance(status_path_value, list):
59
+ if status_path_value[0] == self.status_completed_value:
60
+ return True
61
+
62
+ return False
63
+ # And if we cant recognize the type, raise an error
64
+ raise PrivacyRequestError(
65
+ f"Status request returned an unexpected value: {status_path_value}"
66
+ )
67
+
68
+ raise PrivacyRequestError(
69
+ f"Status request failed with status code {response.status_code}"
70
+ )
71
+
72
+ def get_result_request(
73
+ self,
74
+ client: AuthenticatedClient,
75
+ secrets: Dict[str, Any],
76
+ identity_data: Dict[str, Any],
77
+ ) -> List[Row]:
78
+ """Build request to get the result of the async DSR process"""
79
+ param_values = secrets.copy()
80
+ param_values.update(identity_data)
81
+ prepared_result_request = map_param_values(
82
+ "result",
83
+ "polling request",
84
+ self.result_request,
85
+ param_values, # type: ignore
86
+ )
87
+ response: Response = client.send(prepared_result_request)
88
+ if response.ok:
89
+ result = pydash.get(response.json(), self.result_path)
90
+ return result
91
+
92
+ raise PrivacyRequestError(
93
+ f"Result request failed with status code {response.status_code}"
94
+ )
@@ -14,12 +14,14 @@ from fides.api.common_exceptions import (
14
14
  AwaitingAsyncTask,
15
15
  FidesopsException,
16
16
  PostProcessingException,
17
+ PrivacyRequestError,
17
18
  SkippingConsentPropagation,
18
19
  )
19
20
  from fides.api.graph.execution import ExecutionNode
20
21
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionTestStatus
21
22
  from fides.api.models.policy import Policy
22
23
  from fides.api.models.privacy_request import PrivacyRequest, RequestTask
24
+ from fides.api.models.privacy_request.request_task import AsyncTaskType
23
25
  from fides.api.schemas.consentable_item import (
24
26
  ConsentableItem,
25
27
  build_consent_item_hierarchy,
@@ -27,7 +29,6 @@ from fides.api.schemas.consentable_item import (
27
29
  from fides.api.schemas.limiter.rate_limit_config import RateLimitConfig
28
30
  from fides.api.schemas.policy import ActionType
29
31
  from fides.api.schemas.saas.saas_config import (
30
- AsyncStrategy,
31
32
  ClientConfig,
32
33
  ConsentRequestMap,
33
34
  ParamValue,
@@ -264,17 +265,29 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
264
265
  input_data[CUSTOM_PRIVACY_REQUEST_FIELDS] = [custom_privacy_request_fields]
265
266
 
266
267
  rows: List[Row] = []
267
- awaiting_async_callback: bool = False
268
+ awaiting_async_processing: bool = False
269
+
268
270
  for read_request in read_requests:
269
271
  self.set_saas_request_state(read_request)
270
272
  if (
271
- read_request.async_config
272
- and read_request.async_config.strategy == AsyncStrategy.callback
273
+ read_request.async_config is not None
273
274
  and request_task.id # Only supported in DSR 3.0
274
275
  ):
275
276
  # Asynchronous read request detected. We will exit below and put the
276
277
  # Request Task in an "awaiting_processing" status.
277
- awaiting_async_callback = True
278
+ awaiting_async_processing = True
279
+
280
+ # Validate async strategy with proper enum value checking
281
+ strategy_value = read_request.async_config.strategy
282
+ valid_strategies = [task_type.value for task_type in AsyncTaskType]
283
+
284
+ if strategy_value not in valid_strategies:
285
+ raise PrivacyRequestError(
286
+ f"Invalid async type '{strategy_value}' for request task {request_task.id}. "
287
+ f"Valid types are: {valid_strategies}"
288
+ )
289
+
290
+ request_task.async_type = AsyncTaskType(strategy_value)
278
291
 
279
292
  # check all the values specified by param_values are provided in input_data
280
293
  if self._missing_dataset_reference_values(
@@ -332,9 +345,14 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
332
345
  )
333
346
 
334
347
  self.unset_connector_state()
335
- if awaiting_async_callback:
348
+ if awaiting_async_processing:
336
349
  # If a read request was marked to expect async results, original response data here is ignored.
337
350
  # We'll instead use the data received in the callback URL later.
351
+ # However for polling async request we want to save the request data for ids that we will use on the pollings status
352
+ if request_task.async_type == AsyncTaskType.polling:
353
+ # Saving the request task access data to use it on the polling status request
354
+ # TODO: Consider if we want to clean up the rows. Currently this is the concern of the GraphTask.
355
+ request_task.access_data = rows
338
356
  # Raising an AwaitingAsyncTask to put this task in an awaiting_processing state
339
357
  raise AwaitingAsyncTask()
340
358
 
@@ -633,7 +651,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
633
651
 
634
652
  awaiting_async_callback: bool = bool(
635
653
  masking_request.async_config
636
- and masking_request.async_config.strategy == AsyncStrategy.callback
654
+ and masking_request.async_config.strategy == AsyncTaskType.callback.value
637
655
  ) and bool(
638
656
  request_task.id
639
657
  ) # Only supported in DSR 3.0
fides/api/service/deps.py CHANGED
@@ -1,13 +1,16 @@
1
1
  from fastapi import Depends
2
+ from sqlalchemy.ext.asyncio import AsyncSession
2
3
  from sqlalchemy.orm import Session
3
4
 
4
5
  from fides.api.api.deps import get_config, get_config_proxy, get_db
6
+ from fides.api.db.ctl_session import get_async_db
5
7
  from fides.config import FidesConfig
6
8
  from fides.config.config_proxy import ConfigProxy
7
9
  from fides.service.dataset.dataset_config_service import DatasetConfigService
8
10
  from fides.service.dataset.dataset_service import DatasetService
9
11
  from fides.service.messaging.messaging_service import MessagingService
10
12
  from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
13
+ from fides.service.system.system_service import SystemService
11
14
  from fides.service.taxonomy.taxonomy_service import TaxonomyService
12
15
  from fides.service.user.user_service import UserService
13
16
 
@@ -46,3 +49,7 @@ def get_user_service(
46
49
 
47
50
  def get_taxonomy_service(db: Session = Depends(get_db)) -> TaxonomyService:
48
51
  return TaxonomyService(db)
52
+
53
+
54
+ def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
55
+ return SystemService(db)