diff options
| author | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2019-03-18 18:29:39 +0000 |
|---|---|---|
| committer | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2019-03-18 18:29:47 +0000 |
| commit | 38795c9a464fb6bcb778c655ab1469fa933a54c3 (patch) | |
| tree | 16b59d0ccb35ac5acd712a1636bdd369254e81c5 | |
| parent | Add admin flag (diff) | |
| download | AnnotateChange-38795c9a464fb6bcb778c655ab1469fa933a54c3.tar.gz AnnotateChange-38795c9a464fb6bcb778c655ab1469fa933a54c3.zip | |
Add command line interface for admin tasks
| -rw-r--r-- | app/cli.py | 34 | ||||
| -rw-r--r-- | poetry.lock | 33 | ||||
| -rw-r--r-- | pyproject.toml | 1 |
3 files changed, 67 insertions, 1 deletions
diff --git a/app/cli.py b/app/cli.py new file mode 100644 index 0000000..e128c35 --- /dev/null +++ b/app/cli.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +import getpass + +from email_validator import validate_email + +from app import db +from app.models import User + + +def register(app): + @app.cli.group(help="Perform admin commands") + def admin(): + pass + + @admin.command() + def add(): + username = input("Enter username: ") + email = input("Enter email address: ") + password = getpass.getpass() + assert password == getpass.getpass("Repeat password: ") + + user = User.query.filter_by(username=username).first() + if user is not None: + raise ValueError("User already exists") + + validate_email(email) + + user = User(username=username, email=email, is_admin=True) + user.set_password(password) + db.session.add(user) + db.session.commit() + + print("Admin user %r added successfully." % username) diff --git a/poetry.lock b/poetry.lock index 614ef7b..c41e143 100644 --- a/poetry.lock +++ b/poetry.lock @@ -55,6 +55,14 @@ version = "0.4.1" [[package]] category = "main" +description = "DNS toolkit" +name = "dnspython" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.16.0" + +[[package]] +category = "main" description = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API." name = "dominate" optional = false @@ -63,6 +71,18 @@ version = "2.3.5" [[package]] category = "main" +description = "A robust email syntax and deliverability validation library for Python 2.x/3.x." +name = "email-validator" +optional = false +python-versions = "*" +version = "1.0.3" + +[package.dependencies] +dnspython = ">=1.15.0" +idna = ">=2.0.0" + +[[package]] +category = "main" description = "A simple framework for building complex web applications." name = "flask" optional = false @@ -150,6 +170,14 @@ WTForms = "*" [[package]] category = "main" +description = "Internationalized Domain Names in Applications (IDNA)" +name = "idna" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.8" + +[[package]] +category = "main" description = "Various helpers to pass data to untrusted environments and back." name = "itsdangerous" optional = false @@ -304,7 +332,7 @@ python-versions = "*" version = "2.2.1" [metadata] -content-hash = "1d07bebef9272a897cac525c67e7c41a07c4263824389f272b41d46a21bd5a03" +content-hash = "c6579615c070a50b17a7154b5b5b401e0a1d6ce5ebdb5f93f4c3ce3742fe147f" python-versions = "^3.7" [metadata.hashes] @@ -314,7 +342,9 @@ attrs = ["69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", "f0 blinker = ["471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"] click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"] colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"] +dnspython = ["36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01", "f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"] dominate = ["4076735c0745fe771e57b2313dbb4bfeec42731816ee23cee509f66e8912aa51", "4b9fd42d2824b79761799590697db45bf93daad511b130c50513af38da33df9b"] +email-validator = ["ddc4b5b59fa699bb10127adcf7ad4de78fde4ec539a072b104b8bb16da666ae5"] flask = ["2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48", "a080b744b7e345ccfcbc77954861cb05b3c63786e93f2b3875e0913d44b43f05"] flask-bootstrap = ["cb08ed940183f6343a64e465e83b3a3f13c53e1baabb8d72b5da4545ef123ac8"] flask-login = ["c815c1ac7b3e35e2081685e389a665f2c74d7e077cb93cecabaea352da4752ec"] @@ -322,6 +352,7 @@ flask-mail = ["22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41" flask-migrate = ["a361578cb829681f860e4de5ed2c48886264512f0c16144e404c36ddc95ab49c", "c24d105c5d6cc670de20f8cbfb909e04f4e04b8784d0df070005944de1f21549"] flask-sqlalchemy = ["3bc0fac969dd8c0ace01b32060f0c729565293302f0c4269beed154b46bec50b", "5971b9852b5888655f11db634e87725a9031e170f37c0ce7851cf83497f56e53"] flask-wtf = ["5d14d55cfd35f613d99ee7cba0fc3fbbe63ba02f544d349158c14ca15561cc36", "d9a9e366b32dcbb98ef17228e76be15702cd2600675668bca23f63a7947fd5ac"] +idna = ["c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", "ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"] itsdangerous = ["321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", "b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"] jinja2 = ["74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", "f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4"] mako = ["4e02fde57bd4abb5ec400181e4c314f56ac3e49ba4fb8b0d50bba18cb27d25ae"] diff --git a/pyproject.toml b/pyproject.toml index 7e927e1..5a24279 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ flask-mail = "^0.9.1" pyjwt = "^1.7" flask-bootstrap = "^3.3" python-dotenv = "^0.10.1" +email_validator = "^1.0" [tool.poetry.dev-dependencies] pytest = "^3.0" |
