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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Dict, List, Optional
|
|
1
|
+
from typing import Any, Dict, List, Optional
|
|
2
2
|
|
|
3
3
|
from fastapi import Depends, Security
|
|
4
4
|
from fastapi.encoders import jsonable_encoder
|
|
@@ -26,6 +26,7 @@ from fides.api.common_exceptions import (
|
|
|
26
26
|
MessagingConfigNotFoundException,
|
|
27
27
|
MessagingTemplateValidationException,
|
|
28
28
|
)
|
|
29
|
+
from fides.api.models.application_config import ApplicationConfig
|
|
29
30
|
from fides.api.models.messaging import (
|
|
30
31
|
MessagingConfig,
|
|
31
32
|
default_messaging_config_key,
|
|
@@ -46,16 +47,16 @@ from fides.api.schemas.messaging.messaging import (
|
|
|
46
47
|
MessagingConfigResponse,
|
|
47
48
|
MessagingConfigStatus,
|
|
48
49
|
MessagingConfigStatusMessage,
|
|
50
|
+
MessagingConnectionTestStatus,
|
|
49
51
|
MessagingMethod,
|
|
50
52
|
MessagingServiceType,
|
|
51
53
|
MessagingTemplateDefault,
|
|
52
54
|
MessagingTemplateWithPropertiesDetail,
|
|
55
|
+
MessagingTestBodyParams,
|
|
53
56
|
TestMessagingStatusMessage,
|
|
54
57
|
UserEmailInviteStatus,
|
|
55
58
|
)
|
|
56
|
-
from fides.api.schemas.messaging.
|
|
57
|
-
possible_messaging_secrets,
|
|
58
|
-
)
|
|
59
|
+
from fides.api.schemas.messaging.shared_schemas import PossibleMessagingSecrets
|
|
59
60
|
from fides.api.schemas.redis_cache import Identity
|
|
60
61
|
from fides.api.service.messaging.message_dispatch_service import dispatch_message
|
|
61
62
|
from fides.api.service.messaging.messaging_crud_service import (
|
|
@@ -91,10 +92,14 @@ from fides.common.api.v1.urn_registry import (
|
|
|
91
92
|
MESSAGING_TEMPLATE_BY_ID,
|
|
92
93
|
MESSAGING_TEMPLATE_DEFAULT_BY_TEMPLATE_TYPE,
|
|
93
94
|
MESSAGING_TEST,
|
|
95
|
+
MESSAGING_TEST_DEPRECATED,
|
|
94
96
|
V1_URL_PREFIX,
|
|
95
97
|
)
|
|
98
|
+
from fides.config import get_config
|
|
96
99
|
from fides.config.config_proxy import ConfigProxy
|
|
97
100
|
|
|
101
|
+
CONFIG = get_config()
|
|
102
|
+
|
|
98
103
|
router = APIRouter(tags=["Messaging"], prefix=V1_URL_PREFIX)
|
|
99
104
|
|
|
100
105
|
|
|
@@ -107,33 +112,73 @@ router = APIRouter(tags=["Messaging"], prefix=V1_URL_PREFIX)
|
|
|
107
112
|
def post_config(
|
|
108
113
|
*,
|
|
109
114
|
db: Session = Depends(deps.get_db),
|
|
110
|
-
|
|
115
|
+
messaging_config_request: MessagingConfigRequest,
|
|
111
116
|
) -> MessagingConfigResponse:
|
|
112
117
|
"""
|
|
113
118
|
Given a messaging config, create corresponding MessagingConfig object, provided no config already exists
|
|
114
119
|
"""
|
|
115
120
|
|
|
116
121
|
try:
|
|
117
|
-
|
|
118
|
-
|
|
122
|
+
# set default values for the name and type if they're not provided
|
|
123
|
+
if not messaging_config_request.name:
|
|
124
|
+
messaging_config_request.name = default_messaging_config_name(
|
|
125
|
+
messaging_config_request.service_type.value
|
|
126
|
+
)
|
|
127
|
+
if not messaging_config_request.key:
|
|
128
|
+
messaging_config_request.key = default_messaging_config_key(
|
|
129
|
+
messaging_config_request.service_type.value
|
|
130
|
+
)
|
|
131
|
+
messaging_config = create_or_update_messaging_config(
|
|
132
|
+
db=db, config=messaging_config_request
|
|
133
|
+
)
|
|
134
|
+
if messaging_config_request.secrets:
|
|
135
|
+
update_config_secrets(
|
|
136
|
+
db,
|
|
137
|
+
messaging_config,
|
|
138
|
+
unvalidated_messaging_secrets=messaging_config_request.secrets,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# if there is only one messaging config, make it the default
|
|
142
|
+
messaging_config_count = db.query(MessagingConfig).count()
|
|
143
|
+
if messaging_config_count == 1:
|
|
144
|
+
ApplicationConfig.update_api_set(
|
|
145
|
+
db,
|
|
146
|
+
{
|
|
147
|
+
"notifications": {
|
|
148
|
+
"notification_service_type": messaging_config.service_type
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
return MessagingConfigResponse(
|
|
154
|
+
name=messaging_config.name,
|
|
155
|
+
key=messaging_config.key,
|
|
156
|
+
service_type=messaging_config.service_type.value, # type: ignore
|
|
157
|
+
details=messaging_config.details,
|
|
158
|
+
last_test_timestamp=messaging_config.last_test_timestamp,
|
|
159
|
+
last_test_succeeded=messaging_config.last_test_succeeded,
|
|
160
|
+
)
|
|
161
|
+
except ValueError as exc:
|
|
162
|
+
failed_key = messaging_config_request.key
|
|
119
163
|
logger.warning(
|
|
120
164
|
"Create failed for messaging config {}: {}",
|
|
121
|
-
|
|
122
|
-
|
|
165
|
+
failed_key,
|
|
166
|
+
str(exc),
|
|
123
167
|
)
|
|
124
168
|
raise HTTPException(
|
|
125
169
|
status_code=HTTP_400_BAD_REQUEST,
|
|
126
|
-
detail=f"Config with key {
|
|
170
|
+
detail=f"Config with key {failed_key} failed to be added: {exc}",
|
|
127
171
|
)
|
|
128
172
|
except Exception as exc:
|
|
173
|
+
failed_key = messaging_config_request.key
|
|
129
174
|
logger.warning(
|
|
130
175
|
"Create failed for messaging config {}: {}",
|
|
131
|
-
|
|
132
|
-
|
|
176
|
+
failed_key,
|
|
177
|
+
str(exc),
|
|
133
178
|
)
|
|
134
179
|
raise HTTPException(
|
|
135
180
|
status_code=HTTP_500_INTERNAL_SERVER_ERROR,
|
|
136
|
-
detail=f"Config with key {
|
|
181
|
+
detail=f"Config with key {failed_key} failed to be added: {exc}",
|
|
137
182
|
)
|
|
138
183
|
|
|
139
184
|
|
|
@@ -146,13 +191,23 @@ def patch_config_by_key(
|
|
|
146
191
|
config_key: FidesKey,
|
|
147
192
|
*,
|
|
148
193
|
db: Session = Depends(deps.get_db),
|
|
149
|
-
|
|
194
|
+
messaging_config_request: MessagingConfigRequest,
|
|
150
195
|
) -> Optional[MessagingConfigResponse]:
|
|
151
196
|
"""
|
|
152
197
|
Updates config for messaging by key, provided config with key can be found.
|
|
153
198
|
"""
|
|
154
199
|
try:
|
|
155
|
-
|
|
200
|
+
messaging_config = update_messaging_config(
|
|
201
|
+
db=db, key=config_key, config=messaging_config_request
|
|
202
|
+
)
|
|
203
|
+
return MessagingConfigResponse(
|
|
204
|
+
name=messaging_config.name,
|
|
205
|
+
key=messaging_config.key,
|
|
206
|
+
service_type=messaging_config.service_type.value, # type: ignore
|
|
207
|
+
details=messaging_config.details,
|
|
208
|
+
last_test_timestamp=messaging_config.last_test_timestamp,
|
|
209
|
+
last_test_succeeded=messaging_config.last_test_succeeded,
|
|
210
|
+
)
|
|
156
211
|
except MessagingConfigNotFoundException:
|
|
157
212
|
logger.warning("No messaging config found with key {}", config_key)
|
|
158
213
|
raise HTTPException(
|
|
@@ -162,12 +217,12 @@ def patch_config_by_key(
|
|
|
162
217
|
except Exception as exc:
|
|
163
218
|
logger.warning(
|
|
164
219
|
"Patch failed for messaging config {}: {}",
|
|
165
|
-
|
|
166
|
-
|
|
220
|
+
config_key,
|
|
221
|
+
str(exc),
|
|
167
222
|
)
|
|
168
223
|
raise HTTPException(
|
|
169
224
|
status_code=HTTP_500_INTERNAL_SERVER_ERROR,
|
|
170
|
-
detail=f"Config with key {
|
|
225
|
+
detail=f"Config with key {config_key} failed to be added",
|
|
171
226
|
)
|
|
172
227
|
|
|
173
228
|
|
|
@@ -294,17 +349,19 @@ def get_messaging_status(
|
|
|
294
349
|
def put_default_config(
|
|
295
350
|
*,
|
|
296
351
|
db: Session = Depends(deps.get_db),
|
|
297
|
-
|
|
352
|
+
messaging_config_request: MessagingConfigRequestBase,
|
|
298
353
|
) -> Optional[MessagingConfigResponse]:
|
|
299
354
|
"""
|
|
300
355
|
Updates default messaging config for given service type.
|
|
301
356
|
"""
|
|
302
357
|
logger.info(
|
|
303
358
|
"Starting upsert for default messaging config of type '{}'",
|
|
304
|
-
|
|
359
|
+
messaging_config_request.service_type,
|
|
360
|
+
)
|
|
361
|
+
incoming_data = messaging_config_request.model_dump(mode="json")
|
|
362
|
+
existing_default = MessagingConfig.get_by_type(
|
|
363
|
+
db, messaging_config_request.service_type
|
|
305
364
|
)
|
|
306
|
-
incoming_data = messaging_config.model_dump(mode="json")
|
|
307
|
-
existing_default = MessagingConfig.get_by_type(db, messaging_config.service_type)
|
|
308
365
|
if existing_default:
|
|
309
366
|
# take the key of the existing default and add that to the incoming data, to ensure we overwrite the same record
|
|
310
367
|
incoming_data["key"] = existing_default.key
|
|
@@ -312,14 +369,22 @@ def put_default_config(
|
|
|
312
369
|
else:
|
|
313
370
|
# set a key and name for our config if we're creating a new default
|
|
314
371
|
incoming_data["name"] = default_messaging_config_name(
|
|
315
|
-
|
|
372
|
+
messaging_config_request.service_type.value
|
|
316
373
|
)
|
|
317
374
|
incoming_data["key"] = default_messaging_config_key(
|
|
318
|
-
|
|
375
|
+
messaging_config_request.service_type.value
|
|
319
376
|
)
|
|
320
|
-
|
|
377
|
+
messaging_config = create_or_update_messaging_config(
|
|
321
378
|
db, MessagingConfigRequest(**incoming_data)
|
|
322
379
|
)
|
|
380
|
+
return MessagingConfigResponse(
|
|
381
|
+
name=messaging_config.name,
|
|
382
|
+
key=messaging_config.key,
|
|
383
|
+
service_type=messaging_config.service_type.value, # type: ignore
|
|
384
|
+
details=messaging_config.details,
|
|
385
|
+
last_test_timestamp=messaging_config.last_test_timestamp,
|
|
386
|
+
last_test_succeeded=messaging_config.last_test_succeeded,
|
|
387
|
+
)
|
|
323
388
|
|
|
324
389
|
|
|
325
390
|
@router.put(
|
|
@@ -332,7 +397,7 @@ def put_default_config_secrets(
|
|
|
332
397
|
service_type: MessagingServiceType,
|
|
333
398
|
*,
|
|
334
399
|
db: Session = Depends(deps.get_db),
|
|
335
|
-
unvalidated_messaging_secrets:
|
|
400
|
+
unvalidated_messaging_secrets: PossibleMessagingSecrets,
|
|
336
401
|
) -> TestMessagingStatusMessage:
|
|
337
402
|
messaging_config = MessagingConfig.get_by_type(db, service_type=service_type)
|
|
338
403
|
if not messaging_config:
|
|
@@ -353,7 +418,7 @@ def put_config_secrets(
|
|
|
353
418
|
config_key: FidesKey,
|
|
354
419
|
*,
|
|
355
420
|
db: Session = Depends(deps.get_db),
|
|
356
|
-
unvalidated_messaging_secrets:
|
|
421
|
+
unvalidated_messaging_secrets: PossibleMessagingSecrets,
|
|
357
422
|
) -> TestMessagingStatusMessage:
|
|
358
423
|
"""
|
|
359
424
|
Add or update secrets for messaging config.
|
|
@@ -371,7 +436,7 @@ def put_config_secrets(
|
|
|
371
436
|
def update_config_secrets(
|
|
372
437
|
db: Session,
|
|
373
438
|
messaging_config: MessagingConfig,
|
|
374
|
-
unvalidated_messaging_secrets:
|
|
439
|
+
unvalidated_messaging_secrets: PossibleMessagingSecrets,
|
|
375
440
|
) -> TestMessagingStatusMessage:
|
|
376
441
|
try:
|
|
377
442
|
secrets_schema = get_schema_for_secrets(
|
|
@@ -512,11 +577,70 @@ def delete_config_by_key(
|
|
|
512
577
|
},
|
|
513
578
|
)
|
|
514
579
|
def send_test_message(
|
|
580
|
+
service_type: MessagingServiceType,
|
|
581
|
+
*,
|
|
582
|
+
db: Session = Depends(deps.get_db),
|
|
583
|
+
params: MessagingTestBodyParams,
|
|
584
|
+
) -> Dict[str, str]:
|
|
585
|
+
"""
|
|
586
|
+
Sends a test message to the provided email or phone number.
|
|
587
|
+
"""
|
|
588
|
+
config = MessagingConfig.get_by_type(db, service_type)
|
|
589
|
+
if not config:
|
|
590
|
+
raise HTTPException(
|
|
591
|
+
status_code=404,
|
|
592
|
+
detail=f"No messaging config found with service type: {service_type}",
|
|
593
|
+
)
|
|
594
|
+
try:
|
|
595
|
+
dispatch_message(
|
|
596
|
+
db,
|
|
597
|
+
action_type=MessagingActionType.TEST_MESSAGE,
|
|
598
|
+
to_identity=Identity(
|
|
599
|
+
email=params.to_identity.email,
|
|
600
|
+
phone_number=params.to_identity.phone_number,
|
|
601
|
+
),
|
|
602
|
+
service_type=service_type.value,
|
|
603
|
+
)
|
|
604
|
+
except MessageDispatchException as exc:
|
|
605
|
+
config.update_test_status(
|
|
606
|
+
test_status=MessagingConnectionTestStatus.failed, db=db
|
|
607
|
+
)
|
|
608
|
+
raise HTTPException(
|
|
609
|
+
status_code=400,
|
|
610
|
+
detail=f"There was an error sending the test message: {exc}",
|
|
611
|
+
)
|
|
612
|
+
config.update_test_status(
|
|
613
|
+
test_status=MessagingConnectionTestStatus.succeeded, db=db
|
|
614
|
+
)
|
|
615
|
+
return {"details": "Test message successfully sent"}
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
@router.post(
|
|
619
|
+
MESSAGING_TEST_DEPRECATED,
|
|
620
|
+
deprecated=True,
|
|
621
|
+
status_code=HTTP_200_OK,
|
|
622
|
+
dependencies=[Security(verify_oauth_client, scopes=[MESSAGING_CREATE_OR_UPDATE])],
|
|
623
|
+
response_model=Dict[str, Any],
|
|
624
|
+
responses={
|
|
625
|
+
HTTP_200_OK: {
|
|
626
|
+
"content": {
|
|
627
|
+
"application/json": {
|
|
628
|
+
"example": {
|
|
629
|
+
"details": "Test message successfully sent",
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
},
|
|
635
|
+
)
|
|
636
|
+
def send_test_message_deprecated(
|
|
515
637
|
message_info: Identity,
|
|
516
638
|
db: Session = Depends(deps.get_db),
|
|
517
639
|
config_proxy: ConfigProxy = Depends(deps.get_config_proxy),
|
|
518
|
-
) -> Dict[str,
|
|
519
|
-
"""
|
|
640
|
+
) -> Dict[str, Any]:
|
|
641
|
+
"""
|
|
642
|
+
This endpoint is deprecated. Please use the `POST /messaging/test/{service_type}`
|
|
643
|
+
"""
|
|
520
644
|
try:
|
|
521
645
|
dispatch_message(
|
|
522
646
|
db,
|
|
@@ -524,11 +648,17 @@ def send_test_message(
|
|
|
524
648
|
to_identity=message_info,
|
|
525
649
|
service_type=config_proxy.notifications.notification_service_type,
|
|
526
650
|
)
|
|
527
|
-
except MessageDispatchException as
|
|
651
|
+
except MessageDispatchException as exc:
|
|
528
652
|
raise HTTPException(
|
|
529
|
-
status_code=400,
|
|
530
|
-
|
|
531
|
-
|
|
653
|
+
status_code=400,
|
|
654
|
+
detail=f"There was an error sending the test message: {exc}",
|
|
655
|
+
)
|
|
656
|
+
return {
|
|
657
|
+
"details": "Test message successfully sent",
|
|
658
|
+
"warnings": [
|
|
659
|
+
"This endpoint is deprecated. Please use the `POST /messaging/test/{service_type}`"
|
|
660
|
+
],
|
|
661
|
+
}
|
|
532
662
|
|
|
533
663
|
|
|
534
664
|
@router.get(
|
|
@@ -1,29 +1,27 @@
|
|
|
1
|
-
import datetime
|
|
2
1
|
from typing import Annotated, Dict, List, Optional, Union
|
|
3
2
|
|
|
4
3
|
from fastapi import Depends, HTTPException, Query, Response, Security
|
|
5
4
|
from fastapi_pagination import Page, Params
|
|
6
5
|
from fastapi_pagination.bases import AbstractPage
|
|
7
|
-
from fastapi_pagination.ext.async_sqlalchemy import paginate as async_paginate
|
|
8
6
|
from fastapi_pagination.ext.sqlalchemy import paginate
|
|
9
7
|
from fideslang.models import System as SystemSchema
|
|
10
8
|
from fideslang.validation import FidesKey
|
|
11
9
|
from loguru import logger
|
|
12
10
|
from pydantic import Field
|
|
13
|
-
from sqlalchemy import or_
|
|
14
11
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
15
12
|
from sqlalchemy.future import select
|
|
16
13
|
from sqlalchemy.orm import Session
|
|
17
14
|
from starlette import status
|
|
18
|
-
from starlette.status import
|
|
15
|
+
from starlette.status import (
|
|
16
|
+
HTTP_200_OK,
|
|
17
|
+
HTTP_204_NO_CONTENT,
|
|
18
|
+
HTTP_400_BAD_REQUEST,
|
|
19
|
+
HTTP_404_NOT_FOUND,
|
|
20
|
+
)
|
|
19
21
|
|
|
20
22
|
from fides.api.api import deps
|
|
21
23
|
from fides.api.api.v1.endpoints.saas_config_endpoints import instantiate_connection
|
|
22
|
-
from fides.api.db.crud import
|
|
23
|
-
get_resource,
|
|
24
|
-
get_resource_with_custom_fields,
|
|
25
|
-
list_resource,
|
|
26
|
-
)
|
|
24
|
+
from fides.api.db.crud import get_resource, get_resource_with_custom_fields
|
|
27
25
|
from fides.api.db.ctl_session import get_async_db
|
|
28
26
|
from fides.api.db.system import (
|
|
29
27
|
create_system,
|
|
@@ -34,10 +32,8 @@ from fides.api.db.system import (
|
|
|
34
32
|
)
|
|
35
33
|
from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
|
|
36
34
|
from fides.api.models.fides_user import FidesUser
|
|
37
|
-
from fides.api.models.sql_models import
|
|
38
|
-
|
|
39
|
-
System,
|
|
40
|
-
)
|
|
35
|
+
from fides.api.models.sql_models import System # type:ignore[attr-defined]
|
|
36
|
+
from fides.api.oauth.roles import APPROVER
|
|
41
37
|
from fides.api.oauth.system_manager_oauth_util import (
|
|
42
38
|
verify_oauth_client_for_system_from_fides_key,
|
|
43
39
|
verify_oauth_client_for_system_from_request_body_cli,
|
|
@@ -56,8 +52,12 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
|
|
|
56
52
|
from fides.api.schemas.connection_configuration.saas_config_template_values import (
|
|
57
53
|
SaasConnectionTemplateValues,
|
|
58
54
|
)
|
|
59
|
-
from fides.api.schemas.
|
|
60
|
-
|
|
55
|
+
from fides.api.schemas.system import (
|
|
56
|
+
AssignStewardRequest,
|
|
57
|
+
BasicSystemResponse,
|
|
58
|
+
SystemResponse,
|
|
59
|
+
)
|
|
60
|
+
from fides.api.service.deps import get_system_service
|
|
61
61
|
from fides.api.util.api_router import APIRouter
|
|
62
62
|
from fides.api.util.connection_util import (
|
|
63
63
|
connection_status,
|
|
@@ -66,7 +66,6 @@ from fides.api.util.connection_util import (
|
|
|
66
66
|
patch_connection_configs,
|
|
67
67
|
validate_secrets,
|
|
68
68
|
)
|
|
69
|
-
from fides.api.util.filter_utils import apply_filters_to_query
|
|
70
69
|
from fides.common.api.scope_registry import (
|
|
71
70
|
CONNECTION_CREATE_OR_UPDATE,
|
|
72
71
|
CONNECTION_DELETE,
|
|
@@ -82,6 +81,7 @@ from fides.common.api.v1.urn_registry import (
|
|
|
82
81
|
SYSTEM_CONNECTIONS,
|
|
83
82
|
V1_URL_PREFIX,
|
|
84
83
|
)
|
|
84
|
+
from fides.service.system.system_service import SystemService
|
|
85
85
|
|
|
86
86
|
SYSTEM_ROUTER = APIRouter(tags=["System"], prefix=f"{V1_URL_PREFIX}/system")
|
|
87
87
|
SYSTEM_CONNECTIONS_ROUTER = APIRouter(
|
|
@@ -349,6 +349,123 @@ async def delete(
|
|
|
349
349
|
}
|
|
350
350
|
|
|
351
351
|
|
|
352
|
+
@SYSTEM_ROUTER.post(
|
|
353
|
+
"/bulk-delete",
|
|
354
|
+
dependencies=[
|
|
355
|
+
Security(
|
|
356
|
+
verify_oauth_client_prod,
|
|
357
|
+
scopes=[SYSTEM_DELETE],
|
|
358
|
+
)
|
|
359
|
+
],
|
|
360
|
+
status_code=status.HTTP_200_OK,
|
|
361
|
+
)
|
|
362
|
+
async def system_bulk_delete(
|
|
363
|
+
fides_keys: List[str],
|
|
364
|
+
db: AsyncSession = Depends(get_async_db),
|
|
365
|
+
) -> Dict:
|
|
366
|
+
"""Delete multiple systems by their fides_keys."""
|
|
367
|
+
|
|
368
|
+
deleted: List[Dict] = []
|
|
369
|
+
|
|
370
|
+
async with db.begin():
|
|
371
|
+
# Retrieve all systems within the same transactional context
|
|
372
|
+
stmt = select(System).filter(System.fides_key.in_(fides_keys))
|
|
373
|
+
result = await db.execute(stmt)
|
|
374
|
+
systems_to_delete = result.scalars().all()
|
|
375
|
+
|
|
376
|
+
for system in systems_to_delete:
|
|
377
|
+
await db.delete(system)
|
|
378
|
+
deleted.append(SystemSchema.model_validate(system).model_dump(mode="json"))
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
"message": f"Deleted {len(deleted)} system(s)",
|
|
382
|
+
"deleted": deleted,
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
@SYSTEM_ROUTER.post(
|
|
387
|
+
"/assign-steward",
|
|
388
|
+
dependencies=[
|
|
389
|
+
Security(
|
|
390
|
+
verify_oauth_client_prod,
|
|
391
|
+
scopes=[SYSTEM_UPDATE],
|
|
392
|
+
)
|
|
393
|
+
],
|
|
394
|
+
)
|
|
395
|
+
async def bulk_assign_steward(
|
|
396
|
+
data: AssignStewardRequest,
|
|
397
|
+
db: Session = Depends(deps.get_db),
|
|
398
|
+
) -> Dict:
|
|
399
|
+
"""Assign the given `data_steward` (username) as a system manager for the list of `system_keys`.
|
|
400
|
+
|
|
401
|
+
This mirrors the behavior of the user permissions endpoint that assigns systems to a given user but
|
|
402
|
+
from the perspective of the System API. It validates that:
|
|
403
|
+
|
|
404
|
+
1. The provided user exists.
|
|
405
|
+
2. The user already has permissions (cannot be None).
|
|
406
|
+
3. The user is not an approver (approvers are explicitly disallowed from being system managers).
|
|
407
|
+
4. All provided `system_keys` resolve to existing System records.
|
|
408
|
+
5. There are no duplicate keys in the payload.
|
|
409
|
+
"""
|
|
410
|
+
|
|
411
|
+
data_steward = data.data_steward
|
|
412
|
+
system_keys = data.system_keys
|
|
413
|
+
|
|
414
|
+
user: Optional[FidesUser] = FidesUser.get_by(
|
|
415
|
+
db, field="username", value=data_steward
|
|
416
|
+
)
|
|
417
|
+
if not user:
|
|
418
|
+
raise HTTPException(
|
|
419
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
420
|
+
detail=f"No user found with username {data_steward}.",
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
# Validate user has permissions assigned
|
|
424
|
+
if not (user.permissions and user.permissions.roles): # type: ignore[attr-defined]
|
|
425
|
+
raise HTTPException(
|
|
426
|
+
status_code=HTTP_400_BAD_REQUEST,
|
|
427
|
+
detail=f"User {data_steward} needs permissions before they can be assigned as system manager.",
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
# Approvers are not allowed to be system managers
|
|
431
|
+
if APPROVER in user.permissions.roles: # type: ignore[attr-defined]
|
|
432
|
+
raise HTTPException(
|
|
433
|
+
status_code=HTTP_400_BAD_REQUEST,
|
|
434
|
+
detail=f"User {data_steward} is an {APPROVER} and cannot be assigned as a system manager.",
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
# Check for duplicate system keys
|
|
438
|
+
if len(set(system_keys)) != len(system_keys):
|
|
439
|
+
raise HTTPException(
|
|
440
|
+
status_code=HTTP_400_BAD_REQUEST,
|
|
441
|
+
detail=f"Cannot add user {data_steward} as system manager. Duplicate systems in request body.",
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
# Retrieve systems and validate existence
|
|
445
|
+
systems_query = db.query(System).filter(System.fides_key.in_(system_keys))
|
|
446
|
+
if systems_query.count() != len(system_keys):
|
|
447
|
+
raise HTTPException(
|
|
448
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
449
|
+
detail=f"Cannot add user {data_steward} as system manager. System(s) not found.",
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
systems = systems_query.all()
|
|
453
|
+
|
|
454
|
+
logger.info(
|
|
455
|
+
"Assigning user {} as data steward for {} systems", data_steward, len(systems)
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
updated_count = 0
|
|
459
|
+
for system in systems:
|
|
460
|
+
if user not in system.data_stewards:
|
|
461
|
+
user.set_as_system_manager(db, system)
|
|
462
|
+
updated_count += 1
|
|
463
|
+
|
|
464
|
+
return {
|
|
465
|
+
"message": f"User {data_steward} assigned as data steward to {updated_count} system(s)",
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
|
|
352
469
|
@SYSTEM_ROUTER.post(
|
|
353
470
|
"/",
|
|
354
471
|
response_model=SystemResponse,
|
|
@@ -384,62 +501,30 @@ async def create(
|
|
|
384
501
|
name="List systems (optionally paginated)",
|
|
385
502
|
)
|
|
386
503
|
async def ls( # pylint: disable=invalid-name
|
|
387
|
-
|
|
504
|
+
system_service: SystemService = Depends(get_system_service),
|
|
388
505
|
size: Optional[int] = Query(None, ge=1, le=100),
|
|
389
506
|
page: Optional[int] = Query(None, ge=1),
|
|
390
507
|
search: Optional[str] = None,
|
|
391
508
|
data_uses: Optional[List[FidesKey]] = Query(None),
|
|
392
509
|
data_categories: Optional[List[FidesKey]] = Query(None),
|
|
393
510
|
data_subjects: Optional[List[FidesKey]] = Query(None),
|
|
394
|
-
show_deleted:
|
|
395
|
-
) -> List:
|
|
511
|
+
show_deleted: bool = Query(False),
|
|
512
|
+
) -> Union[List[System], Page[System]]:
|
|
396
513
|
"""Get a list of all of the Systems.
|
|
397
514
|
If any parameters or filters are provided the response will be paginated and/or filtered.
|
|
398
515
|
Otherwise all Systems will be returned (this may be a slow operation if there are many systems,
|
|
399
516
|
so using the pagination parameters is recommended).
|
|
400
517
|
"""
|
|
401
|
-
if not (size or page or search or data_uses or data_categories or data_subjects):
|
|
402
|
-
# if no advanced parameters are passed, we return a very basic list of all System resources
|
|
403
|
-
# to maintain backward compatibility of the original API, which backs some important client usages, e.g. the fides CLI
|
|
404
518
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
query = select(System)
|
|
408
|
-
|
|
409
|
-
pagination_params = Params(page=page or 1, size=size or 50)
|
|
410
|
-
# Need to join with PrivacyDeclaration in order to be able to filter
|
|
411
|
-
# by data use, data category, and data subject
|
|
412
|
-
if any([data_uses, data_categories, data_subjects]):
|
|
413
|
-
query = query.outerjoin(
|
|
414
|
-
PrivacyDeclaration, System.id == PrivacyDeclaration.system_id
|
|
415
|
-
)
|
|
416
|
-
|
|
417
|
-
# Filter out any vendor deleted systems, unless explicitly asked for
|
|
418
|
-
if not show_deleted:
|
|
419
|
-
query = query.filter(
|
|
420
|
-
or_(
|
|
421
|
-
System.vendor_deleted_date.is_(None),
|
|
422
|
-
System.vendor_deleted_date >= datetime.datetime.now(),
|
|
423
|
-
)
|
|
424
|
-
)
|
|
425
|
-
|
|
426
|
-
filter_params = FilterParams(
|
|
519
|
+
return await system_service.get_systems(
|
|
427
520
|
search=search,
|
|
428
521
|
data_uses=data_uses,
|
|
429
522
|
data_categories=data_categories,
|
|
430
523
|
data_subjects=data_subjects,
|
|
524
|
+
size=size,
|
|
525
|
+
page=page,
|
|
526
|
+
show_deleted=show_deleted,
|
|
431
527
|
)
|
|
432
|
-
filtered_query = apply_filters_to_query(
|
|
433
|
-
query=query,
|
|
434
|
-
filter_params=filter_params,
|
|
435
|
-
search_model=System,
|
|
436
|
-
taxonomy_model=PrivacyDeclaration,
|
|
437
|
-
)
|
|
438
|
-
|
|
439
|
-
# Add a distinct so we only get one row per system
|
|
440
|
-
duplicates_removed = filtered_query.distinct(System.id)
|
|
441
|
-
|
|
442
|
-
return await async_paginate(db, duplicates_removed, pagination_params)
|
|
443
528
|
|
|
444
529
|
|
|
445
530
|
@SYSTEM_ROUTER.patch(
|
fides/api/db/base.py
CHANGED
|
@@ -21,6 +21,8 @@ from fides.api.models.detection_discovery.monitor_task import (
|
|
|
21
21
|
MonitorTask,
|
|
22
22
|
MonitorTaskExecutionLog,
|
|
23
23
|
)
|
|
24
|
+
from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
|
|
25
|
+
from fides.api.models.event_audit import EventAudit
|
|
24
26
|
from fides.api.models.experience_notices import ExperienceNotices
|
|
25
27
|
from fides.api.models.fides_cloud import FidesCloud
|
|
26
28
|
from fides.api.models.fides_user import FidesUser
|
|
@@ -77,6 +79,7 @@ from fides.api.models.property import (
|
|
|
77
79
|
from fides.api.models.registration import UserRegistration
|
|
78
80
|
from fides.api.models.storage import StorageConfig
|
|
79
81
|
from fides.api.models.system_compass_sync import SystemCompassSync
|
|
82
|
+
from fides.api.models.system_group import SystemGroup, SystemGroupMember
|
|
80
83
|
from fides.api.models.system_history import SystemHistory
|
|
81
84
|
from fides.api.models.system_manager import SystemManager
|
|
82
85
|
from fides.api.models.taxonomy import (
|
fides/api/db/seed.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Provides functions that seed the application with data.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import os
|
|
5
6
|
from typing import Dict, List, Optional
|
|
6
7
|
|
|
7
8
|
from fideslang.default_taxonomy import DEFAULT_TAXONOMY
|
|
@@ -17,6 +18,7 @@ from fides.api.common_exceptions import KeyOrNameAlreadyExists
|
|
|
17
18
|
from fides.api.db.base_class import FidesBase
|
|
18
19
|
from fides.api.db.ctl_session import sync_session
|
|
19
20
|
from fides.api.db.system import upsert_system
|
|
21
|
+
from fides.api.models.application_config import ApplicationConfig
|
|
20
22
|
from fides.api.models.client import ClientDetail
|
|
21
23
|
from fides.api.models.connectionconfig import ConnectionConfig
|
|
22
24
|
from fides.api.models.datasetconfig import DatasetConfig
|
|
@@ -37,7 +39,16 @@ from fides.api.schemas.connection_configuration.saas_config_template_values impo
|
|
|
37
39
|
SaasConnectionTemplateValues,
|
|
38
40
|
)
|
|
39
41
|
from fides.api.schemas.dataset import DatasetConfigCtlDataset
|
|
42
|
+
from fides.api.schemas.messaging.messaging import (
|
|
43
|
+
MessagingConfigRequest,
|
|
44
|
+
MessagingServiceDetailsMailgun,
|
|
45
|
+
MessagingServiceType,
|
|
46
|
+
)
|
|
47
|
+
from fides.api.schemas.messaging.shared_schemas import MessagingSecretsMailgunDocs
|
|
40
48
|
from fides.api.schemas.policy import ActionType, DrpAction
|
|
49
|
+
from fides.api.service.messaging.messaging_crud_service import (
|
|
50
|
+
create_or_update_messaging_config,
|
|
51
|
+
)
|
|
41
52
|
from fides.api.util.connection_util import patch_connection_configs
|
|
42
53
|
from fides.api.util.data_category import get_user_data_categories
|
|
43
54
|
from fides.api.util.errors import AlreadyExistsError, QueryError
|
|
@@ -486,6 +497,29 @@ async def load_samples(async_session: AsyncSession) -> None:
|
|
|
486
497
|
except QueryError: # pragma: no cover
|
|
487
498
|
pass # The upsert_resources function will log any error
|
|
488
499
|
|
|
500
|
+
if os.getenv("MAILGUN_DOMAIN") and os.getenv("MAILGUN_API_KEY"):
|
|
501
|
+
log.info("Loading Mailgun messaging config")
|
|
502
|
+
with sync_session() as db:
|
|
503
|
+
messaging_config = create_or_update_messaging_config(
|
|
504
|
+
db=db,
|
|
505
|
+
config=MessagingConfigRequest(
|
|
506
|
+
key="my_mailgun_config",
|
|
507
|
+
name="Mailgun",
|
|
508
|
+
service_type=MessagingServiceType.mailgun,
|
|
509
|
+
details=MessagingServiceDetailsMailgun(
|
|
510
|
+
domain=os.getenv("MAILGUN_DOMAIN")
|
|
511
|
+
),
|
|
512
|
+
),
|
|
513
|
+
)
|
|
514
|
+
messaging_config.set_secrets(
|
|
515
|
+
db=db,
|
|
516
|
+
messaging_secrets=MessagingSecretsMailgunDocs(
|
|
517
|
+
mailgun_api_key=os.getenv("MAILGUN_API_KEY")
|
|
518
|
+
),
|
|
519
|
+
)
|
|
520
|
+
CONFIG.notifications.notification_service_type = "mailgun"
|
|
521
|
+
ApplicationConfig.update_config_set(db, CONFIG)
|
|
522
|
+
|
|
489
523
|
|
|
490
524
|
def load_default_organization(db: Session) -> None:
|
|
491
525
|
"""
|