diff --git a/bam/forms.py b/bam/forms.py index d58ed3da75d0d28d51107221d94821e33ddd117d..0abd6c06c7cea81e5d4291df2312996abd04af25 100644 --- a/bam/forms.py +++ b/bam/forms.py @@ -1,11 +1,16 @@ from flask_wtf import FlaskForm -from wtforms import PasswordField, SubmitField, BooleanField +from wtforms import StringField, PasswordField, SubmitField, BooleanField from wtforms.fields.html5 import EmailField from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError from bam.models import User class RegistrationForm(FlaskForm): + username = StringField( + "Username", + validators=[DataRequired()], + render_kw={"placeholder": "Enter a username"}, + ) email = EmailField( "Email", validators=[DataRequired(), Email()], @@ -24,16 +29,20 @@ class RegistrationForm(FlaskForm): submit = SubmitField("Register") + def validate_username(self, username): + if User.query.filter(User.username.ilike(username.data)).first(): + raise ValidationError("Username taken - choose another.") + def validate_email(self, email): - if User.query.filter_by(email=email.data).first(): + if User.query.filter(User.email.ilike(email.data)).first(): raise ValidationError("A user with this email already exists.") class LoginForm(FlaskForm): - email = EmailField( - "Email", - validators=[DataRequired(), Email()], - render_kw={"placeholder": "bookmaster@bam.com"}, + username = StringField( + "Username", + validators=[DataRequired()], + render_kw={"placeholder": "bookmaster"}, ) password = PasswordField( "Password", diff --git a/bam/models.py b/bam/models.py index 8f593fac5de87785d8fc02e4aa02ef8554d50915..57bff8f31617dbeea747e151b7f8da8457886f4d 100644 --- a/bam/models.py +++ b/bam/models.py @@ -10,7 +10,9 @@ def load_user(user_id): class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True, nullable=False) + username = db.Column(db.String(60), unique=True, nullable=False) password = db.Column(db.String(60), nullable=False) + role = db.Column(db.String(10), default="user") def __repr__(self): return f"User({self.email}, {self.password})" diff --git a/bam/routes.py b/bam/routes.py index b4ef8ff7d07680aaac5e84dadfc85036afe7e980..426be328d243db96ed6490d67586abcc4e6851c5 100644 --- a/bam/routes.py +++ b/bam/routes.py @@ -22,12 +22,12 @@ def register(): hashed_password = bcrypt.generate_password_hash(form.password.data).decode( "utf-8" ) - user = User(email=form.email.data, password=hashed_password) + user = User( + username=form.username.data, email=form.email.data, password=hashed_password + ) db.session.add(user) db.session.commit() - flash( - f"Account successfully created! You may login now.", "success" - ) + flash(f"Account successfully created! You may login now.", "success") return redirect(url_for("login")) return render_template("register.html", title="Register", form=form) @@ -38,7 +38,7 @@ def login(): return redirect(url_for("home")) form = LoginForm() if form.validate_on_submit(): - user = User.query.filter_by(email=form.email.data).first() + user = User.query.filter(User.username.ilike(form.username.data)).first() if user and bcrypt.check_password_hash(user.password, form.password.data): login_user(user, remember=form.remember.data) return redirect(url_for("home")) diff --git a/bam/static/outform.css b/bam/static/outform.css index c6d6ad972f1e282476a23a20964afb2febb16c71..5edc9188d9bfe70af7d9ae0c94ce016138ff83f0 100644 --- a/bam/static/outform.css +++ b/bam/static/outform.css @@ -22,17 +22,15 @@ form { input { font-family: Roboto; font-size: 16px; - /* margin-bottom: 5px; */ border-radius: 3px; padding: 17px; background-color: var(--t-dark); border: 1px solid black; color: #eee; transition: background 0.3s; - /* margin: 3px 0 10px; */ } .field:hover { - background-color: rgba(0, 0, 0, 0.9); + background-color: var(--t-darker); } .field:focus, .field:active { @@ -79,12 +77,13 @@ label, margin-top: 10px; } -.remember-row input { - order: 2; - opacity: 0; +.remember-row div { + order: 1; } + .checkbox-indicator { display: flex; + order: 2; height: 1.5rem; width: 1.5rem; border: 1px solid black; @@ -93,10 +92,15 @@ label, background-color: var(--t-dark); } +.remember-row input { + order: 3; + opacity: 0; +} + .checkbox-indicator svg { height: 50%; width: 100%; - fill: transparent; + fill: #252525; } .remember-row:hover .checkbox-indicator { diff --git a/bam/static/outlayout.css b/bam/static/outlayout.css index 3edf17fb34738c7c585be65ad1423fb8e5485cb5..ad994547ce83a1a74108da840097bf6ba1950dd5 100644 --- a/bam/static/outlayout.css +++ b/bam/static/outlayout.css @@ -10,6 +10,7 @@ body { --red: #e50914; --dark-red: #bb0009; --t-dark: rgba(0, 0, 0, 0.8); + --t-darker: rgba(0, 0, 0, 0.9); } * { diff --git a/bam/templates/login.html b/bam/templates/login.html index b055230a4d9646fd5b98b13680bd41362f5ec16d..18cb33c63d4810b6e3a522d6a55b34acc52bf09d 100644 --- a/bam/templates/login.html +++ b/bam/templates/login.html @@ -8,8 +8,8 @@ {% with messages = get_flashed_messages(with_categories=True) %} {% if messages %} {% for category, message in messages %} <div class="f-message f-message-{{ category }}">{{ message }}</div> - {% endfor %} {% endif %} {% endwith %} {{ form.email.label() }} {{ - form.email(class="field") }} {% for error in form.email.errors %} + {% endfor %} {% endif %} {% endwith %} {{ form.username.label() }} {{ + form.username(class="field") }} {% for error in form.username.errors %} <div class="field-error">{{ error }}</div> {% endfor %} {{ form.password.label() }} {{ form.password(class="field") }} {% for error in form.password.errors %} diff --git a/bam/templates/register.html b/bam/templates/register.html index 484ff8e9c92082f558374111b16d805f14ad9e06..a569d0f4d9019413ff9cea44dcb080371add6fdf 100644 --- a/bam/templates/register.html +++ b/bam/templates/register.html @@ -8,8 +8,11 @@ {% with messages = get_flashed_messages(with_categories=True) %} {% if messages %} {% for category, message in messages %} <div class="f-message f-message-{{ category }}">{{ message }}</div> - {% endfor %} {% endif %} {% endwith %} {{ form.email.label() }} {{ - form.email(class="field") }} {% for error in form.email.errors %} + {% endfor %} {% endif %} {% endwith %} {{ form.username.label() }} {{ + form.username(class="field") }} {% for error in form.username.errors %} + <div class="field-error">{{ error }}</div> + {% endfor %} {{ form.email.label() }} {{ form.email(class="field") }} {% for + error in form.email.errors %} <div class="field-error">{{ error }}</div> {% endfor %} {{ form.password.label() }} {{ form.password(class="field") }} {% for error in form.password.errors %}