ethyca-fides 2.64.6b1__py2.py3-none-any.whl → 2.65.0rc0__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 (220) hide show
  1. {ethyca_fides-2.64.6b1.dist-info → ethyca_fides-2.65.0rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.64.6b1.dist-info → ethyca_fides-2.65.0rc0.dist-info}/RECORD +213 -211
  3. fides/_version.py +3 -3
  4. fides/api/email_templates/get_email_template.py +4 -1
  5. fides/api/email_templates/template_names.py +1 -0
  6. fides/api/email_templates/templates/external_user_welcome.html +23 -0
  7. fides/api/models/fides_user_respondent_email_verification.py +3 -3
  8. fides/api/schemas/messaging/messaging.py +14 -0
  9. fides/api/schemas/saas/strategy_configuration.py +6 -0
  10. fides/api/service/connectors/saas_connector.py +35 -1
  11. fides/api/service/execution_context.py +59 -0
  12. fides/api/service/messaging/message_dispatch_service.py +33 -1
  13. fides/api/service/processors/post_processor_strategy/__init__.py +1 -0
  14. fides/api/service/processors/post_processor_strategy/post_processor_strategy.py +11 -1
  15. fides/api/service/processors/post_processor_strategy/post_processor_strategy_extract_for_execution_log.py +73 -0
  16. fides/api/service/processors/post_processor_strategy/post_processor_strategy_factory.py +4 -0
  17. fides/api/service/processors/post_processor_strategy/post_processor_strategy_filter.py +2 -0
  18. fides/api/service/processors/post_processor_strategy/post_processor_strategy_unwrap.py +2 -0
  19. fides/api/task/graph_task.py +38 -18
  20. fides/ui-build/static/admin/404.html +1 -1
  21. fides/ui-build/static/admin/_next/static/Wj1CQlHGEpFOn5fep_U4z/_buildManifest.js +1 -0
  22. fides/ui-build/static/admin/_next/static/chunks/{1040-d246ed641088a416.js → 1040-63c82622e8aee766.js} +1 -1
  23. fides/ui-build/static/admin/_next/static/chunks/{1169-ae67fde0c6d69abc.js → 1169-60d4b584fde8ce55.js} +1 -1
  24. fides/ui-build/static/admin/_next/static/chunks/{1817-60f08a3619b9139c.js → 1817-d6531612cc594bf1.js} +1 -1
  25. fides/ui-build/static/admin/_next/static/chunks/{2921-85515257dd94ef4d.js → 2921-39af9657977fa42c.js} +1 -1
  26. fides/ui-build/static/admin/_next/static/chunks/{3450-4e472b9e2754fa47.js → 3450-1088b1f14a3dc618.js} +1 -1
  27. fides/ui-build/static/admin/_next/static/chunks/{3855-2d045674fbf72a3c.js → 3855-abbb601a0115e0e2.js} +1 -1
  28. fides/ui-build/static/admin/_next/static/chunks/{3872-056ddf3ed9d10b51.js → 3872-dc8084d7df0f12e5.js} +1 -1
  29. fides/ui-build/static/admin/_next/static/chunks/{3923-257df982a95371b5.js → 3923-da789f963d161387.js} +1 -1
  30. fides/ui-build/static/admin/_next/static/chunks/{401-3f2160e3910d075b.js → 401-54fe500e30c5ea66.js} +1 -1
  31. fides/ui-build/static/admin/_next/static/chunks/{409-3e2248a63dd60e58.js → 409-7c75e7a5cd4251a2.js} +1 -1
  32. fides/ui-build/static/admin/_next/static/chunks/{4121-10bfa009892586fa.js → 4121-a3935e484614d586.js} +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/{4230-38c6e446801a8729.js → 4230-aeff8d542b494207.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/{431-13b0ef67d5a3df2f.js → 431-cc1200b1bec1e1ad.js} +1 -1
  35. fides/ui-build/static/admin/_next/static/chunks/{5309-fd8cd5aedd45f7c1.js → 5309-a7b637d2e3830582.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/{5574-028ef28c3cf16995.js → 5574-1eb6600d144c90d7.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{6084-fa1c82d03f6c256a.js → 6084-a596a272a2cc1c93.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/{6662-d8ae12f69d325004.js → 6662-29c0da492e0686a5.js} +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/{6853-2644f28976b46c25.js → 6853-7abe83702dff33b3.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/{6882-ea071425d25dd2b0.js → 6882-306b98265a440778.js} +1 -1
  41. fides/ui-build/static/admin/_next/static/chunks/{6954-bb360fb60aac9440.js → 6954-0294aa483799cd3a.js} +1 -1
  42. fides/ui-build/static/admin/_next/static/chunks/{7476-7073ec015f84a3e0.js → 7476-c3951a31cc8e30f4.js} +1 -1
  43. fides/ui-build/static/admin/_next/static/chunks/{7630-302a13c63f9bfb45.js → 7630-4797e955264ba37b.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{787-b393c03ade9d93dc.js → 787-8c3cff5b5504bbfc.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{79-b67ba449b0f2cc9c.js → 79-acd3fc646456c35c.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{796-b7608f09607288b8.js → 796-231bc790c78485ec.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/{9046-ece5efe762b810cb.js → 9046-e28291074efc2b9c.js} +1 -1
  48. fides/ui-build/static/admin/_next/static/chunks/{9226-c9111590692341b1.js → 9226-e1ab0a8311cfcef5.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/{9392.9a948112de74781b.js → 9392.bb5a989efef5b329.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/{9676.cc515c853b8cf578.js → 9676.549c72c3eb3df912.js} +1 -1
  51. fides/ui-build/static/admin/_next/static/chunks/{9767-277a0229aae7662a.js → 9767-5700ef84bfa4689a.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/{9826-82c473dcaf892d00.js → 9826-a7302c609a0ae585.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/{9951-dbd76d7f3a7f1b9a.js → 9951-81e6a96c892bce10.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/pages/{404-ef01376efb8427e1.js → 404-136cdc66cc546bf9.js} +1 -1
  55. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-7430e1499432b029.js → _app-3c2c13846cf0246c.js} +54 -54
  56. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-4057c399f58d331e.js → manual-ec060a0c3e154265.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-2726ca51f0327347.js → multiple-1115a66a27198dd2.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-a2457d5da25aa854.js → add-systems-e857d1d6fa43adb9.js} +1 -1
  59. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-9fe46ed10a7e7a1a.js → add-vendors-01a209a73ca6db10.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-095828301f22cdaa.js → configure-0bafadd4832888a2.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-de60a5b74f6b20ff.js → [id]-419ce6a7f72b10b1.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-1ee05fd0bc012ec6.js → privacy-experience-2733b87269ad53d6.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5a2e61c7d88bdda1.js → [id]-caa7ecb68d6b5c77.js} +1 -1
  64. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-1bc69669215fa55c.js → new-767c51405b61ad4e.js} +1 -1
  65. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-fa8394d2e1072aba.js → privacy-notices-61625c45fdcf931f.js} +1 -1
  66. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-213c5405e9e4219c.js → properties-ae989bd5c2b202f9.js} +1 -1
  67. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-44aa77149d71a6fe.js → reporting-60272475cb0770fc.js} +1 -1
  68. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-23ab7bd613a0ad53.js → consent-4d2df7770ab3c3c8.js} +1 -1
  69. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-dae11464a091537f.js → [projectUrn]-0b3847fe39d90f6d.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-7442023478422295.js → projects-12f7220f0ef3a50c.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-5597d2e691313bb0.js → data-catalog-de21ee9984a0e989.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/{[systemId]-da06d05d255d0cd0.js → [systemId]-4b1956ba13d00d12.js} +1 -1
  73. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-895591fe32af0f4c.js → [monitorId]-0d09001cbefac14b.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-a932a39e29ac3489.js → action-center-743321764a03e68d.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-2cfdf4d55a7594ba.js → activity-741553e7f5e5dad3.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-07881d1a5fc03d41.js → datamap-286a2f95a62eaa92.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-57be9d40c67b0acb.js → [...subfieldNames]-1574f9f99f3fbd4d.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-bd78d6c6264e2467.js → [collectionName]-7137e44d09c4e66f.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-3c9103487b55e76f.js → [datasetId]-4523752f57210b05.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-e30a546a8cfb6658.js → new-5b58be23debaaecc.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-500610c0b60f9e7e.js → dataset-d1191d3fbb953e64.js} +1 -1
  82. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-34958fe8183d9479.js → [id]-8adf2e814c3b9e0d.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-761294dbaf59bbe1.js → new-e648583cdd77269f.js} +1 -1
  84. fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-59abd36059863e05.js → datastore-connection-b15447b9e74cd9ca.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/{index-ae100a873eb66d59.js → index-215da7ae60a37272.js} +1 -1
  86. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-c7355ec8b1375390.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-2f51dd2ebc800c0d.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-2aada2c7b9156053.js → [id]-4b9ab7dc0267f8a8.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-fbb7b0c43dedf072.js → add-template-80b95a87ca4a9a0e.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-7230d7ee21368cef.js → messaging-40fa5eff36a01f41.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-7c234412502f8102.js → ant-components-6e551f937e1b70f3.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-72791aab60f3a4bf.js → AntForm-49eb4b84e5f07ead.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-da7d11d6146fa746.js → FormikAntFormItem-0c523d8323b900a8.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-3045d24344e99017.js → FormikControlled-3bf5a95f470f351b.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-5b5b165d3f41a1de.js → FormikField-2056140039ebb8dd.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-3afd8b6ba6234366.js → forms-641937410482819f.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-52d50286216bcb8c.js → table-migration-00d2be9ac59028cf.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-2f2410cdb2f2a918.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-535b6e5003d892eb.js → messaging-d31a1d8f3c573023.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-7ded688a1e832c63.js → storage-f3ec1a691bb7a6b6.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-08e0863d432b3348.js → configure-623420abd445b87d.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-d731dd036a0eb44d.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-b8dcb1f5213521ef.js → [id]-202ba739110fbcc5.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-7d8418bb7cb9e1fd.js → add-property-51fc662b550db919.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-537003822f360ae7.js → properties-95f73dad295c22c9.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-ac25749935da453b.js → datamap-d9b31c6172f67b4c.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-647d59bb0aa060bf.js → alpha-1d96cc94c9f9d57a.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-73adc03fe0182e3f.js → about-0102ed2e53aac3f8.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-ffa9e9e79ad75828.js → [purpose_id]-492682d276a487c3.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-4fb6c8c4bd9cdb3f.js → consent-dbef1e775cae0b4b.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-94c1b7bfc6cec4d2.js → custom-fields-1a7786045d55904c.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-e9838b8e49e64e57.js → domain-records-c62f0e6538a0f14f.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-0de16778ad2f8865.js → domains-f3ccf59e0cef58c6.js} +1 -1
  114. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-aac71677024210ad.js → email-templates-efdf18eadaf4e6df.js} +1 -1
  115. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-f43e238571b21643.js → locations-c5fdc67504da5d52.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-f5e0a34f6ae473ad.js → organization-d57f3e3a1926ec3c.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-05d3c86ca3ca4d5d.js → regulations-a92d6a45948774a4.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-31fcf7b52d8028b0.js → test-datasets-f2749e3deaf2de1b.js} +1 -1
  119. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6db01a1afe2f82d5.js → [id]-5750b7b195f4e050.js} +1 -1
  120. fides/ui-build/static/admin/_next/static/chunks/pages/{systems-8ec7472a7032301f.js → systems-f23101c2c99a9abf.js} +1 -1
  121. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-84caae0fc02f8ae1.js → taxonomy-40bdf2e4c0a6a6d5.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-e452541827698b1f.js → [id]-c9ea4777da2b9148.js} +1 -1
  123. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-530be849391d2425.js → user-management-542d299555665262.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/{webpack-e25ccaae1ef867a2.js → webpack-933716e3b2904850.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/css/5f8af79f94072e0f.css +1 -0
  126. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  127. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  128. fides/ui-build/static/admin/add-systems.html +1 -1
  129. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  130. fides/ui-build/static/admin/consent/configure.html +1 -1
  131. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  132. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  133. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  134. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  135. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  136. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  137. fides/ui-build/static/admin/consent/properties.html +1 -1
  138. fides/ui-build/static/admin/consent/reporting.html +1 -1
  139. fides/ui-build/static/admin/consent.html +1 -1
  140. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  141. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  142. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  143. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  144. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  145. fides/ui-build/static/admin/data-catalog.html +1 -1
  146. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  147. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  148. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  149. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  150. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  151. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  152. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  153. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  154. fides/ui-build/static/admin/datamap.html +1 -1
  155. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  156. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  157. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  158. fides/ui-build/static/admin/dataset/new.html +1 -1
  159. fides/ui-build/static/admin/dataset.html +1 -1
  160. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  161. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  162. fides/ui-build/static/admin/datastore-connection.html +1 -1
  163. fides/ui-build/static/admin/index.html +1 -1
  164. fides/ui-build/static/admin/integrations/[id].html +1 -1
  165. fides/ui-build/static/admin/integrations.html +1 -1
  166. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  167. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  168. fides/ui-build/static/admin/lib/fides.js +3 -3
  169. fides/ui-build/static/admin/login/[provider].html +1 -1
  170. fides/ui-build/static/admin/login.html +1 -1
  171. fides/ui-build/static/admin/messaging/[id].html +1 -1
  172. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  173. fides/ui-build/static/admin/messaging.html +1 -1
  174. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  175. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  176. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  177. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  178. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  179. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  180. fides/ui-build/static/admin/poc/forms.html +1 -1
  181. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  182. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  183. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  184. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  185. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  186. fides/ui-build/static/admin/privacy-requests.html +1 -1
  187. fides/ui-build/static/admin/properties/[id].html +1 -1
  188. fides/ui-build/static/admin/properties/add-property.html +1 -1
  189. fides/ui-build/static/admin/properties.html +1 -1
  190. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  191. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  192. fides/ui-build/static/admin/settings/about.html +1 -1
  193. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  194. fides/ui-build/static/admin/settings/consent.html +1 -1
  195. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  196. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  197. fides/ui-build/static/admin/settings/domains.html +1 -1
  198. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  199. fides/ui-build/static/admin/settings/locations.html +1 -1
  200. fides/ui-build/static/admin/settings/organization.html +1 -1
  201. fides/ui-build/static/admin/settings/regulations.html +1 -1
  202. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  203. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  204. fides/ui-build/static/admin/systems.html +1 -1
  205. fides/ui-build/static/admin/taxonomy.html +1 -1
  206. fides/ui-build/static/admin/user-management/new.html +1 -1
  207. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  208. fides/ui-build/static/admin/user-management.html +1 -1
  209. fides/ui-build/static/admin/_next/static/chunks/827-c6fe34fb336467ae.js +0 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-8eee4d0314c83e50.js +0 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-bf3b87b0dd702551.js +0 -1
  212. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-00fb442c4adb7371.js +0 -1
  213. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-c8b02ae92dd7e45b.js +0 -1
  214. fides/ui-build/static/admin/_next/static/css/23391a3311f80cfe.css +0 -1
  215. fides/ui-build/static/admin/_next/static/z7GzAZhoGiO521zm7WPYX/_buildManifest.js +0 -1
  216. {ethyca_fides-2.64.6b1.dist-info → ethyca_fides-2.65.0rc0.dist-info}/WHEEL +0 -0
  217. {ethyca_fides-2.64.6b1.dist-info → ethyca_fides-2.65.0rc0.dist-info}/entry_points.txt +0 -0
  218. {ethyca_fides-2.64.6b1.dist-info → ethyca_fides-2.65.0rc0.dist-info}/licenses/LICENSE +0 -0
  219. {ethyca_fides-2.64.6b1.dist-info → ethyca_fides-2.65.0rc0.dist-info}/top_level.txt +0 -0
  220. /fides/ui-build/static/admin/_next/static/{z7GzAZhoGiO521zm7WPYX → Wj1CQlHGEpFOn5fep_U4z}/_ssgManifest.js +0 -0
fides/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-07-02T08:50:36-0700",
11
+ "date": "2025-07-02T16:48:58-0700",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "5b2b01716a352fdf042c622bf1b996a7490b400b",
15
- "version": "2.64.6b1"
14
+ "full-revisionid": "5d9522adf8b7c04bcf6cf1fcf664289b2e2d0498",
15
+ "version": "2.65.0rc0"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -8,6 +8,7 @@ from fides.api.email_templates.template_names import (
8
8
  CONSENT_REQUEST_EMAIL_FULFILLMENT,
9
9
  CONSENT_REQUEST_VERIFICATION_TEMPLATE,
10
10
  EMAIL_ERASURE_REQUEST_FULFILLMENT,
11
+ EXTERNAL_USER_WELCOME,
11
12
  PRIVACY_REQUEST_COMPLETE_ACCESS_TEMPLATE,
12
13
  PRIVACY_REQUEST_COMPLETE_DELETION_TEMPLATE,
13
14
  PRIVACY_REQUEST_ERROR_NOTIFICATION_TEMPLATE,
@@ -29,7 +30,7 @@ template_env = Environment(
29
30
  )
30
31
 
31
32
 
32
- def get_email_template( # pylint: disable=too-many-return-statements
33
+ def get_email_template( # pylint: disable=too-many-return-statements, too-many-branches
33
34
  action_type: MessagingActionType,
34
35
  ) -> Template:
35
36
  if action_type == MessagingActionType.CONSENT_REQUEST:
@@ -56,6 +57,8 @@ def get_email_template( # pylint: disable=too-many-return-statements
56
57
  return template_env.get_template(TEST_MESSAGE_TEMPLATE)
57
58
  if action_type == MessagingActionType.USER_INVITE:
58
59
  return template_env.get_template(USER_INVITE)
60
+ if action_type == MessagingActionType.EXTERNAL_USER_WELCOME:
61
+ return template_env.get_template(EXTERNAL_USER_WELCOME)
59
62
 
60
63
  logger.error("No corresponding template linked to the {}", action_type)
61
64
  raise EmailTemplateUnhandledActionType(
@@ -10,3 +10,4 @@ PRIVACY_REQUEST_REVIEW_DENY_TEMPLATE = "privacy_request_review_deny.html"
10
10
  PRIVACY_REQUEST_REVIEW_APPROVE_TEMPLATE = "privacy_request_review_approve.html"
11
11
  TEST_MESSAGE_TEMPLATE = "test_message.html"
12
12
  USER_INVITE = "user_invite.html"
13
+ EXTERNAL_USER_WELCOME = "external_user_welcome.html"
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Welcome to Privacy Center</title>
6
+ </head>
7
+ <body>
8
+ <main>
9
+ <p>Hello {{ display_name }},</p>
10
+
11
+ <p>An account has been created for you by the privacy team at {{ org_name }} so that you can assist them in responding to data subject requests, as required by the GDPR and many US state laws, for users that have data in your systems.</p>
12
+
13
+ <p>A portal is available to view and take action on these requests at: <a href="{{ portal_link }}">{{ portal_link }}</a>. Through this portal you can upload or provide user data for users who have requested a copy of their information and attest that users have been removed from your system in the case of an erasure request.</p>
14
+
15
+ <p>The provided link is valid for 30 days and you will be asked to verify your email address each time you access the portal.</p>
16
+
17
+ <p>If you have any questions, please reach out first to your contacts at: {{ org_name }}</p>
18
+
19
+ <p>Regards,<br/>
20
+ {{ org_name }} Privacy Team</p>
21
+ </main>
22
+ </body>
23
+ </html>
@@ -19,16 +19,16 @@ CONFIG = get_config()
19
19
  if TYPE_CHECKING:
20
20
  from fides.api.models.fides_user import FidesUser
21
21
 
22
- # Access links stay active for 45 days - the same as the DSR expiration. A new link is generated for each email.
22
+ # Access links stay active for 30 days for external login functionality. A new link is generated for each email.
23
23
  # The emails are created for new DSRs which are assigned to the respondent.
24
- ACCESS_LINK_TTL_DAYS = 45
24
+ ACCESS_LINK_TTL_DAYS = 30
25
25
 
26
26
 
27
27
  class FidesUserRespondentEmailVerification(Base, IdentityVerificationMixin):
28
28
  """Model for handling email verification for external respondents.
29
29
 
30
30
  This handles two types of verification:
31
- 1. Access links - long-lived (45 days) for initial access
31
+ 1. Access links - long-lived (30 days) for initial access
32
32
  2. Verification codes - short-lived (1 hour) for actual verification
33
33
 
34
34
  When an email is sent to an external respondent, a new verification is created with a new access token is created.
@@ -69,6 +69,7 @@ class MessagingActionType(str, Enum):
69
69
  PRIVACY_REQUEST_REVIEW_DENY = "privacy_request_review_deny"
70
70
  PRIVACY_REQUEST_REVIEW_APPROVE = "privacy_request_review_approve"
71
71
  USER_INVITE = "user_invite"
72
+ EXTERNAL_USER_WELCOME = "external_user_welcome"
72
73
  TEST_MESSAGE = "test_message"
73
74
 
74
75
 
@@ -182,6 +183,17 @@ class UserInviteBodyParams(BaseModel):
182
183
  invite_code: str
183
184
 
184
185
 
186
+ class ExternalUserWelcomeBodyParams(BaseModel):
187
+ """Body params required to send a welcome email to external users"""
188
+
189
+ username: str
190
+ first_name: Optional[str] = None
191
+ last_name: Optional[str] = None
192
+ privacy_center_url: str
193
+ access_token: str
194
+ org_name: str
195
+
196
+
185
197
  class FidesopsMessage(
186
198
  BaseModel,
187
199
  ):
@@ -198,6 +210,7 @@ class FidesopsMessage(
198
210
  ErasureRequestBodyParams,
199
211
  ErrorNotificationBodyParams,
200
212
  UserInviteBodyParams,
213
+ ExternalUserWelcomeBodyParams,
201
214
  ]
202
215
  ] = None
203
216
 
@@ -217,6 +230,7 @@ class FidesopsMessage(
217
230
  MessagingActionType.MESSAGE_ERASURE_REQUEST_FULFILLMENT: ErasureRequestBodyParams,
218
231
  MessagingActionType.PRIVACY_REQUEST_ERROR_NOTIFICATION: ErrorNotificationBodyParams,
219
232
  MessagingActionType.USER_INVITE: UserInviteBodyParams,
233
+ MessagingActionType.EXTERNAL_USER_WELCOME: ExternalUserWelcomeBodyParams,
220
234
  }
221
235
 
222
236
  valid_body_params = valid_body_params_for_action_type.get(
@@ -30,6 +30,12 @@ class FilterPostProcessorConfiguration(StrategyConfiguration):
30
30
  case_sensitive: bool = True
31
31
 
32
32
 
33
+ class ExtractForExecutionLogPostProcessorConfiguration(StrategyConfiguration):
34
+ """Configuration for extracting data from response body and adding to execution log messages"""
35
+
36
+ path: Optional[str] = None
37
+
38
+
33
39
  class OffsetPaginationConfiguration(StrategyConfiguration):
34
40
  """
35
41
  Increases the value of the query param `incremental_param` by the `increment_by` until the `limit` is hit
@@ -423,6 +423,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
423
423
  response_data,
424
424
  identity_data,
425
425
  cast(Optional[List[PostProcessorStrategy]], saas_request.postprocessors),
426
+ response,
426
427
  )
427
428
 
428
429
  logger.info(
@@ -456,6 +457,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
456
457
  response_data: Union[List[Dict[str, Any]], Dict[str, Any]],
457
458
  identity_data: Dict[str, Any],
458
459
  postprocessors: Optional[List[PostProcessorStrategy]],
460
+ response: Optional[Response] = None,
459
461
  ) -> List[Row]:
460
462
  """
461
463
  Runs the raw response through all available postprocessors for the request,
@@ -481,7 +483,9 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
481
483
  processed_data,
482
484
  identity_data,
483
485
  privacy_request,
486
+ response,
484
487
  )
488
+
485
489
  except Exception as exc:
486
490
  raise PostProcessingException(
487
491
  f"Exception occurred during the '{postprocessor.strategy}' postprocessor " # type: ignore
@@ -567,6 +571,7 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
567
571
  rows,
568
572
  privacy_request.get_cached_identity_data(),
569
573
  cast(Optional[List[PostProcessorStrategy]], masking_request.postprocessors),
574
+ None,
570
575
  )
571
576
 
572
577
  client = self.create_client()
@@ -584,9 +589,38 @@ class SaaSConnector(BaseConnector[AuthenticatedClient], Contextualizable):
584
589
  )
585
590
  continue
586
591
  raise exc
587
- client.send(prepared_request, masking_request.ignore_errors)
592
+ response = client.send(prepared_request, masking_request.ignore_errors)
588
593
  rows_updated += 1
589
594
 
595
+ # Run post-processors against the response from the masking request so that
596
+ # processors such as `extract_for_execution_log` can inspect the API
597
+ # response body (e.g. confirmation, ticket IDs, etc.). We ignore the
598
+ # returned rows because masking responses are not used downstream.
599
+ try:
600
+ handled_response = self._handle_errored_response(
601
+ masking_request, response
602
+ )
603
+ response_data = self._unwrap_response_data(
604
+ masking_request, handled_response
605
+ )
606
+
607
+ self.process_response_data(
608
+ response_data,
609
+ privacy_request.get_cached_identity_data(),
610
+ cast(
611
+ Optional[List[PostProcessorStrategy]],
612
+ masking_request.postprocessors,
613
+ ),
614
+ handled_response,
615
+ )
616
+ except Exception as exc: # pylint: disable=broad-except
617
+ # We do not want a post-processing failure to prevent the masking
618
+ # operation itself from succeeding.
619
+ logger.warning(
620
+ "Post-processing of masking request response failed: {}",
621
+ exc,
622
+ )
623
+
590
624
  self.unset_connector_state()
591
625
 
592
626
  awaiting_async_callback: bool = bool(
@@ -0,0 +1,59 @@
1
+ """
2
+ Execution context for collecting log messages during privacy request processing.
3
+
4
+ Uses Python's contextvars for thread-safe, execution-scoped message collection.
5
+ """
6
+
7
+ import contextvars
8
+ from contextlib import contextmanager
9
+ from typing import Generator, List, Optional
10
+
11
+ from loguru import logger
12
+
13
+ # Context variable for current execution messages
14
+ _execution_messages: contextvars.ContextVar[Optional[List[str]]] = (
15
+ contextvars.ContextVar("execution_messages")
16
+ )
17
+
18
+
19
+ @contextmanager
20
+ def collect_execution_log_messages() -> Generator[List[str], None, None]:
21
+ """
22
+ Context manager for collecting execution log messages.
23
+
24
+ Usage:
25
+ with collect_execution_log_messages() as messages:
26
+ # ... do work that calls add_execution_log_message()
27
+ pass
28
+ # messages now contains all collected messages
29
+
30
+ Returns:
31
+ List[str]: Messages collected during execution
32
+ """
33
+ messages: List[str] = []
34
+ token = _execution_messages.set(messages)
35
+ try:
36
+ yield messages
37
+ finally:
38
+ _execution_messages.reset(token)
39
+
40
+
41
+ def add_execution_log_message(message: str) -> None:
42
+ """Add a message to the current execution context"""
43
+ try:
44
+ messages = _execution_messages.get()
45
+ if messages is not None and message.strip():
46
+ messages.append(message.strip())
47
+ except LookupError:
48
+ logger.error(
49
+ f"Attempted to call add_execution_log_message outside of execution context, unable to add message: {message}"
50
+ )
51
+
52
+
53
+ def get_execution_log_messages() -> List[str]:
54
+ """Get messages from current execution context (for testing/debugging)"""
55
+ try:
56
+ messages = _execution_messages.get()
57
+ return messages.copy() if messages is not None else []
58
+ except LookupError:
59
+ return []
@@ -26,6 +26,7 @@ from fides.api.schemas.messaging.messaging import (
26
26
  EmailForActionType,
27
27
  ErasureRequestBodyParams,
28
28
  ErrorNotificationBodyParams,
29
+ ExternalUserWelcomeBodyParams,
29
30
  FidesopsMessage,
30
31
  MessagingActionType,
31
32
  MessagingMethod,
@@ -176,6 +177,7 @@ def dispatch_message(
176
177
  ErasureRequestBodyParams,
177
178
  UserInviteBodyParams,
178
179
  ErrorNotificationBodyParams,
180
+ ExternalUserWelcomeBodyParams,
179
181
  ]
180
182
  ] = None,
181
183
  subject_override: Optional[str] = None,
@@ -351,7 +353,7 @@ def _render(template_str: str, variables: Optional[Dict] = None) -> str:
351
353
  return template_str
352
354
 
353
355
 
354
- def _build_email( # pylint: disable=too-many-return-statements
356
+ def _build_email( # pylint: disable=too-many-return-statements, too-many-branches
355
357
  config_proxy: ConfigProxy,
356
358
  action_type: MessagingActionType,
357
359
  body_params: Any,
@@ -463,6 +465,36 @@ def _build_email( # pylint: disable=too-many-return-statements
463
465
  }
464
466
  ),
465
467
  )
468
+ if action_type == MessagingActionType.EXTERNAL_USER_WELCOME:
469
+ base_template = get_email_template(action_type)
470
+ # Generate display name for personalization
471
+ display_name = body_params.username
472
+ if body_params.first_name:
473
+ display_name = body_params.first_name
474
+ if body_params.last_name:
475
+ display_name = f"{body_params.first_name} {body_params.last_name}"
476
+
477
+ portal_link = (
478
+ f"{body_params.privacy_center_url}?access_token={body_params.access_token}"
479
+ )
480
+
481
+ variables = {
482
+ "username": body_params.username,
483
+ "display_name": display_name,
484
+ "first_name": body_params.first_name,
485
+ "last_name": body_params.last_name,
486
+ "org_name": body_params.org_name,
487
+ "portal_link": portal_link,
488
+ "privacy_center_url": body_params.privacy_center_url,
489
+ "access_token": body_params.access_token,
490
+ }
491
+
492
+ return EmailForActionType(
493
+ subject="Welcome to our Privacy Center",
494
+ body=base_template.render(variables),
495
+ template_variables=variables,
496
+ )
497
+
466
498
  logger.error("Message action type {} is not implemented", action_type)
467
499
  raise MessageDispatchException(
468
500
  f"Message action type {action_type} is not implemented"
@@ -1,4 +1,5 @@
1
1
  from fides.api.service.processors.post_processor_strategy import (
2
+ post_processor_strategy_extract_for_execution_log,
2
3
  post_processor_strategy_filter,
3
4
  post_processor_strategy_unwrap,
4
5
  )
@@ -1,6 +1,8 @@
1
1
  from abc import abstractmethod
2
2
  from typing import Any, Dict, List, Optional, Union
3
3
 
4
+ from requests import Response
5
+
4
6
  from fides.api.models.privacy_request import PrivacyRequest
5
7
  from fides.api.service.strategy import Strategy
6
8
 
@@ -14,5 +16,13 @@ class PostProcessorStrategy(Strategy):
14
16
  data: Any,
15
17
  identity_data: Optional[Dict[str, Any]] = None,
16
18
  privacy_request: Optional[PrivacyRequest] = None,
19
+ response: Optional[Response] = None,
17
20
  ) -> Union[List[Dict[str, Any]], Dict[str, Any]]:
18
- """Process data from SaaS connector"""
21
+ """Process data from SaaS connector
22
+
23
+ Args:
24
+ data: The response data (potentially unwrapped/processed)
25
+ identity_data: Cached identity data for the request
26
+ privacy_request: The privacy request object
27
+ response: The raw HTTP response object (includes headers, status, etc.)
28
+ """
@@ -0,0 +1,73 @@
1
+ from typing import Any, Dict, List, Optional, Union
2
+
3
+ import pydash
4
+ from loguru import logger
5
+ from requests import Response
6
+
7
+ from fides.api.models.privacy_request import PrivacyRequest
8
+ from fides.api.schemas.saas.strategy_configuration import (
9
+ ExtractForExecutionLogPostProcessorConfiguration,
10
+ )
11
+ from fides.api.service.execution_context import add_execution_log_message
12
+ from fides.api.service.processors.post_processor_strategy.post_processor_strategy import (
13
+ PostProcessorStrategy,
14
+ )
15
+
16
+
17
+ class ExtractForExecutionLogPostProcessorStrategy(PostProcessorStrategy):
18
+ """Postprocessor that extracts data from API response contents and adds it to execution log messages"""
19
+
20
+ name = "extract_for_execution_log"
21
+ configuration_model = ExtractForExecutionLogPostProcessorConfiguration
22
+
23
+ def __init__(self, configuration: ExtractForExecutionLogPostProcessorConfiguration):
24
+ self.configuration = configuration
25
+
26
+ def process(
27
+ self,
28
+ data: Union[List[Dict[str, Any]], Dict[str, Any]],
29
+ identity_data: Optional[Dict[str, Any]] = None,
30
+ privacy_request: Optional[PrivacyRequest] = None,
31
+ response: Optional[Response] = None,
32
+ ) -> Union[List[Dict[str, Any]], Dict[str, Any]]:
33
+ """
34
+ Extract data from response contents and add to execution log messages.
35
+ Data is passed through unchanged (non-destructive postprocessor).
36
+ """
37
+ config = self.configuration
38
+
39
+ try:
40
+ # Only process if response.contents is available
41
+ if response is None or not response.content:
42
+ return data
43
+
44
+ if config.path is None:
45
+ # No path specified - use entire response contents as string
46
+ message = str(response.content)
47
+ else:
48
+ # Attempt to parse the response content as JSON before extracting
49
+ try:
50
+ json_data: Any = response.json()
51
+ except ValueError:
52
+ logger.debug(
53
+ "Unable to parse response content as JSON for path extraction"
54
+ )
55
+ return data
56
+
57
+ extracted_value = pydash.get(json_data, config.path)
58
+ if extracted_value is None:
59
+ logger.debug(f"No data found at path '{config.path}'")
60
+ return data
61
+
62
+ message = str(extracted_value)
63
+
64
+ # Add message to execution context
65
+ add_execution_log_message(message)
66
+ logger.info(message)
67
+
68
+ except Exception as e:
69
+ error_msg = f"Error in extract_for_execution_log postprocessor: {e}"
70
+ logger.error(error_msg)
71
+ add_execution_log_message(error_msg)
72
+
73
+ return data
@@ -9,6 +9,9 @@ from fides.api.schemas.saas.strategy_configuration import StrategyConfiguration
9
9
  from fides.api.service.processors.post_processor_strategy.post_processor_strategy import (
10
10
  PostProcessorStrategy,
11
11
  )
12
+ from fides.api.service.processors.post_processor_strategy.post_processor_strategy_extract_for_execution_log import (
13
+ ExtractForExecutionLogPostProcessorStrategy,
14
+ )
12
15
  from fides.api.service.processors.post_processor_strategy.post_processor_strategy_filter import (
13
16
  FilterPostProcessorStrategy,
14
17
  )
@@ -24,6 +27,7 @@ class SupportedPostProcessorStrategies(Enum):
24
27
 
25
28
  unwrap = UnwrapPostProcessorStrategy
26
29
  filter = FilterPostProcessorStrategy
30
+ extract_for_execution_log = ExtractForExecutionLogPostProcessorStrategy
27
31
 
28
32
  @classmethod
29
33
  def __contains__(cls, item: str) -> bool:
@@ -2,6 +2,7 @@ from typing import Any, Dict, List, Optional, Union
2
2
 
3
3
  import pydash
4
4
  from loguru import logger
5
+ from requests import Response
5
6
 
6
7
  from fides.api.common_exceptions import FidesopsException
7
8
  from fides.api.models.privacy_request import PrivacyRequest
@@ -54,6 +55,7 @@ class FilterPostProcessorStrategy(PostProcessorStrategy):
54
55
  data: Union[List[Dict[str, Any]], Dict[str, Any]],
55
56
  identity_data: Optional[Dict[str, Any]] = None,
56
57
  privacy_request: Optional[PrivacyRequest] = None,
58
+ response: Optional[Response] = None,
57
59
  ) -> Union[List[Dict[str, Any]], Dict[str, Any]]:
58
60
  """
59
61
  - data: A list or a dict
@@ -2,6 +2,7 @@ from typing import Any, Dict, List, Optional, Union
2
2
 
3
3
  import pydash
4
4
  from loguru import logger
5
+ from requests import Response
5
6
 
6
7
  from fides.api.models.privacy_request import PrivacyRequest
7
8
  from fides.api.schemas.saas.strategy_configuration import (
@@ -44,6 +45,7 @@ class UnwrapPostProcessorStrategy(PostProcessorStrategy):
44
45
  data: Union[List[Dict[str, Any]], Dict[str, Any]],
45
46
  identity_data: Optional[Dict[str, Any]] = None,
46
47
  privacy_request: Optional[PrivacyRequest] = None,
48
+ response: Optional[Response] = None,
47
49
  ) -> Union[List[Dict[str, Any]], Dict[str, Any]]:
48
50
  """
49
51
  :param data: A list or dict
@@ -42,6 +42,7 @@ from fides.api.models.privacy_request import ExecutionLog, PrivacyRequest, Reque
42
42
  from fides.api.models.worker_task import ExecutionLogStatus
43
43
  from fides.api.schemas.policy import ActionType, CurrentStep
44
44
  from fides.api.service.connectors.base_connector import BaseConnector
45
+ from fides.api.service.execution_context import collect_execution_log_messages
45
46
  from fides.api.task.consolidate_query_matches import consolidate_query_matches
46
47
  from fides.api.task.filter_element_match import filter_element_match
47
48
  from fides.api.task.refine_target_path import FieldPathNodeInput
@@ -419,7 +420,7 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
419
420
  self,
420
421
  action_type: ActionType,
421
422
  ex: Optional[BaseException] = None,
422
- success_override_msg: Optional[BaseException] = None,
423
+ success_override_msg: Optional[str] = None,
423
424
  ) -> None:
424
425
  """On completion activities"""
425
426
  if ex:
@@ -615,19 +616,29 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
615
616
  formatted_input_data: NodeInput = self.pre_process_input_data(
616
617
  *inputs, group_dependent_fields=True
617
618
  )
618
- output: List[Row] = self.connector.retrieve_data(
619
- self.execution_node,
620
- self.resources.policy,
621
- self.resources.request,
622
- self.resources.privacy_request_task,
623
- formatted_input_data,
624
- )
619
+
620
+ # Use execution context to capture postprocessor messages
621
+ with collect_execution_log_messages() as messages:
622
+ output: List[Row] = self.connector.retrieve_data(
623
+ self.execution_node,
624
+ self.resources.policy,
625
+ self.resources.request,
626
+ self.resources.privacy_request_task,
627
+ formatted_input_data,
628
+ )
629
+
625
630
  filtered_output: List[Row] = self.access_results_post_processing(
626
631
  self.pre_process_input_data(*inputs, group_dependent_fields=False),
627
632
  output,
628
633
  )
629
- self.log_end(ActionType.access)
630
- return filtered_output
634
+
635
+ # Include postprocessor messages in success message if available
636
+ success_message = None
637
+ if messages:
638
+ success_message = "\n".join(messages)
639
+
640
+ self.log_end(ActionType.access, success_override_msg=success_message)
641
+ return filtered_output
631
642
 
632
643
  @retry(action_type=ActionType.erasure, default_return=0)
633
644
  def erasure_request(
@@ -683,13 +694,16 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
683
694
  )
684
695
  return 0
685
696
 
686
- output = self.connector.mask_data(
687
- self.execution_node,
688
- self.resources.policy,
689
- self.resources.request,
690
- self.resources.privacy_request_task,
691
- retrieved_data,
692
- )
697
+ # Use execution context to capture postprocessor messages
698
+ with collect_execution_log_messages() as messages:
699
+ output = self.connector.mask_data(
700
+ self.execution_node,
701
+ self.resources.policy,
702
+ self.resources.request,
703
+ self.resources.privacy_request_task,
704
+ retrieved_data,
705
+ )
706
+
693
707
  if self.request_task.id:
694
708
  # For DSR 3.0, largely for testing. DSR 3.0 uses Request Task status
695
709
  # instead of presence of cached erasure data to know if we should rerun a node
@@ -700,7 +714,13 @@ class GraphTask(ABC): # pylint: disable=too-many-instance-attributes
700
714
  self.resources.cache_erasure(
701
715
  self.key.value, output
702
716
  ) # Cache that the erasure was performed in case we need to restart
703
- self.log_end(ActionType.erasure)
717
+
718
+ # Include postprocessor messages in success message if available
719
+ success_message = None
720
+ if messages:
721
+ success_message = "\n".join(messages)
722
+
723
+ self.log_end(ActionType.erasure, success_override_msg=success_message)
704
724
  return output
705
725
 
706
726
  @retry(action_type=ActionType.consent, default_return=False)
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/23391a3311f80cfe.css" as="style"/><link rel="stylesheet" href="/_next/static/css/23391a3311f80cfe.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-e25ccaae1ef867a2.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7430e1499432b029.js" defer=""></script><script src="/_next/static/chunks/pages/404-ef01376efb8427e1.js" defer=""></script><script src="/_next/static/z7GzAZhoGiO521zm7WPYX/_buildManifest.js" defer=""></script><script src="/_next/static/z7GzAZhoGiO521zm7WPYX/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"z7GzAZhoGiO521zm7WPYX","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/5f8af79f94072e0f.css" as="style"/><link rel="stylesheet" href="/_next/static/css/5f8af79f94072e0f.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-933716e3b2904850.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-3c2c13846cf0246c.js" defer=""></script><script src="/_next/static/chunks/pages/404-136cdc66cc546bf9.js" defer=""></script><script src="/_next/static/Wj1CQlHGEpFOn5fep_U4z/_buildManifest.js" defer=""></script><script src="/_next/static/Wj1CQlHGEpFOn5fep_U4z/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"Wj1CQlHGEpFOn5fep_U4z","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST=function(s,e,t,a,c,n,i,d,o,r,p,u,g,f,m,j,b,k,h,y,l,v,I,F,x,_,U,w,q,N,A,S,B,C,z,D,E,L,M,T,P,G,H,J,K,O){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":[l,"static/chunks/pages/index-215da7ae60a37272.js"],"/404":["static/chunks/pages/404-136cdc66cc546bf9.js"],"/_error":["static/chunks/pages/_error-bede3a8288930dcf.js"],"/add-systems":[l,"static/chunks/pages/add-systems-e857d1d6fa43adb9.js"],"/add-systems/manual":[s,e,t,c,p,a,i,u,j,v,I,"static/chunks/pages/add-systems/manual-ec060a0c3e154265.js"],"/add-systems/multiple":[i,g,F,"static/chunks/pages/add-systems/multiple-1115a66a27198dd2.js"],"/consent":["static/chunks/pages/consent-4d2df7770ab3c3c8.js"],"/consent/configure":[i,g,"static/chunks/pages/consent/configure-0bafadd4832888a2.js"],"/consent/configure/add-vendors":[i,g,F,"static/chunks/pages/consent/configure/add-vendors-01a209a73ca6db10.js"],"/consent/privacy-experience":[p,x,"static/chunks/pages/consent/privacy-experience-2733b87269ad53d6.js"],"/consent/privacy-experience/new":[s,e,d,_,f,U,"static/chunks/pages/consent/privacy-experience/new-06bb3b0bf097fcdb.js"],"/consent/privacy-experience/[id]":[s,e,d,_,f,U,"static/chunks/pages/consent/privacy-experience/[id]-419ce6a7f72b10b1.js"],"/consent/privacy-notices":[x,"static/chunks/pages/consent/privacy-notices-61625c45fdcf931f.js"],"/consent/privacy-notices/new":[s,e,d,w,f,q,"static/chunks/pages/consent/privacy-notices/new-767c51405b61ad4e.js"],"/consent/privacy-notices/[id]":[s,e,d,w,f,q,"static/chunks/pages/consent/privacy-notices/[id]-caa7ecb68d6b5c77.js"],"/consent/properties":[N,"static/chunks/pages/consent/properties-ae989bd5c2b202f9.js"],"/consent/reporting":[s,"static/chunks/pages/consent/reporting-60272475cb0770fc.js"],"/data-catalog":[s,e,t,a,"static/css/95ac327e5d70148d.css","static/chunks/pages/data-catalog-de21ee9984a0e989.js"],"/data-catalog/[systemId]/projects":[s,e,t,a,b,n,"static/chunks/pages/data-catalog/[systemId]/projects-12f7220f0ef3a50c.js"],"/data-catalog/[systemId]/projects/[projectUrn]":[A,"static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-0b3847fe39d90f6d.js"],"/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]":[s,e,t,a,b,S,n,"static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]-11d52f1570759c4d.js"],"/data-catalog/[systemId]/resources":[A,"static/chunks/pages/data-catalog/[systemId]/resources-d8db234a44a2ddf4.js"],"/data-catalog/[systemId]/resources/[resourceUrn]":[s,e,t,a,b,S,n,"static/chunks/pages/data-catalog/[systemId]/resources/[resourceUrn]-b83afa5565d0c84e.js"],"/data-discovery/action-center":["static/chunks/pages/data-discovery/action-center-743321764a03e68d.js"],"/data-discovery/action-center/[monitorId]":[s,e,t,k,"static/chunks/pages/data-discovery/action-center/[monitorId]-0d09001cbefac14b.js"],"/data-discovery/action-center/[monitorId]/[systemId]":[s,e,t,a,i,j,"static/css/81642473e38c67a5.css","static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-4b1956ba13d00d12.js"],"/data-discovery/activity":[r,"static/chunks/pages/data-discovery/activity-741553e7f5e5dad3.js"],"/data-discovery/detection":[r,B,"static/chunks/pages/data-discovery/detection-8733807dad4bc96e.js"],"/data-discovery/detection/[resourceUrn]":[r,B,"static/chunks/pages/data-discovery/detection/[resourceUrn]-393e20924c83373e.js"],"/data-discovery/discovery":[s,e,t,a,r,C,n,"static/chunks/pages/data-discovery/discovery-9e7dfd5a6acc2e8f.js"],"/data-discovery/discovery/[resourceUrn]":[s,e,t,a,r,C,n,"static/chunks/pages/data-discovery/discovery/[resourceUrn]-14bd7500362ff224.js"],"/datamap":["static/chunks/255-7db55b0e3a0f9dea.js",u,z,"static/chunks/pages/datamap-286a2f95a62eaa92.js"],"/dataset":[o,m,"static/chunks/pages/dataset-d1191d3fbb953e64.js"],"/dataset/new":[o,m,"static/chunks/pages/dataset/new-5b58be23debaaecc.js"],"/dataset/[datasetId]":["static/chunks/9729-fcf6ff4e3534e4a8.js",h,"static/chunks/pages/dataset/[datasetId]-4523752f57210b05.js"],"/dataset/[datasetId]/[collectionName]":[s,e,t,c,a,h,n,"static/chunks/pages/dataset/[datasetId]/[collectionName]-7137e44d09c4e66f.js"],"/dataset/[datasetId]/[collectionName]/[...subfieldNames]":[s,e,t,c,a,h,n,"static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-1574f9f99f3fbd4d.js"],"/datastore-connection":["static/css/5f393dea1c0d031c.css","static/chunks/pages/datastore-connection-b15447b9e74cd9ca.js"],"/datastore-connection/new":[s,c,o,p,D,m,E,"static/chunks/pages/datastore-connection/new-e648583cdd77269f.js"],"/datastore-connection/[id]":[s,c,o,D,m,E,"static/chunks/pages/datastore-connection/[id]-8adf2e814c3b9e0d.js"],"/fides-js-docs":["static/chunks/2fbcc6de-a6c61724c327e9fa.js","static/chunks/e3251fe7-5777b5d778e6fffa.js",s,e,t,c,o,L,"static/css/ab65b8cc3144bfc8.css","static/chunks/905-ffdbd0b14167e8bd.js","static/chunks/pages/fides-js-docs-5d8fd1af75f19e2f.js"],"/integrations":[s,e,t,c,d,M,T,n,"static/chunks/pages/integrations-2f51dd2ebc800c0d.js"],"/integrations/[id]":[s,e,t,c,d,M,T,n,"static/chunks/pages/integrations/[id]-c7355ec8b1375390.js"],"/login":["static/chunks/pages/login-0cb0eb44bf2dd24c.js"],"/login/[provider]":["static/chunks/pages/login/[provider]-c58beef131c3a82d.js"],"/messaging":[s,e,t,"static/chunks/pages/messaging-40fa5eff36a01f41.js"],"/messaging/add-template":[P,"static/chunks/pages/messaging/add-template-80b95a87ca4a9a0e.js"],"/messaging/[id]":[P,"static/chunks/pages/messaging/[id]-4b9ab7dc0267f8a8.js"],"/poc/ant-components":["static/chunks/pages/poc/ant-components-6e551f937e1b70f3.js"],"/poc/form-experiments/AntForm":["static/chunks/pages/poc/form-experiments/AntForm-49eb4b84e5f07ead.js"],"/poc/form-experiments/FormikAntFormItem":["static/chunks/pages/poc/form-experiments/FormikAntFormItem-0c523d8323b900a8.js"],"/poc/form-experiments/FormikControlled":["static/chunks/pages/poc/form-experiments/FormikControlled-3bf5a95f470f351b.js"],"/poc/form-experiments/FormikField":["static/chunks/pages/poc/form-experiments/FormikField-2056140039ebb8dd.js"],"/poc/form-experiments/FormikSpreadField":[G,"static/chunks/pages/poc/form-experiments/FormikSpreadField-af097d661f6abcf4.js"],"/poc/forms":[G,"static/chunks/pages/poc/forms-641937410482819f.js"],"/poc/table-migration":[i,g,"static/chunks/pages/poc/table-migration-00d2be9ac59028cf.js"],"/privacy-requests":[H,"static/chunks/pages/privacy-requests-d731dd036a0eb44d.js"],"/privacy-requests/configure":["static/chunks/pages/privacy-requests/configure-623420abd445b87d.js"],"/privacy-requests/configure/messaging":["static/chunks/pages/privacy-requests/configure/messaging-d31a1d8f3c573023.js"],"/privacy-requests/configure/storage":["static/chunks/pages/privacy-requests/configure/storage-f3ec1a691bb7a6b6.js"],"/privacy-requests/[id]":[H,"static/css/399d4757862a3982.css","static/chunks/pages/privacy-requests/[id]-2f2410cdb2f2a918.js"],"/properties":[N,"static/chunks/pages/properties-95f73dad295c22c9.js"],"/properties/add-property":[J,"static/chunks/pages/properties/add-property-51fc662b550db919.js"],"/properties/[id]":[J,"static/chunks/pages/properties/[id]-202ba739110fbcc5.js"],"/reporting/datamap":[s,e,t,L,u,z,"static/chunks/pages/reporting/datamap-d9b31c6172f67b4c.js"],"/settings/about":["static/chunks/pages/settings/about-0102ed2e53aac3f8.js"],"/settings/about/alpha":["static/chunks/pages/settings/about/alpha-1d96cc94c9f9d57a.js"],"/settings/consent":["static/chunks/pages/settings/consent-dbef1e775cae0b4b.js"],"/settings/consent/[configuration_id]/[purpose_id]":["static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-492682d276a487c3.js"],"/settings/custom-fields":["static/chunks/pages/settings/custom-fields-1a7786045d55904c.js"],"/settings/domain-records":["static/chunks/pages/settings/domain-records-c62f0e6538a0f14f.js"],"/settings/domains":["static/chunks/pages/settings/domains-f3ccf59e0cef58c6.js"],"/settings/email-templates":["static/chunks/pages/settings/email-templates-efdf18eadaf4e6df.js"],"/settings/locations":[K,k,"static/chunks/pages/settings/locations-c5fdc67504da5d52.js"],"/settings/organization":["static/chunks/pages/settings/organization-d57f3e3a1926ec3c.js"],"/settings/regulations":[K,k,"static/chunks/pages/settings/regulations-a92d6a45948774a4.js"],"/systems":["static/chunks/pages/systems-f23101c2c99a9abf.js"],"/systems/configure/[id]":[s,e,t,c,p,a,i,u,j,v,I,"static/chunks/pages/systems/configure/[id]-5750b7b195f4e050.js"],"/systems/configure/[id]/test-datasets":[o,"static/chunks/pages/systems/configure/[id]/test-datasets-f2749e3deaf2de1b.js"],"/taxonomy":["static/chunks/678d4732-50255cc09048e643.js",s,e,t,d,"static/chunks/570-c99f07161bd339cd.js","static/css/34a7eb08b86ddb57.css","static/chunks/pages/taxonomy-40bdf2e4c0a6a6d5.js"],"/user-management":[y,"static/chunks/pages/user-management-542d299555665262.js"],"/user-management/new":[y,O,"static/chunks/pages/user-management/new-a2524414e968f862.js"],"/user-management/profile/[id]":[y,O,"static/chunks/pages/user-management/profile/[id]-c9ea4777da2b9148.js"],sortedPages:["/","/404","/_app","/_error","/add-systems","/add-systems/manual","/add-systems/multiple","/consent","/consent/configure","/consent/configure/add-vendors","/consent/privacy-experience","/consent/privacy-experience/new","/consent/privacy-experience/[id]","/consent/privacy-notices","/consent/privacy-notices/new","/consent/privacy-notices/[id]","/consent/properties","/consent/reporting","/data-catalog","/data-catalog/[systemId]/projects","/data-catalog/[systemId]/projects/[projectUrn]","/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn]","/data-catalog/[systemId]/resources","/data-catalog/[systemId]/resources/[resourceUrn]","/data-discovery/action-center","/data-discovery/action-center/[monitorId]","/data-discovery/action-center/[monitorId]/[systemId]","/data-discovery/activity","/data-discovery/detection","/data-discovery/detection/[resourceUrn]","/data-discovery/discovery","/data-discovery/discovery/[resourceUrn]","/datamap","/dataset","/dataset/new","/dataset/[datasetId]","/dataset/[datasetId]/[collectionName]","/dataset/[datasetId]/[collectionName]/[...subfieldNames]","/datastore-connection","/datastore-connection/new","/datastore-connection/[id]","/fides-js-docs","/integrations","/integrations/[id]","/login","/login/[provider]","/messaging","/messaging/add-template","/messaging/[id]","/poc/ant-components","/poc/form-experiments/AntForm","/poc/form-experiments/FormikAntFormItem","/poc/form-experiments/FormikControlled","/poc/form-experiments/FormikField","/poc/form-experiments/FormikSpreadField","/poc/forms","/poc/table-migration","/privacy-requests","/privacy-requests/configure","/privacy-requests/configure/messaging","/privacy-requests/configure/storage","/privacy-requests/[id]","/properties","/properties/add-property","/properties/[id]","/reporting/datamap","/settings/about","/settings/about/alpha","/settings/consent","/settings/consent/[configuration_id]/[purpose_id]","/settings/custom-fields","/settings/domain-records","/settings/domains","/settings/email-templates","/settings/locations","/settings/organization","/settings/regulations","/systems","/systems/configure/[id]","/systems/configure/[id]/test-datasets","/taxonomy","/user-management","/user-management/new","/user-management/profile/[id]"]}}("static/chunks/2858-0b44609b6be7850b.js","static/chunks/2866-a73888c17a195cbe.js","static/chunks/9278-9b1b5970f0702668.js","static/chunks/409-7c75e7a5cd4251a2.js","static/chunks/699-8ca44b0de9fa20f0.js","static/css/d2d4e9a6923e6730.css","static/chunks/401-54fe500e30c5ea66.js","static/chunks/3662-f6a1ddca5ee42076.js","static/chunks/6527-0eed08abe252a918.js","static/chunks/431-cc1200b1bec1e1ad.js","static/chunks/5277-e8a036319456127f.js","static/chunks/9951-81e6a96c892bce10.js","static/chunks/3923-da789f963d161387.js","static/chunks/6084-a596a272a2cc1c93.js","static/chunks/5574-1eb6600d144c90d7.js","static/chunks/1040-63c82622e8aee766.js","static/chunks/6882-306b98265a440778.js","static/css/eb46b504bb5d980d.css","static/chunks/9226-e1ab0a8311cfcef5.js","static/chunks/7476-c3951a31cc8e30f4.js","static/css/972dc7eef106ee7c.css","static/chunks/3450-1088b1f14a3dc618.js","static/css/92fc10cc7ed1aba3.css","static/chunks/796-231bc790c78485ec.js","static/chunks/6853-7abe83702dff33b3.js","static/chunks/9014-eeae6f581158e645.js","static/chunks/1817-d6531612cc594bf1.js","static/chunks/3615-5e2d062d684b8fa1.js","static/chunks/6954-0294aa483799cd3a.js","static/chunks/79-acd3fc646456c35c.js","static/chunks/3872-dc8084d7df0f12e5.js","static/chunks/3855-abbb601a0115e0e2.js","static/chunks/5309-a7b637d2e3830582.js","static/chunks/9046-e28291074efc2b9c.js","static/chunks/4230-aeff8d542b494207.js","static/chunks/1807-3beab149351d5ded.js","static/chunks/9767-5700ef84bfa4689a.js","static/chunks/2599-6c4d22e75028d8b6.js","static/chunks/1316-6cc72a45ebf7ff81.js","static/chunks/6662-29c0da492e0686a5.js","static/chunks/7630-4797e955264ba37b.js","static/chunks/2921-39af9657977fa42c.js","static/chunks/1169-60d4b584fde8ce55.js","static/chunks/787-8c3cff5b5504bbfc.js","static/chunks/9826-a7302c609a0ae585.js","static/chunks/4121-a3935e484614d586.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();