ethyca-fides 2.69.3b1__py2.py3-none-any.whl → 2.70.0__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 (324) hide show
  1. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/RECORD +254 -232
  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/api/v1/endpoints/privacy_request_endpoints.py +87 -23
  10. fides/api/db/base.py +1 -0
  11. fides/api/db/seed.py +34 -0
  12. fides/api/models/asset.py +1 -0
  13. fides/api/models/event_audit.py +68 -0
  14. fides/api/models/messaging.py +30 -10
  15. fides/api/models/taxonomy.py +16 -4
  16. fides/api/schemas/application_config.py +4 -1
  17. fides/api/schemas/messaging/messaging.py +33 -66
  18. fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
  19. fides/api/schemas/messaging/shared_schemas.py +102 -0
  20. fides/api/schemas/privacy_center_config.py +29 -5
  21. fides/api/service/deps.py +10 -2
  22. fides/api/service/messaging/message_dispatch_service.py +16 -15
  23. fides/api/service/messaging/messaging_crud_service.py +5 -9
  24. fides/api/service/privacy_request/request_runner_service.py +18 -0
  25. fides/api/tasks/__init__.py +1 -0
  26. fides/api/util/cache.py +1 -1
  27. fides/api/worker/__init__.py +2 -0
  28. fides/common/api/v1/urn_registry.py +2 -1
  29. fides/service/event_audit_service.py +115 -0
  30. fides/service/messaging/aws_ses_service.py +2 -4
  31. fides/service/taxonomy/taxonomy_service.py +49 -3
  32. fides/ui-build/static/admin/404.html +1 -1
  33. fides/ui-build/static/admin/_next/static/chunks/1115-7888473b3dc28cda.js +1 -0
  34. fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/1817-ee9e29a6b8c4af50.js +1 -0
  36. fides/ui-build/static/admin/_next/static/chunks/2040-ab6212a3074f34f9.js +1 -0
  37. fides/ui-build/static/admin/_next/static/chunks/2121.1de2fa060eae34aa.js +1 -0
  38. fides/ui-build/static/admin/_next/static/chunks/3585-451504ea5ed7a1ea.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/3696-c25dc8d1b0e1aee1.js +1 -0
  40. fides/ui-build/static/admin/_next/static/chunks/3700-2a7094f112a1608a.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/3855-12ee1dfbbe47fd28.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/3872-3514b712afd683c0.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/409-c1256ecda1b15db6.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/4558-de5ced790b3380dc.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/4608-96f480766541124b.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/4718-6585c97c26647e65.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/502-a40d39e615f7b664.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/504-afd3588f1908ac33.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/5185-33f50cf9ae17b42e.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/5574-b8c4cba5a6938c00.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/{5596-bb601cbf40e47a0f.js → 5596-29a7c8322530b7cf.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/5698.2135391a128cc373.js +164 -0
  55. fides/ui-build/static/admin/_next/static/chunks/5783-8de76df87af55e98.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/6084-2cd165179c428a6f.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/6416-18d438ff85d807f8.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/6882-447f15e87b8c48a5.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/7045-f15044a4d4525946.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/7158-835ba42fd881d8dd.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/7202.3febe9e89640c712.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/7476-0b6e114658b15eaa.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/7630-e7ea13be69c118a1.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/7725-dd6736855807936a.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/796-e07ac2c543f569e3.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/8002-25fd174aec9b077b.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/9046-2a332fe338535c84.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/9226-2f960b7ca530642a.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/{9676.9fd9552ef744c717.js → 9676.b86ecbcfe5afd25d.js} +1 -1
  72. fides/ui-build/static/admin/_next/static/chunks/9826-c02be5882205bbbc.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/{9951-0c8a80f01e431957.js → 9951-651d521d9a02b6df.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-a653cee14ce2366b.js → _app-302177edeb0dc4f5.js} +63 -226
  75. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-adaec1ec185160af.js → manual-939253f8daf349b2.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-f90aa48500c1cbde.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-c0db068d1863222f.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-59a8aff5935482ec.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-17cdca29c6d4cdd6.js → properties-069f4e3ee96ebf77.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-09be5455ba85db39.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/pages/consent-e5a33654a2dfaf35.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-d0dbba5bff738b57.js → [resourceUrn]-293c1f2d9aefb447.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-be7b385073f22414.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-cfc118e68285405c.js → [resourceUrn]-18501152fa1e4f40.js} +1 -1
  85. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-351caadeef03876a.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-758d51b4d37dbd09.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0e4d9ff89c63793c.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-1554afcb8b9da2ab.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-2635ef588bf06145.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-0497f3ffdb632516.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-a780390da99f3e43.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-1901c26cdde820da.js} +1 -1
  93. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-0cea22af5929c81f.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-619f27c745188adb.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-ef71f387fbbab425.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-d790553662caf5c3.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-cb63db8594fe8dc1.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-78e052c8f95110c4.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-d6d7ee8bd8858a8a.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-785205655317b1d3.js → [id]-cc149157d290a94d.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-a6985f77afbc5bc0.js → new-4c9fb068a5561658.js} +1 -1
  102. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-a832084ce294f8af.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/index-269b8f81546dad66.js +1 -0
  104. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-8b13bb5f7bee61c6.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-6f109ef64304ef59.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-8566e3b7b2a632fa.js +1 -0
  107. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-1b38b656807ed0cd.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b00532a0ad4f6927.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-65f0d5672041a202.js +1 -0
  110. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-3d2a77cb07aa8dc0.js → [id]-322a01e2bceab3fb.js} +1 -1
  111. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-210e7e3b3d776d44.js → add-property-777ed2d73812043d.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-18257b6a70fa8a97.js → properties-08472b2a6bf1d392.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-5b423687e227ad4d.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-55e36839d219a503.js +1 -0
  117. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-26ce8fc493993765.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-7ddf9d992fe714a6.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-7c78ae51f0dd7102.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-05ffbda19ab894b9.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-b0d93bf478bf63ee.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-084f9756b9987285.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-6c51ffd46bb598e7.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-44456bfe54ac4ad5.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-fbe7e8030d837aed.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-a86bafe1b4e1205f.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-1895c6a13b543436.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/systems-e99fbd1b2d1bfd12.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-9ffcf98b8ad56bf7.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-6304dad2c5fab694.js} +1 -1
  131. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-763861f5eb207db5.js → [id]-ff4711db191099cd.js} +1 -1
  132. fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +1 -0
  133. fides/ui-build/static/admin/_next/static/v72X5v2wmNmYdDpd8p1YY/_buildManifest.js +1 -0
  134. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  135. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  136. fides/ui-build/static/admin/add-systems.html +1 -1
  137. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  138. fides/ui-build/static/admin/consent/configure.html +1 -1
  139. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  140. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  141. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  142. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  143. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  144. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  145. fides/ui-build/static/admin/consent/properties.html +1 -1
  146. fides/ui-build/static/admin/consent/reporting.html +1 -1
  147. fides/ui-build/static/admin/consent.html +1 -1
  148. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  149. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  150. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  151. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  152. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  153. fides/ui-build/static/admin/data-catalog.html +1 -1
  154. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  155. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  156. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  157. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  158. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  159. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  160. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  161. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  162. fides/ui-build/static/admin/datamap.html +1 -1
  163. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  164. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  165. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  166. fides/ui-build/static/admin/dataset/new.html +1 -1
  167. fides/ui-build/static/admin/dataset.html +1 -1
  168. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  169. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  170. fides/ui-build/static/admin/datastore-connection.html +1 -1
  171. fides/ui-build/static/admin/index.html +1 -1
  172. fides/ui-build/static/admin/integrations/[id].html +1 -1
  173. fides/ui-build/static/admin/integrations.html +1 -1
  174. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  175. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  176. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  177. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  178. fides/ui-build/static/admin/lib/fides.js +2 -2
  179. fides/ui-build/static/admin/login/[provider].html +1 -1
  180. fides/ui-build/static/admin/login.html +1 -1
  181. fides/ui-build/static/admin/messaging/[id].html +1 -1
  182. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  183. fides/ui-build/static/admin/messaging.html +1 -1
  184. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  185. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  186. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  187. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  188. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  189. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  190. fides/ui-build/static/admin/poc/forms.html +1 -1
  191. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  192. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  193. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  194. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  195. fides/ui-build/static/admin/privacy-requests.html +1 -1
  196. fides/ui-build/static/admin/properties/[id].html +1 -1
  197. fides/ui-build/static/admin/properties/add-property.html +1 -1
  198. fides/ui-build/static/admin/properties.html +1 -1
  199. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  200. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  201. fides/ui-build/static/admin/settings/about.html +1 -1
  202. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  203. fides/ui-build/static/admin/settings/consent.html +1 -1
  204. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  205. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  206. fides/ui-build/static/admin/settings/domains.html +1 -1
  207. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  208. fides/ui-build/static/admin/settings/locations.html +1 -1
  209. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -0
  210. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -0
  211. fides/ui-build/static/admin/settings/messaging-providers.html +1 -0
  212. fides/ui-build/static/admin/settings/organization.html +1 -1
  213. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  214. fides/ui-build/static/admin/settings/regulations.html +1 -1
  215. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  216. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  217. fides/ui-build/static/admin/systems.html +1 -1
  218. fides/ui-build/static/admin/taxonomy.html +1 -1
  219. fides/ui-build/static/admin/user-management/new.html +1 -1
  220. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  221. fides/ui-build/static/admin/user-management.html +1 -1
  222. fides/ui-build/static/admin/_next/static/_b75ACzlGNz3tZqGUPTE5/_buildManifest.js +0 -1
  223. fides/ui-build/static/admin/_next/static/chunks/1099-718ce18b9bd70cdb.js +0 -1
  224. fides/ui-build/static/admin/_next/static/chunks/1345-1961771e9619db39.js +0 -1
  225. fides/ui-build/static/admin/_next/static/chunks/1817-9423665774c2c08f.js +0 -1
  226. fides/ui-build/static/admin/_next/static/chunks/3620-34355b0c44325537.js +0 -1
  227. fides/ui-build/static/admin/_next/static/chunks/3642-c052564812532324.js +0 -1
  228. fides/ui-build/static/admin/_next/static/chunks/3729-c8accd71498f6fe4.js +0 -1
  229. fides/ui-build/static/admin/_next/static/chunks/3855-0565d44d150c985a.js +0 -1
  230. fides/ui-build/static/admin/_next/static/chunks/3872-c022bb7259a9f323.js +0 -1
  231. fides/ui-build/static/admin/_next/static/chunks/4164-cadb4c6528662248.js +0 -1
  232. fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +0 -1
  233. fides/ui-build/static/admin/_next/static/chunks/4608-caa9cb70fb66ac99.js +0 -1
  234. fides/ui-build/static/admin/_next/static/chunks/4786-d2b03ba5c82a02ed.js +0 -1
  235. fides/ui-build/static/admin/_next/static/chunks/4808-57c5ac15fd8b0d81.js +0 -1
  236. fides/ui-build/static/admin/_next/static/chunks/4831-c0d20b2a0b7332bb.js +0 -1
  237. fides/ui-build/static/admin/_next/static/chunks/4844-e5064a161a7e5a12.js +0 -1
  238. fides/ui-build/static/admin/_next/static/chunks/5258-0062e0a1e4f8c03e.js +0 -1
  239. fides/ui-build/static/admin/_next/static/chunks/5487-46774dc9df554af1.js +0 -1
  240. fides/ui-build/static/admin/_next/static/chunks/549-170c96caa601e15a.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/6084-2c7b81cbcae7e3b4.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/7476-fdd0eb08a12e0334.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/7630-8613916021366672.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/787-f2eca25837ff7305.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/79-68834fd07d69f428.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/796-8fbae2fc714e7a3a.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/8002-193a97fe4de8b779.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/9046-1afcfb1c4dbdd6c6.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/9826-d49a56431e896acb.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-0a2b2f4a30245089.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-b7b7fb3e8b2ea816.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-23d3e50db42f31b3.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-75be0acd400cf527.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/pages/consent-9b4e0a08ae6216c7.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-25c5916c8357f98d.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-9fa11c01b44ba8f1.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-fb16cb8fd2b3826f.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a481a5be96dede96.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6c65b86a61340753.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-7fe1ca395914f77f.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-ea1eabce2a3fc2c7.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-3c629aecee30c575.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-a13ea13e0316d5a2.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-a6ae353b3b1536cc.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-85b28db67d96f201.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-409fe1a086fb7d38.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-93d5c01dd927bad2.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/index-bf3042fdbfb12b3d.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-e545f8ef5c945f45.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-f297e6cdb9fe97b9.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-6e864b293571a508.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-0fc3f1f3b1cd6f2a.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-089c166287a89166.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-5a3cd9b14a37ef27.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-73be3cfaaa95ece4.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-adbea0f9fd21ff3a.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-b678e7577eef5e5c.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-3f3039c7e86cab2f.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-d502bf1e7580df06.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-b841d63011827b43.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-50f9b26c6907d6de.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-5ae0d30eb3b770ab.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-f5924e64a15a0dc3.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-88f6badc1bb38b97.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-d5f8db89c7e91a02.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0366184eda09a933.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-a659f18a30ef89f3.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/systems-f4bf47ed2c4746ba.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-2d9548cfa6086e8f.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/webpack-606818148553db7b.js +0 -1
  291. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
  292. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/WHEEL +0 -0
  293. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/entry_points.txt +0 -0
  294. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/licenses/LICENSE +0 -0
  295. {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/top_level.txt +0 -0
  296. /fides/ui-build/static/admin/_next/static/chunks/{2921-765918f8aa37fdb2.js → 2921-66f65496c3a09316.js} +0 -0
  297. /fides/ui-build/static/admin/_next/static/chunks/{3923-23df37eef17d6ea2.js → 3923-a551756b413367ea.js} +0 -0
  298. /fides/ui-build/static/admin/_next/static/chunks/{401-45f399d4d1325340.js → 401-ffe4e8436e1eceb9.js} +0 -0
  299. /fides/ui-build/static/admin/_next/static/chunks/{6853-8fb39280a8f0eb89.js → 6853-7004a8c420b1ca02.js} +0 -0
  300. /fides/ui-build/static/admin/_next/static/chunks/{6954-3b26ff8259c4d5c3.js → 6954-599f2de2c902e9b2.js} +0 -0
  301. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-8d9c703c96662265.js → 404-2eb8aed4939f1142.js} +0 -0
  302. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-20050dbae806179d.js → multiple-83ed7da0bb90b0a5.js} +0 -0
  303. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7b8cec88b5ad53d1.js → add-vendors-46b88bda3d7b15c5.js} +0 -0
  304. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-c30382719d6f797a.js → [id]-fd41ffaff543e05a.js} +0 -0
  305. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-dff842dbed2bc6c8.js → privacy-experience-92a337ee96845af2.js} +0 -0
  306. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-074cdbfc678ba791.js → [id]-1fd2cda8707314f6.js} +0 -0
  307. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-bcddda632b4df409.js → new-2987e397445713c5.js} +0 -0
  308. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-8ffd8d148269d323.js → [projectUrn]-6a4b0d49dcbf17a8.js} +0 -0
  309. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-9b7e4b86b1e8a40a.js → resources-af80fdca3bbdc82f.js} +0 -0
  310. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-f03f1fdaa1f5a0c6.js → [id]-d8c5c03fb2f31d65.js} +0 -0
  311. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-8f90e275e932940b.js → add-template-0e0c06e3c8aabe02.js} +0 -0
  312. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-68385a251c7ade5f.js → messaging-3f15804cf9625f01.js} +0 -0
  313. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-fc7d652910f3ad8d.js → ant-components-248ad9f65a872442.js} +0 -0
  314. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-fb6e6f4b276b6189.js → AntForm-aedb66a62042b10a.js} +0 -0
  315. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-00869abf79950a9a.js → FormikAntFormItem-018df38b7cd77fdb.js} +0 -0
  316. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-5716d749236c9f70.js → FormikControlled-6ca9099d03aab817.js} +0 -0
  317. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-d6dfb9daa3935db3.js → FormikField-0f2c90786ea005a4.js} +0 -0
  318. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-9697549bce7060be.js → forms-200b51a725f8b2d1.js} +0 -0
  319. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-888656ae0bd40f62.js → table-migration-e551fccfcaae76e7.js} +0 -0
  320. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-c64b87694eda4785.js → [purpose_id]-f3e6e74e0efb005c.js} +0 -0
  321. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-e29384f7a3db5221.js → locations-77fb85bdd0be42b5.js} +0 -0
  322. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-46d06037fcadaf00.js → regulations-2866ac99faa5a542.js} +0 -0
  323. /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-98a3277820e232c7.js → user-management-82fcf1151e2fe2ba.js} +0 -0
  324. /fides/ui-build/static/admin/_next/static/{_b75ACzlGNz3tZqGUPTE5 → v72X5v2wmNmYdDpd8p1YY}/_ssgManifest.js +0 -0
