Skip to content
Snippets Groups Projects
Verified Commit 651c19f9 authored by Arun Joshua's avatar Arun Joshua
Browse files

Add username and role columns

Other changes:
* Comparisons are case-insensitive
* Checkbox css improvements
parent 938f4097
No related branches found
No related tags found
No related merge requests found
from flask_wtf import FlaskForm 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.fields.html5 import EmailField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from bam.models import User from bam.models import User
class RegistrationForm(FlaskForm): class RegistrationForm(FlaskForm):
username = StringField(
"Username",
validators=[DataRequired()],
render_kw={"placeholder": "Enter a username"},
)
email = EmailField( email = EmailField(
"Email", "Email",
validators=[DataRequired(), Email()], validators=[DataRequired(), Email()],
...@@ -24,16 +29,20 @@ class RegistrationForm(FlaskForm): ...@@ -24,16 +29,20 @@ class RegistrationForm(FlaskForm):
submit = SubmitField("Register") 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): 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.") raise ValidationError("A user with this email already exists.")
class LoginForm(FlaskForm): class LoginForm(FlaskForm):
email = EmailField( username = StringField(
"Email", "Username",
validators=[DataRequired(), Email()], validators=[DataRequired()],
render_kw={"placeholder": "bookmaster@bam.com"}, render_kw={"placeholder": "bookmaster"},
) )
password = PasswordField( password = PasswordField(
"Password", "Password",
......
...@@ -10,7 +10,9 @@ def load_user(user_id): ...@@ -10,7 +10,9 @@ def load_user(user_id):
class User(db.Model, UserMixin): class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), unique=True, nullable=False) 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) password = db.Column(db.String(60), nullable=False)
role = db.Column(db.String(10), default="user")
def __repr__(self): def __repr__(self):
return f"User({self.email}, {self.password})" return f"User({self.email}, {self.password})"
...@@ -22,12 +22,12 @@ def register(): ...@@ -22,12 +22,12 @@ def register():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode( hashed_password = bcrypt.generate_password_hash(form.password.data).decode(
"utf-8" "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.add(user)
db.session.commit() db.session.commit()
flash( flash(f"Account successfully created! You may login now.", "success")
f"Account successfully created! You may login now.", "success"
)
return redirect(url_for("login")) return redirect(url_for("login"))
return render_template("register.html", title="Register", form=form) return render_template("register.html", title="Register", form=form)
...@@ -38,7 +38,7 @@ def login(): ...@@ -38,7 +38,7 @@ def login():
return redirect(url_for("home")) return redirect(url_for("home"))
form = LoginForm() form = LoginForm()
if form.validate_on_submit(): 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): if user and bcrypt.check_password_hash(user.password, form.password.data):
login_user(user, remember=form.remember.data) login_user(user, remember=form.remember.data)
return redirect(url_for("home")) return redirect(url_for("home"))
......
...@@ -22,17 +22,15 @@ form { ...@@ -22,17 +22,15 @@ form {
input { input {
font-family: Roboto; font-family: Roboto;
font-size: 16px; font-size: 16px;
/* margin-bottom: 5px; */
border-radius: 3px; border-radius: 3px;
padding: 17px; padding: 17px;
background-color: var(--t-dark); background-color: var(--t-dark);
border: 1px solid black; border: 1px solid black;
color: #eee; color: #eee;
transition: background 0.3s; transition: background 0.3s;
/* margin: 3px 0 10px; */
} }
.field:hover { .field:hover {
background-color: rgba(0, 0, 0, 0.9); background-color: var(--t-darker);
} }
.field:focus, .field:focus,
.field:active { .field:active {
...@@ -79,12 +77,13 @@ label, ...@@ -79,12 +77,13 @@ label,
margin-top: 10px; margin-top: 10px;
} }
.remember-row input { .remember-row div {
order: 2; order: 1;
opacity: 0;
} }
.checkbox-indicator { .checkbox-indicator {
display: flex; display: flex;
order: 2;
height: 1.5rem; height: 1.5rem;
width: 1.5rem; width: 1.5rem;
border: 1px solid black; border: 1px solid black;
...@@ -93,10 +92,15 @@ label, ...@@ -93,10 +92,15 @@ label,
background-color: var(--t-dark); background-color: var(--t-dark);
} }
.remember-row input {
order: 3;
opacity: 0;
}
.checkbox-indicator svg { .checkbox-indicator svg {
height: 50%; height: 50%;
width: 100%; width: 100%;
fill: transparent; fill: #252525;
} }
.remember-row:hover .checkbox-indicator { .remember-row:hover .checkbox-indicator {
......
...@@ -10,6 +10,7 @@ body { ...@@ -10,6 +10,7 @@ body {
--red: #e50914; --red: #e50914;
--dark-red: #bb0009; --dark-red: #bb0009;
--t-dark: rgba(0, 0, 0, 0.8); --t-dark: rgba(0, 0, 0, 0.8);
--t-darker: rgba(0, 0, 0, 0.9);
} }
* { * {
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
{% with messages = get_flashed_messages(with_categories=True) %} {% if {% with messages = get_flashed_messages(with_categories=True) %} {% if
messages %} {% for category, message in messages %} messages %} {% for category, message in messages %}
<div class="f-message f-message-{{ category }}">{{ message }}</div> <div class="f-message f-message-{{ category }}">{{ message }}</div>
{% endfor %} {% endif %} {% endwith %} {{ form.email.label() }} {{ {% endfor %} {% endif %} {% endwith %} {{ form.username.label() }} {{
form.email(class="field") }} {% for error in form.email.errors %} form.username(class="field") }} {% for error in form.username.errors %}
<div class="field-error">{{ error }}</div> <div class="field-error">{{ error }}</div>
{% endfor %} {{ form.password.label() }} {{ form.password(class="field") }} {% endfor %} {{ form.password.label() }} {{ form.password(class="field") }}
{% for error in form.password.errors %} {% for error in form.password.errors %}
......
...@@ -8,8 +8,11 @@ ...@@ -8,8 +8,11 @@
{% with messages = get_flashed_messages(with_categories=True) %} {% if {% with messages = get_flashed_messages(with_categories=True) %} {% if
messages %} {% for category, message in messages %} messages %} {% for category, message in messages %}
<div class="f-message f-message-{{ category }}">{{ message }}</div> <div class="f-message f-message-{{ category }}">{{ message }}</div>
{% endfor %} {% endif %} {% endwith %} {{ form.email.label() }} {{ {% endfor %} {% endif %} {% endwith %} {{ form.username.label() }} {{
form.email(class="field") }} {% for error in form.email.errors %} 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> <div class="field-error">{{ error }}</div>
{% endfor %} {{ form.password.label() }} {{ form.password(class="field") }} {% endfor %} {{ form.password.label() }} {{ form.password(class="field") }}
{% for error in form.password.errors %} {% for error in form.password.errors %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment