73 lines
2.7 KiB
Python
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")
|