aboutsummaryrefslogtreecommitdiffstats
path: root/src/expense/auth/register.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/expense/auth/register.py')
-rw-r--r--src/expense/auth/register.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/expense/auth/register.py b/src/expense/auth/register.py
new file mode 100644
index 0000000..0f43c9f
--- /dev/null
+++ b/src/expense/auth/register.py
@@ -0,0 +1,80 @@
+"""Register User"""
+from typing import Union
+from flask import (
+ redirect,
+ render_template,
+ url_for,
+)
+from flask_login import current_user, login_user
+
+from flask_wtf import FlaskForm
+from werkzeug import Response
+from wtforms import StringField, PasswordField, SubmitField
+from wtforms.validators import (
+ DataRequired,
+ InputRequired,
+ Length,
+ ValidationError,
+ EqualTo,
+)
+
+from ..model import User, Category
+
+from .password import PasswordHash
+
+from .blueprint import auth
+from .. import db
+
+
+class RegisterForm(FlaskForm):
+ """User Registeration form"""
+ username = StringField(validators=[DataRequired(), InputRequired(), Length(max=64)])
+ password = PasswordField(
+ validators=[
+ DataRequired(),
+ InputRequired(),
+ Length(min=8, message="Select a stronger password."),
+ ]
+ )
+ confirm = PasswordField(
+ "Repeat Password",
+ validators=[
+ DataRequired(),
+ InputRequired(),
+ EqualTo("password", message="Passwords must match."),
+ ],
+ )
+ submit = SubmitField("Register")
+
+ def validate_username(self, field: StringField) -> None:
+ user = db.session.execute(
+ db.select(User).where(User.name == field.data)
+ ).first()
+ if user is not None:
+ raise ValidationError("Please use a different username.")
+
+
+@auth.route("/register", methods=("GET", "POST"))
+def register() -> Union[str, Response]:
+ """
+ Registering User Route
+ Support both POST and GET
+ """
+ if current_user.is_authenticated: # type: ignore
+ return redirect(url_for("index"))
+ form = RegisterForm()
+ if form.validate_on_submit():
+ user = User(name=form.username.data, password=PasswordHash.new(form.password.data)) # type: ignore
+
+ for cat in ["Misc", "Income"]:
+ category = db.session.scalars(
+ db.select(Category).where(Category.name == cat)
+ ).one()
+ user.categories.append(category)
+
+ db.session.add(user)
+ db.session.commit()
+ login_user(user)
+ return redirect(url_for("index"))
+ print(form.confirm.errors)
+ return render_template("auth/register.html", form=form)