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

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

Potentially problematic release.


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

Files changed (332) hide show
  1. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/RECORD +267 -239
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
  5. fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
  6. fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
  7. fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
  8. fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
  9. fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
  10. fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
  11. fides/api/api/v1/endpoints/system.py +140 -55
  12. fides/api/db/base.py +3 -0
  13. fides/api/db/seed.py +34 -0
  14. fides/api/main.py +2 -0
  15. fides/api/models/asset.py +3 -0
  16. fides/api/models/detection_discovery/web_monitor.py +61 -0
  17. fides/api/models/event_audit.py +68 -0
  18. fides/api/models/messaging.py +30 -10
  19. fides/api/models/sql_models.py +8 -0
  20. fides/api/models/system_group.py +85 -0
  21. fides/api/models/taxonomy.py +16 -4
  22. fides/api/schemas/application_config.py +4 -1
  23. fides/api/schemas/messaging/messaging.py +33 -66
  24. fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
  25. fides/api/schemas/messaging/shared_schemas.py +102 -0
  26. fides/api/schemas/saas/saas_config.py +2 -17
  27. fides/api/schemas/saas/strategy_configuration.py +12 -0
  28. fides/api/schemas/system.py +8 -0
  29. fides/api/service/async_dsr/async_dsr_service.py +130 -10
  30. fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
  31. fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
  32. fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
  33. fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
  34. fides/api/service/connectors/saas_connector.py +25 -7
  35. fides/api/service/deps.py +17 -2
  36. fides/api/service/messaging/message_dispatch_service.py +16 -15
  37. fides/api/service/messaging/messaging_crud_service.py +5 -9
  38. fides/api/service/privacy_request/request_runner_service.py +18 -0
  39. fides/api/service/privacy_request/request_service.py +29 -20
  40. fides/api/service/strategy.py +6 -3
  41. fides/api/task/graph_task.py +1 -2
  42. fides/api/tasks/__init__.py +1 -0
  43. fides/api/util/filter_utils.py +0 -3
  44. fides/api/worker/__init__.py +2 -0
  45. fides/common/api/v1/urn_registry.py +2 -1
  46. fides/service/event_audit_service.py +115 -0
  47. fides/service/messaging/aws_ses_service.py +2 -4
  48. fides/service/system/__init__.py +0 -0
  49. fides/service/system/system_service.py +138 -0
  50. fides/service/taxonomy/taxonomy_service.py +49 -3
  51. fides/ui-build/static/admin/404.html +1 -1
  52. fides/ui-build/static/admin/_next/static/86A8z6OnbTuDYww0DJkX0/_buildManifest.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/1115-d5a834cdaa717edc.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/155-b5e4370b158e5ee3.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/1817-dc2bba3ca736d39e.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/1841-2052c3239f2a0a1a.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/2040-3f9c66c56a05b336.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/2751-58285ccf50a0ba4b.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/3377-c5e0cc3de1a5ffd1.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/3696-fff4f944d7d5ff20.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-8377b3fcbb3d93b0.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/3872-4786ccbe7c6f65b0.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/409-e1deab19fc7e6d99.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/4230-c55d5531697a715c.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/4608-2fbc3389681f6924.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/4786-8d78ec773d171562.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/5185-a219b390ef17ff4b.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/5309-e994c5195f99b1eb.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/5783-c62c79e7be21be73.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/6084-29cbe703bffdccfe.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/6416-79eee298a5b3f80f.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/6780-eeb7775eb21d7a12.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-91a8641cd2784b54.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/6882-55dbb142f7c40f53.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/6954-6dfafd38b02d5852.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/7476-3da7a490debad8e2.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/7630-22f9c4b25d6aed29.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/7725-b2fa93d747d3d85d.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/7929-4314e317b1717257.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/796-8e4da90ae82dfebb.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/8002-78d78545309b2c1c.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/8373-bd50fa53cbcab2aa.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/9046-0f92802b0e3382a9.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/9226-49dbcdb135bf9793.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/9826-f316eb1d61cb90b6.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-c389c51ca6353035.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-c780470042750062.js} +10 -10
  90. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-fb9434d926ebf0b3.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-92034daafd2187a0.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-87919c1192e68b1a.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-ae8a64fffe3f8c66.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-d7d9ff9ed28fa790.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-c985ea8c1a0e0550.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-ddf6ba92355f81de.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/consent-35c0ae9d5b5a940c.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-6a196c704f1c6dd7.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-06ba907e7d91a724.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-9cee4e222ebb2b60.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-f99af5669b9ab44c.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-db7f1a269d3e7fc2.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-de957913f9b47daa.js +1 -0
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-5868591ff1e5f881.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-715064e1c9788e1a.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-9ae81f5c245b8a01.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-6537c93c69b597c7.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-5db26067d921a94a.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-9f6a62614d7eb113.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-aed0e6dafc143b97.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-72b9878ea9b91529.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-f36a46381a6c25d4.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b653fd60e7db989b.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5bb96c8684a38bbf.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-639046f6c76bc8bd.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-6bf117315d909ad1.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-1e2fa11f22dbc449.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-c55e3e0e19030f3f.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/index-d66ea87b457af21e.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-0159fbb2e0440709.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-267d2742fffaebe5.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-670b05b03ba11e0a.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-482a7256925a6e06.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-331147598052f25c.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-28083bfb2dec7b9f.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-e02dc4b4b385c86f.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-74c2a0ff4c992633.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-7459d56e548925b2.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-aed018025b09c045.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-7f2c50044806c094.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-e8cab942d09aa358.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-128f952a49a0e8dc.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-cca3d1a26e1269bb.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-07e1b9937a169e32.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-3bc799dac8423f50.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-9f36b6c213ae524c.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-f8887b2b29aed1b9.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-5473558807e94462.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-1065fbefd449719c.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3e23d92d789fff99.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-907bfbb71d84646f.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-aa1ada4d4ac09759.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-02b0dde03a1ad159.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/chunks/pages/systems-4a6ef2509e8cedfc.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-16b122b83e57bb8c.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-6304dad2c5fab694.js} +1 -1
  149. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-0a8ec3aa2ed59a33.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-4036b023366b7eec.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.css +1 -0
  152. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  153. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  154. fides/ui-build/static/admin/add-systems.html +1 -1
  155. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  156. fides/ui-build/static/admin/consent/configure.html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  158. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  159. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  160. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  161. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  162. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  163. fides/ui-build/static/admin/consent/properties.html +1 -1
  164. fides/ui-build/static/admin/consent/reporting.html +1 -1
  165. fides/ui-build/static/admin/consent.html +1 -1
  166. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  167. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  168. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  169. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  170. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  171. fides/ui-build/static/admin/data-catalog.html +1 -1
  172. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  173. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  174. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  175. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  176. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  177. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  178. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  179. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  180. fides/ui-build/static/admin/datamap.html +1 -1
  181. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  182. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  183. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  184. fides/ui-build/static/admin/dataset/new.html +1 -1
  185. fides/ui-build/static/admin/dataset.html +1 -1
  186. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  187. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  188. fides/ui-build/static/admin/datastore-connection.html +1 -1
  189. fides/ui-build/static/admin/index.html +1 -1
  190. fides/ui-build/static/admin/integrations/[id].html +1 -1
  191. fides/ui-build/static/admin/integrations.html +1 -1
  192. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  193. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  194. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  195. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  196. fides/ui-build/static/admin/lib/fides.js +2 -2
  197. fides/ui-build/static/admin/login/[provider].html +1 -1
  198. fides/ui-build/static/admin/login.html +1 -1
  199. fides/ui-build/static/admin/messaging/[id].html +1 -1
  200. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  201. fides/ui-build/static/admin/messaging.html +1 -1
  202. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  203. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  204. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  205. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  206. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  207. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  208. fides/ui-build/static/admin/poc/forms.html +1 -1
  209. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  210. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  211. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  212. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  213. fides/ui-build/static/admin/privacy-requests.html +1 -1
  214. fides/ui-build/static/admin/properties/[id].html +1 -1
  215. fides/ui-build/static/admin/properties/add-property.html +1 -1
  216. fides/ui-build/static/admin/properties.html +1 -1
  217. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  218. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  219. fides/ui-build/static/admin/settings/about.html +1 -1
  220. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  221. fides/ui-build/static/admin/settings/consent.html +1 -1
  222. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  223. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  224. fides/ui-build/static/admin/settings/domains.html +1 -1
  225. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  226. fides/ui-build/static/admin/settings/locations.html +1 -1
  227. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -0
  228. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -0
  229. fides/ui-build/static/admin/settings/messaging-providers.html +1 -0
  230. fides/ui-build/static/admin/settings/organization.html +1 -1
  231. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  232. fides/ui-build/static/admin/settings/regulations.html +1 -1
  233. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  234. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  235. fides/ui-build/static/admin/systems.html +1 -1
  236. fides/ui-build/static/admin/taxonomy.html +1 -1
  237. fides/ui-build/static/admin/user-management/new.html +1 -1
  238. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  239. fides/ui-build/static/admin/user-management.html +1 -1
  240. fides/ui-build/static/admin/_next/static/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/5258-e880b606a2293803.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/9826-dbae8dee941a7fac.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-dfd71c1e9c458b89.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7cdc42ec5493b83d.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-5d40db1ce8810e1d.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
  303. fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
  304. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
  305. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/WHEEL +0 -0
  306. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/entry_points.txt +0 -0
  307. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/licenses/LICENSE +0 -0
  308. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/top_level.txt +0 -0
  309. /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → 86A8z6OnbTuDYww0DJkX0}/_ssgManifest.js +0 -0
  310. /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-cdc7a13973f4a0ba.js} +0 -0
  311. /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-db57401384d1de8f.js} +0 -0
  312. /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-4e56e924f35317f2.js} +0 -0
  313. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-e4a1f93a7ce944f0.js} +0 -0
  314. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-a4f821c4902f2df8.js} +0 -0
  315. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-96245b63aafc5168.js} +0 -0
  316. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-4fea66e59bd59de8.js} +0 -0
  317. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-c8038e05f35da8d1.js} +0 -0
  318. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-f3a40101a8f3fd00.js} +0 -0
  319. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-965af6c1fd01334e.js} +0 -0
  320. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-5afecf141308bfc5.js} +0 -0
  321. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-4352e55f110556b4.js} +0 -0
  322. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-c533120e94e049e3.js} +0 -0
  323. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-b14f5f38b2d711a8.js} +0 -0
  324. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-31d51e3b9227c8d5.js} +0 -0
  325. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-8794a0d2e7554a05.js} +0 -0
  326. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-90b31073e478c99c.js} +0 -0
  327. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-0a6859a0225b7e00.js} +0 -0
  328. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-eb0552917907fe21.js} +0 -0
  329. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-b2a2a084d8cfe22d.js} +0 -0
  330. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-0c944cfa9c6acbff.js} +0 -0
  331. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-f0f0ea35d0185ae3.js} +0 -0
  332. /fides/ui-build/static/admin/_next/static/chunks/{webpack-678e89d68dbcd94f.js → webpack-55e1c55932df2413.js} +0 -0
