From ef416856fd87d37e93ce172a43c9ef85beab308d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Thu, 28 Mar 2024 18:37:13 +0100 Subject: Port away from flask-script --- accounts/backend/mail/dummy.py | 2 - accounts/utils/console.py | 20 +--------- manage.py | 85 ++++++++++++++++++++++-------------------- requirements.txt | 1 - 4 files changed, 45 insertions(+), 63 deletions(-) diff --git a/accounts/backend/mail/dummy.py b/accounts/backend/mail/dummy.py index 3de3dbe..049df7a 100644 --- a/accounts/backend/mail/dummy.py +++ b/accounts/backend/mail/dummy.py @@ -40,8 +40,6 @@ class DummyBackend(Backend): self.format = format def _send(self, recipient: str, content: TemplateModule): - print(type(content)) - # we can't typecheck things defined in templates body = content.body() # type: ignore if not self.plain: diff --git a/accounts/utils/console.py b/accounts/utils/console.py index ef8b4fd..c63480a 100644 --- a/accounts/utils/console.py +++ b/accounts/utils/console.py @@ -1,22 +1,4 @@ # -*- coding: utf-8 -*- -import flask_script as script - - -class Command(script.Command): - """ - This changes the Command class from Flask-Script in such way, - that url_for will generate correct urls. - """ - - def __call__(self, app=None, *args, **kwargs): - base_url = '%s://%s%s' % ( - app.config.get('PREFERRED_URL_SCHEME') or 'http', - app.config.get('SERVER_NAME') or 'localhost', - app.config.get('APPLICATION_ROOT') or '/') - - with app.test_request_context(base_url=base_url): - return self.run(*args, **kwargs) - class TablePrinter(object): @@ -80,7 +62,7 @@ class ConsoleForm(object): _ready = False def __init__(self, formcls, **kwargs): - self.form = formcls() + self.form = formcls(meta={'csrf': False}) self._fill(kwargs) self._ready = True diff --git a/manage.py b/manage.py index c1abbe3..1e5d8cb 100755 --- a/manage.py +++ b/manage.py @@ -1,16 +1,17 @@ #!/usr/bin/env python from flask import current_app -from flask_script import Manager, Server, Shell, Option, prompt_bool -from accounts import create_app +from argparse import ArgumentParser + from accounts.forms import RegisterForm -from accounts.utils.console import Command, ConsoleForm, TablePrinter +from accounts.utils.console import ConsoleForm, TablePrinter from accounts.backend.mail.dummy import DummyBackend as DummyMailBackend +from accounts import create_app -class ListServices(Command): + +class ListServices(): """List the configured services.""" - name = 'list-services' def run(self): table = TablePrinter(['Name', 'URL']) @@ -18,16 +19,8 @@ class ListServices(Command): for service in current_app.all_services]) -class ListUsers(Command): +class ListUsers(): """List registered users.""" - name = 'list-users' - - option_list = ( - Option('--locked', '-l', action='store_true', dest='locked', - help='Include locked users.'), - Option('--only-locked', '-L', action='store_true', dest='only_locked', - help='Show ONLY locked users.'), - ) def _get_users(self, locked, only_locked): for user in current_app.user_backend.find(): @@ -45,27 +38,15 @@ class ListUsers(Command): for user in self._get_users(locked, only_locked)]) -class CreateUser(Command): +class CreateUser(): """Register a user.""" - name = 'create-user' - - option_list = ( - Option('--ignore-blacklist', action='store_true', - dest='ignore_blacklist', help='Ignore blackisted user names.'), - Option('--print', '-p', action='store_true', dest='print_only', - help='Do not send the activation link via mail, only print it.'), - Option(dest='username', metavar='USERNAME', - help='Username that should be registered.'), - Option(dest='mail', metavar='MAIL', - help='Mail address of the new user.'), - ) def run(self, username, mail, ignore_blacklist=False, print_only=False): form = ConsoleForm(RegisterForm, username=username, mail=mail) form.csrf_enabled = False del form.question - if ignore_blacklist and prompt_bool('Blacklist wirklich ignorieren?'): + if ignore_blacklist: current_app.username_blacklist = [] if not form.validate(): @@ -83,19 +64,41 @@ class CreateUser(Command): def main(): - manager = Manager(create_app) - manager.add_option('-c', '--config', dest='config', required=False) - - manager.add_command( - 'runserver', Server(host='::', use_debugger=False)) - manager.add_command( - 'debug', Server(host='::', use_debugger=True)) - manager.add_command( - 'shell', Shell()) - manager.add_command(ListServices) - manager.add_command(ListUsers) - manager.add_command(CreateUser) - manager.run() + parser = ArgumentParser(description="Spline Accounts") + parser.add_argument('-c', '--config', dest='config', required=False) + + subparsers = parser.add_subparsers(dest="subcommand") + subparsers.add_parser("list-services") + + list_users = subparsers.add_parser("list-users") + list_users.add_argument('--locked', '-l', action='store_true', + dest='locked', help='Include locked users.') + list_users.add_argument('--only-locked', '-L', action='store_true', + dest='only_locked', help='Show ONLY locked users.') + + create_user = subparsers.add_parser("create-user") + create_user.add_argument('--ignore-blacklist', action='store_true', + dest='ignore_blacklist', + help='Ignore blackisted user names.') + create_user.add_argument('--print', '-p', action='store_true', dest='print_only', + help='Do not send the activation link via mail, only print it.'), + create_user.add_argument(dest='username', metavar='USERNAME', + help='Username that should be registered.'), + create_user.add_argument(dest='mail', metavar='MAIL', + help='Mail address of the new user.'), + + args = parser.parse_args() + + app = create_app() + with app.app_context(): + if args.subcommand == "list-services": + ListServices().run() + elif args.subcommand == "list-users": + ListUsers().run(args.locked, args.only_locked) + elif args.subcommand == "create-user": + with app.test_request_context("/cli/create-user"): + CreateUser().run(args.username, args.mail, args.ignore_blacklist, + args.print_only) if __name__ == '__main__': diff --git a/requirements.txt b/requirements.txt index bec8fbb..fe08567 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ Flask==2.2.2 # >=0.10 Flask-WTF==1.2.1 # none -Flask-Script==2.0.6 # none Flask-Login==0.6.3 # none Werkzeug==2.2.2 # >=0.6 Jinja2==3.1.3 # >=2.4 -- cgit v1.2.3-1-g7c22