StarfallBot/starfall/web/controllers/secure/register.py

73 lines
2.7 KiB
Python

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")