fides/api/main.py CHANGED
@@ -45,6 +45,7 @@ from fides.api.service.privacy_request.email_batch_service import (
45
45
  initiate_scheduled_batch_email_send,
46
46
  )
47
47
  from fides.api.service.privacy_request.request_service import (
48
+ initiate_async_tasks_status_polling,
48
49
  initiate_interrupted_task_requeue_poll,
49
50
  initiate_poll_for_exited_privacy_request_tasks,
50
51
  initiate_scheduled_dsr_data_removal,
@@ -102,6 +103,7 @@ async def lifespan(wrapped_app: FastAPI) -> AsyncGenerator[None, None]:
102
103
  initiate_poll_for_exited_privacy_request_tasks()
103
104
  initiate_scheduled_dsr_data_removal()
104
105
  initiate_interrupted_task_requeue_poll()
106
+ initiate_async_tasks_status_polling()
105
107
  initiate_bcrypt_migration_task()
106
108
  initiate_post_upgrade_index_creation()
107
109
 
fides/api/models/asset.py CHANGED
@@ -29,9 +29,12 @@ class ConsentStatus(str, Enum):
29
29
  Consent status of the asset
30
30
  """
31
31
 
32
+ cmp_error = "cmp_error"
33
+ pre_consent = "pre_consent"
32
34
  with_consent = "with_consent"
33
35
  without_consent = "without_consent"
34
36
  exempt = "exempt"
37
+ not_applicable = "not_applicable"
35
38
  unknown = "unknown"
36
39
 
37
40
 
@@ -0,0 +1,61 @@
1
+ from typing import Any, Optional
2
+
3
+ from sqlalchemy import Boolean, Column, String, insert, select
4
+ from sqlalchemy.dialects.postgresql import JSONB
5
+ from sqlalchemy.ext.asyncio import AsyncSession
6
+ from sqlalchemy.ext.declarative import declared_attr
7
+
8
+ from fides.api.db.base_class import Base
9
+
10
+
11
+ class WebMonitorGroupJob(Base):
12
+ """SQL model for storing data returned from a web monitor group job"""
13
+
14
+ @declared_attr
15
+ def __tablename__(self) -> str:
16
+ return "web_monitor_group_job"
17
+
18
+ # The id for the web monitor group on the web monitor service
19
+ group_id = Column(String, nullable=False, unique=True)
20
+
21
+ # The raw experiences data obtained for that group from the web monitor service
22
+ raw_experiences_data = Column(JSONB, nullable=True)
23
+ # The processed experiences data, used to calculate an StagedResource's consent status
24
+ processed_experiences_data = Column(JSONB, nullable=True)
25
+
26
+ # Whether this data is from a test_website monitor rather than a real one
27
+ is_test_run = Column(Boolean, nullable=False, default=False)
28
+
29
+ @classmethod
30
+ async def create_async(
31
+ cls,
32
+ async_session: AsyncSession,
33
+ *,
34
+ group_id: str,
35
+ is_test_run: Optional[bool] = False,
36
+ raw_experiences_data: Optional[dict[str, Any]] = None,
37
+ processed_experiences_data: Optional[dict[str, Any]] = None,
38
+ ) -> "WebMonitorGroupJob":
39
+ """Create a new WebMonitorGroupJob"""
40
+ values = {
41
+ "group_id": group_id,
42
+ "is_test_run": is_test_run,
43
+ "raw_experiences_data": raw_experiences_data,
44
+ "processed_experiences_data": processed_experiences_data,
45
+ }
46
+ stmt = insert(cls.__table__).values(**values).returning(*cls.__table__.columns)
47
+ result = await async_session.execute(stmt)
48
+ row = result.first()
49
+ return cls(**dict(row))
50
+
51
+ @classmethod
52
+ async def get_by_group_id_async(
53
+ cls, async_session: AsyncSession, group_id: str
54
+ ) -> Optional["WebMonitorGroupJob"]:
55
+ """Get a WebMonitorGroupJob by group_id"""
56
+ stmt = select(*cls.__table__.columns).where(
57
+ cls.__table__.c.group_id == group_id
58
+ )
59
+ result = await async_session.execute(stmt)
60
+ row = result.first()
61
+ return cls(**dict(row)) if row else None
@@ -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()
@@ -461,6 +461,14 @@ class System(Base, FidesBase):
461
461
  "Asset", back_populates="system", lazy="selectin", uselist=True, viewonly=True
462
462
  )
463
463
 
464
+ system_groups = relationship(
465
+ "SystemGroup",
466
+ secondary="system_group_member",
467
+ back_populates="systems",
468
+ lazy="selectin",
469
+ viewonly=True,
470
+ )
471
+
464
472
  @classmethod
465
473
  def get_data_uses(
466
474
  cls: Type[System], systems: List[System], include_parents: bool = True
@@ -0,0 +1,85 @@
1
+ from enum import Enum
2
+
3
+ from citext import CIText
4
+ from sqlalchemy import ARRAY, Column
5
+ from sqlalchemy import Enum as EnumColumn
6
+ from sqlalchemy import ForeignKey, String, UniqueConstraint
7
+ from sqlalchemy.ext.declarative import declared_attr
8
+ from sqlalchemy.orm import relationship
9
+
10
+ from fides.api.db.base_class import Base
11
+ from fides.api.models.fides_user import FidesUser
12
+ from fides.api.models.sql_models import System # type: ignore[attr-defined]
13
+
14
+
15
+ class CustomTaxonomyColor(str, Enum):
16
+ WHITE = "taxonomy_white"
17
+ RED = "taxonomy_red"
18
+ ORANGE = "taxonomy_orange"
19
+ YELLOW = "taxonomy_yellow"
20
+ GREEN = "taxonomy_green"
21
+ BLUE = "taxonomy_blue"
22
+ PURPLE = "taxonomy_purple"
23
+ SANDSTONE = "sandstone"
24
+ MINOS = "minos"
25
+
26
+
27
+ class SystemGroup(Base):
28
+ @declared_attr
29
+ def __tablename__(self) -> str:
30
+ return "system_group"
31
+
32
+ fides_key = Column(
33
+ String,
34
+ ForeignKey("taxonomy_element.fides_key", ondelete="CASCADE"),
35
+ nullable=False,
36
+ unique=True,
37
+ index=True,
38
+ )
39
+ label_color = Column(
40
+ EnumColumn(CustomTaxonomyColor, values_callable=lambda x: [i.value for i in x]),
41
+ nullable=True,
42
+ )
43
+ data_steward_username = Column(
44
+ CIText,
45
+ ForeignKey(FidesUser.username, ondelete="SET NULL"),
46
+ index=True,
47
+ nullable=True,
48
+ )
49
+ data_uses = Column(
50
+ ARRAY(String),
51
+ nullable=False,
52
+ server_default="{}",
53
+ default=list,
54
+ ) # a list of `fides_key`s of `DataUse` records
55
+ data_steward = relationship(
56
+ "FidesUser", foreign_keys=[data_steward_username], lazy="selectin"
57
+ )
58
+
59
+ systems = relationship(
60
+ System,
61
+ secondary="system_group_member",
62
+ back_populates="system_groups",
63
+ viewonly=True,
64
+ )
65
+
66
+
67
+ class SystemGroupMember(Base):
68
+ @declared_attr
69
+ def __tablename__(self) -> str:
70
+ return "system_group_member"
71
+
72
+ system_group_id = Column(
73
+ String(255), ForeignKey("system_group.id", ondelete="CASCADE"), index=True
74
+ )
75
+ system_id = Column(
76
+ String(255), ForeignKey("ctl_systems.id", ondelete="CASCADE"), index=True
77
+ )
78
+
79
+ __table_args__ = (
80
+ UniqueConstraint(
81
+ "system_group_id",
82
+ "system_id",
83
+ name="uq_system_group_member_group_system",
84
+ ),
85
+ )
@@ -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
+ ]