ethyca-fides 2.69.3b1__py2.py3-none-any.whl → 2.70.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 (321) hide show
  1. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0rc0.dist-info}/RECORD +251 -229
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/4d8c0fcc5771_adding_default_system_groups.py +78 -0
  5. fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
  6. fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
  7. fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
  8. fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
  9. fides/api/db/base.py +1 -0
  10. fides/api/db/seed.py +34 -0
  11. fides/api/models/asset.py +1 -0
  12. fides/api/models/event_audit.py +68 -0
  13. fides/api/models/messaging.py +30 -10
  14. fides/api/models/taxonomy.py +16 -4
  15. fides/api/schemas/application_config.py +4 -1
  16. fides/api/schemas/messaging/messaging.py +33 -66
  17. fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
  18. fides/api/schemas/messaging/shared_schemas.py +102 -0
  19. fides/api/service/deps.py +10 -2
  20. fides/api/service/messaging/message_dispatch_service.py +16 -15
  21. fides/api/service/messaging/messaging_crud_service.py +5 -9
  22. fides/api/service/privacy_request/request_runner_service.py +18 -0
  23. fides/api/tasks/__init__.py +1 -0
  24. fides/api/worker/__init__.py +2 -0
  25. fides/common/api/v1/urn_registry.py +2 -1
  26. fides/service/event_audit_service.py +115 -0
  27. fides/service/messaging/aws_ses_service.py +2 -4
  28. fides/service/taxonomy/taxonomy_service.py +49 -3
  29. fides/ui-build/static/admin/404.html +1 -1
  30. fides/ui-build/static/admin/_next/static/IEGnswU38MkVE0gbr0ZXX/_buildManifest.js +1 -0
  31. fides/ui-build/static/admin/_next/static/chunks/1115-7888473b3dc28cda.js +1 -0
  32. fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +1 -0
  33. fides/ui-build/static/admin/_next/static/chunks/1817-17079d2f8cf94941.js +1 -0
  34. fides/ui-build/static/admin/_next/static/chunks/2040-ab6212a3074f34f9.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/2121.1de2fa060eae34aa.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/3585-451504ea5ed7a1ea.js +1 -0
  37. fides/ui-build/static/admin/_next/static/chunks/3696-c25dc8d1b0e1aee1.js +1 -0
  38. fides/ui-build/static/admin/_next/static/chunks/3700-2a7094f112a1608a.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/3855-12ee1dfbbe47fd28.js +1 -0
  40. fides/ui-build/static/admin/_next/static/chunks/3872-3514b712afd683c0.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/409-c1256ecda1b15db6.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/4558-de5ced790b3380dc.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/4608-96f480766541124b.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/4718-6585c97c26647e65.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/502-a40d39e615f7b664.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/504-afd3588f1908ac33.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/5185-33f50cf9ae17b42e.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/5574-b8c4cba5a6938c00.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/{5596-bb601cbf40e47a0f.js → 5596-29a7c8322530b7cf.js} +1 -1
  52. fides/ui-build/static/admin/_next/static/chunks/5698.2135391a128cc373.js +164 -0
  53. fides/ui-build/static/admin/_next/static/chunks/5783-8de76df87af55e98.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/6084-2cd165179c428a6f.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/6416-18d438ff85d807f8.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/6882-447f15e87b8c48a5.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/7045-f15044a4d4525946.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/7158-835ba42fd881d8dd.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/7202.3febe9e89640c712.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/7476-0b6e114658b15eaa.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/7630-e7ea13be69c118a1.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/7725-dd6736855807936a.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/7929-919e2dff24e40397.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/796-e07ac2c543f569e3.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/8002-25fd174aec9b077b.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/9046-2a332fe338535c84.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/9226-2f960b7ca530642a.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/{9676.9fd9552ef744c717.js → 9676.b86ecbcfe5afd25d.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/9826-c02be5882205bbbc.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/{9951-0c8a80f01e431957.js → 9951-651d521d9a02b6df.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-a653cee14ce2366b.js → _app-e08a732e348aa667.js} +63 -226
  73. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-adaec1ec185160af.js → manual-939253f8daf349b2.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-f90aa48500c1cbde.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-c0db068d1863222f.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-a94e19870fe3e210.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-17cdca29c6d4cdd6.js → properties-069f4e3ee96ebf77.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-09be5455ba85db39.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/pages/consent-e5a33654a2dfaf35.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-d0dbba5bff738b57.js → [resourceUrn]-293c1f2d9aefb447.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-be7b385073f22414.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-cfc118e68285405c.js → [resourceUrn]-18501152fa1e4f40.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-351caadeef03876a.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-758d51b4d37dbd09.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0e4d9ff89c63793c.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-1554afcb8b9da2ab.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-2635ef588bf06145.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-0497f3ffdb632516.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-a780390da99f3e43.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-1901c26cdde820da.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-0cea22af5929c81f.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-619f27c745188adb.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-ef71f387fbbab425.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-d790553662caf5c3.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-cb63db8594fe8dc1.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-78e052c8f95110c4.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-d6d7ee8bd8858a8a.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-785205655317b1d3.js → [id]-cc149157d290a94d.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-a6985f77afbc5bc0.js → new-4c9fb068a5561658.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-a832084ce294f8af.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/index-269b8f81546dad66.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-8b13bb5f7bee61c6.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-6f109ef64304ef59.js +1 -0
  104. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-8566e3b7b2a632fa.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-1b38b656807ed0cd.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b00532a0ad4f6927.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-65f0d5672041a202.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-3d2a77cb07aa8dc0.js → [id]-322a01e2bceab3fb.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-210e7e3b3d776d44.js → add-property-777ed2d73812043d.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-18257b6a70fa8a97.js → properties-08472b2a6bf1d392.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-b20c53b82a54f5ea.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-55e36839d219a503.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-26ce8fc493993765.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-7ddf9d992fe714a6.js +1 -0
  117. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-7c78ae51f0dd7102.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-05ffbda19ab894b9.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-b0d93bf478bf63ee.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-084f9756b9987285.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-6c51ffd46bb598e7.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-44456bfe54ac4ad5.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-fbe7e8030d837aed.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-a86bafe1b4e1205f.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-1895c6a13b543436.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/systems-ae3f3470e2734933.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-1b9c4b2749e3ece4.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-6304dad2c5fab694.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-763861f5eb207db5.js → [id]-ff4711db191099cd.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +1 -0
  131. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  132. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  133. fides/ui-build/static/admin/add-systems.html +1 -1
  134. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  135. fides/ui-build/static/admin/consent/configure.html +1 -1
  136. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  137. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  138. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  139. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  140. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  141. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  142. fides/ui-build/static/admin/consent/properties.html +1 -1
  143. fides/ui-build/static/admin/consent/reporting.html +1 -1
  144. fides/ui-build/static/admin/consent.html +1 -1
  145. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  146. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  147. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  148. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  149. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  150. fides/ui-build/static/admin/data-catalog.html +1 -1
  151. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  152. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  153. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  154. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  155. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  156. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  157. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  158. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  159. fides/ui-build/static/admin/datamap.html +1 -1
  160. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  161. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  162. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  163. fides/ui-build/static/admin/dataset/new.html +1 -1
  164. fides/ui-build/static/admin/dataset.html +1 -1
  165. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  166. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  167. fides/ui-build/static/admin/datastore-connection.html +1 -1
  168. fides/ui-build/static/admin/index.html +1 -1
  169. fides/ui-build/static/admin/integrations/[id].html +1 -1
  170. fides/ui-build/static/admin/integrations.html +1 -1
  171. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  172. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  173. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  174. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  175. fides/ui-build/static/admin/lib/fides.js +2 -2
  176. fides/ui-build/static/admin/login/[provider].html +1 -1
  177. fides/ui-build/static/admin/login.html +1 -1
  178. fides/ui-build/static/admin/messaging/[id].html +1 -1
  179. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  180. fides/ui-build/static/admin/messaging.html +1 -1
  181. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  182. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  183. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  184. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  185. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  186. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  187. fides/ui-build/static/admin/poc/forms.html +1 -1
  188. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  189. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  190. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  191. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  192. fides/ui-build/static/admin/privacy-requests.html +1 -1
  193. fides/ui-build/static/admin/properties/[id].html +1 -1
  194. fides/ui-build/static/admin/properties/add-property.html +1 -1
  195. fides/ui-build/static/admin/properties.html +1 -1
  196. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  197. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  198. fides/ui-build/static/admin/settings/about.html +1 -1
  199. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  200. fides/ui-build/static/admin/settings/consent.html +1 -1
  201. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  202. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  203. fides/ui-build/static/admin/settings/domains.html +1 -1
  204. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  205. fides/ui-build/static/admin/settings/locations.html +1 -1
  206. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -0
  207. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -0
  208. fides/ui-build/static/admin/settings/messaging-providers.html +1 -0
  209. fides/ui-build/static/admin/settings/organization.html +1 -1
  210. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  211. fides/ui-build/static/admin/settings/regulations.html +1 -1
  212. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  213. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  214. fides/ui-build/static/admin/systems.html +1 -1
  215. fides/ui-build/static/admin/taxonomy.html +1 -1
  216. fides/ui-build/static/admin/user-management/new.html +1 -1
  217. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  218. fides/ui-build/static/admin/user-management.html +1 -1
  219. fides/ui-build/static/admin/_next/static/_b75ACzlGNz3tZqGUPTE5/_buildManifest.js +0 -1
  220. fides/ui-build/static/admin/_next/static/chunks/1099-718ce18b9bd70cdb.js +0 -1
  221. fides/ui-build/static/admin/_next/static/chunks/1345-1961771e9619db39.js +0 -1
  222. fides/ui-build/static/admin/_next/static/chunks/1817-9423665774c2c08f.js +0 -1
  223. fides/ui-build/static/admin/_next/static/chunks/3620-34355b0c44325537.js +0 -1
  224. fides/ui-build/static/admin/_next/static/chunks/3642-c052564812532324.js +0 -1
  225. fides/ui-build/static/admin/_next/static/chunks/3729-c8accd71498f6fe4.js +0 -1
  226. fides/ui-build/static/admin/_next/static/chunks/3855-0565d44d150c985a.js +0 -1
  227. fides/ui-build/static/admin/_next/static/chunks/3872-c022bb7259a9f323.js +0 -1
  228. fides/ui-build/static/admin/_next/static/chunks/4164-cadb4c6528662248.js +0 -1
  229. fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +0 -1
  230. fides/ui-build/static/admin/_next/static/chunks/4608-caa9cb70fb66ac99.js +0 -1
  231. fides/ui-build/static/admin/_next/static/chunks/4786-d2b03ba5c82a02ed.js +0 -1
  232. fides/ui-build/static/admin/_next/static/chunks/4808-57c5ac15fd8b0d81.js +0 -1
  233. fides/ui-build/static/admin/_next/static/chunks/4831-c0d20b2a0b7332bb.js +0 -1
  234. fides/ui-build/static/admin/_next/static/chunks/4844-e5064a161a7e5a12.js +0 -1
  235. fides/ui-build/static/admin/_next/static/chunks/5258-0062e0a1e4f8c03e.js +0 -1
  236. fides/ui-build/static/admin/_next/static/chunks/5487-46774dc9df554af1.js +0 -1
  237. fides/ui-build/static/admin/_next/static/chunks/549-170c96caa601e15a.js +0 -1
  238. fides/ui-build/static/admin/_next/static/chunks/6084-2c7b81cbcae7e3b4.js +0 -1
  239. fides/ui-build/static/admin/_next/static/chunks/7476-fdd0eb08a12e0334.js +0 -1
  240. fides/ui-build/static/admin/_next/static/chunks/7630-8613916021366672.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/787-f2eca25837ff7305.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/79-68834fd07d69f428.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/796-8fbae2fc714e7a3a.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/8002-193a97fe4de8b779.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/9046-1afcfb1c4dbdd6c6.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/9826-d49a56431e896acb.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-0a2b2f4a30245089.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-b7b7fb3e8b2ea816.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-23d3e50db42f31b3.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-75be0acd400cf527.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/pages/consent-9b4e0a08ae6216c7.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-25c5916c8357f98d.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-9fa11c01b44ba8f1.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-fb16cb8fd2b3826f.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a481a5be96dede96.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6c65b86a61340753.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-7fe1ca395914f77f.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-ea1eabce2a3fc2c7.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-3c629aecee30c575.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-a13ea13e0316d5a2.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-a6ae353b3b1536cc.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-85b28db67d96f201.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-409fe1a086fb7d38.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-93d5c01dd927bad2.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/pages/index-bf3042fdbfb12b3d.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-e545f8ef5c945f45.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-f297e6cdb9fe97b9.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-6e864b293571a508.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-0fc3f1f3b1cd6f2a.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-089c166287a89166.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-5a3cd9b14a37ef27.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-73be3cfaaa95ece4.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-adbea0f9fd21ff3a.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-b678e7577eef5e5c.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-3f3039c7e86cab2f.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-d502bf1e7580df06.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-b841d63011827b43.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-50f9b26c6907d6de.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-5ae0d30eb3b770ab.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-f5924e64a15a0dc3.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-88f6badc1bb38b97.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-d5f8db89c7e91a02.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0366184eda09a933.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-a659f18a30ef89f3.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/systems-f4bf47ed2c4746ba.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-2d9548cfa6086e8f.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/webpack-606818148553db7b.js +0 -1
  288. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
  289. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0rc0.dist-info}/WHEEL +0 -0
  290. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0rc0.dist-info}/entry_points.txt +0 -0
  291. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0rc0.dist-info}/licenses/LICENSE +0 -0
  292. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0rc0.dist-info}/top_level.txt +0 -0
  293. /fides/ui-build/static/admin/_next/static/{_b75ACzlGNz3tZqGUPTE5 → IEGnswU38MkVE0gbr0ZXX}/_ssgManifest.js +0 -0
  294. /fides/ui-build/static/admin/_next/static/chunks/{2921-765918f8aa37fdb2.js → 2921-66f65496c3a09316.js} +0 -0
  295. /fides/ui-build/static/admin/_next/static/chunks/{3923-23df37eef17d6ea2.js → 3923-a551756b413367ea.js} +0 -0
  296. /fides/ui-build/static/admin/_next/static/chunks/{401-45f399d4d1325340.js → 401-ffe4e8436e1eceb9.js} +0 -0
  297. /fides/ui-build/static/admin/_next/static/chunks/{6853-8fb39280a8f0eb89.js → 6853-7004a8c420b1ca02.js} +0 -0
  298. /fides/ui-build/static/admin/_next/static/chunks/{6954-3b26ff8259c4d5c3.js → 6954-599f2de2c902e9b2.js} +0 -0
  299. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-8d9c703c96662265.js → 404-2eb8aed4939f1142.js} +0 -0
  300. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-20050dbae806179d.js → multiple-83ed7da0bb90b0a5.js} +0 -0
  301. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7b8cec88b5ad53d1.js → add-vendors-46b88bda3d7b15c5.js} +0 -0
  302. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-c30382719d6f797a.js → [id]-fd41ffaff543e05a.js} +0 -0
  303. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-dff842dbed2bc6c8.js → privacy-experience-92a337ee96845af2.js} +0 -0
  304. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-074cdbfc678ba791.js → [id]-1fd2cda8707314f6.js} +0 -0
  305. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-bcddda632b4df409.js → new-2987e397445713c5.js} +0 -0
  306. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-8ffd8d148269d323.js → [projectUrn]-6a4b0d49dcbf17a8.js} +0 -0
  307. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-9b7e4b86b1e8a40a.js → resources-af80fdca3bbdc82f.js} +0 -0
  308. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-f03f1fdaa1f5a0c6.js → [id]-d8c5c03fb2f31d65.js} +0 -0
  309. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-8f90e275e932940b.js → add-template-0e0c06e3c8aabe02.js} +0 -0
  310. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-68385a251c7ade5f.js → messaging-3f15804cf9625f01.js} +0 -0
  311. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-fc7d652910f3ad8d.js → ant-components-248ad9f65a872442.js} +0 -0
  312. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-fb6e6f4b276b6189.js → AntForm-aedb66a62042b10a.js} +0 -0
  313. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-00869abf79950a9a.js → FormikAntFormItem-018df38b7cd77fdb.js} +0 -0
  314. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-5716d749236c9f70.js → FormikControlled-6ca9099d03aab817.js} +0 -0
  315. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-d6dfb9daa3935db3.js → FormikField-0f2c90786ea005a4.js} +0 -0
  316. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-9697549bce7060be.js → forms-200b51a725f8b2d1.js} +0 -0
  317. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-888656ae0bd40f62.js → table-migration-e551fccfcaae76e7.js} +0 -0
  318. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-c64b87694eda4785.js → [purpose_id]-f3e6e74e0efb005c.js} +0 -0
  319. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-e29384f7a3db5221.js → locations-77fb85bdd0be42b5.js} +0 -0
  320. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-46d06037fcadaf00.js → regulations-2866ac99faa5a542.js} +0 -0
  321. /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-98a3277820e232c7.js → user-management-82fcf1151e2fe2ba.js} +0 -0
