from flask import request from flask_babel import LazyString, lazy_gettext from flask_wtf import FlaskForm from wtforms import EmailField, PasswordField, StringField from wtforms.validators import DataRequired 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={ "autocomplete": "password", "class": "form-control", "placeholder": lazy_gettext("page.register.form.password"), }, validators=[ DataRequired(message=lazy_gettext("page.register.error.password")), # 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: bp.data["status_class"], bp.data["status"] = cls.handle_form() bp.data["form"] = RegisterForm() @classmethod def handle_form(cls) -> tuple[str | None, LazyString | None]: form = RegisterForm() if not form.validate_on_submit(): return None, None user = User( username=str(form.username.data), password=cls.encrypt_password(str(form.password.data)), email=str(form.email.data), ) try: db.session.add(user) db.session.commit() except Exception: return "error", lazy_gettext("page.register.status.email_already_exists") return "success", lazy_gettext("page.register.status.success")