from flask import flash, request from flask_babel import lazy_gettext from flask_wtf import FlaskForm from wtforms import EmailField, PasswordField, StringField from wtforms.fields.simple import PasswordField from wtforms.validators import DataRequired, EqualTo, Length from starfall.db import db from starfall.db.schema.users import User from starfall.web.blueprints.base import BaseBlueprint from starfall.web.controllers.base import BaseController class RegisterForm(FlaskForm): username: StringField = StringField( label=lazy_gettext("page.register.form.username"), # pyright: ignore[reportArgumentType] render_kw={ "autocomplete": "username", "class": "form-control", "aria-describedby": "username-addon", "placeholder": lazy_gettext("page.register.form.username"), }, validators=[ DataRequired(message=lazy_gettext("page.register.error.username")), # pyright: ignore[reportArgumentType] ], ) password: PasswordField = PasswordField( label=lazy_gettext("page.register.form.password"), # pyright: ignore[reportArgumentType] render_kw={ "class": "form-control", "placeholder": lazy_gettext("page.register.form.password"), }, validators=[ DataRequired(message=lazy_gettext("page.register.error.password")), # pyright: ignore[reportArgumentType] Length(8, message=lazy_gettext("page.register.error.password_too_short")), # pyright: ignore[reportArgumentType] ], ) retype_password: PasswordField = PasswordField( label=lazy_gettext("page.register.form.retype_password"), # pyright: ignore[reportArgumentType] render_kw={ "class": "form-control", "placeholder": lazy_gettext("page.register.form.retype_password"), }, validators=[ DataRequired(message=lazy_gettext("page.register.error.retype_password")), # pyright: ignore[reportArgumentType] Length(8, message=lazy_gettext("page.register.error.password_too_short")), # pyright: ignore[reportArgumentType] EqualTo( "password", message=lazy_gettext("page.register.error.password_not_matching"), # pyright: ignore[reportArgumentType] ), ], ) email: EmailField = EmailField( label=lazy_gettext("page.register.form.email"), # pyright: ignore[reportArgumentType] render_kw={ "autocomplete": "email", "class": "form-control", "placeholder": lazy_gettext("page.register.form.email"), }, validators=[ DataRequired(message=lazy_gettext("page.register.error.email")), # pyright: ignore[reportArgumentType] ], ) class RegisterController(BaseController): @classmethod def apply(cls, bp: BaseBlueprint): if "POST" == request.method: cls.handle_form() bp.data["form"] = RegisterForm() @classmethod def handle_form(cls): form = RegisterForm() if not form.validate_on_submit(): return try: user = User( username=str(form.username.data), password=cls.encrypt_password(str(form.password.data)), email=str(form.email.data), ) if not user.username_free(): flash(lazy_gettext("page.register.status.username_exists"), "danger") # pyright: ignore[reportArgumentType] return if not user.email_free(): flash(lazy_gettext("page.register.status.email_exists"), "danger") # pyright: ignore[reportArgumentType] return db.session.add(user) db.session.commit() except Exception: flash(lazy_gettext("page.register.status.insert_error"), "danger") # pyright: ignore[reportArgumentType]