@@ -269,27 +269,30 @@ def privacy_request_csv_download(
269
269
  f = io.StringIO()
270
270
  csv_file = csv.writer(f)
271
271
 
272
+ privacy_request_ids: List[str] = [r.id for r in privacy_request_query]
273
+ denial_audit_log_query: Query = db.query(AuditLog).filter(
274
+ AuditLog.action == AuditLogAction.denied,
275
+ AuditLog.privacy_request_id.in_(privacy_request_ids),
276
+ )
277
+ denial_audit_logs: Dict[str, str] = {
278
+ r.privacy_request_id: r.message for r in denial_audit_log_query
279
+ }
280
+
281
+ identity_columns, custom_field_columns = get_variable_columns(privacy_request_query)
282
+
272
283
  csv_file.writerow(
273
284
  [
274
285
  "Status",
275
286
  "Request Type",
276
- "Subject Identity",
277
- "Custom Privacy Request Fields",
278
287
  "Time Received",
279
288
  "Reviewed By",
280
289
  "Request ID",
281
290
  "Time Approved/Denied",
282
291
  "Denial Reason",
283
292
  ]
293
+ + identity_columns
294
+ + with_prefix("Custom Field", list(custom_field_columns.values()))
284
295
  )
285
- privacy_request_ids: List[str] = [r.id for r in privacy_request_query]
286
- denial_audit_log_query: Query = db.query(AuditLog).filter(
287
- AuditLog.action == AuditLogAction.denied,
288
- AuditLog.privacy_request_id.in_(privacy_request_ids),
289
- )
290
- denial_audit_logs: Dict[str, str] = {
291
- r.privacy_request_id: r.message for r in denial_audit_log_query
292
- }
293
296
 
294
297
  for pr in privacy_request_query:
295
298
  denial_reason = (
@@ -298,19 +301,22 @@ def privacy_request_csv_download(
298
301
  else None
299
302
  )
300
303
 
301
- csv_file.writerow(
302
- [
303
- pr.status.value if pr.status else None,
304
- pr.policy.rules[0].action_type if len(pr.policy.rules) > 0 else None,
305
- pr.get_persisted_identity().model_dump(mode="json"),
306
- pr.get_persisted_custom_privacy_request_fields(),
307
- pr.created_at,
308
- pr.reviewed_by,
309
- pr.id,
310
- pr.reviewed_at,
311
- denial_reason,
312
- ]
313
- )
304
+ static_cells = [
305
+ pr.status.value if pr.status else None,
306
+ pr.policy.rules[0].action_type if len(pr.policy.rules) > 0 else None,
307
+ pr.created_at,
308
+ pr.reviewed_by,
309
+ pr.id,
310
+ pr.reviewed_at,
311
+ denial_reason,
312
+ ]
313
+
314
+ identity_cells = extract_identity_cells(identity_columns, pr)
315
+ custom_field_cells = extract_custom_field_cells(custom_field_columns, pr)
316
+
317
+ row = static_cells + identity_cells + custom_field_cells
318
+
319
+ csv_file.writerow(row)
314
320
 
315
321
  f.seek(0)
316
322
  response = StreamingResponse(f, media_type="text/csv")
@@ -320,6 +326,64 @@ def privacy_request_csv_download(
320
326
  return response
321
327
 
322
328
 
329
+ def get_variable_columns(
330
+ privacy_request_query: Query,
331
+ ) -> tuple[List[str], Dict[str, str]]:
332
+ identity_columns: Set[str] = set()
333
+ custom_field_columns: Dict[str, str] = {}
334
+
335
+ for pr in privacy_request_query:
336
+ identity_columns.update(
337
+ extract_identity_column_names(pr.get_persisted_identity().model_dump())
338
+ )
339
+ custom_field_columns.update(
340
+ extract_custom_field_column_names(
341
+ pr.get_persisted_custom_privacy_request_fields()
342
+ )
343
+ )
344
+
345
+ return list(identity_columns), custom_field_columns
346
+
347
+
348
+ def extract_identity_column_names(identities: dict[str, Any]) -> Set[str]:
349
+ """Extract column names from identity data that have non-empty values."""
350
+ return {key for key, value in identities.items() if value}
351
+
352
+
353
+ def extract_custom_field_column_names(custom_fields: dict[str, Any]) -> Dict[str, str]:
354
+ """Extract column names and labels from custom field data that have non-empty values."""
355
+ return {
356
+ key: value["label"]
357
+ for key, value in custom_fields.items()
358
+ if value.get("value")
359
+ }
360
+
361
+
362
+ def with_prefix(prefix: str, items: List[str]) -> List[str]:
363
+ return [f"{prefix} {item}" for item in items]
364
+
365
+
366
+ def extract_custom_field_cells(
367
+ custom_field_columns: Dict[str, str], pr: PrivacyRequest
368
+ ) -> List[str]:
369
+ custom_fields = pr.get_persisted_custom_privacy_request_fields()
370
+ return [
371
+ custom_fields.get(custom_field_column, {}).get("value")
372
+ for custom_field_column in custom_field_columns
373
+ ]
374
+
375
+
376
+ def extract_identity_cells(
377
+ identity_columns: List[str], pr: PrivacyRequest
378
+ ) -> List[str]:
379
+ identity = pr.get_persisted_identity()
380
+ identity_dict = identity.model_dump()
381
+ return [
382
+ identity_dict.get(identity_column) # type: ignore
383
+ for identity_column in identity_columns
384
+ ]
385
+
386
+
323
387
  def execution_and_audit_logs_by_dataset_name(
324
388
  self: PrivacyRequest,
325
389
  ) -> DefaultDict[str, List[Union["AuditLog", "ExecutionLog"]]]:
fides/api/db/base.py CHANGED
@@ -22,6 +22,7 @@ from fides.api.models.detection_discovery.monitor_task import (
22
22
  MonitorTaskExecutionLog,
23
23
  )
24
24
  from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
25
+ from fides.api.models.event_audit import EventAudit
25
26
  from fides.api.models.experience_notices import ExperienceNotices
26
27
  from fides.api.models.fides_cloud import FidesCloud
27
28
  from fides.api.models.fides_user import FidesUser
fides/api/db/seed.py CHANGED
@@ -2,6 +2,7 @@
2
2
  Provides functions that seed the application with data.
3
3
  """
4
4
 
5
+ import os
5
6
  from typing import Dict, List, Optional
6
7
 
7
8
  from fideslang.default_taxonomy import DEFAULT_TAXONOMY
@@ -17,6 +18,7 @@ from fides.api.common_exceptions import KeyOrNameAlreadyExists
17
18
  from fides.api.db.base_class import FidesBase
18
19
  from fides.api.db.ctl_session import sync_session
19
20
  from fides.api.db.system import upsert_system
21
+ from fides.api.models.application_config import ApplicationConfig
20
22
  from fides.api.models.client import ClientDetail
21
23
  from fides.api.models.connectionconfig import ConnectionConfig
22
24
  from fides.api.models.datasetconfig import DatasetConfig
@@ -37,7 +39,16 @@ from fides.api.schemas.connection_configuration.saas_config_template_values impo
37
39
  SaasConnectionTemplateValues,
38
40
  )
39
41
  from fides.api.schemas.dataset import DatasetConfigCtlDataset
42
+ from fides.api.schemas.messaging.messaging import (
43
+ MessagingConfigRequest,
44
+ MessagingServiceDetailsMailgun,
45
+ MessagingServiceType,
46
+ )
47
+ from fides.api.schemas.messaging.shared_schemas import MessagingSecretsMailgunDocs
40
48
  from fides.api.schemas.policy import ActionType, DrpAction
49
+ from fides.api.service.messaging.messaging_crud_service import (
50
+ create_or_update_messaging_config,
51
+ )
41
52
  from fides.api.util.connection_util import patch_connection_configs
42
53
  from fides.api.util.data_category import get_user_data_categories
43
54
  from fides.api.util.errors import AlreadyExistsError, QueryError
@@ -486,6 +497,29 @@ async def load_samples(async_session: AsyncSession) -> None:
486
497
  except QueryError: # pragma: no cover
487
498
  pass # The upsert_resources function will log any error
488
499
 
500
+ if os.getenv("MAILGUN_DOMAIN") and os.getenv("MAILGUN_API_KEY"):
501
+ log.info("Loading Mailgun messaging config")
502
+ with sync_session() as db:
503
+ messaging_config = create_or_update_messaging_config(
504
+ db=db,
505
+ config=MessagingConfigRequest(
506
+ key="my_mailgun_config",
507
+ name="Mailgun",
508
+ service_type=MessagingServiceType.mailgun,
509
+ details=MessagingServiceDetailsMailgun(
510
+ domain=os.getenv("MAILGUN_DOMAIN")
511
+ ),
512
+ ),
513
+ )
514
+ messaging_config.set_secrets(
515
+ db=db,
516
+ messaging_secrets=MessagingSecretsMailgunDocs(
517
+ mailgun_api_key=os.getenv("MAILGUN_API_KEY")
518
+ ),
519
+ )
520
+ CONFIG.notifications.notification_service_type = "mailgun"
521
+ ApplicationConfig.update_config_set(db, CONFIG)
522
+
489
523
 
490
524
  def load_default_organization(db: Session) -> None:
491
525
  """
fides/api/models/asset.py CHANGED
@@ -34,6 +34,7 @@ class ConsentStatus(str, Enum):
34
34
  with_consent = "with_consent"
35
35
  without_consent = "without_consent"
36
36
  exempt = "exempt"
37
+ not_applicable = "not_applicable"
37
38
  unknown = "unknown"
38
39
 
39
40
 
@@ -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,