aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGertjan van den Burg <gertjanvandenburg@gmail.com>2019-03-18 18:29:39 +0000
committerGertjan van den Burg <gertjanvandenburg@gmail.com>2019-03-18 18:29:47 +0000
commit38795c9a464fb6bcb778c655ab1469fa933a54c3 (patch)
tree16b59d0ccb35ac5acd712a1636bdd369254e81c5
parentAdd admin flag (diff)
downloadAnnotateChange-38795c9a464fb6bcb778c655ab1469fa933a54c3.tar.gz
AnnotateChange-38795c9a464fb6bcb778c655ab1469fa933a54c3.zip
Add command line interface for admin tasks
-rw-r--r--app/cli.py34
-rw-r--r--poetry.lock33
-rw-r--r--pyproject.toml1
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"