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.
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/METADATA +1 -1
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/RECORD +267 -239
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
- fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
- fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
- fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
- fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
- fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
- fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
- fides/api/api/v1/endpoints/system.py +140 -55
- fides/api/db/base.py +3 -0
- fides/api/db/seed.py +34 -0
- fides/api/main.py +2 -0
- fides/api/models/asset.py +3 -0
- fides/api/models/detection_discovery/web_monitor.py +61 -0
- fides/api/models/event_audit.py +68 -0
- fides/api/models/messaging.py +30 -10
- fides/api/models/sql_models.py +8 -0
- fides/api/models/system_group.py +85 -0
- fides/api/models/taxonomy.py +16 -4
- fides/api/schemas/application_config.py +4 -1
- fides/api/schemas/messaging/messaging.py +33 -66
- fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
- fides/api/schemas/messaging/shared_schemas.py +102 -0
- fides/api/schemas/saas/saas_config.py +2 -17
- fides/api/schemas/saas/strategy_configuration.py +12 -0
- fides/api/schemas/system.py +8 -0
- fides/api/service/async_dsr/async_dsr_service.py +130 -10
- fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
- fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
- fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
- fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
- fides/api/service/connectors/saas_connector.py +25 -7
- fides/api/service/deps.py +17 -2
- fides/api/service/messaging/message_dispatch_service.py +16 -15
- fides/api/service/messaging/messaging_crud_service.py +5 -9
- fides/api/service/privacy_request/request_runner_service.py +18 -0
- fides/api/service/privacy_request/request_service.py +29 -20
- fides/api/service/strategy.py +6 -3
- fides/api/task/graph_task.py +1 -2
- fides/api/tasks/__init__.py +1 -0
- fides/api/util/filter_utils.py +0 -3
- fides/api/worker/__init__.py +2 -0
- fides/common/api/v1/urn_registry.py +2 -1
- fides/service/event_audit_service.py +115 -0
- fides/service/messaging/aws_ses_service.py +2 -4
- fides/service/system/__init__.py +0 -0
- fides/service/system/system_service.py +138 -0
- fides/service/taxonomy/taxonomy_service.py +49 -3
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/86A8z6OnbTuDYww0DJkX0/_buildManifest.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1115-d5a834cdaa717edc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/155-b5e4370b158e5ee3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1817-dc2bba3ca736d39e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1841-2052c3239f2a0a1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2040-3f9c66c56a05b336.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2751-58285ccf50a0ba4b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3377-c5e0cc3de1a5ffd1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3696-fff4f944d7d5ff20.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-8377b3fcbb3d93b0.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-4786ccbe7c6f65b0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/409-e1deab19fc7e6d99.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4230-c55d5531697a715c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4608-2fbc3389681f6924.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4786-8d78ec773d171562.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-a219b390ef17ff4b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5309-e994c5195f99b1eb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5783-c62c79e7be21be73.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6084-29cbe703bffdccfe.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6416-79eee298a5b3f80f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6780-eeb7775eb21d7a12.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-91a8641cd2784b54.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/6882-55dbb142f7c40f53.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6954-6dfafd38b02d5852.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7476-3da7a490debad8e2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7630-22f9c4b25d6aed29.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7725-b2fa93d747d3d85d.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7929-4314e317b1717257.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/796-8e4da90ae82dfebb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8002-78d78545309b2c1c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8373-bd50fa53cbcab2aa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9046-0f92802b0e3382a9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9226-49dbcdb135bf9793.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9826-f316eb1d61cb90b6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-c389c51ca6353035.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-c780470042750062.js} +10 -10
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-fb9434d926ebf0b3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-92034daafd2187a0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-87919c1192e68b1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-ae8a64fffe3f8c66.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-d7d9ff9ed28fa790.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-c985ea8c1a0e0550.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-ddf6ba92355f81de.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-35c0ae9d5b5a940c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-6a196c704f1c6dd7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-06ba907e7d91a724.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-9cee4e222ebb2b60.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-f99af5669b9ab44c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-db7f1a269d3e7fc2.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-de957913f9b47daa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-5868591ff1e5f881.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-715064e1c9788e1a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-9ae81f5c245b8a01.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-6537c93c69b597c7.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-5db26067d921a94a.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-9f6a62614d7eb113.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-aed0e6dafc143b97.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-72b9878ea9b91529.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-f36a46381a6c25d4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b653fd60e7db989b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5bb96c8684a38bbf.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-639046f6c76bc8bd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-6bf117315d909ad1.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-1e2fa11f22dbc449.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-c55e3e0e19030f3f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/index-d66ea87b457af21e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-0159fbb2e0440709.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-267d2742fffaebe5.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-670b05b03ba11e0a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-482a7256925a6e06.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-331147598052f25c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-28083bfb2dec7b9f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-e02dc4b4b385c86f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-74c2a0ff4c992633.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-7459d56e548925b2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-aed018025b09c045.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-7f2c50044806c094.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-e8cab942d09aa358.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-128f952a49a0e8dc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-cca3d1a26e1269bb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-07e1b9937a169e32.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-3bc799dac8423f50.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-9f36b6c213ae524c.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-f8887b2b29aed1b9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-5473558807e94462.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-1065fbefd449719c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3e23d92d789fff99.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-907bfbb71d84646f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-aa1ada4d4ac09759.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-02b0dde03a1ad159.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-4a6ef2509e8cedfc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-16b122b83e57bb8c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-6304dad2c5fab694.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-0a8ec3aa2ed59a33.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-4036b023366b7eec.js} +1 -1
- fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.css +1 -0
- fides/ui-build/static/admin/add-systems/manual.html +1 -1
- fides/ui-build/static/admin/add-systems/multiple.html +1 -1
- fides/ui-build/static/admin/add-systems.html +1 -1
- fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
- fides/ui-build/static/admin/consent/configure.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
- fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
- fides/ui-build/static/admin/consent/properties.html +1 -1
- fides/ui-build/static/admin/consent/reporting.html +1 -1
- fides/ui-build/static/admin/consent.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
- fides/ui-build/static/admin/data-catalog.html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
- fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
- fides/ui-build/static/admin/data-discovery/activity.html +1 -1
- fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/detection.html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
- fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
- fides/ui-build/static/admin/datamap.html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
- fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
- fides/ui-build/static/admin/dataset/new.html +1 -1
- fides/ui-build/static/admin/dataset.html +1 -1
- fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
- fides/ui-build/static/admin/datastore-connection/new.html +1 -1
- fides/ui-build/static/admin/datastore-connection.html +1 -1
- fides/ui-build/static/admin/index.html +1 -1
- fides/ui-build/static/admin/integrations/[id].html +1 -1
- fides/ui-build/static/admin/integrations.html +1 -1
- fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
- fides/ui-build/static/admin/lib/fides-headless.js +1 -1
- fides/ui-build/static/admin/lib/fides-preview.js +1 -1
- fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
- fides/ui-build/static/admin/lib/fides.js +2 -2
- fides/ui-build/static/admin/login/[provider].html +1 -1
- fides/ui-build/static/admin/login.html +1 -1
- fides/ui-build/static/admin/messaging/[id].html +1 -1
- fides/ui-build/static/admin/messaging/add-template.html +1 -1
- fides/ui-build/static/admin/messaging.html +1 -1
- fides/ui-build/static/admin/poc/ant-components.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
- fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
- fides/ui-build/static/admin/poc/forms.html +1 -1
- fides/ui-build/static/admin/poc/table-migration.html +1 -1
- fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
- fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
- fides/ui-build/static/admin/privacy-requests.html +1 -1
- fides/ui-build/static/admin/properties/[id].html +1 -1
- fides/ui-build/static/admin/properties/add-property.html +1 -1
- fides/ui-build/static/admin/properties.html +1 -1
- fides/ui-build/static/admin/reporting/datamap.html +1 -1
- fides/ui-build/static/admin/settings/about/alpha.html +1 -1
- fides/ui-build/static/admin/settings/about.html +1 -1
- fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
- fides/ui-build/static/admin/settings/consent.html +1 -1
- fides/ui-build/static/admin/settings/custom-fields.html +1 -1
- fides/ui-build/static/admin/settings/domain-records.html +1 -1
- fides/ui-build/static/admin/settings/domains.html +1 -1
- fides/ui-build/static/admin/settings/email-templates.html +1 -1
- fides/ui-build/static/admin/settings/locations.html +1 -1
- fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -0
- fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -0
- fides/ui-build/static/admin/settings/messaging-providers.html +1 -0
- fides/ui-build/static/admin/settings/organization.html +1 -1
- fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
- fides/ui-build/static/admin/settings/regulations.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
- fides/ui-build/static/admin/systems/configure/[id].html +1 -1
- fides/ui-build/static/admin/systems.html +1 -1
- fides/ui-build/static/admin/taxonomy.html +1 -1
- fides/ui-build/static/admin/user-management/new.html +1 -1
- fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
- fides/ui-build/static/admin/user-management.html +1 -1
- fides/ui-build/static/admin/_next/static/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5258-e880b606a2293803.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9826-dbae8dee941a7fac.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-dfd71c1e9c458b89.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7cdc42ec5493b83d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-5d40db1ce8810e1d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
- fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → 86A8z6OnbTuDYww0DJkX0}/_ssgManifest.js +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-cdc7a13973f4a0ba.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-db57401384d1de8f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-4e56e924f35317f2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-e4a1f93a7ce944f0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-a4f821c4902f2df8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-96245b63aafc5168.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-4fea66e59bd59de8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-c8038e05f35da8d1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-f3a40101a8f3fd00.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-965af6c1fd01334e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-5afecf141308bfc5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-4352e55f110556b4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-c533120e94e049e3.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-b14f5f38b2d711a8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-31d51e3b9227c8d5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-8794a0d2e7554a05.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-90b31073e478c99c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-0a6859a0225b7e00.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-eb0552917907fe21.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-b2a2a084d8cfe22d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-0c944cfa9c6acbff.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-f0f0ea35d0185ae3.js} +0 -0
- /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
|
+
)
|
fides/api/models/messaging.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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
|
-
|
|
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()
|
fides/api/models/sql_models.py
CHANGED
|
@@ -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
|
+
)
|
fides/api/models/taxonomy.py
CHANGED
|
@@ -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.
|
|
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(
|
|
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.
|
|
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=
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
+
]
|