ethyca-fides 2.69.3b0__py2.py3-none-any.whl → 2.69.3b2__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 (332) hide show
  1. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/RECORD +267 -239
  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/5fa78b1f324d_add_event_audit_table.py +82 -0
  6. fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
  7. fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
  8. fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
  9. fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
  10. fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
  11. fides/api/api/v1/endpoints/system.py +140 -55
  12. fides/api/db/base.py +3 -0
  13. fides/api/db/seed.py +34 -0
  14. fides/api/main.py +2 -0
  15. fides/api/models/asset.py +3 -0
  16. fides/api/models/detection_discovery/web_monitor.py +61 -0
  17. fides/api/models/event_audit.py +68 -0
  18. fides/api/models/messaging.py +30 -10
  19. fides/api/models/sql_models.py +8 -0
  20. fides/api/models/system_group.py +85 -0
  21. fides/api/models/taxonomy.py +16 -4
  22. fides/api/schemas/application_config.py +4 -1
  23. fides/api/schemas/messaging/messaging.py +33 -66
  24. fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
  25. fides/api/schemas/messaging/shared_schemas.py +102 -0
  26. fides/api/schemas/saas/saas_config.py +2 -17
  27. fides/api/schemas/saas/strategy_configuration.py +12 -0
  28. fides/api/schemas/system.py +8 -0
  29. fides/api/service/async_dsr/async_dsr_service.py +130 -10
  30. fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
  31. fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
  32. fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
  33. fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
  34. fides/api/service/connectors/saas_connector.py +25 -7
  35. fides/api/service/deps.py +17 -2
  36. fides/api/service/messaging/message_dispatch_service.py +16 -15
  37. fides/api/service/messaging/messaging_crud_service.py +5 -9
  38. fides/api/service/privacy_request/request_runner_service.py +18 -0
  39. fides/api/service/privacy_request/request_service.py +29 -20
  40. fides/api/service/strategy.py +6 -3
  41. fides/api/task/graph_task.py +1 -2
  42. fides/api/tasks/__init__.py +1 -0
  43. fides/api/util/filter_utils.py +0 -3
  44. fides/api/worker/__init__.py +2 -0
  45. fides/common/api/v1/urn_registry.py +2 -1
  46. fides/service/event_audit_service.py +115 -0
  47. fides/service/messaging/aws_ses_service.py +2 -4
  48. fides/service/system/__init__.py +0 -0
  49. fides/service/system/system_service.py +138 -0
  50. fides/service/taxonomy/taxonomy_service.py +49 -3
  51. fides/ui-build/static/admin/404.html +1 -1
  52. fides/ui-build/static/admin/_next/static/86A8z6OnbTuDYww0DJkX0/_buildManifest.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/1115-d5a834cdaa717edc.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/155-b5e4370b158e5ee3.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/1817-dc2bba3ca736d39e.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/1841-2052c3239f2a0a1a.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/2040-3f9c66c56a05b336.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/2751-58285ccf50a0ba4b.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/3377-c5e0cc3de1a5ffd1.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/3696-fff4f944d7d5ff20.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-8377b3fcbb3d93b0.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/3872-4786ccbe7c6f65b0.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/409-e1deab19fc7e6d99.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/4230-c55d5531697a715c.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/4608-2fbc3389681f6924.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/4786-8d78ec773d171562.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/5185-a219b390ef17ff4b.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/5309-e994c5195f99b1eb.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/5783-c62c79e7be21be73.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/6084-29cbe703bffdccfe.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/6416-79eee298a5b3f80f.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/6780-eeb7775eb21d7a12.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-91a8641cd2784b54.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/6882-55dbb142f7c40f53.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/6954-6dfafd38b02d5852.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/7476-3da7a490debad8e2.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/7630-22f9c4b25d6aed29.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/7725-b2fa93d747d3d85d.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/7929-4314e317b1717257.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/796-8e4da90ae82dfebb.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/8002-78d78545309b2c1c.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/8373-bd50fa53cbcab2aa.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/9046-0f92802b0e3382a9.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/9226-49dbcdb135bf9793.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/9826-f316eb1d61cb90b6.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-c389c51ca6353035.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-c780470042750062.js} +10 -10
  90. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-fb9434d926ebf0b3.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-92034daafd2187a0.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-87919c1192e68b1a.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-ae8a64fffe3f8c66.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-d7d9ff9ed28fa790.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-c985ea8c1a0e0550.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-ddf6ba92355f81de.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/consent-35c0ae9d5b5a940c.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-6a196c704f1c6dd7.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-06ba907e7d91a724.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-9cee4e222ebb2b60.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-f99af5669b9ab44c.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-db7f1a269d3e7fc2.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-de957913f9b47daa.js +1 -0
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-5868591ff1e5f881.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-715064e1c9788e1a.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-9ae81f5c245b8a01.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-6537c93c69b597c7.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-5db26067d921a94a.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-9f6a62614d7eb113.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-aed0e6dafc143b97.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-72b9878ea9b91529.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-f36a46381a6c25d4.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b653fd60e7db989b.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5bb96c8684a38bbf.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-639046f6c76bc8bd.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-6bf117315d909ad1.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-1e2fa11f22dbc449.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-c55e3e0e19030f3f.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/index-d66ea87b457af21e.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-0159fbb2e0440709.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-267d2742fffaebe5.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-670b05b03ba11e0a.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-482a7256925a6e06.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-331147598052f25c.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-28083bfb2dec7b9f.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-e02dc4b4b385c86f.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-74c2a0ff4c992633.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-7459d56e548925b2.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-aed018025b09c045.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-7f2c50044806c094.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-e8cab942d09aa358.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-128f952a49a0e8dc.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-cca3d1a26e1269bb.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-07e1b9937a169e32.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-3bc799dac8423f50.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-9f36b6c213ae524c.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-f8887b2b29aed1b9.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-5473558807e94462.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-1065fbefd449719c.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3e23d92d789fff99.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-907bfbb71d84646f.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-aa1ada4d4ac09759.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-02b0dde03a1ad159.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/chunks/pages/systems-4a6ef2509e8cedfc.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-16b122b83e57bb8c.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-6304dad2c5fab694.js} +1 -1
  149. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-0a8ec3aa2ed59a33.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-4036b023366b7eec.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.css +1 -0
  152. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  153. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  154. fides/ui-build/static/admin/add-systems.html +1 -1
  155. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  156. fides/ui-build/static/admin/consent/configure.html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  158. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  159. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  160. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  161. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  162. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  163. fides/ui-build/static/admin/consent/properties.html +1 -1
  164. fides/ui-build/static/admin/consent/reporting.html +1 -1
  165. fides/ui-build/static/admin/consent.html +1 -1
  166. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  167. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  168. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  169. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  170. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  171. fides/ui-build/static/admin/data-catalog.html +1 -1
  172. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  173. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  174. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  175. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  176. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  177. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  178. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  179. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  180. fides/ui-build/static/admin/datamap.html +1 -1
  181. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  182. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  183. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  184. fides/ui-build/static/admin/dataset/new.html +1 -1
  185. fides/ui-build/static/admin/dataset.html +1 -1
  186. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  187. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  188. fides/ui-build/static/admin/datastore-connection.html +1 -1
  189. fides/ui-build/static/admin/index.html +1 -1
  190. fides/ui-build/static/admin/integrations/[id].html +1 -1
  191. fides/ui-build/static/admin/integrations.html +1 -1
  192. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  193. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  194. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  195. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  196. fides/ui-build/static/admin/lib/fides.js +2 -2
  197. fides/ui-build/static/admin/login/[provider].html +1 -1
  198. fides/ui-build/static/admin/login.html +1 -1
  199. fides/ui-build/static/admin/messaging/[id].html +1 -1
  200. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  201. fides/ui-build/static/admin/messaging.html +1 -1
  202. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  203. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  204. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  205. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  206. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  207. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  208. fides/ui-build/static/admin/poc/forms.html +1 -1
  209. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  210. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  211. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  212. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  213. fides/ui-build/static/admin/privacy-requests.html +1 -1
  214. fides/ui-build/static/admin/properties/[id].html +1 -1
  215. fides/ui-build/static/admin/properties/add-property.html +1 -1
  216. fides/ui-build/static/admin/properties.html +1 -1
  217. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  218. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  219. fides/ui-build/static/admin/settings/about.html +1 -1
  220. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  221. fides/ui-build/static/admin/settings/consent.html +1 -1
  222. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  223. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  224. fides/ui-build/static/admin/settings/domains.html +1 -1
  225. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  226. fides/ui-build/static/admin/settings/locations.html +1 -1
  227. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -0
  228. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -0
  229. fides/ui-build/static/admin/settings/messaging-providers.html +1 -0
  230. fides/ui-build/static/admin/settings/organization.html +1 -1
  231. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  232. fides/ui-build/static/admin/settings/regulations.html +1 -1
  233. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  234. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  235. fides/ui-build/static/admin/systems.html +1 -1
  236. fides/ui-build/static/admin/taxonomy.html +1 -1
  237. fides/ui-build/static/admin/user-management/new.html +1 -1
  238. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  239. fides/ui-build/static/admin/user-management.html +1 -1
  240. fides/ui-build/static/admin/_next/static/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/5258-e880b606a2293803.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/9826-dbae8dee941a7fac.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-dfd71c1e9c458b89.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7cdc42ec5493b83d.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-5d40db1ce8810e1d.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
  303. fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
  304. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
  305. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/WHEEL +0 -0
  306. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/entry_points.txt +0 -0
  307. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/licenses/LICENSE +0 -0
  308. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/top_level.txt +0 -0
  309. /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → 86A8z6OnbTuDYww0DJkX0}/_ssgManifest.js +0 -0
  310. /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-cdc7a13973f4a0ba.js} +0 -0
  311. /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-db57401384d1de8f.js} +0 -0
  312. /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-4e56e924f35317f2.js} +0 -0
  313. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-e4a1f93a7ce944f0.js} +0 -0
  314. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-a4f821c4902f2df8.js} +0 -0
  315. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-96245b63aafc5168.js} +0 -0
  316. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-4fea66e59bd59de8.js} +0 -0
  317. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-c8038e05f35da8d1.js} +0 -0
  318. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-f3a40101a8f3fd00.js} +0 -0
  319. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-965af6c1fd01334e.js} +0 -0
  320. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-5afecf141308bfc5.js} +0 -0
  321. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-4352e55f110556b4.js} +0 -0
  322. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-c533120e94e049e3.js} +0 -0
  323. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-b14f5f38b2d711a8.js} +0 -0
  324. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-31d51e3b9227c8d5.js} +0 -0
  325. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-8794a0d2e7554a05.js} +0 -0
  326. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-90b31073e478c99c.js} +0 -0
  327. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-0a6859a0225b7e00.js} +0 -0
  328. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-eb0552917907fe21.js} +0 -0
  329. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-b2a2a084d8cfe22d.js} +0 -0
  330. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-0c944cfa9c6acbff.js} +0 -0
  331. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-f0f0ea35d0185ae3.js} +0 -0
  332. /fides/ui-build/static/admin/_next/static/chunks/{webpack-678e89d68dbcd94f.js → webpack-55e1c55932df2413.js} +0 -0
