From 6971b4b618f60a785451ce9dd1888eb625c19deb Mon Sep 17 00:00:00 2001 From: Tobias Kurze Date: Fri, 21 Feb 2020 07:22:26 +0100 Subject: [PATCH] added stream checks --- Pipfile | 1 + Pipfile.lock | 396 +++++++++++++----------- backend/__main__.py | 9 +- backend/api/group_api.py | 6 +- backend/models/__init__.py | 4 +- backend/models/recorder_model.py | 59 +++- backend/models/user_model.py | 19 ++ backend/recorder_adapters/extron_smp.py | 9 +- backend/tools/model_updater.py | 8 +- backend/tools/stream_handling.py | 15 + 10 files changed, 324 insertions(+), 202 deletions(-) create mode 100644 backend/tools/stream_handling.py diff --git a/Pipfile b/Pipfile index f81b30a..f7996ba 100644 --- a/Pipfile +++ b/Pipfile @@ -4,6 +4,7 @@ verify_ssl = true name = "pypi" [packages] +ffmpeg-python = "*" flask = "*" flask-httpauth = "*" flask-restplus-patched = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 1b93aef..976b7b1 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "09b7c608041f283fc640d8866eb00e7b80991e8283b9f1718a6b4b9bc09aca0c" + "sha256": "83c5fbc0a5b6c72ecdd8842e12b7c647e6d43d94a83623a8c0268c08d8a835b7" }, "pipfile-spec": 6, "requires": { @@ -16,18 +16,11 @@ ] }, "default": { - "alabaster": { - "hashes": [ - "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", - "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" - ], - "version": "==0.7.12" - }, "alembic": { "hashes": [ - "sha256:49277bb7242192bbb9eac58fed4fe02ec6c3a2a4b4345d2171197459266482b2" + "sha256:2df2519a5b002f881517693b95626905a39c5faf4b5a1f94de4f1441095d1d26" ], - "version": "==1.3.1" + "version": "==1.4.0" }, "aniso8601": { "hashes": [ @@ -38,10 +31,10 @@ }, "apispec": { "hashes": [ - "sha256:cf8e1f3b56949710f8cf23797b7f40215e9dae8bac583789a3f2c13dc56349fa", - "sha256:fe5cf5fc89b1c4a73acd5af3a10ede02b31ec116f215ed02271cb905d3172367" + "sha256:419d0564b899e182c2af50483ea074db8cb05fee60838be58bb4542095d5c08d", + "sha256:9bf4e51d56c9067c60668b78210ae213894f060f85593dc2ad8805eb7d875a2a" ], - "version": "==3.1.0" + "version": "==3.3.0" }, "apscheduler": { "hashes": [ @@ -73,12 +66,12 @@ }, "beautifulsoup4": { "hashes": [ - "sha256:5279c36b4b2ec2cb4298d723791467e3000e5384a43ea0cdf5d45207c7e97169", - "sha256:6135db2ba678168c07950f9a16c4031822c6f4aec75a65e0a97bc5ca09789931", - "sha256:dcdef580e18a76d54002088602eba453eec38ebbcafafeaabd8cab12b6155d57" + "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a", + "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887", + "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae" ], "index": "pypi", - "version": "==4.8.1" + "version": "==4.8.2" }, "certifi": { "hashes": [ @@ -89,41 +82,36 @@ }, "cffi": { "hashes": [ - "sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42", - "sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04", - "sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5", - "sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54", - "sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba", - "sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57", - "sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396", - "sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12", - "sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97", - "sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43", - "sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db", - "sha256:42194f54c11abc8583417a7cf4eaff544ce0de8187abaf5d29029c91b1725ad3", - "sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b", - "sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579", - "sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346", - "sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159", - "sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652", - "sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e", - "sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a", - "sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506", - "sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f", - "sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d", - "sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c", - "sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20", - "sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858", - "sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc", - "sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a", - "sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3", - "sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e", - "sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410", - "sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25", - "sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b", - "sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d" + "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", + "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", + "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", + "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", + "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", + "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", + "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", + "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", + "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", + "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", + "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", + "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", + "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", + "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", + "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", + "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", + "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", + "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", + "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", + "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", + "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", + "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", + "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", + "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", + "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", + "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", + "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", + "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" ], - "version": "==1.13.2" + "version": "==1.14.0" }, "chardet": { "hashes": [ @@ -141,49 +129,48 @@ }, "coloredlogs": { "hashes": [ - "sha256:34fad2e342d5a559c31b6c889e8d14f97cb62c47d9a2ae7b5ed14ea10a79eff8", - "sha256:b869a2dda3fa88154b9dd850e27828d8755bfab5a838a1c97fbc850c6e377c36" + "sha256:346f58aad6afd48444c2468618623638dadab76e4e70d5e10822676f2d32226a", + "sha256:a1fab193d2053aa6c0a97608c4342d031f1f93a3d1218432c59322441d31a505" ], "index": "pypi", - "version": "==10.0" + "version": "==14.0" }, "coverage": { "hashes": [ - "sha256:08907593569fe59baca0bf152c43f3863201efb6113ecb38ce7e97ce339805a6", - "sha256:0be0f1ed45fc0c185cfd4ecc19a1d6532d72f86a2bac9de7e24541febad72650", - "sha256:141f08ed3c4b1847015e2cd62ec06d35e67a3ac185c26f7635f4406b90afa9c5", - "sha256:19e4df788a0581238e9390c85a7a09af39c7b539b29f25c89209e6c3e371270d", - "sha256:23cc09ed395b03424d1ae30dcc292615c1372bfba7141eb85e11e50efaa6b351", - "sha256:245388cda02af78276b479f299bbf3783ef0a6a6273037d7c60dc73b8d8d7755", - "sha256:331cb5115673a20fb131dadd22f5bcaf7677ef758741312bee4937d71a14b2ef", - "sha256:386e2e4090f0bc5df274e720105c342263423e77ee8826002dcffe0c9533dbca", - "sha256:3a794ce50daee01c74a494919d5ebdc23d58873747fa0e288318728533a3e1ca", - "sha256:60851187677b24c6085248f0a0b9b98d49cba7ecc7ec60ba6b9d2e5574ac1ee9", - "sha256:63a9a5fc43b58735f65ed63d2cf43508f462dc49857da70b8980ad78d41d52fc", - "sha256:6b62544bb68106e3f00b21c8930e83e584fdca005d4fffd29bb39fb3ffa03cb5", - "sha256:6ba744056423ef8d450cf627289166da65903885272055fb4b5e113137cfa14f", - "sha256:7494b0b0274c5072bddbfd5b4a6c6f18fbbe1ab1d22a41e99cd2d00c8f96ecfe", - "sha256:826f32b9547c8091679ff292a82aca9c7b9650f9fda3e2ca6bf2ac905b7ce888", - "sha256:93715dffbcd0678057f947f496484e906bf9509f5c1c38fc9ba3922893cda5f5", - "sha256:9a334d6c83dfeadae576b4d633a71620d40d1c379129d587faa42ee3e2a85cce", - "sha256:af7ed8a8aa6957aac47b4268631fa1df984643f07ef00acd374e456364b373f5", - "sha256:bf0a7aed7f5521c7ca67febd57db473af4762b9622254291fbcbb8cd0ba5e33e", - "sha256:bf1ef9eb901113a9805287e090452c05547578eaab1b62e4ad456fcc049a9b7e", - "sha256:c0afd27bc0e307a1ffc04ca5ec010a290e49e3afbe841c5cafc5c5a80ecd81c9", - "sha256:dd579709a87092c6dbee09d1b7cfa81831040705ffa12a1b248935274aee0437", - "sha256:df6712284b2e44a065097846488f66840445eb987eb81b3cc6e4149e7b6982e1", - "sha256:e07d9f1a23e9e93ab5c62902833bf3e4b1f65502927379148b6622686223125c", - "sha256:e2ede7c1d45e65e209d6093b762e98e8318ddeff95317d07a27a2140b80cfd24", - "sha256:e4ef9c164eb55123c62411f5936b5c2e521b12356037b6e1c2617cef45523d47", - "sha256:eca2b7343524e7ba246cab8ff00cab47a2d6d54ada3b02772e908a45675722e2", - "sha256:eee64c616adeff7db37cc37da4180a3a5b6177f5c46b187894e633f088fb5b28", - "sha256:ef824cad1f980d27f26166f86856efe11eff9912c4fed97d3804820d43fa550c", - "sha256:efc89291bd5a08855829a3c522df16d856455297cf35ae827a37edac45f466a7", - "sha256:fa964bae817babece5aa2e8c1af841bebb6d0b9add8e637548809d040443fee0", - "sha256:ff37757e068ae606659c28c3bd0d923f9d29a85de79bf25b2b34b148473b5025" + "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3", + "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c", + "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0", + "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477", + "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a", + "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf", + "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691", + "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73", + "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987", + "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894", + "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e", + "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef", + "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf", + "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68", + "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8", + "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954", + "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2", + "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40", + "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc", + "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc", + "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e", + "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d", + "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f", + "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc", + "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301", + "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea", + "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb", + "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af", + "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52", + "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37", + "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0" ], "index": "pypi", - "version": "==4.5.4" + "version": "==5.0.3" }, "cryptography": { "hashes": [ @@ -218,6 +205,13 @@ ], "version": "==4.4.1" }, + "defusedxml": { + "hashes": [ + "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93", + "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5" + ], + "version": "==0.6.0" + }, "dnspython": { "hashes": [ "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01", @@ -227,10 +221,10 @@ }, "ecdsa": { "hashes": [ - "sha256:64c613005f13efec6541bb0a33290d0d03c27abab5f15fbab20fb0ee162bdd8e", - "sha256:e108a5fe92c67639abae3260e43561af914e7fd0d27bae6d2ec1312ae7934dfe" + "sha256:867ec9cf6df0b03addc8ef66b56359643cb5d0c1dc329df76ba7ecfe256c8061", + "sha256:8f12ac317f8a1318efa75757ef0a651abe12e51fc1af8838fb91079445227277" ], - "version": "==0.14.1" + "version": "==0.15" }, "eventlet": { "hashes": [ @@ -240,6 +234,14 @@ "index": "pypi", "version": "==0.25.1" }, + "ffmpeg-python": { + "hashes": [ + "sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127", + "sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5" + ], + "index": "pypi", + "version": "==0.2.0" + }, "flask": { "hashes": [ "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52", @@ -273,17 +275,18 @@ }, "flask-login": { "hashes": [ - "sha256:c815c1ac7b3e35e2081685e389a665f2c74d7e077cb93cecabaea352da4752ec" + "sha256:6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b", + "sha256:7451b5001e17837ba58945aead261ba425fdf7b4f0448777e597ddab39f4fba0" ], "index": "pypi", - "version": "==0.4.1" + "version": "==0.5.0" }, "flask-marshmallow": { "hashes": [ - "sha256:4f507f883838b397638a3a36c7d36ee146b255a49db952f5d9de3f6f4522e8a8", - "sha256:69e99e3a123393894884a032ae2d11e6bdf4519a505819b66cec7eda32057741" + "sha256:01520ef1851ccb64d4ffb33196cddff895cc1302ae1585bff1abf58684a8111a", + "sha256:28b969193958d9602ab5d6add6d280e0e360c8e373d3492c2f73b024ecd36374" ], - "version": "==0.10.1" + "version": "==0.11.0" }, "flask-migrate": { "hashes": [ @@ -295,10 +298,10 @@ }, "flask-pyoidc": { "hashes": [ - "sha256:c5556e82eb45c6314f4dc4c357c9909830e99cd2e4237ba56f34ca9e699aae42" + "sha256:215f91ec5f08d7a40b5fc10f88bec06bf39840f9242bb18e0ead3a249c1329ee" ], "index": "pypi", - "version": "==3.0.0" + "version": "==3.2.0" }, "flask-restplus": { "hashes": [ @@ -356,7 +359,9 @@ "sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28", "sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8", "sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304", + "sha256:51155342eb4d6058a0ffcd98a798fe6ba21195517da97e15fca3db12ab201e6e", "sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0", + "sha256:7457d685158522df483196b16ec648b28f8e847861adb01a55d41134e7734122", "sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214", "sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043", "sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6", @@ -370,7 +375,8 @@ "sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939", "sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87", "sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720", - "sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656" + "sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656", + "sha256:e538b8dae561080b542b0f5af64d47ef859f22517f7eca617bb314e0e03fd7ef" ], "version": "==0.4.15" }, @@ -384,10 +390,10 @@ }, "humanfriendly": { "hashes": [ - "sha256:23057b10ad6f782e7bc3a20e3cb6768ab919f619bbdc0dd75691121bbde5591d", - "sha256:33ee8ceb63f1db61cce8b5c800c531e1a61023ac5488ccde2ba574a85be00a85" + "sha256:5e5c2b82fb58dcea413b48ab2a7381baa5e246d47fe94241d7d83724c11c0565", + "sha256:a9a41074c24dc5d6486e8784dc8f057fec8b963217e941c25fb7c7c383a4a1c1" ], - "version": "==4.18" + "version": "==7.1.1" }, "ics": { "hashes": [ @@ -398,10 +404,17 @@ }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], - "version": "==2.8" + "version": "==2.9" + }, + "importlib-resources": { + "hashes": [ + "sha256:6e2783b2538bd5a14678284a3962b0660c715e5a0f10243fd5e00a4b5974f50b", + "sha256:d3279fd0f6f847cced9f7acc19bd3e5df54d34f93a2e7bb5f238f81545787078" + ], + "version": "==1.0.2" }, "itsdangerous": { "hashes": [ @@ -412,10 +425,10 @@ }, "jinja2": { "hashes": [ - "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", - "sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de" + "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250", + "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49" ], - "version": "==2.10.3" + "version": "==2.11.1" }, "jsonschema": { "hashes": [ @@ -426,9 +439,9 @@ }, "mako": { "hashes": [ - "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b" + "sha256:2984a6733e1d472796ceef37ad48c26f4a984bb18119bb2dbc37a44d8f6e75a4" ], - "version": "==1.1.0" + "version": "==1.1.1" }, "markupsafe": { "hashes": [ @@ -436,13 +449,16 @@ "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", @@ -459,16 +475,18 @@ "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7" + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" ], "version": "==1.1.1" }, "marshmallow": { "hashes": [ - "sha256:1a358beb89c2b4d5555272065a9533591a3eb02f1b854f3c4002d88d8f2a1ddb", - "sha256:eb97c42c5928b5720812c9268865fe863d4807bc1a8b48ddd7d5c9e1779a6af0" + "sha256:3a94945a7461f2ab4df9576e51c97d66bee2c86155d3d3933fab752b31effab8", + "sha256:4b95c7735f93eb781dfdc4dded028108998cad759dda8dd9d4b5b4ac574cbf13" ], - "version": "==3.2.2" + "version": "==3.5.0" }, "monotonic": { "hashes": [ @@ -479,9 +497,10 @@ }, "oic": { "hashes": [ - "sha256:34da42f4f9b4a36a02b28d72a42a3197a91e7efc5356c1c41d7f1a0bdf3ad1d2" + "sha256:091b20c0a4866e5afeef8fc21bfdffd65382763f09d782e14f8ce9081326e1ed", + "sha256:865da7ade1291c2f39dd196c34e5641a782b29871c3a48289e317d62fa49ef20" ], - "version": "==0.12" + "version": "==1.1.2" }, "passlib": { "hashes": [ @@ -513,40 +532,38 @@ }, "pycryptodomex": { "hashes": [ - "sha256:0943b65fb41b7403a9def6214061fdd9ab9afd0bbc581e553c72eebe60bded36", - "sha256:0a1dbb5c4d975a4ea568fb7686550aa225d94023191fb0cca8747dc5b5d77857", - "sha256:0f43f1608518347fdcb9c8f443fa5cabedd33f94188b13e4196a3a7ba90d169c", - "sha256:11ce5fec5990e34e3981ed14897ba601c83957b577d77d395f1f8f878a179f98", - "sha256:17a09e38fdc91e4857cf5a7ce82f3c0b229c3977490f2146513e366923fc256b", - "sha256:22d970cee5c096b9123415e183ae03702b2cd4d3ba3f0ced25c4e1aba3967167", - "sha256:2a1793efcbae3a2264c5e0e492a2629eb10d895d6e5f17dbbd00eb8b489c6bda", - "sha256:30a8a148a0fe482cec1aaf942bbd0ade56ec197c14fe058b2a94318c57e1f991", - "sha256:32fbbaf964c5184d3f3e349085b0536dd28184b02e2b014fc900f58bbc126339", - "sha256:347d67faee36d449dc9632da411cc318df52959079062627f1243001b10dc227", - "sha256:45f4b4e5461a041518baabc52340c249b60833aa84cea6377dc8016a2b33c666", - "sha256:4717daec0035034b002d31c42e55431c970e3e38a78211f43990e1b7eaf19e28", - "sha256:51a1ac9e7dda81da444fed8be558a60ec88dfc73b2aa4b0efa310e87acb75838", - "sha256:53e9dcc8f14783f6300b70da325a50ac1b0a3dbaee323bd9dc3f71d409c197a1", - "sha256:5519a2ed776e193688b7ddb61ab709303f6eb7d1237081e298283c72acc44271", - "sha256:583450e8e80a0885c453211ed2bd69ceea634d8c904f23ff8687f677fe810e95", - "sha256:60f862bd2a07133585a4fc2ce2b1a8ec24746b07ac44307d22ef2b767cb03435", - "sha256:612091f1d3c84e723bec7cb855cf77576e646045744794c9a3f75ba80737762f", - "sha256:629a87b87c8203b8789ccefc7f2f2faecd2daaeb56bdd0b4e44cd89565f2db07", - "sha256:6e56ec4c8938fb388b6f250ddd5e21c15e8f25a76e0ad0e2abae9afee09e67b4", - "sha256:8e8092651844a11ec7fa534395f3dfe99256ce4edca06f128efc9d770d6e1dc1", - "sha256:8f5f260629876603e08f3ce95c8ccd9b6b83bf9a921c41409046796267f7adc5", - "sha256:9a6b74f38613f54c56bd759b411a352258f47489bbefd1d57c930a291498b35b", - "sha256:a5a13ebb52c4cd065fb673d8c94f39f30823428a4de19e1f3f828b63a8882d1e", - "sha256:a77ca778a476829876a3a70ae880073379160e4a465d057e3c4e1c79acdf1b8a", - "sha256:a9f7be3d19f79429c2118fd61bc2ec4fa095e93b56fb3a5f3009822402c4380f", - "sha256:dc15a467c4f9e4b43748ba2f97aea66f67812bfd581818284c47cadc81d4caec", - "sha256:e13cdeea23059f7577c230fd580d2c8178e67ebe10e360041abe86c33c316f1c", - "sha256:e45b85c8521bca6bdfaf57e4987743ade53e9f03529dd3adbc9524094c6d55c4", - "sha256:e87f17867b260f57c88487f943eb4d46c90532652bb37046e764842c3b66cbb1", - "sha256:ee40a5b156f6c1192bc3082e9d73d0479904433cdda83110546cd67f5a15a5be", - "sha256:ef63ffde3b267043579af8830fc97fc3b9b8a526a24e3ba23af9989d4e9e689a" + "sha256:04646e40ef5788bad6d415e52862ffcdf2ac2d888ba4a5c82d5cb44607a042f7", + "sha256:132f1e5fa84921f25695a313a6d4988847dfaee7fb1fd0d1fbe03ef678836f58", + "sha256:17ad1ebaa00806305d34550fe5d3c776e38a27b8a2678dfb7871ef0209d64e46", + "sha256:27736fa02a2d3502e1ca4b150457e56ce3b98f132462f540073498884e5f8975", + "sha256:38050b3fd86c74c6c79e40bbe824bec6431c3e4e36f6080ed544673ba2dc133a", + "sha256:3b9306b360bddbc8e098b16eab7adacf49389d212db9c3739588ab840a1ca868", + "sha256:466e36ba74a7e725625e717fad3f36e0b9293c247b7d0439c66528026ef2834f", + "sha256:4f77360b23a21db32a4c35dacffac33dc30ac6a5a77162a34e99ab11ab631516", + "sha256:5002388178845683c330a02f4faeddfe7cd477b87824987cca4718fa0c4f2085", + "sha256:51be76756abfc1ddc97e1e2e3c38f4e62fb940161162368308ea9e5919e86c34", + "sha256:544628ae67d61c31c28a60e621dadd738b303c5266492355d5ebdb6e7dd1e78f", + "sha256:6ff9d4a06bc40211eee05cd88436740d698a01233f4aaff9eb70d8a90e578966", + "sha256:718329c6ca60260f1c27b8392e372dd51e4e691f7dcb88adc53eb3b76af6363c", + "sha256:918bc5a0170fe8ed7b72f202245b34f84a1997f5ca1520b9c7db71126e5acd62", + "sha256:a8ea72adde0d010f89abece5f024b1be95a5c52472e9a57b3ac7d59aee3c8238", + "sha256:a979d2c7bcc67282b7ec2600db384c63d37d74e250edb99168483605a380bf62", + "sha256:b350f9ad09b692aed57e669fc3f8cf918557fae9f0229c6ce9286a6fe8c1b60f", + "sha256:be838abc8557a21a60d453c5a4e64c738966b8a0b7d7f8f97eb8bb44041ca452", + "sha256:bfa99692d3c8f994c5850cc8a894cba001abd76d34069a8bfaad173dd46387d6", + "sha256:c021b66f5b3c4ea0c45422ec3241bfea4a16651e1ee5459a136639d0716ccb3c", + "sha256:c7babb64484080057a24c74a82dbf7997904b1710b74caf62e261610f989b437", + "sha256:c96b7762b601dc8a58d7712235c3c152868116f58a7ffa40dcd1c6f6cd97405e", + "sha256:d67b6e0bae0777a2c6c83275fbd7cbf53cd5f23c2028f908b0f7d996466e5b15", + "sha256:e15f39fcfb949cfd5536cc9647daba942b1a99b67e4d7211e3bdbcedbc2f823c", + "sha256:e380448f1e39736f6230ec284cd6d771956ad802d6ce5bc56947a2481080cac1", + "sha256:e5236f2171b21e704d1854fd809a7228eb22e29c894af31459e41986e6a53f87", + "sha256:ea7b48ce8dbbc86ebadcfe56ebc10d413bdd12c9a5ff0b9147a41993f12b80b3", + "sha256:f39f5b58d8fe348ed604bb44a89ca93b26130c275db2b249f718f1538cb70500", + "sha256:f545f776e45f74c41329e4020463fdd4d0cd0a7501bdf9e50251dafe7bd959a9", + "sha256:f667ac7ae29c19530f199854635f1a97e73d0bfd24163e0db6bdba7dba04eb9f" ], - "version": "==3.9.4" + "version": "==3.9.6" }, "pyjwkest": { "hashes": [ @@ -562,18 +579,11 @@ "index": "pypi", "version": "==1.7.1" }, - "pyopenssl": { - "hashes": [ - "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504", - "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507" - ], - "version": "==19.1.0" - }, "pyrsistent": { "hashes": [ - "sha256:f3b280d030afb652f79d67c5586157c5c1355c9a58dfc7940566e28d28f3df1b" + "sha256:cdc7b5e3ed77bed61270a47d35434a30617b9becdf2478af76ad2c6ade307280" ], - "version": "==0.15.6" + "version": "==0.15.7" }, "python-dateutil": { "hashes": [ @@ -592,18 +602,18 @@ }, "python-engineio": { "hashes": [ - "sha256:4a13fb87c819b855c55a731fdf82559adb8311c04cfdfebd6b9ecd1c2afbb575", - "sha256:9c9a6035b4b5e5a225f426f846afa14cf627f7571d1ae02167cb703fefd134b7" + "sha256:47ae4a9b3b4f2e8a68929f37a518338838e119f24c9a9121af92c49f8bea55c3", + "sha256:c3a3822deb51fdf9c7fe4d78abf807c73b83ea538036a50862d3024450746253" ], - "version": "==3.10.0" + "version": "==3.11.2" }, "python-jose": { "hashes": [ - "sha256:29701d998fe560e52f17246c3213a882a4a39da7e42c7015bcc1f7823ceaff1c", - "sha256:ed7387f0f9af2ea0ddc441d83a6eb47a5909bd0c8a72ac3250e75afec2cc1371" + "sha256:1ac4caf4bfebd5a70cf5bd82702ed850db69b0b6e1d0ae7368e5f99ac01c9571", + "sha256:8484b7fdb6962e9d242cce7680469ecf92bda95d10bbcbbeb560cacdff3abfce" ], "index": "pypi", - "version": "==3.0.1" + "version": "==3.1.0" }, "python-socketio": { "extras": [ @@ -618,10 +628,10 @@ }, "pythonping": { "hashes": [ - "sha256:c754c2bd8617943988a0a1b47d7392a57efea51fb7a30c7e938e246e90ea91eb" + "sha256:05269d459d2290ff57665aa3b3c9ed1b64bb96106d22712e0054b52d51c6bb13" ], "index": "pypi", - "version": "==1.0.7" + "version": "==1.0.8" }, "pytz": { "hashes": [ @@ -632,10 +642,10 @@ }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" ], - "version": "==2.22.0" + "version": "==2.23.0" }, "rsa": { "hashes": [ @@ -653,10 +663,10 @@ }, "six": { "hashes": [ - "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", - "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], - "version": "==1.13.0" + "version": "==1.14.0" }, "socketio-client": { "hashes": [ @@ -674,10 +684,10 @@ }, "sqlalchemy": { "hashes": [ - "sha256:afa5541e9dea8ad0014251bc9d56171ca3d8b130c9627c6cb3681cff30be3f8a" + "sha256:64a7b71846db6423807e96820993fa12a03b89127d278290ca25c0b11ed7b4fb" ], "index": "pypi", - "version": "==1.3.11" + "version": "==1.3.13" }, "sqlalchemy-migrate": { "hashes": [ @@ -729,10 +739,10 @@ }, "tatsu": { "hashes": [ - "sha256:80713413473a009f2081148d0f494884cabaf9d6866b71f2a68a92b6442f343d", - "sha256:c9211eeee9a2d4c90f69879ec0b518b1aa0d9450249cb0dd181f5f5b18be0a92" + "sha256:0adbf7189a8c4f9a882b442f7b8ed6c6ab3baae37057db0e96b6888daacffad0", + "sha256:3a043490e577632a05374b5033646bbc26cbb17386df81735a569ecbd45d934b" ], - "version": "==4.4.0" + "version": "==5.5.0" }, "tempita": { "hashes": [ @@ -740,6 +750,14 @@ ], "version": "==0.5.2" }, + "typing-extensions": { + "hashes": [ + "sha256:091ecc894d5e908ac75209f10d5b4f118fbdb2eb1ede6a63544054bb1edb41f2", + "sha256:910f4656f54de5993ad9304959ce9bb903f90aadc7c67a0bef07e678014e892d", + "sha256:cf8b63fedea4d89bab840ecbb93e75578af28f76f66c35889bd7065f5af88575" + ], + "version": "==3.7.4.1" + }, "tzlocal": { "hashes": [ "sha256:11c9f16e0a633b4b60e1eede97d8a46340d042e67b670b290ca526576e039048", @@ -756,18 +774,18 @@ }, "urllib3": { "hashes": [ - "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", - "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" + "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", + "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "version": "==1.25.7" + "version": "==1.25.8" }, "webargs": { "hashes": [ - "sha256:3beca296598067cec24a0b6f91c0afcc19b6e3c4d84ab026b931669628bb47b4", - "sha256:3f9dc15de183d356c9a0acc159c100ea0506c0c240c1e6f1d8b308c5fed4dbbd", - "sha256:fa4ad3ad9b38bedd26c619264fdc50d7ae014b49186736bca851e5b5228f2a1b" + "sha256:4f04918864c7602886335d8099f9b8960ee698b6b914f022736ed50be6b71235", + "sha256:871642a2e0c62f21d5b78f357750ac7a87e6bc734c972f633aa5fb6204fbf29a", + "sha256:fc81c9f9d391acfbce406a319217319fd8b2fd862f7fdb5319ad06944f36ed25" ], - "version": "==5.5.2" + "version": "==5.5.3" }, "webencodings": { "hashes": [ @@ -778,18 +796,18 @@ }, "websocket-client": { "hashes": [ - "sha256:1151d5fb3a62dc129164292e1227655e4bbc5dd5340a5165dfae61128ec50aa9", - "sha256:1fd5520878b68b84b5748bb30e592b10d0a91529d5383f74f4964e72b297fd3a" + "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549", + "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010" ], "index": "pypi", - "version": "==0.56.0" + "version": "==0.57.0" }, "werkzeug": { "hashes": [ - "sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7", - "sha256:e5f4a1f98b52b18a93da705a7458e55afb26f32bff83ff5d19189f92462d65c4" + "sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096", + "sha256:6dc65cf9091cf750012f56f2cad759fa9e879f511b5ff8685e456b4e3bf90d16" ], - "version": "==0.16.0" + "version": "==1.0.0" } }, "develop": {} diff --git a/backend/__main__.py b/backend/__main__.py index c537ac3..464a2eb 100644 --- a/backend/__main__.py +++ b/backend/__main__.py @@ -10,7 +10,8 @@ from jinja2.exceptions import TemplateNotFound from backend import app, db from backend.cron import get_default_scheduler, add_default_jobs -from backend.models import room_model, recorder_model, RecorderCommand +from backend.models import * +from backend.models import room_model, recorder_model, RecorderCommand, Recorder from backend.recorder_adapters import get_defined_recorder_adapters from backend.tools.model_updater import update_recorder_models_database, create_default_recorders from backend.websocket.base import WebSocketBase @@ -19,8 +20,10 @@ from backend.websocket.base import WebSocketBase def main(): logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') - #db.drop_all() - #db.create_all() + db.drop_all() + db.create_all() + + Recorder() room_model.pre_fill_table() update_recorder_models_database(drop=False) create_default_recorders() diff --git a/backend/api/group_api.py b/backend/api/group_api.py index b3dc5f2..2eae68f 100644 --- a/backend/api/group_api.py +++ b/backend/api/group_api.py @@ -21,7 +21,11 @@ group_model = api_group.model('Group', { 'first_name': fields.String(), 'last_name': fields.String(), 'email': fields.String(), 'registered_on': fields.DateTime(), 'last_seen': fields.DateTime()})), - required=False, description='Group members.') + required=False, description='Group members.'), + 'permissions': fields.List(fields.Nested(api_group.model('group_permissions', + {'id': fields.Integer, + 'name': fields.String})), + required=False, description='Group permissions.'), }) diff --git a/backend/models/__init__.py b/backend/models/__init__.py index 6ee72fe..40ca279 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -1,10 +1,10 @@ """ Import all models... """ +from backend.models.access_control_model import * from backend.models.example_model import * -from backend.models.user_model import * from backend.models.post_model import * from backend.models.recorder_model import * -from backend.models.access_control_model import * from backend.models.room_model import * +from backend.models.user_model import * from backend.models.virtual_command_model import * diff --git a/backend/models/recorder_model.py b/backend/models/recorder_model.py index bcbb7cd..907e24d 100644 --- a/backend/models/recorder_model.py +++ b/backend/models/recorder_model.py @@ -10,7 +10,7 @@ import os import re from typing import Union -from sqlalchemy import MetaData +from sqlalchemy import MetaData, ForeignKeyConstraint from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import validates @@ -24,6 +24,41 @@ from backend.models.virtual_command_model import virtual_command_recorder_comman metadata = MetaData() +# This is the association table for the many-to-many relationship between +# recorders and permissions. +recorder_permission_table = db.Table('recorder_permission', + db.Column('recorder_id', db.Integer, + db.ForeignKey('recorder.id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + db.Column('permission_id', db.Integer, + db.ForeignKey('permission.id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + extend_existing=True) + +# This is the association table for the many-to-many relationship between +# recorders and recorderCommands and permissions. +recorder_rec_commands_permission_table = db.Table('recorder_rec_command_permission', + db.Column('recorder_id', db.Integer, + db.ForeignKey('recorder.id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + db.Column('recorder_command_id', db.Integer, + db.ForeignKey('recorder_command.id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + db.Column('permission_id', db.Integer, + db.ForeignKey('permission.id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + extend_existing=True) + class RecorderModel(db.Model, ModelBase): __table_args__ = {'extend_existing': True} @@ -116,6 +151,9 @@ class Recorder(db.Model, ModelBase): virtual_commands = db.relationship('VirtualCommand', secondary=virtual_command_recorder_table, back_populates='recorders') + required_read_permissions = db.relationship('Permission', secondary=recorder_permission_table) + required_write_permissions = db.relationship('Permission', secondary=recorder_permission_table) + def __init__(self, **kwargs): super(Recorder, self).__init__(**kwargs) @@ -215,9 +253,19 @@ class Recorder(db.Model, ModelBase): sort_keys=True, indent=4) +class RecorderCommandPermission(db.Model, ModelBase): + __table_args__ = {'extend_existing': True} + id = db.Column(db.Integer, autoincrement=True, primary_key=True) + recorder = db.relationship('Recorder') + recorder_id = db.Column(db.Integer, db.ForeignKey('recorder.id')) + recorder_command = db.relationship('RecorderCommand') + recorder_command_id = db.Column(db.Integer, db.ForeignKey('recorder_command.id')) + permission = db.relationship('Permission') + permission_id = db.Column(db.Integer, db.ForeignKey('permission.id')) + + class RecorderCommand(db.Model, ModelBase): __table_args__ = {'extend_existing': True} - """Table containing permissions associated with groups.""" id = db.Column(db.Integer, autoincrement=True, primary_key=True) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) last_time_modified = db.Column(db.DateTime, nullable=True, default=datetime.utcnow()) @@ -231,6 +279,9 @@ class RecorderCommand(db.Model, ModelBase): virtual_commands = db.relationship('VirtualCommand', secondary=virtual_command_recorder_command_table, back_populates='recorder_commands') + required_show_permissions = db.relationship('RecorderCommandPermission') + required_execute_permissions = db.relationship('RecorderCommandPermission') + @staticmethod def get_all(): return RecorderCommand.query.all() @@ -248,3 +299,7 @@ class RecorderCommand(db.Model, ModelBase): @parameters.setter def parameters(self, parameters_dict: dict): self.parameters_string = json.dumps(parameters_dict) + + +if __name__ == '__main__': + Recorder(name="RecTest") diff --git a/backend/models/user_model.py b/backend/models/user_model.py index f6b0dc7..47f9623 100644 --- a/backend/models/user_model.py +++ b/backend/models/user_model.py @@ -71,6 +71,20 @@ group_permission_table = db.Table('group_permission', ondelete="CASCADE"), primary_key=True)) +# This is the association table for the many-to-many relationship between +# users and permissions. +user_permission_table = db.Table('user_permission', + db.Column('user_id', db.Integer, + db.ForeignKey('user.id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + db.Column('permission_id', db.Integer, + db.ForeignKey('permission.id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True)) + class User(UserMixin, db.Model): """ @@ -90,6 +104,7 @@ class User(UserMixin, db.Model): about_me = db.Column(db.Unicode(255)) role = db.Column(db.Unicode(63)) groups = db.relationship('Group', secondary=user_group_table, back_populates='users') + permissions = db.relationship('Permission', secondary=user_permission_table, back_populates='users') password = db.Column(db.String(255), nullable=True) registered_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) external_user = db.Column(db.Boolean, default=False) @@ -482,10 +497,14 @@ class Permission(db.Model): id = db.Column(db.Integer, autoincrement=True, primary_key=True) name = db.Column(db.Unicode(63), unique=True, nullable=False) description = db.Column(db.Unicode(511)) + #read_only = db.Column(db.Boolean, default=False) groups = db.relationship(Group, secondary=group_permission_table, back_populates='permissions') + users = db.relationship(User, secondary=user_permission_table, + back_populates='permissions') access_control_entry = db.relationship('AccessControlEntry', back_populates='required_permission') + @staticmethod def get_by_name(name): """ diff --git a/backend/recorder_adapters/extron_smp.py b/backend/recorder_adapters/extron_smp.py index b12da4f..e1c525f 100644 --- a/backend/recorder_adapters/extron_smp.py +++ b/backend/recorder_adapters/extron_smp.py @@ -18,12 +18,12 @@ REQUIRES_PW = True # HOST = "129.13.51.102" # Audimax SMP 351 # HOST = "129.13.51.106" # Tulla SMP 351 HOST = "172.22.246.207" # Test SMP MZ -HOST = "129.13.51.109" # Hertz +# HOST = "129.13.51.109" # Hertz USER = "admin" PW = "123mzsmp" # PW = "audimaxsmp" -PW = "smphertz" +# PW = "smphertz" class SMP35x(TelnetAdapter, RecorderAdapter): @@ -359,7 +359,7 @@ class SMP35x(TelnetAdapter, RecorderAdapter): self.tn.write("{}{}NI\n".format(self.esc_char, input_num)) return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_input_selction_per_channel(self): + def get_input_selection_per_channel(self): self.tn.write("32I\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) @@ -795,6 +795,9 @@ def main(): print(smp) print(smp.get_recording_status()) print(smp.is_recording()) + print(smp.get_input_presets()) + print(smp.get_input_selection_per_channel()) + print(smp.get_recording_status_text()) exit() smp._login() diff --git a/backend/tools/model_updater.py b/backend/tools/model_updater.py index 8d61335..4c0ac1f 100644 --- a/backend/tools/model_updater.py +++ b/backend/tools/model_updater.py @@ -69,9 +69,12 @@ def update_recorder_models_database(drop: bool = False): for r_a in r_as: if r_a.get('class') is None: # skip modules without class (helpers.py, e.g.) continue + logger.info("Checking Recorder Adapter {} for possible updates".format(r_a["id"])) try: r_m = RecorderModel.get_by_adapter_id(r_a["id"]) model_checksum = calculate_md5_checksum(dumps(r_a["commands"])) + logger.debug("Recorder Adapter commands checksum: {}".format(model_checksum)) + logger.debug(r_m) if r_m is None: r_m = RecorderModel(record_adapter_id=r_a["id"], model_name=r_a["name"], checksum=model_checksum, **r_a.get('class').get_recorder_params()) @@ -81,22 +84,23 @@ def update_recorder_models_database(drop: bool = False): logger.debug("Creating command definitions for rec mod adapter {}".format(r_m.record_adapter_id)) create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m) else: + logger.debug("Model command checksum already in db: {}".format(r_m.checksum)) if r_m.model_name != r_a["name"]: r_m.model_name = r_a["name"] r_m.last_time_modified = datetime.utcnow() if model_checksum != r_m.checksum: + create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m) r_m.last_time_modified = datetime.utcnow() r_m.checksum = model_checksum r_m.last_checksum_change = datetime.utcnow() logger.debug("Updating command definitions for rec mod adapter {}".format(r_m.record_adapter_id)) - create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m) except IntegrityError as e: logger.error(e) db.session.rollback() db.session.commit() -def get_recorder_room(rec: dict) -> Room(): +def get_recorder_room(rec: dict): rooms = Room.get_by_building_number(rec.get('building', None)) if rooms.count() <= 0: logger.warning("Building {} unknown! Can not find room for recorder {}.".format(rec['building'], rec['name'])) diff --git a/backend/tools/stream_handling.py b/backend/tools/stream_handling.py new file mode 100644 index 0000000..0a34dbd --- /dev/null +++ b/backend/tools/stream_handling.py @@ -0,0 +1,15 @@ +import ffmpeg + +packet_size = 4096 + +process = ( + ffmpeg + .input('rtsp://172.22.246.207/extron1') + #.input('rtsp://172.22.246.207/extron3') + .output('/tmp/test.jpg', vframes=1) + #.output('-', format='h264') + .run_async(pipe_stdout=True) +) + +while process.poll() is None: + packet = process.stdout.read(packet_size)