@@ -0,0 +1,68 @@
1
+ """EventAudit model and related enums for comprehensive audit logging."""
2
+
3
+ from enum import Enum as EnumType
4
+
5
+ from sqlalchemy import Column, String, Text
6
+ from sqlalchemy.dialects.postgresql import JSONB
7
+ from sqlalchemy.ext.declarative import declared_attr
8
+
9
+ from fides.api.db.base_class import Base
10
+ from fides.api.db.util import EnumColumn
11
+
12
+
13
+ class EventAuditType(str, EnumType):
14
+ """Hierarchical event types for audit logging - variable depth as needed."""
15
+
16
+ # System
17
+ system_updated = "system.updated"
18
+
19
+ # System group
20
+ system_group_created = "system_group.created"
21
+ system_group_updated = "system_group.updated"
22
+ system_group_deleted = "system_group.deleted"
23
+
24
+ # Taxonomy
25
+ taxonomy_created = "taxonomy.created"
26
+ taxonomy_updated = "taxonomy.updated"
27
+ taxonomy_deleted = "taxonomy.deleted"
28
+ taxonomy_usage_updated = "taxonomy.usage.updated"
29
+ taxonomy_usage_deleted = "taxonomy.usage.deleted"
30
+ taxonomy_element_created = "taxonomy.element.created"
31
+ taxonomy_element_updated = "taxonomy.element.updated"
32
+ taxonomy_element_deleted = "taxonomy.element.deleted"
33
+
34
+
35
+ class EventAuditStatus(str, EnumType):
36
+ """Status enum for event audit logging."""
37
+
38
+ succeeded = "succeeded"
39
+ failed = "failed"
40
+
41
+
42
+ class EventAudit(Base):
43
+ """Audit log for significant business events across the Fides platform."""
44
+
45
+ @declared_attr
46
+ def __tablename__(cls) -> str:
47
+ return "event_audit"
48
+
49
+ # Uses EventAuditType values but left as String to avoid future migrations
50
+ event_type = Column(String, index=True, nullable=False)
51
+ user_id = Column(String, nullable=True, index=True)
52
+
53
+ # Resource information
54
+ resource_type = Column(String, nullable=True, index=True)
55
+ resource_identifier = Column(String, nullable=True, index=True)
56
+
57
+ # User-friendly description of event
58
+ description = Column(Text, nullable=True)
59
+
60
+ # Structured data about event
61
+ event_details = Column(JSONB, nullable=True)
62
+
63
+ # Status of the event
64
+ status = Column(
65
+ EnumColumn(EventAuditStatus),
66
+ index=True,
67
+ nullable=False,
68
+ )
@@ -1,10 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from datetime import datetime
3
4
  from typing import Dict, Optional, Type, Union