@@ -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,17 @@
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
11
+ from fides.service.event_audit_service import EventAuditService
9
12
  from fides.service.messaging.messaging_service import MessagingService
10
13
  from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
14
+ from fides.service.system.system_service import SystemService
11
15
  from fides.service.taxonomy.taxonomy_service import TaxonomyService
12
16
  from fides.service.user.user_service import UserService
13
17
 
@@ -44,5 +48,16 @@ def get_user_service(
44
48
  return UserService(db, config, config_proxy)
45
49
 
46
50
 
47
- def get_taxonomy_service(db: Session = Depends(get_db)) -> TaxonomyService:
48
- return TaxonomyService(db)
51
+ def get_event_audit_service(db: Session = Depends(get_db)) -> EventAuditService:
52
+ return EventAuditService(db)
53
+
54
+
55
+ def get_taxonomy_service(
56
+ db: Session = Depends(get_db),
57
+ event_audit_service: EventAuditService = Depends(get_event_audit_service),
58
+ ) -> TaxonomyService:
59
+ return TaxonomyService(db, event_audit_service)
60
+
61
+
62
+ def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
63
+ return SystemService(db)
@@ -44,7 +44,6 @@ from fides.api.service.messaging.messaging_crud_service import (
44
44
  get_enabled_messaging_template_by_type_and_property,
45
45
  )
46
46
  from fides.api.tasks import DatabaseTask, celery_app
47
- from fides.api.util.logger import Pii
48
47
  from fides.config import CONFIG
49
48
  from fides.config.config_proxy import ConfigProxy
50
49
  from fides.service.messaging.aws_ses_service import AWS_SES_Service
@@ -663,9 +662,9 @@ def _mailgun_dispatcher(
663
662
  raise MessageDispatchException(
664
663
  f"Email failed to send with status code {response.status_code}"
665
664
  )
666
- except Exception as e:
667
- logger.error("Email failed to send: {}", Pii(str(e)))
668
- raise MessageDispatchException(f"Email failed to send due to: {Pii(e)}")
665
+ except Exception as exc:
666
+ logger.error("Email failed to send: {}", str(exc))
667
+ raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
669
668
 
670
669
 
671
670
  def _twilio_email_dispatcher(
@@ -707,14 +706,14 @@ def _twilio_email_dispatcher(
707
706
  logger.error(
708
707
  "Email failed to send: %s: %s",
709
708
  response.status_code,
710
- Pii(str(response.body)),
709
+ str(response.body),
711
710
  )
712
711
  raise MessageDispatchException(
713
- f"Email failed to send: {response.status_code}, {Pii(str(response.body))}"
712
+ f"Email failed to send: {response.status_code}, {str(response.body)}"
714
713
  )
715
- except Exception as e:
716
- logger.error("Email failed to send: {}", Pii(str(e)))
717
- raise MessageDispatchException(f"Email failed to send due to: {Pii(e)}")
714
+ except Exception as exc:
715
+ logger.error("Email failed to send: {}", str(exc))
716
+ raise MessageDispatchException(f"Email failed to send due to: {str(exc)}")
718
717
 
719
718
 
720
719
  def _twilio_sms_dispatcher(
@@ -753,9 +752,9 @@ def _twilio_sms_dispatcher(
753
752
  raise MessageDispatchException(
754
753
  "Message failed to send. Either sender phone number or messaging service sid must be provided."
755
754
  )
756
- except TwilioRestException as e:
757
- logger.error("Twilio SMS failed to send: {}", Pii(str(e)))
758
- raise MessageDispatchException(f"Twilio SMS failed to send due to: {Pii(e)}")
755
+ except TwilioRestException as exc:
756
+ logger.error("Twilio SMS failed to send: {}", str(exc))
757
+ raise MessageDispatchException(f"Twilio SMS failed to send due to: {str(exc)}")
759
758
 
760
759
 
761
760
  def _aws_ses_dispatcher(
@@ -769,9 +768,11 @@ def _aws_ses_dispatcher(
769
768
 
770
769
  try:
771
770
  aws_ses_serivce.send_email(to, message.subject, message.body)
772
- except Exception as e:
773
- logger.error("Email failed to send: {}", Pii(str(e)))
774
- raise MessageDispatchException(f"AWS SES email failed to send due to: {Pii(e)}")
771
+ except Exception as exc:
772
+ logger.error("Email failed to send: {}", str(exc))
773
+ raise MessageDispatchException(
774
+ f"AWS SES email failed to send due to: {str(exc)}"
775
+ )
775
776
 
776
777
 
777
778
  def _get_template_id_if_exists(
@@ -25,7 +25,7 @@ from fides.api.schemas.messaging.messaging import (
25
25
 
26
26
  def update_messaging_config(
27
27
  db: Session, key: FidesKey, config: MessagingConfigRequest
28
- ) -> MessagingConfigResponse:
28
+ ) -> MessagingConfig:
29
29
  existing_config_with_key: Optional[MessagingConfig] = MessagingConfig.get_by(
30
30
  db=db, field="key", value=key
31
31
  )
@@ -38,7 +38,7 @@ def update_messaging_config(
38
38
 
39
39
  def create_or_update_messaging_config(
40
40
  db: Session, config: MessagingConfigRequest
41
- ) -> MessagingConfigResponse:
41
+ ) -> MessagingConfig:
42
42
  data = {
43
43
  "key": config.key,
44
44
  "name": config.name,
@@ -46,16 +46,10 @@ def create_or_update_messaging_config(
46
46
  }
47
47
  if config.details:
48
48
  data["details"] = config.details.__dict__ # type: ignore
49
- messaging_config: MessagingConfig = MessagingConfig.create_or_update(
49
+ return MessagingConfig.create_or_update(
50
50
  db=db,
51
51
  data=data,
52
52
  )
53
- return MessagingConfigResponse(
54
- name=messaging_config.name,
55
- key=messaging_config.key,
56
- service_type=messaging_config.service_type.value, # type: ignore
57
- details=messaging_config.details,
58
- )
59
53
 
60
54
 
61
55
  def delete_messaging_config(db: Session, key: FidesKey) -> None:
@@ -84,6 +78,8 @@ def get_messaging_config_by_key(db: Session, key: FidesKey) -> MessagingConfigRe
84
78
  key=config.key,
85
79
  service_type=config.service_type.value, # type: ignore[attr-defined]
86
80
  details=config.details,
81
+ last_test_timestamp=config.last_test_timestamp,
82
+ last_test_succeeded=config.last_test_succeeded,
87
83
  )
88
84
 
89
85