Add user login and replace pipenv with Nix
This commit is contained in:
parent
66092ba6e3
commit
75843f4927
|
@ -1,3 +1,3 @@
|
||||||
constants.py
|
constants.py
|
||||||
assets/db_schema.sql
|
assets
|
||||||
/**/__pycache__
|
/**/__pycache__
|
||||||
|
|
22
Pipfile
22
Pipfile
|
@ -1,22 +0,0 @@
|
||||||
[[source]]
|
|
||||||
name = "pypi"
|
|
||||||
url = "https://pypi.org/simple"
|
|
||||||
verify_ssl = true
|
|
||||||
|
|
||||||
[dev-packages]
|
|
||||||
|
|
||||||
[packages]
|
|
||||||
flask = "*"
|
|
||||||
pymysql = "*"
|
|
||||||
flask-praetorian = "*"
|
|
||||||
flask-sqlalchemy = "*"
|
|
||||||
flask-migrate = "*"
|
|
||||||
flask-marshmallow = "*"
|
|
||||||
marshmallow = "*"
|
|
||||||
pytest = "*"
|
|
||||||
marshmallow-sqlalchemy = "*"
|
|
||||||
twilio = "*"
|
|
||||||
pytest-flask = "*"
|
|
||||||
|
|
||||||
[requires]
|
|
||||||
python_version = "3.8"
|
|
|
@ -1,414 +0,0 @@
|
||||||
{
|
|
||||||
"_meta": {
|
|
||||||
"hash": {
|
|
||||||
"sha256": "eb1b1d3ad68e400f0f9cb120594b5b710072f825f2ad49112dab55008e36ed8f"
|
|
||||||
},
|
|
||||||
"pipfile-spec": 6,
|
|
||||||
"requires": {
|
|
||||||
"python_version": "3.8"
|
|
||||||
},
|
|
||||||
"sources": [
|
|
||||||
{
|
|
||||||
"name": "pypi",
|
|
||||||
"url": "https://pypi.org/simple",
|
|
||||||
"verify_ssl": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"default": {
|
|
||||||
"alembic": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:035ab00497217628bf5d0be82d664d8713ab13d37b630084da8e1f98facf4dbf"
|
|
||||||
],
|
|
||||||
"version": "==1.4.2"
|
|
||||||
},
|
|
||||||
"attrs": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
|
|
||||||
"sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
|
|
||||||
],
|
|
||||||
"version": "==19.3.0"
|
|
||||||
},
|
|
||||||
"blinker": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"
|
|
||||||
],
|
|
||||||
"version": "==1.4"
|
|
||||||
},
|
|
||||||
"certifi": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304",
|
|
||||||
"sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519"
|
|
||||||
],
|
|
||||||
"version": "==2020.4.5.1"
|
|
||||||
},
|
|
||||||
"chardet": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
|
|
||||||
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
|
|
||||||
],
|
|
||||||
"version": "==3.0.4"
|
|
||||||
},
|
|
||||||
"click": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a",
|
|
||||||
"sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"
|
|
||||||
],
|
|
||||||
"version": "==7.1.2"
|
|
||||||
},
|
|
||||||
"deprecated": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:0cf37d293a96805c6afd8b5fc525cb40f23a2cac9b2d066ac3bd4b04e72ceccc",
|
|
||||||
"sha256:55b41a15bda04c6a2c0d27dd4c2b7b81ffa6348c9cad8f077ac1978c59927ab9"
|
|
||||||
],
|
|
||||||
"version": "==1.2.9"
|
|
||||||
},
|
|
||||||
"flask": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060",
|
|
||||||
"sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==1.1.2"
|
|
||||||
},
|
|
||||||
"flask-buzz": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:5d1158170c62c62a55e294f531091b261e5f9b272f9e4054e497e0fb68a6cf45",
|
|
||||||
"sha256:bd15f6c28807cad1fa7bdfa997f6722ac234271f72a0f7976d6100d64af864b9"
|
|
||||||
],
|
|
||||||
"version": "==0.1.15"
|
|
||||||
},
|
|
||||||
"flask-mail": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41"
|
|
||||||
],
|
|
||||||
"version": "==0.9.1"
|
|
||||||
},
|
|
||||||
"flask-marshmallow": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:6e6aec171b8e092e0eafaf035ff5b8637bf3a58ab46f568c4c1bab02f2a3c196",
|
|
||||||
"sha256:a1685536e7ab5abdc712bbc1ac1a6b0b50951a368502f7985e7d1c27b3c21e59"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==0.12.0"
|
|
||||||
},
|
|
||||||
"flask-migrate": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:4dc4a5cce8cbbb06b8dc963fd86cf8136bd7d875aabe2d840302ea739b243732",
|
|
||||||
"sha256:a69d508c2e09d289f6e55a417b3b8c7bfe70e640f53d2d9deb0d056a384f37ee"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==2.5.3"
|
|
||||||
},
|
|
||||||
"flask-praetorian": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:107086455f57935432700dab2611aecdaf3825421196cf6c8e812700e43b37a3",
|
|
||||||
"sha256:292ff803eca223fa0e72571d95c3c93b61798b395c9c9755af7943364a04fc31"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==1.0.0"
|
|
||||||
},
|
|
||||||
"flask-sqlalchemy": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327",
|
|
||||||
"sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==2.4.1"
|
|
||||||
},
|
|
||||||
"idna": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
|
|
||||||
"sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
|
|
||||||
],
|
|
||||||
"version": "==2.9"
|
|
||||||
},
|
|
||||||
"inflection": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca"
|
|
||||||
],
|
|
||||||
"version": "==0.3.1"
|
|
||||||
},
|
|
||||||
"itsdangerous": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
|
|
||||||
"sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
|
|
||||||
],
|
|
||||||
"version": "==1.1.0"
|
|
||||||
},
|
|
||||||
"jinja2": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0",
|
|
||||||
"sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"
|
|
||||||
],
|
|
||||||
"version": "==2.11.2"
|
|
||||||
},
|
|
||||||
"mako": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d",
|
|
||||||
"sha256:8e8b53c71c7e59f3de716b6832c4e401d903af574f6962edbbbf6ecc2a5fe6c9"
|
|
||||||
],
|
|
||||||
"version": "==1.1.2"
|
|
||||||
},
|
|
||||||
"markupsafe": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
|
|
||||||
"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",
|
|
||||||
"sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
|
|
||||||
"sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
|
|
||||||
"sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
|
|
||||||
"sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
|
|
||||||
"sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
|
|
||||||
"sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
|
|
||||||
"sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
|
|
||||||
"sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
|
|
||||||
"sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
|
|
||||||
"sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
|
|
||||||
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
|
|
||||||
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
|
|
||||||
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
|
|
||||||
"sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
|
|
||||||
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
|
|
||||||
"sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
|
|
||||||
],
|
|
||||||
"version": "==1.1.1"
|
|
||||||
},
|
|
||||||
"marshmallow": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:56663fa1d5385c14c6a1236badd166d6dee987a5f64d2b6cc099dadf96eb4f09",
|
|
||||||
"sha256:f12203bf8d94c410ab4b8d66edfde4f8a364892bde1f6747179765559f93d62a"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==3.5.2"
|
|
||||||
},
|
|
||||||
"marshmallow-sqlalchemy": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:3247e41e424146340b03a369f2b7c6f0364477ccedc4e2481e84d5f3a8d3c67f",
|
|
||||||
"sha256:dbbe51d28bb28e7ee2782e51310477f7a2c5a111a301f6dd8e264e11ab820427"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==0.23.0"
|
|
||||||
},
|
|
||||||
"more-itertools": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c",
|
|
||||||
"sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507"
|
|
||||||
],
|
|
||||||
"version": "==8.2.0"
|
|
||||||
},
|
|
||||||
"packaging": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3",
|
|
||||||
"sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752"
|
|
||||||
],
|
|
||||||
"version": "==20.3"
|
|
||||||
},
|
|
||||||
"passlib": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:68c35c98a7968850e17f1b6892720764cc7eed0ef2b7cb3116a89a28e43fe177",
|
|
||||||
"sha256:8d666cef936198bc2ab47ee9b0410c94adf2ba798e5a84bf220be079ae7ab6a8"
|
|
||||||
],
|
|
||||||
"version": "==1.7.2"
|
|
||||||
},
|
|
||||||
"pendulum": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:093cab342e10516660e64b935a6da1a043e0286de36cc229fb48471415981ffe",
|
|
||||||
"sha256:0cbbd4f30c69a283690d9ed8e58e44a990e067e59ee05b5ef55d022b38659aeb",
|
|
||||||
"sha256:2788945a0111d5325fd27ae3e3b18b741e440d20bdb7d4ea22fce7c9a4fbbf40",
|
|
||||||
"sha256:4420e058110740a8193fb0709350dfc6ac790a99c345fc4e92e24df0f834ddcb",
|
|
||||||
"sha256:575934b65b298eeb99c5a5b1673c945fc5c99e2b56caff772a91bc4b1eba7b82",
|
|
||||||
"sha256:6cf0f876cd088ee1578266f4231121376747aa90c3ed3b8e212a8344a9920061",
|
|
||||||
"sha256:70007aebc4494163f8705909a1996ce21ab853801b57fba4c2dd53c3df5c38f0",
|
|
||||||
"sha256:701127e1f0ff7c253cc0c07f29becc5f9210547914e0bbe59ffd9fa064d7c3c8",
|
|
||||||
"sha256:75a62e3f98499283fafe8ef4b44f81052e84825b00a0b64609dd8a06985382b9",
|
|
||||||
"sha256:816e01dcb0ba4ffcf2ceaafe4d644174fea680361e909f6f8ba0a4fdb2ccae24",
|
|
||||||
"sha256:9eda38ff65b1f297d860d3f562480e048673fb4b81fdd5c8c55decb519b97ed2",
|
|
||||||
"sha256:a79a72a7fd1092a7c69ddd8580a0be5365ded40c9f9c865623c7665742e3b888",
|
|
||||||
"sha256:aa13ddea12fd871d3191f633f08090b91ea2e80fb0ed50a7a149add7f680b12d",
|
|
||||||
"sha256:aa560bd39d94f3889646422f1e65b8dfd025bf6288d43e5c2e31d4f972aaf2e4",
|
|
||||||
"sha256:ac3c6a992beeb4c9bd90c317a1bb2a6cba159b49a49b6dd3c86b5bacb86f3d50",
|
|
||||||
"sha256:d42d1e870541eeaf3fe0500aac0c76a85bd4bd53ebed74f9a7daf8f01ac77374",
|
|
||||||
"sha256:eb7e349bb2d1b2b418d094e2179d6768561e8242fd8cb640b5aaba735f3e91d1",
|
|
||||||
"sha256:edd00e6b43698762e10bfda508cc9c06bad88c0703a9b37e412aec1189e06e23",
|
|
||||||
"sha256:ff7f3420de0c0cf21c1fc813d581fcfa4a1fb6d87f09485880b3e1204eb9cdd7"
|
|
||||||
],
|
|
||||||
"version": "==2.1.0"
|
|
||||||
},
|
|
||||||
"pluggy": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0",
|
|
||||||
"sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"
|
|
||||||
],
|
|
||||||
"version": "==0.13.1"
|
|
||||||
},
|
|
||||||
"py": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa",
|
|
||||||
"sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"
|
|
||||||
],
|
|
||||||
"version": "==1.8.1"
|
|
||||||
},
|
|
||||||
"py-buzz": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:07ff75c14182cb07d88372b6dc5e74e3588174189c8fd43b262317d38b8e49bd",
|
|
||||||
"sha256:21f72d3e160eb403dce76f9011c4614f3e0608bb7f91673e9fb7bfee7859a9a0"
|
|
||||||
],
|
|
||||||
"version": "==1.0.3"
|
|
||||||
},
|
|
||||||
"pyjwt": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e",
|
|
||||||
"sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"
|
|
||||||
],
|
|
||||||
"version": "==1.7.1"
|
|
||||||
},
|
|
||||||
"pymysql": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:3943fbbbc1e902f41daf7f9165519f140c4451c179380677e6a848587042561a",
|
|
||||||
"sha256:d8c059dcd81dedb85a9f034d5e22dcb4442c0b201908bede99e306d65ea7c8e7"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==0.9.3"
|
|
||||||
},
|
|
||||||
"pyparsing": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
|
|
||||||
"sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
|
|
||||||
],
|
|
||||||
"version": "==2.4.7"
|
|
||||||
},
|
|
||||||
"pytest": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:0e5b30f5cb04e887b91b1ee519fa3d89049595f428c1db76e73bd7f17b09b172",
|
|
||||||
"sha256:84dde37075b8805f3d1f392cc47e38a0e59518fb46a431cfdaf7cf1ce805f970"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==5.4.1"
|
|
||||||
},
|
|
||||||
"pytest-flask": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:44948d3feab48c69e89b087129cc4db66bad9cb5aa472c08dfc798c69f4eac67",
|
|
||||||
"sha256:4d5678a045c07317618d80223ea124e21e8acc89dae109542dd1fdf6783d96c2"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==1.0.0"
|
|
||||||
},
|
|
||||||
"python-dateutil": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c",
|
|
||||||
"sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"
|
|
||||||
],
|
|
||||||
"version": "==2.8.1"
|
|
||||||
},
|
|
||||||
"python-editor": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d",
|
|
||||||
"sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b",
|
|
||||||
"sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"
|
|
||||||
],
|
|
||||||
"version": "==1.0.4"
|
|
||||||
},
|
|
||||||
"pytz": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed",
|
|
||||||
"sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"
|
|
||||||
],
|
|
||||||
"version": "==2020.1"
|
|
||||||
},
|
|
||||||
"pytzdata": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:84c52b9a47d097fcd483f047a544979de6c3a86e94c845e3569e9f8acd0fa071",
|
|
||||||
"sha256:fac06f7cdfa903188dc4848c655e4adaee67ee0f2fe08e7daf815cf2a761ee5e"
|
|
||||||
],
|
|
||||||
"version": "==2019.3"
|
|
||||||
},
|
|
||||||
"requests": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
|
|
||||||
"sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
|
|
||||||
],
|
|
||||||
"version": "==2.23.0"
|
|
||||||
},
|
|
||||||
"six": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
|
|
||||||
"sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
|
|
||||||
],
|
|
||||||
"version": "==1.14.0"
|
|
||||||
},
|
|
||||||
"sqlalchemy": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:083e383a1dca8384d0ea6378bd182d83c600ed4ff4ec8247d3b2442cf70db1ad",
|
|
||||||
"sha256:0a690a6486658d03cc6a73536d46e796b6570ac1f8a7ec133f9e28c448b69828",
|
|
||||||
"sha256:114b6ace30001f056e944cebd46daef38fdb41ebb98f5e5940241a03ed6cad43",
|
|
||||||
"sha256:128f6179325f7597a46403dde0bf148478f868df44841348dfc8d158e00db1f9",
|
|
||||||
"sha256:13d48cd8b925b6893a4e59b2dfb3e59a5204fd8c98289aad353af78bd214db49",
|
|
||||||
"sha256:211a1ce7e825f7142121144bac76f53ac28b12172716a710f4bf3eab477e730b",
|
|
||||||
"sha256:2dc57ee80b76813759cccd1a7affedf9c4dbe5b065a91fb6092c9d8151d66078",
|
|
||||||
"sha256:3e625e283eecc15aee5b1ef77203bfb542563fa4a9aa622c7643c7b55438ff49",
|
|
||||||
"sha256:43078c7ec0457387c79b8d52fff90a7ad352ca4c7aa841c366238c3e2cf52fdf",
|
|
||||||
"sha256:5b1bf3c2c2dca738235ce08079783ef04f1a7fc5b21cf24adaae77f2da4e73c3",
|
|
||||||
"sha256:6056b671aeda3fc451382e52ab8a753c0d5f66ef2a5ccc8fa5ba7abd20988b4d",
|
|
||||||
"sha256:68d78cf4a9dfade2e6cf57c4be19f7b82ed66e67dacf93b32bb390c9bed12749",
|
|
||||||
"sha256:7025c639ce7e170db845e94006cf5f404e243e6fc00d6c86fa19e8ad8d411880",
|
|
||||||
"sha256:7224e126c00b8178dfd227bc337ba5e754b197a3867d33b9f30dc0208f773d70",
|
|
||||||
"sha256:7d98e0785c4cd7ae30b4a451416db71f5724a1839025544b4edbd92e00b91f0f",
|
|
||||||
"sha256:8d8c21e9d4efef01351bf28513648ceb988031be4159745a7ad1b3e28c8ff68a",
|
|
||||||
"sha256:bbb545da054e6297242a1bb1ba88e7a8ffb679f518258d66798ec712b82e4e07",
|
|
||||||
"sha256:d00b393f05dbd4ecd65c989b7f5a81110eae4baea7a6a4cdd94c20a908d1456e",
|
|
||||||
"sha256:e18752cecaef61031252ca72031d4d6247b3212ebb84748fc5d1a0d2029c23ea"
|
|
||||||
],
|
|
||||||
"version": "==1.3.16"
|
|
||||||
},
|
|
||||||
"twilio": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:7ef6ad19251fee6a41f1184e97b4fcb62f4a8c0e6f4b78797e40e9c92aed006d"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==6.39.0"
|
|
||||||
},
|
|
||||||
"urllib3": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527",
|
|
||||||
"sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"
|
|
||||||
],
|
|
||||||
"version": "==1.25.9"
|
|
||||||
},
|
|
||||||
"wcwidth": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1",
|
|
||||||
"sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1"
|
|
||||||
],
|
|
||||||
"version": "==0.1.9"
|
|
||||||
},
|
|
||||||
"werkzeug": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43",
|
|
||||||
"sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"
|
|
||||||
],
|
|
||||||
"version": "==1.0.1"
|
|
||||||
},
|
|
||||||
"wrapt": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"
|
|
||||||
],
|
|
||||||
"version": "==1.12.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"develop": {}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
from flask import request, jsonify, make_response
|
from flask import request, jsonify, make_response
|
||||||
from database.crud import insert_data, verify_otp
|
from database.crud import insert_data, verify_otp, verify_login
|
||||||
from app.twilio import send_otp
|
from app.twilio import send_otp
|
||||||
from app import app
|
from app import app
|
||||||
|
|
||||||
|
@ -8,11 +8,19 @@ from app import app
|
||||||
def create_user():
|
def create_user():
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
insert_data(schema="Users", data=data)
|
insert_data(schema="Users", data=data)
|
||||||
# send_otp(receiver=data["mobile"])
|
send_otp(receiver=data["mobile"])
|
||||||
return make_response(jsonify("User created, pending OTP verification"))
|
return make_response(jsonify("User created, pending OTP verification"))
|
||||||
|
|
||||||
|
|
||||||
@app.route("/verifyotp", methods=["POST"])
|
@app.route("/login", methods=["POST"])
|
||||||
|
def log_in():
|
||||||
|
data = request.get_json
|
||||||
|
if verify_login(data=data):
|
||||||
|
return make_response(jsonify("Successful login"))
|
||||||
|
return make_response(jsonify("The email/password combination is not correct"))
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/otpVerification", methods=["POST"])
|
||||||
def validate_otp():
|
def validate_otp():
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
if verify_otp(mobile=data["mobile"], otp=data["otp"]):
|
if verify_otp(mobile=data["mobile"], otp=data["otp"]):
|
||||||
|
|
|
@ -4,12 +4,25 @@ from app.models import *
|
||||||
from app.schema import *
|
from app.schema import *
|
||||||
from marshmallow import ValidationError
|
from marshmallow import ValidationError
|
||||||
from pydoc import locate
|
from pydoc import locate
|
||||||
|
from werkzeug.security import check_password_hash
|
||||||
|
|
||||||
|
|
||||||
|
def validate_schema(schema, data):
|
||||||
|
schema_name = schema + "Schema"
|
||||||
|
validation_schema = locate("app.schema." + schema_name)
|
||||||
|
instance = validation_schema()
|
||||||
|
instance.load(data)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_json(schema, data):
|
||||||
|
validate_schema(schema=schema, data=data)
|
||||||
|
model = locate("app.models." + schema)
|
||||||
|
instance = model(**data)
|
||||||
|
return instance
|
||||||
|
|
||||||
|
|
||||||
def insert_data(schema, data):
|
def insert_data(schema, data):
|
||||||
validate_data(schema=schema, data=data)
|
instance = validate_json(schema, data)
|
||||||
model = locate("app.models." + schema)
|
|
||||||
instance = model(**data)
|
|
||||||
db.session.add(instance)
|
db.session.add(instance)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
@ -24,23 +37,13 @@ def save_otp(mobile, otp):
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
def validate_data(schema, data):
|
|
||||||
schema_name = schema + "Schema"
|
|
||||||
validation_schema = locate("app.schema." + schema_name)
|
|
||||||
instance = validation_schema()
|
|
||||||
try:
|
|
||||||
instance.load(data)
|
|
||||||
except ValidationError as err:
|
|
||||||
print(err.messages)
|
|
||||||
|
|
||||||
|
|
||||||
def fetch_stored_otp(mobile):
|
def fetch_stored_otp(mobile):
|
||||||
user = db.session.query(table="Users").filter_by(mobile=mobile)
|
user = db.session.query(table="Users").filter_by(mobile=mobile)
|
||||||
otp = user.otp
|
otp = user.otp
|
||||||
return otp
|
return otp
|
||||||
|
|
||||||
|
|
||||||
def validate_account(mobile):
|
def activate_account(mobile):
|
||||||
timestamp = datetime.now()
|
timestamp = datetime.now()
|
||||||
db.session.query(table="Users").filter_by(mobile=mobile).update(
|
db.session.query(table="Users").filter_by(mobile=mobile).update(
|
||||||
dict(otp_valid_time=timestamp)
|
dict(otp_valid_time=timestamp)
|
||||||
|
@ -51,6 +54,20 @@ def validate_account(mobile):
|
||||||
def verify_otp(mobile, otp):
|
def verify_otp(mobile, otp):
|
||||||
stored_otp = fetch_stored_otp(mobile=mobile)
|
stored_otp = fetch_stored_otp(mobile=mobile)
|
||||||
if stored_otp == otp:
|
if stored_otp == otp:
|
||||||
validate_account(mobile=mobile)
|
activate_account(mobile=mobile)
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_user(data):
|
||||||
|
user = db.session.query(table="Users").filter_by(email=data["email"])
|
||||||
|
email = user.email
|
||||||
|
password = user.password
|
||||||
|
return email, password
|
||||||
|
|
||||||
|
|
||||||
|
def verify_login(data):
|
||||||
|
user, password = fetch_user(data)
|
||||||
|
if user == data["email"] and check_password_hash(password, data["password"]):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
{ pkgs ? import <nixpkgs> { } }:
|
||||||
|
|
||||||
|
with pkgs.python37Packages;
|
||||||
|
|
||||||
|
pkgs.mkShell {
|
||||||
|
buildInputs = [
|
||||||
|
# Dependencies
|
||||||
|
flask
|
||||||
|
flask_sqlalchemy
|
||||||
|
flask_migrate
|
||||||
|
flask_marshmallow
|
||||||
|
pymysql
|
||||||
|
marshmallow
|
||||||
|
marshmallow-sqlalchemy
|
||||||
|
pytest
|
||||||
|
pytest-flask
|
||||||
|
twilio
|
||||||
|
# Development tools
|
||||||
|
black
|
||||||
|
isort
|
||||||
|
pyflakes
|
||||||
|
python-language-server
|
||||||
|
pyls-black
|
||||||
|
pyls-isort
|
||||||
|
];
|
||||||
|
}
|
|
@ -9,15 +9,27 @@ def test_registration(client):
|
||||||
user = {
|
user = {
|
||||||
"full_name": "Bilal Balaperdida",
|
"full_name": "Bilal Balaperdida",
|
||||||
"email": "oyvey@hotmail.com",
|
"email": "oyvey@hotmail.com",
|
||||||
"password": generate_password_hash(password="lifeisabitch", method="md5"),
|
"password": "lifeisabitch",
|
||||||
"gender": 3,
|
"gender": 3,
|
||||||
"mobile": "+212655778899",
|
"mobile": "+212655778899",
|
||||||
"city_id": 12,
|
"city_id": 12,
|
||||||
"user_type": 1,
|
"user_type": 1,
|
||||||
"lang_type": 1,
|
"lang_type": 1,
|
||||||
"device_id": token_hex(8),
|
"device_id": token_hex(16),
|
||||||
"device_type": 1,
|
"device_type": 1,
|
||||||
"badge": 0,
|
"badge": 0,
|
||||||
}
|
}
|
||||||
response = client.post("/register", json=user)
|
response = client.post("/register", json=user)
|
||||||
assert response.status == "200 OK"
|
assert response.status == "200 OK"
|
||||||
|
|
||||||
|
|
||||||
|
def test_login(client):
|
||||||
|
user = {
|
||||||
|
"email": "12@gmail.com",
|
||||||
|
"password": "odyfo2020",
|
||||||
|
"device_id": "fEll6hxazGQ:APA91bFpsB44ZHgjUItYOKTTmUxxkJsWiuaeojdxiTLVbz-AwN90XwLvpA6nRQoLrUYaF-HoHTz4Vc5S0VlqemerJ6MjG4zqwfNYB75whQVQI1M29yhMc3oFdl1me2zP_RY2dXbfx7UW",
|
||||||
|
"lang_type": 2,
|
||||||
|
"user_type": 1,
|
||||||
|
}
|
||||||
|
response = client.post("/login", json=user)
|
||||||
|
assert response.status == "200 OK"
|
||||||
|
|
Loading…
Reference in New Issue