ethyca-fides 2.66.0rc0__py2.py3-none-any.whl → 2.66.1b0__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.66.0rc0.dist-info → ethyca_fides-2.66.1b0.dist-info}/METADATA +1 -1
- {ethyca_fides-2.66.0rc0.dist-info → ethyca_fides-2.66.1b0.dist-info}/RECORD +207 -200
- fides/_version.py +3 -3
- fides/api/alembic/migrations/versions/d0031087eacb_create_manualtaskconditionaldependency_.py +106 -0
- fides/api/db/base.py +1 -0
- fides/api/models/manual_task/__init__.py +2 -0
- fides/api/models/manual_task/conditional_dependency.py +144 -0
- fides/api/models/{manual_task.py → manual_task/manual_task.py} +10 -0
- fides/api/task/conditional_dependencies/__init__.py +0 -0
- fides/api/task/conditional_dependencies/evaluator.py +109 -0
- fides/api/task/conditional_dependencies/schemas.py +54 -0
- fides/ui-build/static/admin/404.html +1 -1
- fides/ui-build/static/admin/_next/static/chunks/3450-24041e1b2a846739.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/{3923-8d3bc8c052a41e83.js → 3923-13a6b4da2d51bf8f.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/{4230-b214ba26fa901c4c.js → 4230-840c287045c88b34.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/431-0e77abba7e220e31.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/6780-4b687168dd8daa84.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/8237-55049f8f5fd5e058.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{_app-8b3c5d3146ed7692.js → _app-f66151e613766714.js} +56 -56
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-031d7589a07fde30.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-efcbfd52186591bc.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-e2d5d7e2a5265e68.js → integrations-0f91eae539d47163.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-69ad86b7a8a9a115.js → table-migration-8bfde56c86128ec3.js} +1 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-444ec9b3fec6e428.js +1 -0
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7eb7d26fa4b5cf17.js +1 -0
- fides/ui-build/static/admin/_next/static/css/{5bfb2473e5701527.css → 23cf870196941c9a.css} +1 -1
- fides/ui-build/static/admin/_next/static/css/b81194f2c3930152.css +1 -0
- fides/ui-build/static/admin/_next/static/jeMhTiDcCKPk_H4S0nSQq/_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/messaging.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/organization.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/chunks/3450-f3de4256f728cb13.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/431-34f0b91c26f8d9ab.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/6780-5bd185892f6af46e.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-2265ecb899d45fbc.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-8ab33a1e0272df1f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-32600543eb7b584f.js +0 -1
- fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-cbe4c8f9096b6543.js +0 -1
- fides/ui-build/static/admin/_next/static/css/2cadb5f62dcd7c2b.css +0 -1
- fides/ui-build/static/admin/_next/static/wBqdsil8VpFrsdFaO2xpv/_buildManifest.js +0 -1
- {ethyca_fides-2.66.0rc0.dist-info → ethyca_fides-2.66.1b0.dist-info}/WHEEL +0 -0
- {ethyca_fides-2.66.0rc0.dist-info → ethyca_fides-2.66.1b0.dist-info}/entry_points.txt +0 -0
- {ethyca_fides-2.66.0rc0.dist-info → ethyca_fides-2.66.1b0.dist-info}/licenses/LICENSE +0 -0
- {ethyca_fides-2.66.0rc0.dist-info → ethyca_fides-2.66.1b0.dist-info}/top_level.txt +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{1817-e601e737e3cc7a0e.js → 1817-10f6ab6da28df4d2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{203-5a663f465ba26bb4.js → 203-d9fe5384a6e94799.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{2921-455e6357b74d2f76.js → 2921-86f1547ac40a5cdf.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3855-e172870d3e21b0dd.js → 3855-e2fa6db53d32c3de.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{3872-46cebf7ec1b31a2b.js → 3872-b97dd7695d6532bc.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{401-1b529d5800aa1f3a.js → 401-3cc1fee61494e3bd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{409-a257e14acebcd73b.js → 409-45a125437261580c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4121-2bc09fc4ddbfe5cb.js → 4121-c4747258599705d0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{4608-bbb7bf511a05c3c2.js → 4608-b2d8a76e3a680db4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5309-d73339f062763fed.js → 5309-67bdf9001531e972.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{5574-b13021775a15bfd2.js → 5574-0b7c88e3f81b08fb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6084-7178ff6ea6822475.js → 6084-7bc3756bd23c3a4c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6662-507be5d46e5b719b.js → 6662-8c43dd2b75e0264c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6853-2ad3e08fe6f9f5f2.js → 6853-4f8bf6558f8c6a46.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6882-6af16fef26c21e06.js → 6882-0fa957731918160e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{6954-bb875d9ac89f6030.js → 6954-d30c6dff440d46b0.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7476-281ee9a8286556f3.js → 7476-2d2c80dfe64c0f90.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{7630-9aac73191ed5ed13.js → 7630-06f4207597225cbb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{787-fb41002f797eb2df.js → 787-32ca132be974eaf9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{79-7e87aff851423d4a.js → 79-056290dba15480c2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{796-329a5f823ec258a5.js → 796-00487f9036709b7b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9046-ce9567c9074563e2.js → 9046-54877976a0529de2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9226-746771d47dff6266.js → 9226-081cb18771536d64.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9826-111aaee8bd8dbd09.js → 9826-e77d5e5b8458fe77.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{9951-9b753ad7c3f51bdf.js → 9951-595d0f1588215081.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{404-aece2c920ea14514.js → 404-2d803dab6a00f353.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-98777246bec9dc2a.js → manual-a539d34e7c9ab0ee.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-dc75dc6e37e52f05.js → multiple-fa0c254854fbf79c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{add-systems-a71c0aff4e0e6535.js → add-systems-9c86d99f81d128ac.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-24d226b5a8de5c74.js → add-vendors-3a77a92d2a94426a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-6a8ef51138ac926a.js → configure-886518c906a28271.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-1edf582ba3cd3bbb.js → [id]-fc3a011154a2e1de.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-685771e5f7196d87.js → privacy-experience-a333f503aa057e06.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-6ccedc70dc447089.js → [id]-7a1c8073262ff0b4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-944bca1cc57985b5.js → new-39ef289b3c88ebd4.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-notices-84f4bd14ce8673bc.js → privacy-notices-deeb59b8332261c1.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-6f86ab63a08a6528.js → properties-057cad65e7414a44.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-afdbd4665657cfa1.js → reporting-8f891957c8944137.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-73d3cbf68f7c3a31.js → consent-7507764f89f9d9c8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-6ba9e160dae64695.js → [projectUrn]-6020cd361c57b387.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-32eac8bbd217615a.js → projects-2fc76749940a06fd.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-6f630d42ac9fb6b4.js → data-catalog-7d1c53686a9a5d73.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-9ddb52ebb7ac4c71.js → action-center-94acf9cc27209714.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-9aa744d56cdacb0d.js → activity-5af9381f02b2aff6.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-7674b97d655c193b.js → datamap-e48f4ef032791c1d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-c0d2bfd465df20e0.js → [...subfieldNames]-24f87303adb9428e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-28280a8a39a6e37c.js → [collectionName]-41aa4e51bd73d13e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-006b695e5af5ef24.js → [datasetId]-b296323ed0922fd5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-82fb246d87e58ebd.js → new-cbb409d1bc89d10b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-20165c31ab1bc7cf.js → dataset-07df9c4896721e9f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-b4a6bcc87d126840.js → [id]-0a60fe49678a3ece.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-f95d7b0bbfc58f5a.js → new-c903ab62611245d8.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-c391c6fad56eec48.js → datastore-connection-33b01e2ab2d5ce7e.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{index-1919aab9e5834b51.js → index-ca1c9d4de5abec7a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/integrations/{[id]-eacabe4a80cb8813.js → [id]-2f9efedecc4b9273.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-53fecfb9dd6a1e0c.js → [id]-8b20a058d18181b9.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-76b01cec5fde10a9.js → add-template-c7054125338aee6c.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-5094ffea13f32ed9.js → messaging-a4fdfa9047bb5770.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-5c08e8447c45ce44.js → ant-components-64a322d01aae5ca7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-06ad5f34585480aa.js → AntForm-8bca16a7726e7eb2.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-6f071c2bc9446cb0.js → FormikAntFormItem-b0f246fc3b67ebf7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-efcc38c58991ac9e.js → FormikControlled-1a0852b090bfc392.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-430ba5c979abfb7c.js → FormikField-11f3de1b45e36583.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-5c561880bf131afb.js → forms-1b73a1c2b6c6285f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{messaging-10ce53ea356f8bad.js → messaging-08a6d60bb9230d5f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-5501bbb129fee9c4.js → storage-29d47f1bdd08c45d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-d888a69a3bbe040e.js → configure-2806f3458fe85897.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-d3d8e3d7583ec635.js → [id]-568620fc7e239e7b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-1af10ed303815d46.js → add-property-394043fd823d69f5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-cebc0dc186be499a.js → properties-e959378bb32b6b73.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-e130c0197362e8f3.js → datamap-2a98bd257edd8f47.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/{alpha-5e1322de868d615e.js → alpha-92d7f12a95a1adc5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{about-241f95e372b65d0f.js → about-70fb68b7519d5222.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-fc201657f4a782c7.js → [purpose_id]-668d74c041d74650.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{consent-c2d39cba8396ef3a.js → consent-7c8bda96813441c5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-d992103cc55901ae.js → custom-fields-b773691516488006.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-41242f805599feda.js → domain-records-21f14d9141a5ad8a.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domains-2e885f74c92f669c.js → domains-3022368d5438dfb7.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-ff112655ad5f41e5.js → email-templates-89903d6f579b1aeb.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-023e1895552817de.js → locations-14621f32ad4f9120.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-ac403c0886b20e20.js → organization-5106ff9a9403ee92.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-86062a18e081a52a.js → regulations-0927740524f79b02.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/{test-datasets-7a3396ac819c7904.js → test-datasets-47284d49803f8b3b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-8314a819837f5b2a.js → [id]-7bc2d6b23d5bb71f.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{systems-21f423a7c417aa9d.js → systems-c3a536901d6b445d.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-6387fcc8cce872eb.js → taxonomy-ab4f4d260c01163b.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-ff5738706da07801.js → [id]-79fe68f1eb3add49.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-173ac3a1ed2b05a6.js → user-management-6111bb65a2607dc5.js} +0 -0
- /fides/ui-build/static/admin/_next/static/chunks/{webpack-ff0cd6bff75588da.js → webpack-ff4c22c9f0840531.js} +0 -0
- /fides/ui-build/static/admin/_next/static/{wBqdsil8VpFrsdFaO2xpv → jeMhTiDcCKPk_H4S0nSQq}/_ssgManifest.js +0 -0
fides/_version.py
CHANGED
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-07-
|
|
11
|
+
"date": "2025-07-22T14:39:31-0600",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.66.
|
|
14
|
+
"full-revisionid": "32734cca4a0241242f49aa52436361d77f7d63ea",
|
|
15
|
+
"version": "2.66.1b0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""create ManualTaskConditionalDependency table
|
|
2
|
+
|
|
3
|
+
Revision ID: d0031087eacb
|
|
4
|
+
Revises: 9e3dab26f75f
|
|
5
|
+
Create Date: 2025-07-17 21:28:20.937945
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import op
|
|
11
|
+
from sqlalchemy.dialects import postgresql
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "d0031087eacb"
|
|
15
|
+
down_revision = "9e3dab26f75f"
|
|
16
|
+
branch_labels = None
|
|
17
|
+
depends_on = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade():
|
|
21
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
22
|
+
|
|
23
|
+
op.create_table(
|
|
24
|
+
"manual_task_conditional_dependency",
|
|
25
|
+
sa.Column(
|
|
26
|
+
"created_at",
|
|
27
|
+
sa.DateTime(timezone=True),
|
|
28
|
+
server_default=sa.text("now()"),
|
|
29
|
+
nullable=True,
|
|
30
|
+
),
|
|
31
|
+
sa.Column(
|
|
32
|
+
"updated_at",
|
|
33
|
+
sa.DateTime(timezone=True),
|
|
34
|
+
server_default=sa.text("now()"),
|
|
35
|
+
nullable=True,
|
|
36
|
+
),
|
|
37
|
+
sa.Column("id", sa.String(length=255), nullable=False),
|
|
38
|
+
sa.Column("manual_task_id", sa.String(), nullable=False),
|
|
39
|
+
sa.Column("parent_id", sa.String(), nullable=True),
|
|
40
|
+
sa.Column(
|
|
41
|
+
"condition_type",
|
|
42
|
+
sa.String(), # Use String instead of Enum to avoid auto-creation
|
|
43
|
+
nullable=False,
|
|
44
|
+
),
|
|
45
|
+
sa.Column("field_address", sa.String(), nullable=True),
|
|
46
|
+
sa.Column("operator", sa.String(), nullable=True),
|
|
47
|
+
sa.Column("value", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
|
|
48
|
+
sa.Column("logical_operator", sa.String(), nullable=True),
|
|
49
|
+
sa.Column("sort_order", sa.Integer(), nullable=False),
|
|
50
|
+
sa.ForeignKeyConstraint(
|
|
51
|
+
["manual_task_id"], ["manual_task.id"], ondelete="CASCADE"
|
|
52
|
+
),
|
|
53
|
+
sa.ForeignKeyConstraint(
|
|
54
|
+
["parent_id"], ["manual_task_conditional_dependency.id"], ondelete="CASCADE"
|
|
55
|
+
),
|
|
56
|
+
sa.PrimaryKeyConstraint("id"),
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
op.create_index(
|
|
60
|
+
"ix_manual_task_conditional_dependency_condition_type",
|
|
61
|
+
"manual_task_conditional_dependency",
|
|
62
|
+
["condition_type"],
|
|
63
|
+
unique=False,
|
|
64
|
+
)
|
|
65
|
+
op.create_index(
|
|
66
|
+
"ix_manual_task_conditional_dependency_manual_task_id",
|
|
67
|
+
"manual_task_conditional_dependency",
|
|
68
|
+
["manual_task_id"],
|
|
69
|
+
unique=False,
|
|
70
|
+
)
|
|
71
|
+
op.create_index(
|
|
72
|
+
"ix_manual_task_conditional_dependency_parent_id",
|
|
73
|
+
"manual_task_conditional_dependency",
|
|
74
|
+
["parent_id"],
|
|
75
|
+
unique=False,
|
|
76
|
+
)
|
|
77
|
+
op.create_index(
|
|
78
|
+
"ix_manual_task_conditional_dependency_sort_order",
|
|
79
|
+
"manual_task_conditional_dependency",
|
|
80
|
+
["sort_order"],
|
|
81
|
+
unique=False,
|
|
82
|
+
)
|
|
83
|
+
# ### end Alembic commands ###
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def downgrade():
|
|
87
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
88
|
+
op.drop_index(
|
|
89
|
+
"ix_manual_task_conditional_dependency_sort_order",
|
|
90
|
+
table_name="manual_task_conditional_dependency",
|
|
91
|
+
)
|
|
92
|
+
op.drop_index(
|
|
93
|
+
"ix_manual_task_conditional_dependency_parent_id",
|
|
94
|
+
table_name="manual_task_conditional_dependency",
|
|
95
|
+
)
|
|
96
|
+
op.drop_index(
|
|
97
|
+
"ix_manual_task_conditional_dependency_manual_task_id",
|
|
98
|
+
table_name="manual_task_conditional_dependency",
|
|
99
|
+
)
|
|
100
|
+
op.drop_index(
|
|
101
|
+
"ix_manual_task_conditional_dependency_condition_type",
|
|
102
|
+
table_name="manual_task_conditional_dependency",
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
op.drop_table("manual_task_conditional_dependency")
|
|
106
|
+
# ### end Alembic commands ###
|
fides/api/db/base.py
CHANGED
|
@@ -33,6 +33,7 @@ from fides.api.models.identity_salt import IdentitySalt
|
|
|
33
33
|
from fides.api.models.location_regulation_selections import LocationRegulationSelections
|
|
34
34
|
from fides.api.models.manual_task import (
|
|
35
35
|
ManualTask,
|
|
36
|
+
ManualTaskConditionalDependency,
|
|
36
37
|
ManualTaskConfig,
|
|
37
38
|
ManualTaskConfigField,
|
|
38
39
|
ManualTaskInstance,
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import TYPE_CHECKING, Optional, Union
|
|
3
|
+
|
|
4
|
+
from sqlalchemy import Column, ForeignKey, Index, Integer, String
|
|
5
|
+
from sqlalchemy.dialects.postgresql import JSONB
|
|
6
|
+
from sqlalchemy.ext.declarative import declared_attr
|
|
7
|
+
from sqlalchemy.orm import Session, relationship
|
|
8
|
+
|
|
9
|
+
from fides.api.db.base_class import Base, FidesBase
|
|
10
|
+
from fides.api.db.util import EnumColumn
|
|
11
|
+
from fides.api.task.conditional_dependencies.schemas import (
|
|
12
|
+
ConditionGroup,
|
|
13
|
+
ConditionLeaf,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from fides.api.models.manual_task.manual_task import ManualTask
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ManualTaskConditionalDependencyType(str, Enum):
|
|
21
|
+
"""Enum for manual task conditional dependency types.
|
|
22
|
+
|
|
23
|
+
This enum defines the two types of nodes in a conditional dependency tree:
|
|
24
|
+
|
|
25
|
+
- leaf: A terminal node that represents a single condition (e.g., "user.age >= 18")
|
|
26
|
+
- group: A non-terminal node that groups multiple conditions with logical operators (AND/OR)
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
leaf: Used for simple field comparisons like:
|
|
30
|
+
- "user.name exists"
|
|
31
|
+
- "user.age >= 18"
|
|
32
|
+
- "billing.subscription.status == 'active'"
|
|
33
|
+
|
|
34
|
+
group: Used to combine multiple conditions with logical operators:
|
|
35
|
+
- AND group: "user.age >= 18 AND user.active == true"
|
|
36
|
+
- OR group: "user.role == 'admin' OR user.verified == true"
|
|
37
|
+
- Nested groups: "(user.age >= 18 AND (user.role == 'admin' OR user.verified == true))"
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
leaf = "leaf"
|
|
41
|
+
group = "group"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ManualTaskConditionalDependency(Base):
|
|
45
|
+
"""Model for storing conditional dependencies."""
|
|
46
|
+
|
|
47
|
+
@declared_attr
|
|
48
|
+
def __tablename__(cls) -> str:
|
|
49
|
+
"""Overriding base class method to set the table name."""
|
|
50
|
+
return "manual_task_conditional_dependency"
|
|
51
|
+
|
|
52
|
+
# We need to redefine it here so that self-referential relationships
|
|
53
|
+
# can properly reference the `id` column instead of the built-in Python function.
|
|
54
|
+
id = Column(String(255), primary_key=True, default=FidesBase.generate_uuid)
|
|
55
|
+
|
|
56
|
+
# Foreign key relationships
|
|
57
|
+
manual_task_id = Column(
|
|
58
|
+
String, ForeignKey("manual_task.id", ondelete="CASCADE"), nullable=False
|
|
59
|
+
)
|
|
60
|
+
parent_id = Column(
|
|
61
|
+
String,
|
|
62
|
+
ForeignKey("manual_task_conditional_dependency.id", ondelete="CASCADE"),
|
|
63
|
+
nullable=True,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Condition metadata
|
|
67
|
+
condition_type = Column(
|
|
68
|
+
EnumColumn(ManualTaskConditionalDependencyType), nullable=False
|
|
69
|
+
) # leaf or group
|
|
70
|
+
field_address = Column(String, nullable=True) # For leaf conditions
|
|
71
|
+
operator = Column(String, nullable=True) # For leaf conditions
|
|
72
|
+
value = Column(JSONB, nullable=True) # For leaf conditions
|
|
73
|
+
logical_operator = Column(String, nullable=True) # 'and' or 'or' for groups
|
|
74
|
+
|
|
75
|
+
# Ordering
|
|
76
|
+
sort_order = Column(Integer, nullable=False, default=0)
|
|
77
|
+
|
|
78
|
+
__table_args__ = (
|
|
79
|
+
Index("ix_manual_task_conditional_dependency_manual_task_id", "manual_task_id"),
|
|
80
|
+
Index("ix_manual_task_conditional_dependency_parent_id", "parent_id"),
|
|
81
|
+
Index("ix_manual_task_conditional_dependency_condition_type", "condition_type"),
|
|
82
|
+
Index("ix_manual_task_conditional_dependency_sort_order", "sort_order"),
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Relationships
|
|
86
|
+
task = relationship("ManualTask", back_populates="conditional_dependencies")
|
|
87
|
+
parent = relationship(
|
|
88
|
+
"ManualTaskConditionalDependency",
|
|
89
|
+
remote_side=[id],
|
|
90
|
+
back_populates="children",
|
|
91
|
+
foreign_keys=[parent_id],
|
|
92
|
+
)
|
|
93
|
+
children = relationship(
|
|
94
|
+
"ManualTaskConditionalDependency",
|
|
95
|
+
back_populates="parent",
|
|
96
|
+
cascade="all, delete-orphan",
|
|
97
|
+
foreign_keys=[parent_id],
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def to_condition_leaf(self) -> ConditionLeaf:
|
|
101
|
+
"""Convert to ConditionLeaf if this is a leaf condition"""
|
|
102
|
+
if self.condition_type != "leaf":
|
|
103
|
+
raise ValueError("Cannot convert group condition to leaf")
|
|
104
|
+
|
|
105
|
+
return ConditionLeaf(
|
|
106
|
+
field_address=self.field_address, operator=self.operator, value=self.value
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def to_condition_group(self) -> ConditionGroup:
|
|
110
|
+
"""Convert to ConditionGroup if this is a group condition"""
|
|
111
|
+
if self.condition_type != "group":
|
|
112
|
+
raise ValueError("Cannot convert leaf condition to group")
|
|
113
|
+
|
|
114
|
+
# Recursively build children
|
|
115
|
+
child_conditions = []
|
|
116
|
+
children_list = [child for child in self.children] # type: ignore[attr-defined]
|
|
117
|
+
for child in sorted(children_list, key=lambda x: x.sort_order):
|
|
118
|
+
if child.condition_type == "leaf":
|
|
119
|
+
child_conditions.append(child.to_condition_leaf())
|
|
120
|
+
else:
|
|
121
|
+
child_conditions.append(child.to_condition_group())
|
|
122
|
+
|
|
123
|
+
return ConditionGroup(
|
|
124
|
+
logical_operator=self.logical_operator, conditions=child_conditions
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
@classmethod
|
|
128
|
+
def get_root_condition(
|
|
129
|
+
cls, db: Session, manual_task_id: str
|
|
130
|
+
) -> Optional[Union[ConditionLeaf, ConditionGroup]]:
|
|
131
|
+
"""Get the root condition for a config"""
|
|
132
|
+
root = (
|
|
133
|
+
db.query(cls)
|
|
134
|
+
.filter(cls.manual_task_id == manual_task_id, cls.parent_id.is_(None))
|
|
135
|
+
.first()
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
if not root:
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
if root.condition_type == "leaf":
|
|
142
|
+
return root.to_condition_leaf()
|
|
143
|
+
|
|
144
|
+
return root.to_condition_group()
|
|
@@ -26,6 +26,9 @@ from fides.api.schemas.base_class import FidesSchema
|
|
|
26
26
|
if TYPE_CHECKING:
|
|
27
27
|
from fides.api.models.attachment import Attachment
|
|
28
28
|
from fides.api.models.fides_user import FidesUser
|
|
29
|
+
from fides.api.models.manual_task.conditional_dependency import (
|
|
30
|
+
ManualTaskConditionalDependency,
|
|
31
|
+
)
|
|
29
32
|
|
|
30
33
|
# ------------------------------------------------------------
|
|
31
34
|
# Enums
|
|
@@ -242,6 +245,13 @@ class ManualTask(Base):
|
|
|
242
245
|
viewonly=True, # No cascade delete - submissions are historical data
|
|
243
246
|
)
|
|
244
247
|
|
|
248
|
+
conditional_dependencies = relationship(
|
|
249
|
+
"ManualTaskConditionalDependency",
|
|
250
|
+
back_populates="task",
|
|
251
|
+
uselist=True,
|
|
252
|
+
cascade="all, delete-orphan",
|
|
253
|
+
)
|
|
254
|
+
|
|
245
255
|
# Properties
|
|
246
256
|
@property
|
|
247
257
|
def assigned_users(self) -> list[str]:
|
|
File without changes
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import operator as py_operator
|
|
2
|
+
from typing import Any, Union
|
|
3
|
+
|
|
4
|
+
from loguru import logger
|
|
5
|
+
from sqlalchemy.orm import Session
|
|
6
|
+
|
|
7
|
+
from fides.api.graph.config import FieldPath
|
|
8
|
+
from fides.api.task.conditional_dependencies.schemas import (
|
|
9
|
+
Condition,
|
|
10
|
+
ConditionGroup,
|
|
11
|
+
ConditionLeaf,
|
|
12
|
+
GroupOperator,
|
|
13
|
+
Operator,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
operator_methods = {
|
|
17
|
+
Operator.exists: lambda a, _: a is not None,
|
|
18
|
+
Operator.not_exists: lambda a, _: a is None,
|
|
19
|
+
Operator.eq: py_operator.eq,
|
|
20
|
+
Operator.neq: py_operator.ne,
|
|
21
|
+
Operator.lt: lambda a, b: a < b if a is not None else False,
|
|
22
|
+
Operator.lte: lambda a, b: a <= b if a is not None else False,
|
|
23
|
+
Operator.gt: lambda a, b: a > b if a is not None else False,
|
|
24
|
+
Operator.gte: lambda a, b: a >= b if a is not None else False,
|
|
25
|
+
Operator.list_contains: lambda a, b: b in a if isinstance(a, list) else False,
|
|
26
|
+
Operator.not_in_list: lambda a, b: a not in b if isinstance(b, list) else True,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ConditionEvaluator:
|
|
31
|
+
"""Evaluates nested conditions for manual task creation"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, db: Session):
|
|
34
|
+
self.db = db
|
|
35
|
+
|
|
36
|
+
def evaluate_rule(self, rule: Condition, data: Union[dict, Any]) -> bool:
|
|
37
|
+
"""Evaluate a nested condition rule against input data"""
|
|
38
|
+
if isinstance(rule, ConditionLeaf):
|
|
39
|
+
return self._evaluate_leaf_condition(rule, data)
|
|
40
|
+
# ConditionGroup
|
|
41
|
+
return self._evaluate_group_condition(rule, data)
|
|
42
|
+
|
|
43
|
+
def _evaluate_leaf_condition(
|
|
44
|
+
self, condition: ConditionLeaf, data: Union[dict, Any]
|
|
45
|
+
) -> bool:
|
|
46
|
+
"""Evaluate a leaf condition against input data"""
|
|
47
|
+
actual_value = self._get_nested_value(data, condition.field_address.split("."))
|
|
48
|
+
# Apply operator and return result
|
|
49
|
+
return self._apply_operator(actual_value, condition.operator, condition.value)
|
|
50
|
+
|
|
51
|
+
def _evaluate_group_condition(
|
|
52
|
+
self, group: ConditionGroup, data: Union[dict, Any]
|
|
53
|
+
) -> bool:
|
|
54
|
+
"""Evaluate a group condition against input data"""
|
|
55
|
+
results = [
|
|
56
|
+
self.evaluate_rule(condition, data) for condition in group.conditions
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
logical_operators = {GroupOperator.and_: all, GroupOperator.or_: any}
|
|
60
|
+
operator_func = logical_operators.get(group.logical_operator)
|
|
61
|
+
|
|
62
|
+
if operator_func is None:
|
|
63
|
+
logger.warning(f"Unknown logical operator: {group.logical_operator}")
|
|
64
|
+
return False
|
|
65
|
+
|
|
66
|
+
return operator_func(results)
|
|
67
|
+
|
|
68
|
+
def _get_nested_value(self, data: Union[dict, Any], keys: list[str]) -> Any:
|
|
69
|
+
"""Get nested value from data using dot notation
|
|
70
|
+
|
|
71
|
+
Supports both simple dictionary access and Fides reference structures:
|
|
72
|
+
- Simple dict: data["user"]["name"]
|
|
73
|
+
- Fides FieldAddress: data.get_field_value(FieldAddress("dataset", "collection", "field_address"))
|
|
74
|
+
- Fides Collection: data.get_field_value(FieldPath("field_address", "subfield"))
|
|
75
|
+
"""
|
|
76
|
+
if not keys:
|
|
77
|
+
return data
|
|
78
|
+
|
|
79
|
+
current = data
|
|
80
|
+
|
|
81
|
+
# Try Fides reference structures first
|
|
82
|
+
if hasattr(current, "get_field_value"):
|
|
83
|
+
try:
|
|
84
|
+
field_path = FieldPath(*keys) if len(keys) > 1 else FieldPath(keys[0])
|
|
85
|
+
return current.get_field_value(field_path)
|
|
86
|
+
except (AttributeError, ValueError):
|
|
87
|
+
pass
|
|
88
|
+
|
|
89
|
+
# Fall back to dictionary access
|
|
90
|
+
for key in keys:
|
|
91
|
+
if not isinstance(current, dict):
|
|
92
|
+
current = current.get(key, {}) if hasattr(current, "get") else None
|
|
93
|
+
else:
|
|
94
|
+
current = current.get(key, {})
|
|
95
|
+
|
|
96
|
+
return current if current != {} else None
|
|
97
|
+
|
|
98
|
+
def _apply_operator(
|
|
99
|
+
self, actual_value: Any, operator: Operator, expected_value: Any
|
|
100
|
+
) -> bool:
|
|
101
|
+
"""Apply operator to actual and expected values"""
|
|
102
|
+
|
|
103
|
+
# Get the method for the operator and execute it
|
|
104
|
+
operator_method = operator_methods.get(operator)
|
|
105
|
+
if operator_method is None:
|
|
106
|
+
logger.warning(f"Unknown operator: {operator}")
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
return operator_method(actual_value, expected_value)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import List, Optional, Union
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field, model_validator
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Operator(str, Enum):
|
|
8
|
+
eq = "eq"
|
|
9
|
+
neq = "neq"
|
|
10
|
+
lt = "lt"
|
|
11
|
+
lte = "lte"
|
|
12
|
+
gt = "gt"
|
|
13
|
+
gte = "gte"
|
|
14
|
+
exists = "exists"
|
|
15
|
+
not_exists = "not_exists"
|
|
16
|
+
list_contains = "list_contains"
|
|
17
|
+
not_in_list = "not_in_list"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GroupOperator(str, Enum):
|
|
21
|
+
and_ = "and"
|
|
22
|
+
or_ = "or"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# Leaf condition (e.g., "user.name exists", "user.created_at >= 2024-01-01")
|
|
26
|
+
class ConditionLeaf(BaseModel):
|
|
27
|
+
field_address: str = Field(
|
|
28
|
+
description="Field path to check (e.g., 'user.name', 'billing.subscription.status')"
|
|
29
|
+
)
|
|
30
|
+
operator: Operator = Field(description="Operator to apply")
|
|
31
|
+
value: Optional[
|
|
32
|
+
Union[str, int, float, bool, List[Union[str, int, float, bool]]]
|
|
33
|
+
] = Field(default=None, description="Expected value for comparison")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# Nested logical condition (AND, OR)
|
|
37
|
+
class ConditionGroup(BaseModel):
|
|
38
|
+
logical_operator: GroupOperator = Field(
|
|
39
|
+
description="Logical operator: 'and' or 'or'"
|
|
40
|
+
)
|
|
41
|
+
conditions: list["Condition"] = Field(
|
|
42
|
+
description="List of conditions or nested groups"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
@model_validator(mode="after")
|
|
46
|
+
def validate_conditions(self) -> "ConditionGroup":
|
|
47
|
+
if not self.conditions:
|
|
48
|
+
raise ValueError("conditions list cannot be empty")
|
|
49
|
+
return self
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# Use model_rebuild to allow recursive nesting
|
|
53
|
+
Condition = Union[ConditionLeaf, ConditionGroup]
|
|
54
|
+
ConditionGroup.model_rebuild()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/b81194f2c3930152.css" as="style"/><link rel="stylesheet" href="/_next/static/css/b81194f2c3930152.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-ff4c22c9f0840531.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-f66151e613766714.js" defer=""></script><script src="/_next/static/chunks/pages/404-2d803dab6a00f353.js" defer=""></script><script src="/_next/static/jeMhTiDcCKPk_H4S0nSQq/_buildManifest.js" defer=""></script><script src="/_next/static/jeMhTiDcCKPk_H4S0nSQq/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"jeMhTiDcCKPk_H4S0nSQq","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|