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

98 lines
3.9 KiB
Python

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]