ethyca-fides 2.69.3b1__py2.py3-none-any.whl → 2.70.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ethyca-fides might be problematic. Click here for more details.
- {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/METADATA +1 -1
- {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/RECORD +254 -232
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/4d8c0fcc5771_adding_default_system_groups.py +78 -0
- fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
- fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -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/privacy_request_endpoints.py +87 -23
- fides/api/db/base.py +1 -0
- fides/api/db/seed.py +34 -0
- fides/api/models/asset.py +1 -0
- fides/api/models/event_audit.py +68 -0
- fides/api/models/messaging.py +30 -10
- 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/privacy_center_config.py +29 -5
- fides/api/service/deps.py +10 -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/tasks/__init__.py +1 -0
- fides/api/util/cache.py +1 -1
- 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/taxonomy/taxonomy_service.py +49 -3
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/1115-7888473b3dc28cda.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/155-88303b05c6e115a5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/1817-ee9e29a6b8c4af50.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2040-ab6212a3074f34f9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/2121.1de2fa060eae34aa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3585-451504ea5ed7a1ea.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3696-c25dc8d1b0e1aee1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3700-2a7094f112a1608a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3855-12ee1dfbbe47fd28.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/3872-3514b712afd683c0.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/409-c1256ecda1b15db6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4558-de5ced790b3380dc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4608-96f480766541124b.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/4718-6585c97c26647e65.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/502-a40d39e615f7b664.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/504-afd3588f1908ac33.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5185-33f50cf9ae17b42e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/5574-b8c4cba5a6938c00.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{5596-bb601cbf40e47a0f.js → 5596-29a7c8322530b7cf.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/5698.2135391a128cc373.js +164 -0
- fides/ui-build/static/admin/_next/static/chunks/5783-8de76df87af55e98.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6084-2cd165179c428a6f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6416-18d438ff85d807f8.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6882-447f15e87b8c48a5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7045-f15044a4d4525946.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7158-835ba42fd881d8dd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7202.3febe9e89640c712.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7476-0b6e114658b15eaa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7630-e7ea13be69c118a1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7725-dd6736855807936a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/796-e07ac2c543f569e3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8002-25fd174aec9b077b.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-2a332fe338535c84.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/9226-2f960b7ca530642a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9676.9fd9552ef744c717.js → 9676.b86ecbcfe5afd25d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/9826-c02be5882205bbbc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{9951-0c8a80f01e431957.js → 9951-651d521d9a02b6df.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-a653cee14ce2366b.js → _app-302177edeb0dc4f5.js} +63 -226
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-adaec1ec185160af.js → manual-939253f8daf349b2.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-f90aa48500c1cbde.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-c0db068d1863222f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-59a8aff5935482ec.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-17cdca29c6d4cdd6.js → properties-069f4e3ee96ebf77.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-09be5455ba85db39.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-e5a33654a2dfaf35.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-d0dbba5bff738b57.js → [resourceUrn]-293c1f2d9aefb447.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-be7b385073f22414.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-cfc118e68285405c.js → [resourceUrn]-18501152fa1e4f40.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-351caadeef03876a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-758d51b4d37dbd09.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0e4d9ff89c63793c.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-1554afcb8b9da2ab.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-2635ef588bf06145.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-0497f3ffdb632516.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-a780390da99f3e43.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-1901c26cdde820da.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-0cea22af5929c81f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-619f27c745188adb.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-ef71f387fbbab425.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-d790553662caf5c3.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-cb63db8594fe8dc1.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-78e052c8f95110c4.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-d6d7ee8bd8858a8a.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-785205655317b1d3.js → [id]-cc149157d290a94d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-a6985f77afbc5bc0.js → new-4c9fb068a5561658.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-a832084ce294f8af.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/index-269b8f81546dad66.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-8b13bb5f7bee61c6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-6f109ef64304ef59.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-8566e3b7b2a632fa.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-1b38b656807ed0cd.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b00532a0ad4f6927.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-65f0d5672041a202.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-3d2a77cb07aa8dc0.js → [id]-322a01e2bceab3fb.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-210e7e3b3d776d44.js → add-property-777ed2d73812043d.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/{properties-18257b6a70fa8a97.js → properties-08472b2a6bf1d392.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-5b423687e227ad4d.js +1 -0
- 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-55e36839d219a503.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-26ce8fc493993765.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-7ddf9d992fe714a6.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-7c78ae51f0dd7102.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-05ffbda19ab894b9.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-b0d93bf478bf63ee.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-084f9756b9987285.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-6c51ffd46bb598e7.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-44456bfe54ac4ad5.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-fbe7e8030d837aed.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-a86bafe1b4e1205f.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-1895c6a13b543436.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-e99fbd1b2d1bfd12.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-9ffcf98b8ad56bf7.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]-763861f5eb207db5.js → [id]-ff4711db191099cd.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +1 -0
- fides/ui-build/static/admin/_next/static/v72X5v2wmNmYdDpd8p1YY/_buildManifest.js +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/_b75ACzlGNz3tZqGUPTE5/_buildManifest.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1099-718ce18b9bd70cdb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1345-1961771e9619db39.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/1817-9423665774c2c08f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3620-34355b0c44325537.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3642-c052564812532324.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3729-c8accd71498f6fe4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3855-0565d44d150c985a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/3872-c022bb7259a9f323.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4164-cadb4c6528662248.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-86ad2beeb93c95c9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4608-caa9cb70fb66ac99.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4786-d2b03ba5c82a02ed.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4808-57c5ac15fd8b0d81.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4831-c0d20b2a0b7332bb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/4844-e5064a161a7e5a12.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5258-0062e0a1e4f8c03e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/5487-46774dc9df554af1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/549-170c96caa601e15a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6084-2c7b81cbcae7e3b4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7476-fdd0eb08a12e0334.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/7630-8613916021366672.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/787-f2eca25837ff7305.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/79-68834fd07d69f428.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/796-8fbae2fc714e7a3a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/8002-193a97fe4de8b779.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9046-1afcfb1c4dbdd6c6.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/9826-d49a56431e896acb.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-0a2b2f4a30245089.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-b7b7fb3e8b2ea816.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-23d3e50db42f31b3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-75be0acd400cf527.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/consent-9b4e0a08ae6216c7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-25c5916c8357f98d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-9fa11c01b44ba8f1.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-fb16cb8fd2b3826f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-a481a5be96dede96.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6c65b86a61340753.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-7fe1ca395914f77f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datamap-ea1eabce2a3fc2c7.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-3c629aecee30c575.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-a13ea13e0316d5a2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-a6ae353b3b1536cc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-85b28db67d96f201.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/dataset-409fe1a086fb7d38.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-93d5c01dd927bad2.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/index-bf3042fdbfb12b3d.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-e545f8ef5c945f45.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/integrations-f297e6cdb9fe97b9.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-6e864b293571a508.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-0fc3f1f3b1cd6f2a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-089c166287a89166.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-5a3cd9b14a37ef27.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-73be3cfaaa95ece4.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-adbea0f9fd21ff3a.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-b678e7577eef5e5c.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-3f3039c7e86cab2f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-d502bf1e7580df06.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-b841d63011827b43.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-50f9b26c6907d6de.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-5ae0d30eb3b770ab.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-f5924e64a15a0dc3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-88f6badc1bb38b97.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-d5f8db89c7e91a02.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-0366184eda09a933.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-a659f18a30ef89f3.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/systems-f4bf47ed2c4746ba.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-2d9548cfa6086e8f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/webpack-606818148553db7b.js +0 -1
- fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
- {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.69.3b1.dist-info → ethyca_fides-2.70.0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-765918f8aa37fdb2.js → 2921-66f65496c3a09316.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3923-23df37eef17d6ea2.js → 3923-a551756b413367ea.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{401-45f399d4d1325340.js → 401-ffe4e8436e1eceb9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6853-8fb39280a8f0eb89.js → 6853-7004a8c420b1ca02.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6954-3b26ff8259c4d5c3.js → 6954-599f2de2c902e9b2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-8d9c703c96662265.js → 404-2eb8aed4939f1142.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-20050dbae806179d.js → multiple-83ed7da0bb90b0a5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7b8cec88b5ad53d1.js → add-vendors-46b88bda3d7b15c5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-c30382719d6f797a.js → [id]-fd41ffaff543e05a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-dff842dbed2bc6c8.js → privacy-experience-92a337ee96845af2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-074cdbfc678ba791.js → [id]-1fd2cda8707314f6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-bcddda632b4df409.js → new-2987e397445713c5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-8ffd8d148269d323.js → [projectUrn]-6a4b0d49dcbf17a8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-9b7e4b86b1e8a40a.js → resources-af80fdca3bbdc82f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-f03f1fdaa1f5a0c6.js → [id]-d8c5c03fb2f31d65.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-8f90e275e932940b.js → add-template-0e0c06e3c8aabe02.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-68385a251c7ade5f.js → messaging-3f15804cf9625f01.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-fc7d652910f3ad8d.js → ant-components-248ad9f65a872442.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-fb6e6f4b276b6189.js → AntForm-aedb66a62042b10a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-00869abf79950a9a.js → FormikAntFormItem-018df38b7cd77fdb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-5716d749236c9f70.js → FormikControlled-6ca9099d03aab817.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-d6dfb9daa3935db3.js → FormikField-0f2c90786ea005a4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-9697549bce7060be.js → forms-200b51a725f8b2d1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-888656ae0bd40f62.js → table-migration-e551fccfcaae76e7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-c64b87694eda4785.js → [purpose_id]-f3e6e74e0efb005c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-e29384f7a3db5221.js → locations-77fb85bdd0be42b5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-46d06037fcadaf00.js → regulations-2866ac99faa5a542.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-98a3277820e232c7.js → user-management-82fcf1151e2fe2ba.js} +0 -0
- /fides/ui-build/static/admin/_next/static/{_b75ACzlGNz3tZqGUPTE5 → v72X5v2wmNmYdDpd8p1YY}/_ssgManifest.js +0 -0
|
@@ -269,27 +269,30 @@ def privacy_request_csv_download(
|
|
|
269
269
|
f = io.StringIO()
|
|
270
270
|
csv_file = csv.writer(f)
|
|
271
271
|
|
|
272
|
+
privacy_request_ids: List[str] = [r.id for r in privacy_request_query]
|
|
273
|
+
denial_audit_log_query: Query = db.query(AuditLog).filter(
|
|
274
|
+
AuditLog.action == AuditLogAction.denied,
|
|
275
|
+
AuditLog.privacy_request_id.in_(privacy_request_ids),
|
|
276
|
+
)
|
|
277
|
+
denial_audit_logs: Dict[str, str] = {
|
|
278
|
+
r.privacy_request_id: r.message for r in denial_audit_log_query
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
identity_columns, custom_field_columns = get_variable_columns(privacy_request_query)
|
|
282
|
+
|
|
272
283
|
csv_file.writerow(
|
|
273
284
|
[
|
|
274
285
|
"Status",
|
|
275
286
|
"Request Type",
|
|
276
|
-
"Subject Identity",
|
|
277
|
-
"Custom Privacy Request Fields",
|
|
278
287
|
"Time Received",
|
|
279
288
|
"Reviewed By",
|
|
280
289
|
"Request ID",
|
|
281
290
|
"Time Approved/Denied",
|
|
282
291
|
"Denial Reason",
|
|
283
292
|
]
|
|
293
|
+
+ identity_columns
|
|
294
|
+
+ with_prefix("Custom Field", list(custom_field_columns.values()))
|
|
284
295
|
)
|
|
285
|
-
privacy_request_ids: List[str] = [r.id for r in privacy_request_query]
|
|
286
|
-
denial_audit_log_query: Query = db.query(AuditLog).filter(
|
|
287
|
-
AuditLog.action == AuditLogAction.denied,
|
|
288
|
-
AuditLog.privacy_request_id.in_(privacy_request_ids),
|
|
289
|
-
)
|
|
290
|
-
denial_audit_logs: Dict[str, str] = {
|
|
291
|
-
r.privacy_request_id: r.message for r in denial_audit_log_query
|
|
292
|
-
}
|
|
293
296
|
|
|
294
297
|
for pr in privacy_request_query:
|
|
295
298
|
denial_reason = (
|
|
@@ -298,19 +301,22 @@ def privacy_request_csv_download(
|
|
|
298
301
|
else None
|
|
299
302
|
)
|
|
300
303
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
304
|
+
static_cells = [
|
|
305
|
+
pr.status.value if pr.status else None,
|
|
306
|
+
pr.policy.rules[0].action_type if len(pr.policy.rules) > 0 else None,
|
|
307
|
+
pr.created_at,
|
|
308
|
+
pr.reviewed_by,
|
|
309
|
+
pr.id,
|
|
310
|
+
pr.reviewed_at,
|
|
311
|
+
denial_reason,
|
|
312
|
+
]
|
|
313
|
+
|
|
314
|
+
identity_cells = extract_identity_cells(identity_columns, pr)
|
|
315
|
+
custom_field_cells = extract_custom_field_cells(custom_field_columns, pr)
|
|
316
|
+
|
|
317
|
+
row = static_cells + identity_cells + custom_field_cells
|
|
318
|
+
|
|
319
|
+
csv_file.writerow(row)
|
|
314
320
|
|
|
315
321
|
f.seek(0)
|
|
316
322
|
response = StreamingResponse(f, media_type="text/csv")
|
|
@@ -320,6 +326,64 @@ def privacy_request_csv_download(
|
|
|
320
326
|
return response
|
|
321
327
|
|
|
322
328
|
|
|
329
|
+
def get_variable_columns(
|
|
330
|
+
privacy_request_query: Query,
|
|
331
|
+
) -> tuple[List[str], Dict[str, str]]:
|
|
332
|
+
identity_columns: Set[str] = set()
|
|
333
|
+
custom_field_columns: Dict[str, str] = {}
|
|
334
|
+
|
|
335
|
+
for pr in privacy_request_query:
|
|
336
|
+
identity_columns.update(
|
|
337
|
+
extract_identity_column_names(pr.get_persisted_identity().model_dump())
|
|
338
|
+
)
|
|
339
|
+
custom_field_columns.update(
|
|
340
|
+
extract_custom_field_column_names(
|
|
341
|
+
pr.get_persisted_custom_privacy_request_fields()
|
|
342
|
+
)
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
return list(identity_columns), custom_field_columns
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def extract_identity_column_names(identities: dict[str, Any]) -> Set[str]:
|
|
349
|
+
"""Extract column names from identity data that have non-empty values."""
|
|
350
|
+
return {key for key, value in identities.items() if value}
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def extract_custom_field_column_names(custom_fields: dict[str, Any]) -> Dict[str, str]:
|
|
354
|
+
"""Extract column names and labels from custom field data that have non-empty values."""
|
|
355
|
+
return {
|
|
356
|
+
key: value["label"]
|
|
357
|
+
for key, value in custom_fields.items()
|
|
358
|
+
if value.get("value")
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def with_prefix(prefix: str, items: List[str]) -> List[str]:
|
|
363
|
+
return [f"{prefix} {item}" for item in items]
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def extract_custom_field_cells(
|
|
367
|
+
custom_field_columns: Dict[str, str], pr: PrivacyRequest
|
|
368
|
+
) -> List[str]:
|
|
369
|
+
custom_fields = pr.get_persisted_custom_privacy_request_fields()
|
|
370
|
+
return [
|
|
371
|
+
custom_fields.get(custom_field_column, {}).get("value")
|
|
372
|
+
for custom_field_column in custom_field_columns
|
|
373
|
+
]
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def extract_identity_cells(
|
|
377
|
+
identity_columns: List[str], pr: PrivacyRequest
|
|
378
|
+
) -> List[str]:
|
|
379
|
+
identity = pr.get_persisted_identity()
|
|
380
|
+
identity_dict = identity.model_dump()
|
|
381
|
+
return [
|
|
382
|
+
identity_dict.get(identity_column) # type: ignore
|
|
383
|
+
for identity_column in identity_columns
|
|
384
|
+
]
|
|
385
|
+
|
|
386
|
+
|
|
323
387
|
def execution_and_audit_logs_by_dataset_name(
|
|
324
388
|
self: PrivacyRequest,
|
|
325
389
|
) -> DefaultDict[str, List[Union["AuditLog", "ExecutionLog"]]]:
|
fides/api/db/base.py
CHANGED
|
@@ -22,6 +22,7 @@ from fides.api.models.detection_discovery.monitor_task import (
|
|
|
22
22
|
MonitorTaskExecutionLog,
|
|
23
23
|
)
|
|
24
24
|
from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
|
|
25
|
+
from fides.api.models.event_audit import EventAudit
|
|
25
26
|
from fides.api.models.experience_notices import ExperienceNotices
|
|
26
27
|
from fides.api.models.fides_cloud import FidesCloud
|
|
27
28
|
from fides.api.models.fides_user import FidesUser
|
fides/api/db/seed.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Provides functions that seed the application with data.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import os
|
|
5
6
|
from typing import Dict, List, Optional
|
|
6
7
|
|
|
7
8
|
from fideslang.default_taxonomy import DEFAULT_TAXONOMY
|
|
@@ -17,6 +18,7 @@ from fides.api.common_exceptions import KeyOrNameAlreadyExists
|
|
|
17
18
|
from fides.api.db.base_class import FidesBase
|
|
18
19
|
from fides.api.db.ctl_session import sync_session
|
|
19
20
|
from fides.api.db.system import upsert_system
|
|
21
|
+
from fides.api.models.application_config import ApplicationConfig
|
|
20
22
|
from fides.api.models.client import ClientDetail
|
|
21
23
|
from fides.api.models.connectionconfig import ConnectionConfig
|
|
22
24
|
from fides.api.models.datasetconfig import DatasetConfig
|
|
@@ -37,7 +39,16 @@ from fides.api.schemas.connection_configuration.saas_config_template_values impo
|
|
|
37
39
|
SaasConnectionTemplateValues,
|
|
38
40
|
)
|
|
39
41
|
from fides.api.schemas.dataset import DatasetConfigCtlDataset
|
|
42
|
+
from fides.api.schemas.messaging.messaging import (
|
|
43
|
+
MessagingConfigRequest,
|
|
44
|
+
MessagingServiceDetailsMailgun,
|
|
45
|
+
MessagingServiceType,
|
|
46
|
+
)
|
|
47
|
+
from fides.api.schemas.messaging.shared_schemas import MessagingSecretsMailgunDocs
|
|
40
48
|
from fides.api.schemas.policy import ActionType, DrpAction
|
|
49
|
+
from fides.api.service.messaging.messaging_crud_service import (
|
|
50
|
+
create_or_update_messaging_config,
|
|
51
|
+
)
|
|
41
52
|
from fides.api.util.connection_util import patch_connection_configs
|
|
42
53
|
from fides.api.util.data_category import get_user_data_categories
|
|
43
54
|
from fides.api.util.errors import AlreadyExistsError, QueryError
|
|
@@ -486,6 +497,29 @@ async def load_samples(async_session: AsyncSession) -> None:
|
|
|
486
497
|
except QueryError: # pragma: no cover
|
|
487
498
|
pass # The upsert_resources function will log any error
|
|
488
499
|
|
|
500
|
+
if os.getenv("MAILGUN_DOMAIN") and os.getenv("MAILGUN_API_KEY"):
|
|
501
|
+
log.info("Loading Mailgun messaging config")
|
|
502
|
+
with sync_session() as db:
|
|
503
|
+
messaging_config = create_or_update_messaging_config(
|
|
504
|
+
db=db,
|
|
505
|
+
config=MessagingConfigRequest(
|
|
506
|
+
key="my_mailgun_config",
|
|
507
|
+
name="Mailgun",
|
|
508
|
+
service_type=MessagingServiceType.mailgun,
|
|
509
|
+
details=MessagingServiceDetailsMailgun(
|
|
510
|
+
domain=os.getenv("MAILGUN_DOMAIN")
|
|
511
|
+
),
|
|
512
|
+
),
|
|
513
|
+
)
|
|
514
|
+
messaging_config.set_secrets(
|
|
515
|
+
db=db,
|
|
516
|
+
messaging_secrets=MessagingSecretsMailgunDocs(
|
|
517
|
+
mailgun_api_key=os.getenv("MAILGUN_API_KEY")
|
|
518
|
+
),
|
|
519
|
+
)
|
|
520
|
+
CONFIG.notifications.notification_service_type = "mailgun"
|
|
521
|
+
ApplicationConfig.update_config_set(db, CONFIG)
|
|
522
|
+
|
|
489
523
|
|
|
490
524
|
def load_default_organization(db: Session) -> None:
|
|
491
525
|
"""
|
fides/api/models/asset.py
CHANGED
|
@@ -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/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,
|