Merge branch 'dev' into post-submission-states-247

# Conflicts:
#	pb/pb_mock.py

Conflicts were import statements
This commit is contained in:
mike cullerton 2021-06-23 11:16:09 -04:00
commit d71360f49a
11 changed files with 446 additions and 236 deletions

382
Pipfile.lock generated
View File

@ -18,31 +18,31 @@
"default": {
"alembic": {
"hashes": [
"sha256:66bbb0e7d6277b007dfe7e27237093c79b76cf4f94e6fbd0f7af6f9409546fe6",
"sha256:f33d561f3ce2ca390f1c87ff3849cd7d97bb93bae9c91357727263498e10028f"
"sha256:a21fedebb3fb8f6bbbba51a11114f08c78709377051384c9c5ead5705ee93a51",
"sha256:e78be5b919f5bb184e3e0e2dd1ca986f2362e29a2bc933c446fe89f39dbe4e9c"
],
"version": "==1.5.7"
"version": "==1.6.5"
},
"attrs": {
"hashes": [
"sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6",
"sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"
"sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1",
"sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"
],
"version": "==20.3.0"
"version": "==21.2.0"
},
"babel": {
"hashes": [
"sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5",
"sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"
"sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9",
"sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"
],
"version": "==2.9.0"
"version": "==2.9.1"
},
"certifi": {
"hashes": [
"sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c",
"sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"
"sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee",
"sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"
],
"version": "==2020.12.5"
"version": "==2021.5.30"
},
"chardet": {
"hashes": [
@ -53,10 +53,10 @@
},
"click": {
"hashes": [
"sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a",
"sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"
"sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a",
"sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"
],
"version": "==7.1.2"
"version": "==8.0.1"
},
"clickclick": {
"hashes": [
@ -78,10 +78,10 @@
},
"decorator": {
"hashes": [
"sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760",
"sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"
"sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323",
"sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"
],
"version": "==4.4.2"
"version": "==5.0.9"
},
"dnspython": {
"hashes": [
@ -199,52 +199,58 @@
},
"greenlet": {
"hashes": [
"sha256:0a77691f0080c9da8dfc81e23f4e3cffa5accf0f5b56478951016d7cfead9196",
"sha256:0ddd77586553e3daf439aa88b6642c5f252f7ef79a39271c25b1d4bf1b7cbb85",
"sha256:111cfd92d78f2af0bc7317452bd93a477128af6327332ebf3c2be7df99566683",
"sha256:122c63ba795fdba4fc19c744df6277d9cfd913ed53d1a286f12189a0265316dd",
"sha256:181300f826625b7fd1182205b830642926f52bd8cdb08b34574c9d5b2b1813f7",
"sha256:1a1ada42a1fd2607d232ae11a7b3195735edaa49ea787a6d9e6a53afaf6f3476",
"sha256:1bb80c71de788b36cefb0c3bb6bfab306ba75073dbde2829c858dc3ad70f867c",
"sha256:1d1d4473ecb1c1d31ce8fd8d91e4da1b1f64d425c1dc965edc4ed2a63cfa67b2",
"sha256:292e801fcb3a0b3a12d8c603c7cf340659ea27fd73c98683e75800d9fd8f704c",
"sha256:2c65320774a8cd5fdb6e117c13afa91c4707548282464a18cf80243cf976b3e6",
"sha256:4365eccd68e72564c776418c53ce3c5af402bc526fe0653722bc89efd85bf12d",
"sha256:5352c15c1d91d22902582e891f27728d8dac3bd5e0ee565b6a9f575355e6d92f",
"sha256:58ca0f078d1c135ecf1879d50711f925ee238fe773dfe44e206d7d126f5bc664",
"sha256:5d4030b04061fdf4cbc446008e238e44936d77a04b2b32f804688ad64197953c",
"sha256:5d69bbd9547d3bc49f8a545db7a0bd69f407badd2ff0f6e1a163680b5841d2b0",
"sha256:5f297cb343114b33a13755032ecf7109b07b9a0020e841d1c3cedff6602cc139",
"sha256:62afad6e5fd70f34d773ffcbb7c22657e1d46d7fd7c95a43361de979f0a45aef",
"sha256:647ba1df86d025f5a34043451d7c4a9f05f240bee06277a524daad11f997d1e7",
"sha256:719e169c79255816cdcf6dccd9ed2d089a72a9f6c42273aae12d55e8d35bdcf8",
"sha256:7cd5a237f241f2764324396e06298b5dee0df580cf06ef4ada0ff9bff851286c",
"sha256:875d4c60a6299f55df1c3bb870ebe6dcb7db28c165ab9ea6cdc5d5af36bb33ce",
"sha256:90b6a25841488cf2cb1c8623a53e6879573010a669455046df5f029d93db51b7",
"sha256:94620ed996a7632723a424bccb84b07e7b861ab7bb06a5aeb041c111dd723d36",
"sha256:b5f1b333015d53d4b381745f5de842f19fe59728b65f0fbb662dafbe2018c3a5",
"sha256:c5b22b31c947ad8b6964d4ed66776bcae986f73669ba50620162ba7c832a6b6a",
"sha256:c93d1a71c3fe222308939b2e516c07f35a849c5047f0197442a4d6fbcb4128ee",
"sha256:cdb90267650c1edb54459cdb51dab865f6c6594c3a47ebd441bc493360c7af70",
"sha256:cfd06e0f0cc8db2a854137bd79154b61ecd940dce96fad0cba23fe31de0b793c",
"sha256:d3789c1c394944084b5e57c192889985a9f23bd985f6d15728c745d380318128",
"sha256:da7d09ad0f24270b20f77d56934e196e982af0d0a2446120cb772be4e060e1a2",
"sha256:df3e83323268594fa9755480a442cabfe8d82b21aba815a71acf1bb6c1776218",
"sha256:df8053867c831b2643b2c489fe1d62049a98566b1646b194cc815f13e27b90df",
"sha256:e1128e022d8dce375362e063754e129750323b67454cac5600008aad9f54139e",
"sha256:e6e9fdaf6c90d02b95e6b0709aeb1aba5affbbb9ccaea5502f8638e4323206be",
"sha256:eac8803c9ad1817ce3d8d15d1bb82c2da3feda6bee1153eec5c58fa6e5d3f770",
"sha256:eb333b90036358a0e2c57373f72e7648d7207b76ef0bd00a4f7daad1f79f5203",
"sha256:ed1d1351f05e795a527abc04a0d82e9aecd3bdf9f46662c36ff47b0b00ecaf06",
"sha256:f3dc68272990849132d6698f7dc6df2ab62a88b0d36e54702a8fd16c0490e44f",
"sha256:f59eded163d9752fd49978e0bab7a1ff21b1b8d25c05f0995d140cc08ac83379",
"sha256:f5e2d36c86c7b03c94b8459c3bd2c9fe2c7dab4b258b8885617d44a22e453fb7",
"sha256:f6f65bf54215e4ebf6b01e4bb94c49180a589573df643735107056f7a910275b",
"sha256:f8450d5ef759dbe59f84f2c9f77491bb3d3c44bc1a573746daf086e70b14c243",
"sha256:f97d83049715fd9dec7911860ecf0e17b48d8725de01e45de07d8ac0bd5bc378"
"sha256:03f28a5ea20201e70ab70518d151116ce939b412961c33827519ce620957d44c",
"sha256:06d7ac89e6094a0a8f8dc46aa61898e9e1aec79b0f8b47b2400dd51a44dbc832",
"sha256:06ecb43b04480e6bafc45cb1b4b67c785e183ce12c079473359e04a709333b08",
"sha256:096cb0217d1505826ba3d723e8981096f2622cde1eb91af9ed89a17c10aa1f3e",
"sha256:0c557c809eeee215b87e8a7cbfb2d783fb5598a78342c29ade561440abae7d22",
"sha256:0de64d419b1cb1bfd4ea544bedea4b535ef3ae1e150b0f2609da14bbf48a4a5f",
"sha256:14927b15c953f8f2d2a8dffa224aa78d7759ef95284d4c39e1745cf36e8cdd2c",
"sha256:16183fa53bc1a037c38d75fdc59d6208181fa28024a12a7f64bb0884434c91ea",
"sha256:206295d270f702bc27dbdbd7651e8ebe42d319139e0d90217b2074309a200da8",
"sha256:22002259e5b7828b05600a762579fa2f8b33373ad95a0ee57b4d6109d0e589ad",
"sha256:2325123ff3a8ecc10ca76f062445efef13b6cf5a23389e2df3c02a4a527b89bc",
"sha256:258f9612aba0d06785143ee1cbf2d7361801c95489c0bd10c69d163ec5254a16",
"sha256:3096286a6072553b5dbd5efbefc22297e9d06a05ac14ba017233fedaed7584a8",
"sha256:3d13da093d44dee7535b91049e44dd2b5540c2a0e15df168404d3dd2626e0ec5",
"sha256:408071b64e52192869129a205e5b463abda36eff0cebb19d6e63369440e4dc99",
"sha256:598bcfd841e0b1d88e32e6a5ea48348a2c726461b05ff057c1b8692be9443c6e",
"sha256:5d928e2e3c3906e0a29b43dc26d9b3d6e36921eee276786c4e7ad9ff5665c78a",
"sha256:5f75e7f237428755d00e7460239a2482fa7e3970db56c8935bd60da3f0733e56",
"sha256:60848099b76467ef09b62b0f4512e7e6f0a2c977357a036de602b653667f5f4c",
"sha256:6b1d08f2e7f2048d77343279c4d4faa7aef168b3e36039cba1917fffb781a8ed",
"sha256:70bd1bb271e9429e2793902dfd194b653221904a07cbf207c3139e2672d17959",
"sha256:76ed710b4e953fc31c663b079d317c18f40235ba2e3d55f70ff80794f7b57922",
"sha256:7920e3eccd26b7f4c661b746002f5ec5f0928076bd738d38d894bb359ce51927",
"sha256:7db68f15486d412b8e2cfcd584bf3b3a000911d25779d081cbbae76d71bd1a7e",
"sha256:8833e27949ea32d27f7e96930fa29404dd4f2feb13cce483daf52e8842ec246a",
"sha256:944fbdd540712d5377a8795c840a97ff71e7f3221d3fddc98769a15a87b36131",
"sha256:9a6b035aa2c5fcf3dbbf0e3a8a5bc75286fc2d4e6f9cfa738788b433ec894919",
"sha256:9bdcff4b9051fb1aa4bba4fceff6a5f770c6be436408efd99b76fc827f2a9319",
"sha256:a9017ff5fc2522e45562882ff481128631bf35da444775bc2776ac5c61d8bcae",
"sha256:aa4230234d02e6f32f189fd40b59d5a968fe77e80f59c9c933384fe8ba535535",
"sha256:ad80bb338cf9f8129c049837a42a43451fc7c8b57ad56f8e6d32e7697b115505",
"sha256:adb94a28225005890d4cf73648b5131e885c7b4b17bc762779f061844aabcc11",
"sha256:b3090631fecdf7e983d183d0fad7ea72cfb12fa9212461a9b708ff7907ffff47",
"sha256:b33b51ab057f8a20b497ffafdb1e79256db0c03ef4f5e3d52e7497200e11f821",
"sha256:b97c9a144bbeec7039cca44df117efcbeed7209543f5695201cacf05ba3b5857",
"sha256:be13a18cec649ebaab835dff269e914679ef329204704869f2f167b2c163a9da",
"sha256:be9768e56f92d1d7cd94185bab5856f3c5589a50d221c166cc2ad5eb134bd1dc",
"sha256:c1580087ab493c6b43e66f2bdd165d9e3c1e86ef83f6c2c44a29f2869d2c5bd5",
"sha256:c35872b2916ab5a240d52a94314c963476c989814ba9b519bc842e5b61b464bb",
"sha256:c70c7dd733a4c56838d1f1781e769081a25fade879510c5b5f0df76956abfa05",
"sha256:c767458511a59f6f597bfb0032a1c82a52c29ae228c2c0a6865cfeaeaac4c5f5",
"sha256:c87df8ae3f01ffb4483c796fe1b15232ce2b219f0b18126948616224d3f658ee",
"sha256:ca1c4a569232c063615f9e70ff9a1e2fee8c66a6fb5caf0f5e8b21a396deec3e",
"sha256:cc407b68e0a874e7ece60f6639df46309376882152345508be94da608cc0b831",
"sha256:da862b8f7de577bc421323714f63276acb2f759ab8c5e33335509f0b89e06b8f",
"sha256:dfe7eac0d253915116ed0cd160a15a88981a1d194c1ef151e862a5c7d2f853d3",
"sha256:ed1377feed808c9c1139bdb6a61bcbf030c236dd288d6fca71ac26906ab03ba6",
"sha256:f42ad188466d946f1b3afc0a9e1a266ac8926461ee0786c06baac6bd71f8a6f3",
"sha256:f92731609d6625e1cc26ff5757db4d32b6b810d2a3363b0ff94ff573e5901f6f"
],
"markers": "platform_python_implementation == 'CPython'",
"version": "==1.0.0"
"version": "==1.1.0"
},
"gunicorn": {
"hashes": [
@ -290,18 +296,17 @@
},
"itsdangerous": {
"hashes": [
"sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
"sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
"sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c",
"sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"
],
"version": "==1.1.0"
"version": "==2.0.1"
},
"jinja2": {
"hashes": [
"sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419",
"sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"
"sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4",
"sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"
],
"index": "pypi",
"version": "==2.11.3"
"version": "==3.0.1"
},
"jsonschema": {
"hashes": [
@ -340,67 +345,49 @@
},
"markupsafe": {
"hashes": [
"sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
"sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
"sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f",
"sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39",
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
"sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014",
"sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f",
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
"sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
"sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
"sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85",
"sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1",
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
"sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
"sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850",
"sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0",
"sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
"sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
"sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb",
"sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
"sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
"sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
"sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1",
"sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2",
"sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
"sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
"sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
"sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7",
"sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
"sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8",
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
"sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193",
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
"sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b",
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
"sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
"sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5",
"sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c",
"sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032",
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
"sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be",
"sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"
"sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298",
"sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64",
"sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b",
"sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567",
"sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff",
"sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74",
"sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35",
"sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26",
"sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7",
"sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75",
"sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f",
"sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135",
"sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8",
"sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a",
"sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914",
"sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18",
"sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8",
"sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2",
"sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d",
"sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b",
"sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f",
"sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb",
"sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833",
"sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415",
"sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902",
"sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9",
"sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d",
"sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066",
"sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f",
"sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5",
"sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94",
"sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509",
"sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51",
"sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"
],
"version": "==1.1.1"
"version": "==2.0.1"
},
"marshmallow": {
"hashes": [
"sha256:4ab2fdb7f36eb61c3665da67a7ce281c8900db08d72ba6bf0e695828253581f7",
"sha256:eca81d53aa4aafbc0e20566973d0d2e50ce8bf0ee15165bb799bec0df1e50177"
"sha256:8050475b70470cc58f4441ee92375db611792ba39ca1ad41d39cad193ea9e040",
"sha256:b45cde981d1835145257b4a3c5cb7b80786dcf5f50dd2990749a50c16cb48e01"
],
"version": "==3.10.0"
"version": "==3.12.1"
},
"marshmallow-sqlalchemy": {
"hashes": [
@ -412,19 +399,19 @@
},
"openapi-schema-validator": {
"hashes": [
"sha256:60d3401cc1579eed0c1f2bec1a669a964a9974bc6a940261bf7c8aa9edb7d409",
"sha256:66fa34b40a40b1ff927e1db8bf5a20dc84fd0933fc284ec0dc87d7ae889a0874",
"sha256:782c7be7fd75ab172fb47b4504a63833001f7d5de0a06a08998c146e5f923f0a"
"sha256:215b516d0942f4e8e2446cf3f7d4ff2ed71d102ebddcc30526d8a3f706ab1df6",
"sha256:a4b2712020284cee880b4c55faa513fbc2f8f07f365deda6098f8ab943c9f0df",
"sha256:b65d6c2242620bfe76d4c749b61cd9657e4528895a8f4fb6f916085b508ebd24"
],
"version": "==0.1.4"
"version": "==0.1.5"
},
"openapi-spec-validator": {
"hashes": [
"sha256:4083fc5aac3e9f751c2a82d4ec5cf3adad5f967d0faf31495d8b56a0b0f9705c",
"sha256:53ba3d884e98ff2062d5ada025aa590541dcd665b8f81067dc82dd61c0923759",
"sha256:e11df7c559339027bd04f2399bc82474983129a6a7a6a0421eaa95e2c844d686"
"sha256:0a7da925bad4576f4518f77302c0b1990adb2fbcbe7d63fb4ed0de894cad8bdd",
"sha256:3d70e6592754799f7e77a45b98c6a91706bdd309a425169d17d8e92173e198a2",
"sha256:ba28b06e63274f2bc6de995a07fb572c657e534425b5baf68d9f7911efe6929f"
],
"version": "==0.3.0"
"version": "==0.3.1"
},
"psycopg2-binary": {
"hashes": [
@ -552,10 +539,10 @@
},
"six": {
"hashes": [
"sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259",
"sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
],
"version": "==1.15.0"
"version": "==1.16.0"
},
"sqlalchemy": {
"hashes": [
@ -603,9 +590,10 @@
},
"sqlalchemy-utils": {
"hashes": [
"sha256:fb66e9956e41340011b70b80f898fde6064ec1817af77199ee21ace71d7d6ab0"
"sha256:5b774ab2d2196ca46e1c75a8c4fd5b0093c47dcfff3f6d7bbb821d3ccacfeb4f",
"sha256:62a504b61d17837cb7846f4fb7c9319754685e232d2b8b4cdd4cf792dd48e78f"
],
"version": "==0.36.8"
"version": "==0.37.5"
},
"swagger-ui-bundle": {
"hashes": [
@ -616,10 +604,11 @@
},
"urllib3": {
"hashes": [
"sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df",
"sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"
"sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c",
"sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"
],
"version": "==1.26.4"
"index": "pypi",
"version": "==1.26.5"
},
"validators": {
"hashes": [
@ -672,69 +661,68 @@
},
"zope.interface": {
"hashes": [
"sha256:05a97ba92c1c7c26f25c9f671aa1ef85ffead6cdad13770e5b689cf983adc7e1",
"sha256:07d61722dd7d85547b7c6b0f5486b4338001fab349f2ac5cabc0b7182eb3425d",
"sha256:0a990dcc97806e5980bbb54b2e46b9cde9e48932d8e6984daf71ef1745516123",
"sha256:150e8bcb7253a34a4535aeea3de36c0bb3b1a6a47a183a95d65a194b3e07f232",
"sha256:1743bcfe45af8846b775086471c28258f4c6e9ee8ef37484de4495f15a98b549",
"sha256:1b5f6c8fff4ed32aa2dd43e84061bc8346f32d3ba6ad6e58f088fe109608f102",
"sha256:21e49123f375703cf824214939d39df0af62c47d122d955b2a8d9153ea08cfd5",
"sha256:21f579134a47083ffb5ddd1307f0405c91aa8b61ad4be6fd5af0171474fe0c45",
"sha256:27c267dc38a0f0079e96a2945ee65786d38ef111e413c702fbaaacbab6361d00",
"sha256:299bde0ab9e5c4a92f01a152b7fbabb460f31343f1416f9b7b983167ab1e33bc",
"sha256:2ab88d8f228f803fcb8cb7d222c579d13dab2d3622c51e8cf321280da01102a7",
"sha256:2ced4c35061eea623bc84c7711eedce8ecc3c2c51cd9c6afa6290df3bae9e104",
"sha256:2dcab01c660983ba5e5a612e0c935141ccbee67d2e2e14b833e01c2354bd8034",
"sha256:32546af61a9a9b141ca38d971aa6eb9800450fa6620ce6323cc30eec447861f3",
"sha256:32b40a4c46d199827d79c86bb8cb88b1bbb764f127876f2cb6f3a47f63dbada3",
"sha256:3cc94c69f6bd48ed86e8e24f358cb75095c8129827df1298518ab860115269a4",
"sha256:42b278ac0989d6f5cf58d7e0828ea6b5951464e3cf2ff229dd09a96cb6ba0c86",
"sha256:495b63fd0302f282ee6c1e6ea0f1c12cb3d1a49c8292d27287f01845ff252a96",
"sha256:4af87cdc0d4b14e600e6d3d09793dce3b7171348a094ba818e2a68ae7ee67546",
"sha256:4b94df9f2fdde7b9314321bab8448e6ad5a23b80542dcab53e329527d4099dcb",
"sha256:4c48ddb63e2b20fba4c6a2bf81b4d49e99b6d4587fb67a6cd33a2c1f003af3e3",
"sha256:4df9afd17bd5477e9f8c8b6bb8507e18dd0f8b4efe73bb99729ff203279e9e3b",
"sha256:518950fe6a5d56f94ba125107895f938a4f34f704c658986eae8255edb41163b",
"sha256:538298e4e113ccb8b41658d5a4b605bebe75e46a30ceca22a5a289cf02c80bec",
"sha256:55465121e72e208a7b69b53de791402affe6165083b2ea71b892728bd19ba9ae",
"sha256:588384d70a0f19b47409cfdb10e0c27c20e4293b74fc891df3d8eb47782b8b3e",
"sha256:6278c080d4afffc9016e14325f8734456831124e8c12caa754fd544435c08386",
"sha256:64ea6c221aeee4796860405e1aedec63424cda4202a7ad27a5066876db5b0fd2",
"sha256:681dbb33e2b40262b33fd383bae63c36d33fd79fa1a8e4092945430744ffd34a",
"sha256:6936aa9da390402d646a32a6a38d5409c2d2afb2950f045a7d02ab25a4e7d08d",
"sha256:778d0ec38bbd288b150a3ae363c8ffd88d2207a756842495e9bffd8a8afbc89a",
"sha256:8251f06a77985a2729a8bdbefbae79ee78567dddc3acbd499b87e705ca59fe24",
"sha256:83b4aa5344cce005a9cff5d0321b2e318e871cc1dfc793b66c32dd4f59e9770d",
"sha256:844fad925ac5c2ad4faaceb3b2520ad016b5280105c6e16e79838cf951903a7b",
"sha256:8ceb3667dd13b8133f2e4d637b5b00f240f066448e2aa89a41f4c2d78a26ce50",
"sha256:92dc0fb79675882d0b6138be4bf0cec7ea7c7eede60aaca78303d8e8dbdaa523",
"sha256:9789bd945e9f5bd026ed3f5b453d640befb8b1fc33a779c1fe8d3eb21fe3fb4a",
"sha256:a2b6d6eb693bc2fc6c484f2e5d93bd0b0da803fa77bf974f160533e555e4d095",
"sha256:aab9f1e34d810feb00bf841993552b8fcc6ae71d473c505381627143d0018a6a",
"sha256:abb61afd84f23099ac6099d804cdba9bd3b902aaaded3ffff47e490b0a495520",
"sha256:adf9ee115ae8ff8b6da4b854b4152f253b390ba64407a22d75456fe07dcbda65",
"sha256:aedc6c672b351afe6dfe17ff83ee5e7eb6ed44718f879a9328a68bdb20b57e11",
"sha256:b7a00ecb1434f8183395fac5366a21ee73d14900082ca37cf74993cf46baa56c",
"sha256:ba32f4a91c1cb7314c429b03afbf87b1fff4fb1c8db32260e7310104bd77f0c7",
"sha256:cbd0f2cbd8689861209cd89141371d3a22a11613304d1f0736492590aa0ab332",
"sha256:e4bc372b953bf6cec65a8d48482ba574f6e051621d157cf224227dbb55486b1e",
"sha256:eccac3d9aadc68e994b6d228cb0c8919fc47a5350d85a1b4d3d81d1e98baf40c",
"sha256:efd550b3da28195746bb43bd1d815058181a7ca6d9d6aa89dd37f5eefe2cacb7",
"sha256:efef581c8ba4d990770875e1a2218e856849d32ada2680e53aebc5d154a17e20",
"sha256:f057897711a630a0b7a6a03f1acf379b6ba25d37dc5dc217a97191984ba7f2fc",
"sha256:f37d45fab14ffef9d33a0dc3bc59ce0c5313e2253323312d47739192da94f5fd",
"sha256:f44906f70205d456d503105023041f1e63aece7623b31c390a0103db4de17537"
"sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192",
"sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702",
"sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09",
"sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4",
"sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a",
"sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3",
"sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf",
"sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c",
"sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d",
"sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78",
"sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83",
"sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531",
"sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46",
"sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021",
"sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94",
"sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc",
"sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63",
"sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54",
"sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117",
"sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25",
"sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05",
"sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e",
"sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1",
"sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004",
"sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2",
"sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e",
"sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f",
"sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f",
"sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120",
"sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f",
"sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1",
"sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9",
"sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e",
"sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7",
"sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8",
"sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b",
"sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155",
"sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7",
"sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c",
"sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325",
"sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d",
"sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb",
"sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e",
"sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959",
"sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7",
"sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920",
"sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e",
"sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48",
"sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8",
"sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4",
"sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263"
],
"version": "==5.2.0"
"version": "==5.4.0"
}
},
"develop": {
"attrs": {
"hashes": [
"sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6",
"sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"
"sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1",
"sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"
],
"version": "==20.3.0"
"version": "==21.2.0"
},
"coverage": {
"hashes": [

View File

@ -0,0 +1,24 @@
"""add new study detail
Revision ID: af3a7d80c102
Revises: 6c34576847ab
Create Date: 2021-05-26 16:24:37.196893
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'af3a7d80c102'
down_revision = '6c34576847ab'
branch_labels = None
depends_on = None
def upgrade():
op.add_column('study_details', sa.Column('UVA_STUDY_TRACKING', sa.String(), nullable=True))
def downgrade():
op.drop_column('study_details', 'UVA_STUDY_TRACKING')

View File

@ -11,7 +11,7 @@ import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c1b37c418abd'
down_revision = '6c34576847ab'
down_revision = 'af3a7d80c102'
branch_labels = None
depends_on = None

View File

@ -65,7 +65,7 @@ class StudySponsorForm(FlaskForm):
class StudyDetailsForm(ModelForm, FlaskForm):
class Meta:
model = StudyDetails
only = ['IS_IND', 'IND_1', 'IND_2', 'IND_3', 'IS_UVA_IND', 'IS_IDE', 'IDE',
only = ['IS_IND', 'UVA_STUDY_TRACKING', 'IND_1', 'IND_2', 'IND_3', 'IS_UVA_IND', 'IS_IDE', 'IDE',
'IS_UVA_IDE', 'IS_CHART_REVIEW', 'IS_RADIATION', 'GCRC_NUMBER', 'IS_GCRC',
'IS_PRC_DSMP', 'IS_PRC', 'PRC_NUMBER', 'IS_IBC', 'IBC_NUMBER',
'IS_SPONSOR_TRACKING', 'SPONSOR_TRACKING', 'SPONSORS_PROTOCOL_REVISION_DATE',

View File

@ -203,25 +203,33 @@ class RequiredDocument(db.Model):
@staticmethod
def all():
docs = [RequiredDocument(AUXDOCID=1, AUXDOC="Investigators Brochure"),
RequiredDocument(AUXDOCID=2, AUXDOC="Screening Log"),
RequiredDocument(AUXDOCID=3, AUXDOC="Protocol"),
RequiredDocument(AUXDOCID=6, AUXDOC="Cancer Center's PRC Approval Form"),
RequiredDocument(AUXDOCID=7, AUXDOC="GCRC Approval Form"),
RequiredDocument(AUXDOCID=8, AUXDOC="SOM CTO IND/IDE Review Letter"),
RequiredDocument(AUXDOCID=9, AUXDOC="HIRE Approval"),
RequiredDocument(AUXDOCID=10, AUXDOC="Cancer Center's PRC Approval Waiver"),
RequiredDocument(AUXDOCID=11, AUXDOC="HSR Grant"),
RequiredDocument(AUXDOCID=12, AUXDOC="Certificate of Confidentiality Application"),
RequiredDocument(AUXDOCID=14, AUXDOC="Institutional Biosafety Committee Approval"),
RequiredDocument(AUXDOCID=18, AUXDOC="SOM CTO Approval Letter - UVA PI Multisite Trial"),
RequiredDocument(AUXDOCID=20,
AUXDOC="IRB Approval or Letter of Approval from Administration: Study Conducted at non- UVA Facilities "),
RequiredDocument(AUXDOCID=19, AUXDOC="IRB Approval or Letter of Approval from Administration: Send Data or Specimens to UVA"),
RequiredDocument(AUXDOCID=20, AUXDOC="IRB Approval or Letter of Approval from Administration: Study Conducted at non- UVA Facilities "),
RequiredDocument(AUXDOCID=21, AUXDOC="New Medical Device Form"),
RequiredDocument(AUXDOCID=22, AUXDOC="SOM CTO Review regarding need for IDE"),
RequiredDocument(AUXDOCID=23, AUXDOC="SOM CTO Review regarding need for IND"),
RequiredDocument(AUXDOCID=24, AUXDOC="InfoSec Approval"),
RequiredDocument(AUXDOCID=25, AUXDOC="Scientific Pre-review Documentation"),
RequiredDocument(AUXDOCID=26, AUXDOC="IBC Number"),
RequiredDocument(AUXDOCID=32, AUXDOC="IDS - Investigational Drug Service Approval"),
RequiredDocument(AUXDOCID=33, AUXDOC="Data Security Plan"),
RequiredDocument(AUXDOCID=35, AUXDOC="Model Consent"),
RequiredDocument(AUXDOCID=36, AUXDOC="RDRC Approval "),
RequiredDocument(AUXDOCID=39, AUXDOC="Age of Majority Cover Letter and Consent"),
RequiredDocument(AUXDOCID=40, AUXDOC="SBS/IRB Approval-FERPA"),
RequiredDocument(AUXDOCID=41, AUXDOC="HIRE Standard Radiation Language"),
RequiredDocument(AUXDOCID=42, AUXDOC="COI Management Plan "),
RequiredDocument(AUXDOCID=42, AUXDOC="COI Management Plan"),
RequiredDocument(AUXDOCID=43, AUXDOC="SOM CTO Approval Letter-Non UVA, Non Industry PI MultiSite Study"),
RequiredDocument(AUXDOCID=44, AUXDOC="GRIME Approval"),
RequiredDocument(AUXDOCID=45, AUXDOC="GMEC Approval"),
@ -233,10 +241,11 @@ class RequiredDocument(db.Model):
RequiredDocument(AUXDOCID=52, AUXDOC="Package Inserts"),
RequiredDocument(AUXDOCID=53, AUXDOC="IRB Reliance Agreement Request Form- IRB-HSR Not IRB of Record"),
RequiredDocument(AUXDOCID=54, AUXDOC="ESCRO Approval"),
RequiredDocument(AUXDOCID=57, AUXDOC="Laser Safety Officer Approval")]
RequiredDocument(AUXDOCID=56, AUXDOC="Unaffiliated Investigator Agreement "),
RequiredDocument(AUXDOCID=57, AUXDOC="Laser Safety Officer Approval"),
RequiredDocument(AUXDOCID=58, AUXDOC="FDA Letter granting IND/IDE# or exemption")]
return docs
class RequiredDocumentSchema(ma.Schema):
class Meta:
fields = ("AUXDOCID", "AUXDOC")
@ -262,6 +271,7 @@ class IRBStatusSchema(ma.Schema):
class StudyDetails(db.Model):
STUDYID = db.Column(db.Integer, db.ForeignKey('study.STUDYID'), primary_key=True)
UVA_STUDY_TRACKING = db.Column(db.String, nullable=True)
IS_IND = db.Column(db.Integer, nullable=True)
IND_1 = db.Column(db.String, nullable=True)
IND_2 = db.Column(db.String, nullable=True)

View File

@ -1,12 +1,19 @@
from pb.models import Study, RequiredDocument, StudyDetails, IRBStatus, IRBInfo, SelectedUser, IRBInfoEvent, IRBInfoStatus
from pb.models import IRBInfo, IRBStatus, RequiredDocument, StudyDetails, SelectedUser, Study, IRBInfoEvent, IRBInfoStatus
from pb.forms import StudyTable
from pb import BASE_HREF, app, db, session
from flask import g, render_template, redirect, url_for
from io import TextIOWrapper
from sqlalchemy import func
import datetime
import csv
from io import TextIOWrapper
import requests
import json
def _is_development():
return 'DEVELOPMENT' in app.config and app.config['DEVELOPMENT']
def _is_production():
@ -63,6 +70,7 @@ def render_study_template(studies, uva_id):
selected_user=uva_id
)
def _update_study(study, form):
if study.STUDYID is None:
# quick hack to get auto-increment without creating a bunch of hassle, this is not
@ -184,3 +192,110 @@ def has_no_empty_params(rule):
def redirect_home():
return redirect(url_for('index'))
def _get_required_document_list():
document_list = []
if _is_production():
rv = requests.get('https://hrpp.irb.virginia.edu/webservices/crconnect/crconnect.cfc?method=CrConnectAuxDocList')
if rv.ok:
document_list = json.loads(rv.text)['CRCONNECTDOCS']
elif _is_development():
with open(r'pb/static/json/aux_doc_list.json') as file:
data = file.read()
obj = json.loads(data)
document_list = obj['CRCONNECTDOCS']
return document_list
def compare_the_lists(a, b):
if len(a) != len(b):
return False
for x in a:
if x not in b:
return False
for y in b:
if y not in a:
return False
return True
def verify_required_document_list():
"""We can view the master list at https://hrpp.irb.virginia.edu/webservices/crconnect/crconnect.cfc?method=CrConnectAuxDocList
Locally, the list is hardcoded into models.RequiredDocument.
This is not good. We need to automate this."""
# Grab the two lists--that are formatted differently,
# and build something we can compare.
local = RequiredDocument.all()
local_documents_list = []
for loc in local:
local_documents_list.append({'AUXDOCID': loc.AUXDOCID, 'AUXDOC': loc.AUXDOC})
required_documents_list = []
master_list = _get_required_document_list()
if master_list:
for doc in master_list:
doc['AUXILIARY_DOC'] = doc['AUXILIARY_DOC'].replace("\r", '')
doc['AUXILIARY_DOC'] = doc['AUXILIARY_DOC'].replace("\n", '')
required_documents_list.append({'AUXDOCID': doc['SS_AUXILIARY_DOC_TYPE'], 'AUXDOC': doc['AUXILIARY_DOC']})
verify = compare_the_lists(required_documents_list, local_documents_list)
if not verify:
# Printing this so it is easier to update the hardcoded list in models.RequiredDocument
to_print = '['
for rd in required_documents_list:
to_print += f"RequiredDocument(AUXDOCID={rd['AUXDOCID']}, AUXDOC=\"{rd['AUXDOC']}\"), "
to_print += ']'
print(to_print)
return verify
def _get_study_details_list():
details_list = []
if _is_production():
rv = requests.get('https://hrpp.irb.virginia.edu/webservices/crconnect/crconnect.cfc?method=Study&studyid=15370')
if rv.ok:
details_list = json.loads(rv.text)
elif _is_development():
with open(r'pb/static/json/study_details_list.json') as file:
data = file.read()
obj = json.loads(data)
details_list = obj
return details_list
def verify_study_details_list():
study_details_list = _get_study_details_list()
study_details = study_details_list[0]
details = []
for key in study_details.keys():
details.append(key)
column_statement = "select column_name from information_schema.columns where table_name = 'study_details'"
result = session.execute(column_statement)
column_names = []
for row in result:
column_names.append(row[0])
verify = compare_the_lists(details, column_names)
if not verify:
missing_details, extra_columns = _process_study_details(details, column_names)
# Print this to make it easier to update the table
print(f'Missing Details: {missing_details}')
print(f'Extra Columns: {extra_columns}')
return verify
def _process_study_details(details, column_names):
missing_details = []
extra_columns = []
for x in details:
if x not in column_names:
missing_details.append(x)
for y in column_names:
if y not in details:
extra_columns.append(y)
return missing_details, extra_columns

View File

@ -3,7 +3,7 @@ from pb import app, db, description_map, session
from pb.ldap.ldap_service import LdapService
from pb.pb_mock import get_current_user, get_selected_user, update_selected_user, \
render_study_template, _update_study, redirect_home, _update_irb_info, _allowed_file, \
process_csv_study_details, has_no_empty_params
process_csv_study_details, has_no_empty_params, verify_required_document_list, verify_study_details_list
from pb.forms import StudyForm, IRBInfoForm, InvestigatorForm, ConfirmDeleteForm, StudySponsorForm, StudyDetailsForm
from pb.models import Study, StudyDetails, IRBInfo, IRBStatus, Investigator, Sponsor, StudySponsor, RequiredDocument
@ -68,8 +68,6 @@ def edit_study(study_id):
study = db.session.query(Study).filter(Study.STUDYID == study_id).first()
form = StudyForm(request.form, obj=study)
if request.method == 'GET':
action = BASE_HREF + "/study/" + study_id
title = "Edit Study #" + study_id
if study.requirements:
form.requirements.data = list(map(lambda r: r.AUXDOCID, list(study.requirements)))
if study.Q_COMPLETE and study.Q_COMPLETE.first():
@ -80,6 +78,8 @@ def edit_study(study_id):
_update_study(study, form)
flash('Study updated successfully!', 'success')
return redirect_home()
action = BASE_HREF + "/study/" + study_id
title = "Edit Study #" + study_id
return render_template(
'form.html',
form=form,
@ -381,3 +381,24 @@ def site_map():
url = app.confg['APPLICATION_ROOT'].strip('/') + url_for(rule.endpoint, **(rule.defaults or {}))
links.append((url, rule.endpoint))
return json.dumps({"links": links})
@app.route('/verify_document_list', methods=['GET'])
def verify_document_list():
verify = verify_required_document_list()
if verify:
flash('Document list is up to date.', 'success')
else:
flash('The document list is not up to date.', 'failure')
return redirect_home()
@app.route('/verify_study_details')
def verify_study_details():
verify = verify_study_details_list()
if verify:
flash('Study details are up to date.', 'success')
else:
flash('Study details are not up to date.', 'failure')
return redirect_home()

View File

@ -0,0 +1 @@
{"CRCONNECTDOCS":[{"SS_AUXILIARY_DOC_TYPE":1,"AUXILIARY_DOC":"Investigators Brochure"},{"SS_AUXILIARY_DOC_TYPE":2,"AUXILIARY_DOC":"Screening Log"},{"SS_AUXILIARY_DOC_TYPE":3,"AUXILIARY_DOC":"Protocol"},{"SS_AUXILIARY_DOC_TYPE":6,"AUXILIARY_DOC":"Cancer Center's PRC Approval Form"},{"SS_AUXILIARY_DOC_TYPE":7,"AUXILIARY_DOC":"GCRC Approval Form"},{"SS_AUXILIARY_DOC_TYPE":8,"AUXILIARY_DOC":"SOM CTO IND/IDE Review Letter"},{"SS_AUXILIARY_DOC_TYPE":9,"AUXILIARY_DOC":"HIRE Approval"},{"SS_AUXILIARY_DOC_TYPE":10,"AUXILIARY_DOC":"Cancer Center's PRC Approval Waiver"},{"SS_AUXILIARY_DOC_TYPE":11,"AUXILIARY_DOC":"HSR Grant"},{"SS_AUXILIARY_DOC_TYPE":12,"AUXILIARY_DOC":"Certificate of Confidentiality Application"},{"SS_AUXILIARY_DOC_TYPE":14,"AUXILIARY_DOC":"Institutional Biosafety Committee Approval"},{"SS_AUXILIARY_DOC_TYPE":18,"AUXILIARY_DOC":"SOM CTO Approval Letter\r\n - UVA PI Multisite Trial"},{"SS_AUXILIARY_DOC_TYPE":19,"AUXILIARY_DOC":"IRB Approval or Letter of Approval from Administration: Send Data or Specimens to UVA"},{"SS_AUXILIARY_DOC_TYPE":20,"AUXILIARY_DOC":"IRB Approval or Letter of Approval from Administration: Study Conducted at non- UVA Facilities "},{"SS_AUXILIARY_DOC_TYPE":21,"AUXILIARY_DOC":"New Medical Device Form"},{"SS_AUXILIARY_DOC_TYPE":22,"AUXILIARY_DOC":"SOM CTO Review regarding need for IDE"},{"SS_AUXILIARY_DOC_TYPE":23,"AUXILIARY_DOC":"SOM CTO Review regarding need for IND"},{"SS_AUXILIARY_DOC_TYPE":24,"AUXILIARY_DOC":"InfoSec Approval"},{"SS_AUXILIARY_DOC_TYPE":25,"AUXILIARY_DOC":"Scientific Pre-review Documentation"},{"SS_AUXILIARY_DOC_TYPE":26,"AUXILIARY_DOC":"IBC Number"},{"SS_AUXILIARY_DOC_TYPE":32,"AUXILIARY_DOC":"IDS - Investigational Drug Service Approval"},{"SS_AUXILIARY_DOC_TYPE":33,"AUXILIARY_DOC":"Data Security Plan"},{"SS_AUXILIARY_DOC_TYPE":35,"AUXILIARY_DOC":"Model Consent"},{"SS_AUXILIARY_DOC_TYPE":36,"AUXILIARY_DOC":"RDRC Approval "},{"SS_AUXILIARY_DOC_TYPE":39,"AUXILIARY_DOC":"Age of Majority Cover Letter and Consent"},{"SS_AUXILIARY_DOC_TYPE":40,"AUXILIARY_DOC":"SBS/IRB Approval-FERPA"},{"SS_AUXILIARY_DOC_TYPE":41,"AUXILIARY_DOC":"HIRE Standard Radiation Language"},{"SS_AUXILIARY_DOC_TYPE":42,"AUXILIARY_DOC":"COI Management Plan\r\n"},{"SS_AUXILIARY_DOC_TYPE":43,"AUXILIARY_DOC":"SOM CTO Approval Letter-Non UVA, Non Industry PI MultiSite Study"},{"SS_AUXILIARY_DOC_TYPE":44,"AUXILIARY_DOC":"GRIME Approval"},{"SS_AUXILIARY_DOC_TYPE":45,"AUXILIARY_DOC":"GMEC Approval"},{"SS_AUXILIARY_DOC_TYPE":46,"AUXILIARY_DOC":"IRB Reliance Agreement Request Form- IRB-HSR is IRB of Record"},{"SS_AUXILIARY_DOC_TYPE":47,"AUXILIARY_DOC":"Non UVA IRB Approval - Initial and Last Continuation"},{"SS_AUXILIARY_DOC_TYPE":48,"AUXILIARY_DOC":"MR Physicist Approval- Use of Gadolinium"},{"SS_AUXILIARY_DOC_TYPE":49,"AUXILIARY_DOC":"SOM CTO Approval- Non- UVA Academia PI of IDE"},{"SS_AUXILIARY_DOC_TYPE":51,"AUXILIARY_DOC":"IDS Waiver"},{"SS_AUXILIARY_DOC_TYPE":52,"AUXILIARY_DOC":"Package Inserts"},{"SS_AUXILIARY_DOC_TYPE":53,"AUXILIARY_DOC":"IRB Reliance Agreement Request Form- IRB-HSR Not IRB of Record"},{"SS_AUXILIARY_DOC_TYPE":54,"AUXILIARY_DOC":"ESCRO Approval"},{"SS_AUXILIARY_DOC_TYPE":56,"AUXILIARY_DOC":"Unaffiliated Investigator Agreement "},{"SS_AUXILIARY_DOC_TYPE":57,"AUXILIARY_DOC":"Laser Safety Officer Approval"},{"SS_AUXILIARY_DOC_TYPE":58,"AUXILIARY_DOC":"FDA Letter granting IND/IDE# or exemption"}]}

View File

@ -0,0 +1 @@
[{"STUDYID":15370,"UVA_STUDY_TRACKING":"","IS_IND":0,"IND_1":"","IND_2":"","IND_3":"","IS_UVA_IND":null,"IS_IDE":1,"IDE":"1234","IS_UVA_IDE":1,"IS_CHART_REVIEW":0,"IS_RADIATION":null,"GCRC_NUMBER":"","IS_GCRC":null,"IS_PRC_DSMP":1,"IS_PRC":null,"PRC_NUMBER":"","IS_IBC":null,"IBC_NUMBER":"","IS_SPONSOR_TRACKING":1,"SPONSOR_TRACKING":"123456","SPONSORS_PROTOCOL_REVISION_DATE":"2019-01-01T00:00:00","IS_SPONSOR_MONITORING":1,"IS_DSMB":1,"IS_COMPLETE_NON_IRB_REGULATORY":null,"IS_AUX":1,"IS_SPONSOR":1,"IS_GRANT":1,"IS_COMMITTEE_CONFLICT":0,"DSMB":"UVA Cancer Center","DSMB_FREQUENCY":4,"IS_DB":null,"IS_UVA_DB":null,"IS_CENTRAL_REG_DB":1,"IS_CONSENT_WAIVER":0,"IS_HGT":0,"IS_GENE_TRANSFER":0,"IS_TISSUE_BANKING":null,"IS_SURROGATE_CONSENT":null,"IS_ADULT_PARTICIPANT":null,"IS_MINOR_PARTICIPANT":null,"IS_MINOR":null,"IS_BIOMEDICAL":1,"IS_QUALITATIVE":0,"IS_PI_SCHOOL":1,"IS_PRISONERS_POP":null,"IS_PREGNANT_POP":null,"IS_FETUS_POP":null,"IS_MENTAL_IMPAIRMENT_POP":null,"IS_ELDERLY_POP":null,"IS_OTHER_VULNERABLE_POP":null,"OTHER_VULNERABLE_DESC":null,"IS_MULTI_SITE":1,"IS_UVA_LOCATION":0,"NON_UVA_LOCATION":"Martha Jefferson Hospital, Augusta Health Medical Center, Rockingham Memorial Hospital","MULTI_SITE_LOCATIONS":"","IS_OUTSIDE_CONTRACT":"1 ","IS_UVA_PI_MULTI":null,"IS_NOT_PRC_WAIVER":null,"IS_INSIDE_CONTRACT":1,"IS_CANCER_PATIENT":1,"UPLOAD_COMPLETE":null,"IS_FUNDING_SOURCE":null,"IS_CODED_RESEARCH":null,"IS_OUTSIDE_SPONSOR":1,"IS_PI_INITIATED":1,"IS_ENGAGED_RESEARCH":null,"IS_APPROVED_DEVICE":1,"IS_FINANCIAL_CONFLICT":1,"IS_NOT_CONSENT_WAIVER":0,"IS_FOR_CANCER_CENTER":null,"IS_REVIEW_BY_CENTRAL_IRB":1,"IRBREVIEWERADMIN":null,"IS_UVA_COLLABANALYSIS":1,"REVIEW_TYPE":2,"REVIEWTYPENAME":"Full Committee"}]

View File

@ -300,4 +300,14 @@ select.multi {
.highlight {
font-weight: bolder;
font-style: italic;
}
.float-left {
float: left;
}
.float-right {
float: right;
}
.float-clear {
float: none;
}

View File

@ -13,37 +13,57 @@
<body>
<h2>Protocol Builder Mock</h2>
<p>
<a class="btn btn-primary" href="{{ url_for('.new_study') }}"> New Study </a>
</p>
<p>
<label>Only Show Studies for: </label>
<select name="uva_id" id="uva_id" onchange="selectStudies()">
<option value="">Select User</option>
<option value="all" {% if selected_user=='all' %}selected{% endif %}>All Users</option>
{% if users %}
{% for user in users %}
<option value="{{ user }}" {% if selected_user==user %}selected{% endif %}>{{ user }}</option>
{% endfor %}
{% endif %}
</select>
</p>
<div class="float-wrapper">
{% with messages = get_flashed_messages(with_categories=True) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert {{ category }}">
<span class="btn-close" onclick="hideElement(this.parentElement);">&times;</span>
{{ message|safe }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
<div> <!-- no float -->
<p>
<a class="btn btn-primary" href="{{ url_for('.new_study') }}"> New Study </a>
</p>
<p>
<label>Only Show Studies for: </label>
<select name="uva_id" id="uva_id" onchange="selectStudies()">
<option value="">Select User</option>
<option value="all" {% if selected_user=='all' %}selected{% endif %}>All Users</option>
{% if users %}
{% for user in users %}
<option value="{{ user }}" {% if selected_user==user %}selected{% endif %}>{{ user }}</option>
{% endfor %}
{% endif %}
</select>
</p>
{% with messages = get_flashed_messages(with_categories=True) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert {{ category }}">
<span class="btn-close" onclick="hideElement(this.parentElement);">&times;</span>
{{ message|safe }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
</div> <!-- no float -->
<div class="float-right">
<div>
<form name="verify_study_details" method="get" action="{{base_href + url_for('verify_study_details')}}">
<button onclick="verifyStudyDetails();">Verify Study Details</button>
</form>
</div>
<div>
<form name="verify_document_list" method="get" action="{{base_href + url_for('verify_document_list')}}">
<button onclick="verifyDocumentList();">Verify Document List</button>
</form>
</div>
</div>
</div><!-- float wrapper -->
<h3>Current Studies</h3>
{{ table }}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script>
const hideElement = (el) => {
el.classList.add('fade-out');
@ -61,5 +81,25 @@
window.location.href = "{{base_href}}/user_studies/" + uva_id;
}
</script>
<script>
function verifyDocumentList() {
let url = "{{base_href + url_for('verify_document_list')}}";
$.ajax({
url: url,
success: function (result) {
alert(result);
}
});
}
function verifyStudyDetails() {
let url = "{{base_href + url_for('verify_study_details')}}";
$.ajax({
url: url,
success: function (result) {
alert(result);
}
});
}
</script>
</body>
</html>