Loading latest chages from Spiff whic refactored the way the PythonExpressionEngine works.

This cleans up the _evaluate method which previously accepted arbitrary args and kwargs, and now requires an expression, a context to which exectute it, and, optionally, the current task being executed if the DMN is being executed as a part of a BusinessRuleTask in a BPMN diagram.

This also cleans up several bits of duplicated code.

There is also a bit of code here to assure that the current user is included when running the master workflow.
This commit is contained in:
Dan 2022-03-04 15:34:36 -05:00
parent 84c420346d
commit 0455506e2b
5 changed files with 147 additions and 135 deletions

191
Pipfile.lock generated
View File

@ -48,11 +48,11 @@
}, },
"apscheduler": { "apscheduler": {
"hashes": [ "hashes": [
"sha256:236dbf7244200ffc79c6c0b9ff7d2ed10e7e985f37f48d4a23f4142f4967dcb5", "sha256:65e6574b6395498d371d045f2a8a7e4f7d50c6ad21ef7313d15b1c7cf20df1e3",
"sha256:f8a3e6e4d178de40fdbd5a3eefcc217588fc7f42f443e2335bb2dc29daf99357" "sha256:ddc25a0ddd899de44d7f451f4375fb971887e65af51e41e5dcf681f59b8b2c9a"
], ],
"index": "pypi", "index": "pypi",
"version": "==3.9.0.post1" "version": "==3.9.1"
}, },
"attrs": { "attrs": {
"hashes": [ "hashes": [
@ -89,7 +89,7 @@
"sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac", "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac",
"sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2" "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"
], ],
"markers": "python_version < '3.9'", "markers": "python_version >= '3.6' and python_version < '3.9'",
"version": "==0.2.1" "version": "==0.2.1"
}, },
"bcrypt": { "bcrypt": {
@ -131,11 +131,11 @@
}, },
"celery": { "celery": {
"hashes": [ "hashes": [
"sha256:2844eb040e915398623a43253a8e1016723442ece6b0751a3c416d8a2b34216f", "sha256:8aacd02fc23a02760686d63dde1eb0daa9f594e735e73ea8fb15c2ff15cb608c",
"sha256:5a68a351076cfac4f678fa5ffd898105c28825a2224902da006970005196d061" "sha256:e2cd41667ad97d4f6a2f4672d1c6a6ebada194c619253058b5f23704aaadaa82"
], ],
"index": "pypi", "index": "pypi",
"version": "==5.2.2" "version": "==5.2.3"
}, },
"certifi": { "certifi": {
"hashes": [ "hashes": [
@ -549,11 +549,11 @@
}, },
"importlib-metadata": { "importlib-metadata": {
"hashes": [ "hashes": [
"sha256:175f4ee440a0317f6e8d81b7f8d4869f93316170a65ad2b007d2929186c8052c", "sha256:b36ffa925fe3139b2f6ff11d6925ffd4fa7bc47870165e3ac260ac7b4f91e6ac",
"sha256:e0bc84ff355328a4adfc5240c4f211e0ab386f80aa640d1b11f0618a1d282094" "sha256:d16e8c1deb60de41b8e8ed21c1a7b947b0bc62fab7e1d470bcdf331cea2e6735"
], ],
"markers": "python_version < '3.9'", "markers": "python_version < '3.10'",
"version": "==4.11.1" "version": "==4.11.2"
}, },
"importlib-resources": { "importlib-resources": {
"hashes": [ "hashes": [
@ -1080,82 +1080,83 @@
}, },
"regex": { "regex": {
"hashes": [ "hashes": [
"sha256:04611cc0f627fc4a50bc4a9a2e6178a974c6a6a4aa9c1cca921635d2c47b9c87", "sha256:0008650041531d0eadecc96a73d37c2dc4821cf51b0766e374cb4f1ddc4e1c14",
"sha256:0b5d6f9aed3153487252d00a18e53f19b7f52a1651bc1d0c4b5844bc286dfa52", "sha256:03299b0bcaa7824eb7c0ebd7ef1e3663302d1b533653bfe9dc7e595d453e2ae9",
"sha256:0d2f5c3f7057530afd7b739ed42eb04f1011203bc5e4663e1e1d01bb50f813e3", "sha256:06b1df01cf2aef3a9790858af524ae2588762c8a90e784ba00d003f045306204",
"sha256:11772be1eb1748e0e197a40ffb82fb8fd0d6914cd147d841d9703e2bef24d288", "sha256:09b4b6ccc61d4119342b26246ddd5a04accdeebe36bdfe865ad87a0784efd77f",
"sha256:1333b3ce73269f986b1fa4d5d395643810074dc2de5b9d262eb258daf37dc98f", "sha256:0be0c34a39e5d04a62fd5342f0886d0e57592a4f4993b3f9d257c1f688b19737",
"sha256:16f81025bb3556eccb0681d7946e2b35ff254f9f888cff7d2120e8826330315c", "sha256:0d96eec8550fd2fd26f8e675f6d8b61b159482ad8ffa26991b894ed5ee19038b",
"sha256:1a171eaac36a08964d023eeff740b18a415f79aeb212169080c170ec42dd5184", "sha256:0eb0e2845e81bdea92b8281a3969632686502565abf4a0b9e4ab1471c863d8f3",
"sha256:1d6301f5288e9bdca65fab3de6b7de17362c5016d6bf8ee4ba4cbe833b2eda0f", "sha256:13bbf0c9453c6d16e5867bda7f6c0c7cff1decf96c5498318bb87f8136d2abd4",
"sha256:1e031899cb2bc92c0cf4d45389eff5b078d1936860a1be3aa8c94fa25fb46ed8", "sha256:17e51ad1e6131c496b58d317bc9abec71f44eb1957d32629d06013a21bc99cac",
"sha256:1f8c0ae0a0de4e19fddaaff036f508db175f6f03db318c80bbc239a1def62d02", "sha256:1977bb64264815d3ef016625adc9df90e6d0e27e76260280c63eca993e3f455f",
"sha256:2245441445099411b528379dee83e56eadf449db924648e5feb9b747473f42e3", "sha256:1e30762ddddb22f7f14c4f59c34d3addabc789216d813b0f3e2788d7bcf0cf29",
"sha256:22709d701e7037e64dae2a04855021b62efd64a66c3ceed99dfd684bfef09e38", "sha256:1e73652057473ad3e6934944af090852a02590c349357b79182c1b681da2c772",
"sha256:24c89346734a4e4d60ecf9b27cac4c1fee3431a413f7aa00be7c4d7bbacc2c4d", "sha256:20e6a27959f162f979165e496add0d7d56d7038237092d1aba20b46de79158f1",
"sha256:25716aa70a0d153cd844fe861d4f3315a6ccafce22b39d8aadbf7fcadff2b633", "sha256:286ff9ec2709d56ae7517040be0d6c502642517ce9937ab6d89b1e7d0904f863",
"sha256:2dacb3dae6b8cc579637a7b72f008bff50a94cde5e36e432352f4ca57b9e54c4", "sha256:297c42ede2c81f0cb6f34ea60b5cf6dc965d97fa6936c11fc3286019231f0d66",
"sha256:34316bf693b1d2d29c087ee7e4bb10cdfa39da5f9c50fa15b07489b4ab93a1b5", "sha256:320c2f4106962ecea0f33d8d31b985d3c185757c49c1fb735501515f963715ed",
"sha256:36b2d700a27e168fa96272b42d28c7ac3ff72030c67b32f37c05616ebd22a202", "sha256:35ed2f3c918a00b109157428abfc4e8d1ffabc37c8f9abc5939ebd1e95dabc47",
"sha256:37978254d9d00cda01acc1997513f786b6b971e57b778fbe7c20e30ae81a97f3", "sha256:3d146e5591cb67c5e836229a04723a30af795ef9b70a0bbd913572e14b7b940f",
"sha256:38289f1690a7e27aacd049e420769b996826f3728756859420eeee21cc857118", "sha256:42bb37e2b2d25d958c25903f6125a41aaaa1ed49ca62c103331f24b8a459142f",
"sha256:385ccf6d011b97768a640e9d4de25412204fbe8d6b9ae39ff115d4ff03f6fe5d", "sha256:42d6007722d46bd2c95cce700181570b56edc0dcbadbfe7855ec26c3f2d7e008",
"sha256:3c7ea86b9ca83e30fa4d4cd0eaf01db3ebcc7b2726a25990966627e39577d729", "sha256:43eba5c46208deedec833663201752e865feddc840433285fbadee07b84b464d",
"sha256:49810f907dfe6de8da5da7d2b238d343e6add62f01a15d03e2195afc180059ed", "sha256:452519bc4c973e961b1620c815ea6dd8944a12d68e71002be5a7aff0a8361571",
"sha256:519c0b3a6fbb68afaa0febf0d28f6c4b0a1074aefc484802ecb9709faf181607", "sha256:4b9c16a807b17b17c4fa3a1d8c242467237be67ba92ad24ff51425329e7ae3d0",
"sha256:51f02ca184518702975b56affde6c573ebad4e411599005ce4468b1014b4786c", "sha256:5510932596a0f33399b7fff1bd61c59c977f2b8ee987b36539ba97eb3513584a",
"sha256:552a39987ac6655dad4bf6f17dd2b55c7b0c6e949d933b8846d2e312ee80005a", "sha256:55820bc631684172b9b56a991d217ec7c2e580d956591dc2144985113980f5a3",
"sha256:596f5ae2eeddb79b595583c2e0285312b2783b0ec759930c272dbf02f851ff75", "sha256:57484d39447f94967e83e56db1b1108c68918c44ab519b8ecfc34b790ca52bf7",
"sha256:6014038f52b4b2ac1fa41a58d439a8a00f015b5c0735a0cd4b09afe344c94899", "sha256:58ba41e462653eaf68fc4a84ec4d350b26a98d030be1ab24aba1adcc78ffe447",
"sha256:61ebbcd208d78658b09e19c78920f1ad38936a0aa0f9c459c46c197d11c580a0", "sha256:5bc5f921be39ccb65fdda741e04b2555917a4bced24b4df14eddc7569be3b493",
"sha256:6213713ac743b190ecbf3f316d6e41d099e774812d470422b3a0f137ea635832", "sha256:5dcc4168536c8f68654f014a3db49b6b4a26b226f735708be2054314ed4964f4",
"sha256:637e27ea1ebe4a561db75a880ac659ff439dec7f55588212e71700bb1ddd5af9", "sha256:5f92a7cdc6a0ae2abd184e8dfd6ef2279989d24c85d2c85d0423206284103ede",
"sha256:6aa427c55a0abec450bca10b64446331b5ca8f79b648531138f357569705bc4a", "sha256:67250b36edfa714ba62dc62d3f238e86db1065fccb538278804790f578253640",
"sha256:6ca45359d7a21644793de0e29de497ef7f1ae7268e346c4faf87b421fea364e6", "sha256:6df070a986fc064d865c381aecf0aaff914178fdf6874da2f2387e82d93cc5bd",
"sha256:6db1b52c6f2c04fafc8da17ea506608e6be7086715dab498570c3e55e4f8fbd1", "sha256:729aa8ca624c42f309397c5fc9e21db90bf7e2fdd872461aabdbada33de9063c",
"sha256:752e7ddfb743344d447367baa85bccd3629c2c3940f70506eb5f01abce98ee68", "sha256:72bc3a5effa5974be6d965ed8301ac1e869bc18425c8a8fac179fbe7876e3aee",
"sha256:760c54ad1b8a9b81951030a7e8e7c3ec0964c1cb9fee585a03ff53d9e531bb8e", "sha256:74d86e8924835f863c34e646392ef39039405f6ce52956d8af16497af4064a30",
"sha256:768632fd8172ae03852e3245f11c8a425d95f65ff444ce46b3e673ae5b057b74", "sha256:79e5af1ff258bc0fe0bdd6f69bc4ae33935a898e3cbefbbccf22e88a27fa053b",
"sha256:7a0b9f6a1a15d494b35f25ed07abda03209fa76c33564c09c9e81d34f4b919d7", "sha256:7b103dffb9f6a47ed7ffdf352b78cfe058b1777617371226c1894e1be443afec",
"sha256:7e070d3aef50ac3856f2ef5ec7214798453da878bb5e5a16c16a61edf1817cc3", "sha256:83f03f0bd88c12e63ca2d024adeee75234d69808b341e88343b0232329e1f1a1",
"sha256:7e12949e5071c20ec49ef00c75121ed2b076972132fc1913ddf5f76cae8d10b4", "sha256:86d7a68fa53688e1f612c3246044157117403c7ce19ebab7d02daf45bd63913e",
"sha256:7e26eac9e52e8ce86f915fd33380f1b6896a2b51994e40bb094841e5003429b4", "sha256:878c626cbca3b649e14e972c14539a01191d79e58934e3f3ef4a9e17f90277f8",
"sha256:85ffd6b1cb0dfb037ede50ff3bef80d9bf7fa60515d192403af6745524524f3b", "sha256:878f5d649ba1db9f52cc4ef491f7dba2d061cdc48dd444c54260eebc0b1729b9",
"sha256:8618d9213a863c468a865e9d2ec50221015f7abf52221bc927152ef26c484b4c", "sha256:87bc01226cd288f0bd9a4f9f07bf6827134dc97a96c22e2d28628e824c8de231",
"sha256:8acef4d8a4353f6678fd1035422a937c2170de58a2b29f7da045d5249e934101", "sha256:8babb2b5751105dc0aef2a2e539f4ba391e738c62038d8cb331c710f6b0f3da7",
"sha256:8d2f355a951f60f0843f2368b39970e4667517e54e86b1508e76f92b44811a8a", "sha256:91e0f7e7be77250b808a5f46d90bf0032527d3c032b2131b63dee54753a4d729",
"sha256:90b6840b6448203228a9d8464a7a0d99aa8fa9f027ef95fe230579abaf8a6ee1", "sha256:9557545c10d52c845f270b665b52a6a972884725aa5cf12777374e18f2ea8960",
"sha256:9187500d83fd0cef4669385cbb0961e227a41c0c9bc39219044e35810793edf7", "sha256:9ccb0a4ab926016867260c24c192d9df9586e834f5db83dfa2c8fffb3a6e5056",
"sha256:93c20777a72cae8620203ac11c4010365706062aa13aaedd1a21bb07adbb9d5d", "sha256:9d828c5987d543d052b53c579a01a52d96b86f937b1777bbfe11ef2728929357",
"sha256:93cce7d422a0093cfb3606beae38a8e47a25232eea0f292c878af580a9dc7605", "sha256:9efa41d1527b366c88f265a227b20bcec65bda879962e3fc8a2aee11e81266d7",
"sha256:94c623c331a48a5ccc7d25271399aff29729fa202c737ae3b4b28b89d2b0976d", "sha256:aaf5317c961d93c1a200b9370fb1c6b6836cc7144fef3e5a951326912bf1f5a3",
"sha256:97f32dc03a8054a4c4a5ab5d761ed4861e828b2c200febd4e46857069a483916", "sha256:ab69b4fe09e296261377d209068d52402fb85ef89dc78a9ac4a29a895f4e24a7",
"sha256:9a2bf98ac92f58777c0fafc772bf0493e67fcf677302e0c0a630ee517a43b949", "sha256:ad397bc7d51d69cb07ef89e44243f971a04ce1dca9bf24c992c362406c0c6573",
"sha256:a602bdc8607c99eb5b391592d58c92618dcd1537fdd87df1813f03fed49957a6", "sha256:ae17fc8103f3b63345709d3e9654a274eee1c6072592aec32b026efd401931d0",
"sha256:a9d24b03daf7415f78abc2d25a208f234e2c585e5e6f92f0204d2ab7b9ab48e3", "sha256:af4d8cc28e4c7a2f6a9fed544228c567340f8258b6d7ea815b62a72817bbd178",
"sha256:abfcb0ef78df0ee9df4ea81f03beea41849340ce33a4c4bd4dbb99e23ec781b6", "sha256:b22ff939a8856a44f4822da38ef4868bd3a9ade22bb6d9062b36957c850e404f",
"sha256:b013f759cd69cb0a62de954d6d2096d648bc210034b79b1881406b07ed0a83f9", "sha256:b549d851f91a4efb3e65498bd4249b1447ab6035a9972f7fc215eb1f59328834",
"sha256:b02e3e72665cd02afafb933453b0c9f6c59ff6e3708bd28d0d8580450e7e88af", "sha256:be319f4eb400ee567b722e9ea63d5b2bb31464e3cf1b016502e3ee2de4f86f5c",
"sha256:b52cc45e71657bc4743a5606d9023459de929b2a198d545868e11898ba1c3f59", "sha256:c0446b2871335d5a5e9fcf1462f954586b09a845832263db95059dcd01442015",
"sha256:ba37f11e1d020969e8a779c06b4af866ffb6b854d7229db63c5fdddfceaa917f", "sha256:c68d2c04f7701a418ec2e5631b7f3552efc32f6bcc1739369c6eeb1af55f62e0",
"sha256:bb804c7d0bfbd7e3f33924ff49757de9106c44e27979e2492819c16972ec0da2", "sha256:c87ac58b9baaf50b6c1b81a18d20eda7e2883aa9a4fb4f1ca70f2e443bfcdc57",
"sha256:bf594cc7cc9d528338d66674c10a5b25e3cde7dd75c3e96784df8f371d77a298", "sha256:caa2734ada16a44ae57b229d45091f06e30a9a52ace76d7574546ab23008c635",
"sha256:c38baee6bdb7fe1b110b6b3aaa555e6e872d322206b7245aa39572d3fc991ee4", "sha256:cb34c2d66355fb70ae47b5595aafd7218e59bb9c00ad8cc3abd1406ca5874f07",
"sha256:c73d2166e4b210b73d1429c4f1ca97cea9cc090e5302df2a7a0a96ce55373f1c", "sha256:cb3652bbe6720786b9137862205986f3ae54a09dec8499a995ed58292bdf77c2",
"sha256:c9099bf89078675c372339011ccfc9ec310310bf6c292b413c013eb90ffdcafc", "sha256:cf668f26604e9f7aee9f8eaae4ca07a948168af90b96be97a4b7fa902a6d2ac1",
"sha256:cf0db26a1f76aa6b3aa314a74b8facd586b7a5457d05b64f8082a62c9c49582a", "sha256:d326ff80ed531bf2507cba93011c30fff2dd51454c85f55df0f59f2030b1687b",
"sha256:d19a34f8a3429bd536996ad53597b805c10352a8561d8382e05830df389d2b43", "sha256:d6c2441538e4fadd4291c8420853431a229fcbefc1bf521810fbc2629d8ae8c2",
"sha256:da80047524eac2acf7c04c18ac7a7da05a9136241f642dd2ed94269ef0d0a45a", "sha256:d6ecfd1970b3380a569d7b3ecc5dd70dba295897418ed9e31ec3c16a5ab099a5",
"sha256:de2923886b5d3214be951bc2ce3f6b8ac0d6dfd4a0d0e2a4d2e5523d8046fdfb", "sha256:e5602a9b5074dcacc113bba4d2f011d2748f50e3201c8139ac5b68cf2a76bd8b",
"sha256:defa0652696ff0ba48c8aff5a1fac1eef1ca6ac9c660b047fc8e7623c4eb5093", "sha256:ef806f684f17dbd6263d72a54ad4073af42b42effa3eb42b877e750c24c76f86",
"sha256:e54a1eb9fd38f2779e973d2f8958fd575b532fe26013405d1afb9ee2374e7ab8", "sha256:f3356afbb301ec34a500b8ba8b47cba0b44ed4641c306e1dd981a08b416170b5",
"sha256:e5c31d70a478b0ca22a9d2d76d520ae996214019d39ed7dd93af872c7f301e52", "sha256:f6f7ee2289176cb1d2c59a24f50900f8b9580259fa9f1a739432242e7d254f93",
"sha256:ebaeb93f90c0903233b11ce913a7cb8f6ee069158406e056f884854c737d2442", "sha256:f7e8f1ee28e0a05831c92dc1c0c1c94af5289963b7cf09eca5b5e3ce4f8c91b0",
"sha256:ecfe51abf7f045e0b9cdde71ca9e153d11238679ef7b5da6c82093874adf3338", "sha256:f8169ec628880bdbca67082a9196e2106060a4a5cbd486ac51881a4df805a36f",
"sha256:f99112aed4fb7cee00c7f77e8b964a9b10f69488cdff626ffd797d02e2e4484f", "sha256:fbc88d3ba402b5d041d204ec2449c4078898f89c4a6e6f0ed1c1a510ef1e221d",
"sha256:fd914db437ec25bfa410f8aa0aa2f3ba87cdfc04d9919d608d02330947afaeab" "sha256:fbd3fe37353c62fd0eb19fb76f78aa693716262bcd5f9c14bb9e5aca4b3f0dc4"
], ],
"version": "==2022.1.18" "markers": "python_version >= '3.6'",
"version": "==2022.3.2"
}, },
"requests": { "requests": {
"hashes": [ "hashes": [
@ -1176,14 +1177,6 @@
"index": "pypi", "index": "pypi",
"version": "==0.14.4" "version": "==0.14.4"
}, },
"setuptools": {
"hashes": [
"sha256:2347b2b432c891a863acadca2da9ac101eae6169b1d3dfee2ec605ecd50dbfe5",
"sha256:e4f30b9f84e5ab3decf945113119649fec09c1fc3507c6ebffec75646c56e62b"
],
"markers": "python_version >= '3.7'",
"version": "==60.9.3"
},
"six": { "six": {
"hashes": [ "hashes": [
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
@ -1273,7 +1266,7 @@
}, },
"spiffworkflow": { "spiffworkflow": {
"git": "https://github.com/sartography/SpiffWorkflow", "git": "https://github.com/sartography/SpiffWorkflow",
"ref": "3904fdbc90f7fabddfe1e6a4f802963a2364ae7e" "ref": "bd09454132aba6a2d0c774672f9bc5c7bfd7fd36"
}, },
"sqlalchemy": { "sqlalchemy": {
"hashes": [ "hashes": [
@ -1471,18 +1464,18 @@
}, },
"xlsxwriter": { "xlsxwriter": {
"hashes": [ "hashes": [
"sha256:1aa65166697c42284e82f5bf9a33c2e913341eeef2b262019c3f5b5334768765", "sha256:df0aefe5137478d206847eccf9f114715e42aaea077e6a48d0e8a2152e983010",
"sha256:53005f03e8eb58f061ebf41d5767c7495ee0772c2396fe26b7e0ca22fa9c2570" "sha256:e89f4a1d2fa2c9ea15cde77de95cd3fd8b0345d0efb3964623f395c8c4988b7f"
], ],
"index": "pypi", "index": "pypi",
"version": "==3.0.2" "version": "==3.0.3"
}, },
"zipp": { "zipp": {
"hashes": [ "hashes": [
"sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d", "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d",
"sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375" "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version < '3.10'",
"version": "==3.7.0" "version": "==3.7.0"
} }
}, },

View File

@ -102,7 +102,7 @@ def evaluate_python_expression(body):
try: try:
script_engine = CustomBpmnScriptEngine() script_engine = CustomBpmnScriptEngine()
result = script_engine._evaluate(body['expression'], **body['data']) result = script_engine._evaluate(body['expression'], body['data'])
return {"result": result, "expression": body['expression'], "key": body['key']} return {"result": result, "expression": body['expression'], "key": body['key']}
except Exception as e: except Exception as e:
return {"result": False, "expression": body['expression'], "key": body['key'], "error": str(e)} return {"result": False, "expression": body['expression'], "key": body['key'], "error": str(e)}

View File

@ -37,24 +37,34 @@ class CustomBpmnScriptEngine(PythonScriptEngine):
scripts directory available for execution. """ scripts directory available for execution. """
def evaluate(self, task, expression): def evaluate(self, task, expression):
return self._evaluate(expression, task.data, task)
@staticmethod
def __get_augment_methods(task):
methods = []
if task:
study_id = task.workflow.data[WorkflowProcessor.STUDY_ID_KEY]
if WorkflowProcessor.WORKFLOW_ID_KEY in task.workflow.data:
workflow_id = task.workflow.data[WorkflowProcessor.WORKFLOW_ID_KEY]
else:
workflow_id = None
if task.workflow.data[WorkflowProcessor.VALIDATION_PROCESS_KEY]:
methods = Script.generate_augmented_validate_list(task, study_id, workflow_id)
else:
methods = Script.generate_augmented_list(task, study_id, workflow_id)
return methods
def _evaluate(self, expression, context, task=None, external_methods=None):
""" """
Evaluate the given expression, within the context of the given task and Evaluate the given expression, within the context of the given task and
return the result. return the result.
""" """
study_id = task.workflow.data[WorkflowProcessor.STUDY_ID_KEY] methods = self.__get_augment_methods(task)
if WorkflowProcessor.WORKFLOW_ID_KEY in task.workflow.data: if(external_methods):
workflow_id = task.workflow.data[WorkflowProcessor.WORKFLOW_ID_KEY] methods.update(external_methods)
else:
workflow_id = None
try: try:
if task.workflow.data[WorkflowProcessor.VALIDATION_PROCESS_KEY]: return super()._evaluate(expression, context, task, methods)
augmentMethods = Script.generate_augmented_validate_list(task, study_id, workflow_id)
else:
augmentMethods = Script.generate_augmented_list(task, study_id, workflow_id)
return self._evaluate(expression, external_methods=augmentMethods, **task.data)
except Exception as e: except Exception as e:
raise WorkflowTaskExecException(task, raise WorkflowTaskExecException(task,
"Error evaluating expression " "Error evaluating expression "
@ -67,11 +77,7 @@ class CustomBpmnScriptEngine(PythonScriptEngine):
else: else:
workflow_id = None workflow_id = None
try: try:
if task.workflow.data[WorkflowProcessor.VALIDATION_PROCESS_KEY]: augment_methods = self.__get_augment_methods(task)
augment_methods = Script.generate_augmented_validate_list(task, study_id, workflow_id)
else:
# Costs 0.25 seconds the first time it is executed.
augment_methods = Script.generate_augmented_list(task, study_id, workflow_id)
super().execute(task, script, data, external_methods=augment_methods) super().execute(task, script, data, external_methods=augment_methods)
except WorkflowException as e: except WorkflowException as e:
raise e raise e
@ -134,12 +140,7 @@ class WorkflowProcessor(object):
self.bpmn_workflow = self.__get_bpmn_workflow(workflow_model, spec, validate_only) self.bpmn_workflow = self.__get_bpmn_workflow(workflow_model, spec, validate_only)
self.bpmn_workflow.script_engine = self._script_engine self.bpmn_workflow.script_engine = self._script_engine
if UserService.has_user(): self.add_user_info_to_workflow(self.bpmn_workflow)
current_user = UserService.current_user(allow_admin_impersonate=True)
current_user_data = UserModelSchema().dump(current_user)
tasks = self.bpmn_workflow.get_tasks(SpiffTask.READY)
for task in tasks:
task.data['current_user'] = current_user_data
if self.WORKFLOW_ID_KEY not in self.bpmn_workflow.data: if self.WORKFLOW_ID_KEY not in self.bpmn_workflow.data:
if not workflow_model.id: if not workflow_model.id:
@ -160,6 +161,15 @@ class WorkflowProcessor(object):
" '%s' due to a mis-placed or missing task '%s'" % " '%s' due to a mis-placed or missing task '%s'" %
(self.workflow_spec_id, str(ke))) (self.workflow_spec_id, str(ke)))
@staticmethod
def add_user_info_to_workflow(bpmn_workflow):
if UserService.has_user():
current_user = UserService.current_user(allow_admin_impersonate=True)
current_user_data = UserModelSchema().dump(current_user)
tasks = bpmn_workflow.get_tasks(SpiffTask.READY)
for task in tasks:
task.data['current_user'] = current_user_data
@staticmethod @staticmethod
def reset(workflow_model, clear_data=False, delete_files=False): def reset(workflow_model, clear_data=False, delete_files=False):
# Try to execute a cancel notify # Try to execute a cancel notify
@ -220,6 +230,7 @@ class WorkflowProcessor(object):
bpmn_workflow = BpmnWorkflow(spec, script_engine=WorkflowProcessor._script_engine) bpmn_workflow = BpmnWorkflow(spec, script_engine=WorkflowProcessor._script_engine)
bpmn_workflow.data[WorkflowProcessor.STUDY_ID_KEY] = study.id bpmn_workflow.data[WorkflowProcessor.STUDY_ID_KEY] = study.id
bpmn_workflow.data[WorkflowProcessor.VALIDATION_PROCESS_KEY] = False bpmn_workflow.data[WorkflowProcessor.VALIDATION_PROCESS_KEY] = False
WorkflowProcessor.add_user_info_to_workflow(bpmn_workflow)
bpmn_workflow.do_engine_steps() bpmn_workflow.do_engine_steps()
except WorkflowException as we: except WorkflowException as we:
raise ApiError.from_task_spec("error_running_master_spec", str(we), we.sender) raise ApiError.from_task_spec("error_running_master_spec", str(we), we.sender)

View File

@ -277,7 +277,7 @@ class WorkflowService(object):
if field.label: if field.label:
try: try:
# Assure that we can evaluate the field.label, but no need to save the resulting value. # Assure that we can evaluate the field.label, but no need to save the resulting value.
task.workflow.script_engine._evaluate(field.label, data) task.workflow.script_engine._evaluate(field.label, data, task)
except Exception as e: except Exception as e:
raise ApiError.from_task("bad label", f'The label "{field.label}" in field {field.id} ' raise ApiError.from_task("bad label", f'The label "{field.label}" in field {field.id} '
f'could not be understood or evaluated. ', f'could not be understood or evaluated. ',
@ -419,7 +419,7 @@ class WorkflowService(object):
# This is generally handled by the front end, but it is possible that the file was uploaded BEFORE # This is generally handled by the front end, but it is possible that the file was uploaded BEFORE
# the doc_code was correctly set, so this is a stop gap measure to assure we still hit it correctly. # the doc_code was correctly set, so this is a stop gap measure to assure we still hit it correctly.
file_id = data[field.id]["id"] file_id = data[field.id]["id"]
doc_code = task.workflow.script_engine._evaluate(field.get_property(Task.FIELD_PROP_DOC_CODE), **data) doc_code = task.workflow.script_engine._evaluate(field.get_property(Task.FIELD_PROP_DOC_CODE), data, task)
file = db.session.query(FileModel).filter(FileModel.id == file_id).first() file = db.session.query(FileModel).filter(FileModel.id == file_id).first()
if (file): if (file):
file.irb_doc_code = doc_code file.irb_doc_code = doc_code
@ -463,7 +463,7 @@ class WorkflowService(object):
new_data = copy.deepcopy(task.data) new_data = copy.deepcopy(task.data)
try: try:
return task.workflow.script_engine._evaluate(expression, **data) return task.workflow.script_engine._evaluate(expression, data, task)
except Exception as e: except Exception as e:
message = f"The field {field.id} contains an invalid expression: '{expression}'. {e}" message = f"The field {field.id} contains an invalid expression: '{expression}'. {e}"
raise ApiError.from_task(f'invalid_{property_name}', message, task=task) raise ApiError.from_task(f'invalid_{property_name}', message, task=task)
@ -484,7 +484,7 @@ class WorkflowService(object):
default = None default = None
if field.default_value is not None: if field.default_value is not None:
try: try:
default = task.workflow.script_engine._evaluate(field.default_value, data) default = task.workflow.script_engine._evaluate(field.default_value, data, task)
except Exception as e: except Exception as e:
raise WorkflowTaskExecException(task, "invalid_default", e) raise WorkflowTaskExecException(task, "invalid_default", e)
# If no default exists, return None # If no default exists, return None

View File

@ -1,24 +1,21 @@
import json
import logging
import os import os
from unittest.mock import patch
from SpiffWorkflow.bpmn.specs.events import EndEvent
from tests.base_test import BaseTest from tests.base_test import BaseTest
from SpiffWorkflow.bpmn.specs.events import EndEvent
from SpiffWorkflow.camunda.specs.UserTask import FormField from SpiffWorkflow.camunda.specs.UserTask import FormField
from flask import g
from crc import session, db, app from crc import session, db, app
from crc.api.common import ApiError from crc.api.common import ApiError
from crc.models.file import FileModel, FileDataModel from crc.models.file import FileModel, FileDataModel
from crc.models.protocol_builder import ProtocolBuilderCreatorStudySchema
from crc.models.study import StudyModel from crc.models.study import StudyModel
from crc.models.workflow import WorkflowStatus from crc.models.workflow import WorkflowStatus
from crc.models.user import UserModel
from crc.services.spec_file_service import SpecFileService
from crc.services.study_service import StudyService from crc.services.study_service import StudyService
from crc.services.workflow_processor import WorkflowProcessor from crc.services.workflow_processor import WorkflowProcessor
from crc.services.workflow_service import WorkflowService from crc.services.workflow_service import WorkflowService
from crc.services.spec_file_service import SpecFileService
class TestWorkflowProcessor(BaseTest): class TestWorkflowProcessor(BaseTest):
@ -347,3 +344,14 @@ class TestWorkflowProcessor(BaseTest):
supervisor_task = processor.next_user_tasks()[0] supervisor_task = processor.next_user_tasks()[0]
self.assertEqual("supervisor", supervisor_task.task_spec.lane) self.assertEqual("supervisor", supervisor_task.task_spec.lane)
def test_run_master_spec_knows_about_current_user(self):
"""Master spec should have access to the current user."""
spec = self.load_test_spec('empty_workflow', "Master", master_spec=True)
study = self.create_study()
# Make it seem like we are logged in
g.user = UserModel.query.filter_by(uid=study.user_uid).first()
g.token = 'my_fake_token'
results = WorkflowProcessor.run_master_spec(spec, study)
self.assertIn('current_user', results.keys())