4
5
 
5
6
  from loguru import logger
6
7
  from pydantic import ValidationError
7
- from sqlalchemy import Column, Enum, String
8
+ from sqlalchemy import Boolean, Column, DateTime, Enum, String
8
9
  from sqlalchemy.dialects.postgresql import JSONB
9
10
  from sqlalchemy.ext.mutable import MutableDict
10
11
  from sqlalchemy.orm import Session
@@ -18,17 +19,18 @@ from fides.api.db.base_class import Base, JSONTypeOverride
18
19
  from fides.api.schemas.messaging.messaging import (
19
20
  EMAIL_MESSAGING_SERVICES,
20
21
  SMS_MESSAGING_SERVICES,
21
- SUPPORTED_MESSAGING_SERVICE_SECRETS,
22
+ MessagingConnectionTestStatus,
22
23
  MessagingMethod,
24
+ MessagingServiceType,
25
+ )
26
+ from fides.api.schemas.messaging.shared_schemas import (
27
+ SUPPORTED_MESSAGING_SERVICE_SECRETS,
23
28
  MessagingServiceSecretsAWS_SES,
24
29
  MessagingServiceSecretsMailchimpTransactional,
25
30
  MessagingServiceSecretsMailgun,
26
31
  MessagingServiceSecretsTwilioEmail,
27
32
  MessagingServiceSecretsTwilioSMS,
28
- MessagingServiceType,
29
- )
30
- from fides.api.schemas.messaging.messaging_secrets_docs_only import (
31
- possible_messaging_secrets,
33
+ PossibleMessagingSecrets,
32
34
  )
33
35
  from fides.api.util.logger import Pii
34
36
  from fides.config import CONFIG
@@ -48,7 +50,7 @@ def get_messaging_method(
48
50
 
49
51
  def get_schema_for_secrets(
50
52
  service_type: MessagingServiceType,
51
- secrets: possible_messaging_secrets,
53
+ secrets: PossibleMessagingSecrets,
52
54
  ) -> SUPPORTED_MESSAGING_SERVICE_SECRETS:
53
55
  """
54
56
  Returns the secrets that pertain to `service_type` represented as a Pydantic schema
@@ -87,6 +89,8 @@ class MessagingConfig(Base):
87
89
  Enum(MessagingServiceType), index=True, unique=True, nullable=False
88
90
  )
89
91
  details = Column(MutableDict.as_mutable(JSONB), nullable=True)
92
+ last_test_timestamp = Column(DateTime(timezone=True))
93
+ last_test_succeeded = Column(Boolean)
90
94
  secrets = Column(
91
95
  MutableDict.as_mutable(
92
96
  StringEncryptedType(
@@ -136,7 +140,7 @@ class MessagingConfig(Base):
136
140
  self,
137
141
  *,
138
142
  db: Session,
139
- messaging_secrets: possible_messaging_secrets,
143
+ messaging_secrets: PossibleMessagingSecrets,
140
144
  ) -> None:
141
145
  """Creates or updates secrets associated with a config id"""
142
146
 
@@ -185,6 +189,18 @@ class MessagingConfig(Base):
185
189
  f"Unknown notification_service_type {active_default_messaging_type} configured"
186
190
  )
187
191
 
192
+ def update_test_status(
193
+ self, test_status: MessagingConnectionTestStatus, db: Session
194
+ ) -> None:
195
+ """
196
+ Updates last_test_timestamp and last_test_succeeded after an attempt to send a test message.
197
+ """
198
+ self.last_test_timestamp = datetime.now()
199
+ self.last_test_succeeded = (
200
+ test_status == MessagingConnectionTestStatus.succeeded
201
+ )
202
+ self.save(db)
203
+
188
204
 
189
205
  def default_messaging_config_name(service_type: str) -> str:
190
206
  """
@@ -192,7 +208,7 @@ def default_messaging_config_name(service_type: str) -> str:
192
208
 
193
209
  Returns a name to be used in a default messaging config for the given type.
194
210
  """
195
- return f"Default Messaging Config [{service_type}]"
211
+ return MessagingServiceType(service_type).human_readable
196
212
 
197
213
 
198
214
  def default_messaging_config_key(service_type: str) -> str:
@@ -201,4 +217,8 @@ def default_messaging_config_key(service_type: str) -> str:
201
217
 
202
218
  Returns a key to be used in a default messaging config for the given type.
203
219
  """
204
- return f"default_messaging_config_{service_type.lower()}"
220
+ # Historically, when a key was not supplied, the service type string itself
221
+ # was used as the key (e.g. "mailgun"). Reverting to that behaviour keeps
222
+ # backward-compatibility with existing tests and API consumers that may rely
223
+ # on this convention.
224
+ return service_type.lower()
@@ -85,10 +85,17 @@ class Taxonomy(Base, FidesBase):
85
85
  raise ValidationError(
86
86
  f"Cannot create taxonomy '{fides_key}'. This is a taxonomy managed by the system."
87
87
  )
88
- applies_to = data.pop("applies_to", [])
88
+ applies_to = data.get("applies_to", [])
89
+
90
+ # Create a copy of data without applies_to to avoid modifying the input
91
+ data_without_applies_to = {
92
+ key: value for key, value in data.items() if key != "applies_to"
93
+ }
89
94
 
90
95
  # Create the taxonomy
91
- taxonomy: Taxonomy = super().create(db=db, data=data, check_name=check_name)
96
+ taxonomy: Taxonomy = super().create(
97
+ db=db, data=data_without_applies_to, check_name=check_name
98
+ )
92
99
 
93
100
  # Reconcile allowed usages if applies_to was provided
94
101
  if applies_to:
@@ -98,10 +105,15 @@ class Taxonomy(Base, FidesBase):
98
105
 
99
106
  def update(self, db: Session, *, data: Dict[str, Any]) -> "Taxonomy":
100
107
  """Update a Taxonomy with proper handling of applies_to."""
101
- applies_to = data.pop("applies_to", None)
108
+ applies_to = data.get("applies_to", None)
109
+
110
+ # Create a copy of data without applies_to to avoid modifying the input
111
+ data_without_applies_to = {
112
+ key: value for key, value in data.items() if key != "applies_to"
113
+ }
102
114
 
103
115
  # Update the base fields
104
- super().update(db=db, data=data)
116
+ super().update(db=db, data=data_without_applies_to)
105
117
 
106
118
  # If applies_to was provided, reconcile allowed usages
107
119
  if applies_to is not None:
@@ -53,8 +53,11 @@ class NotificationApplicationConfig(FidesSchema):
53
53
 
54
54
  @field_validator("notification_service_type", mode="before")
55
55
  @classmethod
56
- def validate_notification_service_type(cls, value: str) -> Optional[str]:
56
+ def validate_notification_service_type(cls, value: Optional[str]) -> Optional[str]:
57
57
  """Ensure the provided type is a valid value."""
58
+ if value is None:
59
+ return None # Allow None values for disabling messaging
60
+
58
61
  value = value.lower() # force lowercase for safety
59
62
  try:
60
63
  MessagingServiceType[value]
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from datetime import datetime
3
4
  from enum import Enum
4
5
  from typing import Any, Dict, List, Optional, Tuple, Type, Union
5
6
 
@@ -7,15 +8,14 @@ from fideslang.default_taxonomy import DEFAULT_TAXONOMY
7
8
  from fideslang.validation import FidesKey
8
9
  from pydantic import BaseModel, ConfigDict, Field, model_validator
9
10
 
10
- from fides.api.custom_types import PhoneNumber, SafeStr
11
+ from fides.api.custom_types import SafeStr
11
12
  from fides.api.schemas import Msg
12
13
  from fides.api.schemas.api import BulkResponse, BulkUpdateFailed
13
- from fides.api.schemas.connection_configuration.connection_secrets_base_aws import (
14
- BaseAWSSchema,
15
- )
14
+ from fides.api.schemas.messaging.shared_schemas import PossibleMessagingSecrets
16
15
  from fides.api.schemas.privacy_preference import MinimalPrivacyPreferenceHistorySchema
17
16
  from fides.api.schemas.privacy_request import Consent
18
17
  from fides.api.schemas.property import MinimalProperty
18
+ from fides.api.schemas.redis_cache import IdentityBase
19
19
 
20
20
 
21
21
  class MessagingMethod(Enum):
@@ -44,6 +44,25 @@ class MessagingServiceType(Enum):
44
44
  return member
45
45
  return None
46
46
 
47
+ @property
48
+ def human_readable(self) -> str:
49
+ """
50
+ Human-readable mapping for MessagingServiceType
51
+ """
52
+ readable_mapping: Dict[str, str] = {
53
+ MessagingServiceType.mailgun.value: "Mailgun",
54
+ MessagingServiceType.twilio_text.value: "Twilio SMS",
55
+ MessagingServiceType.twilio_email.value: "Twilio Email",
56
+ MessagingServiceType.mailchimp_transactional.value: "Mailchimp Transactional",
57
+ MessagingServiceType.aws_ses.value: "AWS SES",
58
+ }
59
+ try:
60
+ return readable_mapping[self.value]
61
+ except KeyError:
62
+ raise NotImplementedError(
63
+ "Add new MessagingServiceType to human_readable mapping"
64
+ )
65
+
47
66
 
48
67
  EMAIL_MESSAGING_SERVICES: Tuple[str, ...] = (
49
68
  MessagingServiceType.mailgun.value,
@@ -85,6 +104,12 @@ CONFIGURABLE_MESSAGING_ACTION_TYPES: Tuple[str, ...] = (
85
104
  )
86
105
 
87
106
 
107
+ class MessagingTestBodyParams(BaseModel):
108
+ """Body params required for testing messaging service"""
109
+
110
+ to_identity: IdentityBase
111
+
112
+
88
113
  class ErrorNotificationBodyParams(BaseModel):
89
114
  """Body params required for privacy request error notifications."""
90
115
 
@@ -339,56 +364,6 @@ class MessagingServiceSecrets(Enum):
339
364
  AWS_ASSUME_ROLE_ARN = "aws_assume_role_arn"
340
365
 
341
366
 
342
- class MessagingServiceSecretsMailchimpTransactional(BaseModel):
343
- """The secrets required to connect to Mailchimp Transactional."""
344
-
345
- mailchimp_transactional_api_key: str
346
- model_config = ConfigDict(extra="forbid")
347
-
348
-
349
- class MessagingServiceSecretsMailgun(BaseModel):
350
- """The secrets required to connect to Mailgun."""
351
-
352
- mailgun_api_key: str
353
- model_config = ConfigDict(extra="forbid")
354
-
355
-
356
- class MessagingServiceSecretsTwilioSMS(BaseModel):
357
- """The secrets required to connect to Twilio SMS."""
358
-
359
- twilio_account_sid: str
360
- twilio_auth_token: str
361
- twilio_messaging_service_sid: Optional[str] = None
362
- twilio_sender_phone_number: Optional[PhoneNumber] = None
363
- model_config = ConfigDict(extra="forbid")
364
-
365
- @model_validator(mode="before")
366
- @classmethod
367
- def validate_fields(cls, values: Dict[str, Any]) -> Dict[str, Any]:
368
- sender_phone = values.get("twilio_sender_phone_number")
369
- if not values.get("twilio_messaging_service_sid") and not sender_phone:
370
- raise ValueError(
371
- "Either the twilio_messaging_service_sid or the twilio_sender_phone_number should be supplied."
372
- )
373
- return values
374
-
375
-
376
- class MessagingServiceSecretsTwilioEmail(BaseModel):
377
- """The secrets required to connect to twilio email."""
378
-
379
- twilio_api_key: str
380
- model_config = ConfigDict(extra="forbid")
381
-
382
-
383
- class MessagingServiceSecretsAWS_SES(BaseAWSSchema):
384
- """
385
- The secrets required to connect to AWS SES.
386
- Inherits basic AWS authentication schema.
387
- """
388
-
389
- model_config = ConfigDict(extra="forbid")
390
-
391
-
392
367
  class MessagingConfigBase(BaseModel):
393
368
  """Base model shared by messaging config related models"""
394
369
 
@@ -453,8 +428,9 @@ class MessagingConfigRequestBase(MessagingConfigBase):
453
428
  class MessagingConfigRequest(MessagingConfigRequestBase):
454
429
  """Messaging Config Request Schema"""
455
430
 
456
- name: str
431
+ name: Optional[str] = None
457
432
  key: Optional[FidesKey] = None
433
+ secrets: Optional[PossibleMessagingSecrets] = None
458
434
 
459
435
 
460
436
  class MessagingConfigResponse(MessagingConfigBase):
@@ -462,16 +438,8 @@ class MessagingConfigResponse(MessagingConfigBase):
462
438
 
463
439
  name: str
464
440
  key: FidesKey
465
- model_config = ConfigDict(from_attributes=True, use_enum_values=True)
466
-
467
-
468
- SUPPORTED_MESSAGING_SERVICE_SECRETS = Union[
469
- MessagingServiceSecretsMailgun,
470
- MessagingServiceSecretsTwilioSMS,
471
- MessagingServiceSecretsTwilioEmail,
472
- MessagingServiceSecretsMailchimpTransactional,
473
- MessagingServiceSecretsAWS_SES,
474
- ]
441
+ last_test_timestamp: Optional[datetime] = None
442
+ last_test_succeeded: Optional[bool] = None
475
443
 
476
444
 
477
445
  class MessagingConnectionTestStatus(Enum):
@@ -479,7 +447,6 @@ class MessagingConnectionTestStatus(Enum):
479
447
 
480
448
  succeeded = "succeeded"
481
449
  failed = "failed"
482
- skipped = "skipped"
483
450
 
484
451
 
485
452
  class TestMessagingStatusMessage(Msg):
@@ -1,7 +1,7 @@
1
1
  from typing import Union
2
2
 
3
3
  from fides.api.schemas.base_class import NoValidationSchema
4
- from fides.api.schemas.messaging.messaging import (
4
+ from fides.api.schemas.messaging.shared_schemas import (
5
5
  MessagingServiceSecretsAWS_SES,
6
6
  MessagingServiceSecretsMailchimpTransactional,
7
7
  MessagingServiceSecretsMailgun,
@@ -0,0 +1,102 @@
1
+ from typing import Any, Dict, Optional, Union
2
+
3
+ from pydantic import BaseModel, ConfigDict, model_validator
4
+
5
+ from fides.api.custom_types import PhoneNumber
6
+ from fides.api.schemas.base_class import NoValidationSchema
7
+ from fides.api.schemas.connection_configuration.connection_secrets_base_aws import (
8
+ BaseAWSSchema,
9
+ )
10
+
11
+
12
+ class MessagingServiceSecretsMailgun(BaseModel):
13
+ """The secrets required to connect to Mailgun."""
14
+
15
+ mailgun_api_key: str
16
+ model_config = ConfigDict(extra="forbid")
17
+
18
+
19
+ class MessagingServiceSecretsTwilioSMS(BaseModel):
20
+ """The secrets required to connect to Twilio SMS."""
21
+
22
+ twilio_account_sid: str
23
+ twilio_auth_token: str
24
+ twilio_messaging_service_sid: Optional[str] = None
25
+ twilio_sender_phone_number: Optional[PhoneNumber] = None
26
+ model_config = ConfigDict(extra="forbid")
27
+
28
+ @model_validator(mode="before")
29
+ @classmethod
30
+ def validate_fields(cls, values: Dict[str, Any]) -> Dict[str, Any]:
31
+ sender_phone = values.get("twilio_sender_phone_number")
32
+ if not values.get("twilio_messaging_service_sid") and not sender_phone:
33
+ raise ValueError(
34
+ "Either the twilio_messaging_service_sid or the twilio_sender_phone_number should be supplied."
35
+ )
36
+ return values
37
+
38
+
39
+ class MessagingServiceSecretsTwilioEmail(BaseModel):
40
+ """The secrets required to connect to twilio email."""
41
+
42
+ twilio_api_key: str
43
+ model_config = ConfigDict(extra="forbid")
44
+
45
+
46
+ class MessagingServiceSecretsMailchimpTransactional(BaseModel):
47
+ """The secrets required to connect to Mailchimp Transactional."""
48
+
49
+ mailchimp_transactional_api_key: str
50
+ model_config = ConfigDict(extra="forbid")
51
+
52
+
53
+ class MessagingServiceSecretsMailchimpTransactionalDocs(
54
+ MessagingServiceSecretsMailchimpTransactional,
55
+ NoValidationSchema,
56
+ ):
57
+ """The secrets required to connect Mailchimp Transactional, for documentation"""
58
+
59
+
60
+ class MessagingSecretsMailgunDocs(MessagingServiceSecretsMailgun, NoValidationSchema):
61
+ """The secrets required to connect to Mailgun, for documentation"""
62
+
63
+
64
+ class MessagingSecretsTwilioSMSDocs(
65
+ MessagingServiceSecretsTwilioSMS, NoValidationSchema
66
+ ):
67
+ """The secrets required to connect to Twilio sms, for documentation"""
68
+
69
+
70
+ class MessagingSecretsTwilioEmailDocs(
71
+ MessagingServiceSecretsTwilioEmail, NoValidationSchema
72
+ ):
73
+ """The secrets required to connect to Twilio email, for documentation"""
74
+
75
+
76
+ class MessagingServiceSecretsAWS_SES(BaseAWSSchema):
77
+ """The secrets required to connect to AWS SES."""
78
+
79
+ model_config = ConfigDict(extra="forbid")
80
+
81
+
82
+ class MessagingServiceSecretsAWS_SESDocs(
83
+ MessagingServiceSecretsAWS_SES, NoValidationSchema
84
+ ):
85
+ """The secrets required to connect to AWS SES, for documentation"""
86
+
87
+
88
+ SUPPORTED_MESSAGING_SERVICE_SECRETS = Union[
89
+ MessagingServiceSecretsMailgun,
90
+ MessagingServiceSecretsTwilioSMS,
91
+ MessagingServiceSecretsTwilioEmail,
92
+ MessagingServiceSecretsMailchimpTransactional,
93
+ MessagingServiceSecretsAWS_SES,
94
+ ]
95
+
96
+ PossibleMessagingSecrets = Union[
97
+ MessagingSecretsMailgunDocs,
98
+ MessagingSecretsTwilioSMSDocs,
99
+ MessagingSecretsTwilioEmailDocs,
100
+ MessagingServiceSecretsMailchimpTransactionalDocs,
101
+ MessagingServiceSecretsAWS_SESDocs,
102
+ ]
fides/api/service/deps.py CHANGED
@@ -8,6 +8,7 @@ from fides.config import FidesConfig
8
8
  from fides.config.config_proxy import ConfigProxy
9
9
  from fides.service.dataset.dataset_config_service import DatasetConfigService
10
10
  from fides.service.dataset.dataset_service import DatasetService
11
+ from fides.service.event_audit_service import EventAuditService
11
12
  from fides.service.messaging.messaging_service import MessagingService
12
13
  from fides.service.privacy_request.privacy_request_service import PrivacyRequestService
13
14
  from fides.service.system.system_service import SystemService
@@ -47,8 +48,15 @@ def get_user_service(
47
48
  return UserService(db, config, config_proxy)
48
49
 
49
50
 
50
- def get_taxonomy_service(db: Session = Depends(get_db)) -> TaxonomyService:
51
- 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)
52
60
 
53
61
 
54
62
  def get_system_service(db: AsyncSession = Depends(get_async_db)) -> SystemService:
@@ -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
 
@@ -782,10 +782,28 @@ def run_privacy_request(
782
782
  privacy_request.property_id,
783
783
  privacy_request.id,
784
784
  )
785
+ # Add success log for completion email
786
+ privacy_request.add_success_execution_log(
787
+ session,
788
+ connection_key=None,
789
+ dataset_name="Privacy request completion email",
790
+ collection_name=None,
791
+ message="Privacy request completion email sent successfully.",
792
+ action_type=privacy_request.policy.get_action_type(), # type: ignore
793
+ )
785
794
  except (
786
795
  IdentityNotFoundException,
787
796
  MessageDispatchException,
788
797
  ) as e:
798
+ # Add error log for completion email failure
799
+ privacy_request.add_error_execution_log(
800
+ session,
801
+ connection_key=None,
802
+ dataset_name="Privacy request completion email",
803
+ collection_name=None,
804
+ message=f"Privacy request completion email failed: {str(e)}",
805
+ action_type=privacy_request.policy.get_action_type(), # type: ignore
806
+ )
789
807
  privacy_request.error_processing(db=session)
790
808
  # If dev mode, log traceback
791
809
  _log_exception(e, CONFIG.dev_mode)
@@ -19,6 +19,7 @@ from fides.config import CONFIG, FidesConfig
19
19
  MESSAGING_QUEUE_NAME = "fidesops.messaging"
20
20
  PRIVACY_PREFERENCES_QUEUE_NAME = "fides.privacy_preferences" # This queue is used in Fidesplus for saving privacy preferences and notices served
21
21
  DSR_QUEUE_NAME = "fides.dsr" # This queue is used for running data subject requests
22
+ CONSENT_WEBHOOK_QUEUE_NAME = "fidesplus.consent_webhooks" # This queue is used for processing consent webhooks from 3rd-party APIs
22
23
  DISCOVERY_MONITORS_DETECTION_QUEUE_NAME = "fidesplus.discovery_monitors_detection" # This queue is used for running discovery monitors detection tasks
23
24
  DISCOVERY_MONITORS_CLASSIFICATION_QUEUE_NAME = "fidesplus.discovery_monitors_classification" # This queue is used for running discovery monitors classification tasks
24
25
  DISCOVERY_MONITORS_PROMOTION_QUEUE_NAME = "fidesplus.discovery_monitors_promotion" # This queue is used for running discovery monitors promotion tasks