Skip to content
This repository was archived by the owner on Dec 8, 2022. It is now read-only.

Commit a536815

Browse files
committed
changes to User model:
+ studentfirstname + studentlastname + parentfirstname + parentlastname + parent_email* + student_email + dob* - email
1 parent 0ddc557 commit a536815

File tree

3 files changed

+50
-33
lines changed

3 files changed

+50
-33
lines changed

CodeChallenge/api/users.py

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def login():
2626
username = request.json.get("username", None)
2727
password = request.json.get("password", None)
2828

29-
user = Users.query.filter_by(email=username).first()
29+
user = Users.query.filter_by(username=username).first()
3030
if user is None or not user.check_password(password):
3131
return json_error("invalid username or password")
3232

@@ -66,31 +66,38 @@ def register():
6666
user_data = request.get_json()
6767
new_u = Users()
6868

69-
email = user_data.get("email", None)
69+
# required fields first
70+
71+
parent_email = user_data.get("parentEmail", None)
7072
username = user_data.get("username", None)
73+
dob = user_data.get("DOB", None)
74+
password = user_data.get("password", None)
7175

72-
if email is None:
73-
return json_error("email is required")
76+
if parent_email is None:
77+
return json_error("parent email is required")
7478

7579
if username is None:
7680
return json_error("username is required")
7781

78-
password = user_data.get("password", None)
82+
if dob is None:
83+
return json_error("DOB is required")
7984

80-
if password is None or len(password) < 11 or len(password) > 120:
81-
return json_error("invalid password length (between 11 and 120)")
82-
83-
if Users.query.filter_by(email=email).first():
84-
return json_error("that email is already in use")
85+
if password is None or len(password) < 8 or len(password) > 120:
86+
return json_error("invalid password length (between 8 and 120)")
8587

8688
if Users.query.filter_by(username=username).first():
8789
return json_error("that username has been taken")
8890

89-
new_u.email = user_data['email']
90-
new_u.username = user_data['username']
91+
new_u.parent_email = parent_email
92+
new_u.username = username
9193
new_u.password = hash_password(password)
92-
new_u.firstname = user_data['firstname']
93-
new_u.lastname = user_data['lastname']
94+
95+
new_u.parentfirstname = user_data.get("parentFirstName")
96+
new_u.parentlastname = user_data.get("parentLastName")
97+
new_u.studentfirstname = user_data.get("studentFirstName")
98+
new_u.studentlastname = user_data.get("studentLastName")
99+
new_u.dob = dob
100+
94101
new_u.active = True
95102

96103
db.session.add(new_u)
@@ -106,11 +113,11 @@ def hello_protected():
106113
user = get_current_user()
107114

108115
return jsonify({"status": "success",
109-
"message": f"Hello {user.firstname}! (id {identity})",
116+
"message": f"Hello {user.studentfirstname}! (id {identity})",
110117
"username": user.username,
111-
"email": user.email,
112-
"firstname": user.firstname,
113-
"lastname": user.lastname,
118+
"email": user.parent_email,
119+
"firstname": user.studentfirstname,
120+
"lastname": user.studentfirstname,
114121
"rank": user.rank,
115122
"timeUntilNextRank": core.time_until_next_rank()})
116123

@@ -124,7 +131,7 @@ def forgot_password():
124131
if email is None:
125132
return jsonify(status="error", reason="email missing"), 400
126133

127-
user = Users.query.filter_by(email=email).first()
134+
user = Users.query.filter_by(parent_email=email).first()
128135

129136
if user is None:
130137
return jsonify(status="error",
@@ -138,7 +145,7 @@ def forgot_password():
138145
"did not make this request, you can ignore this email. "
139146
"To reset your password, use this link within 24 hours. "
140147
f"https://www.hackcwhq.com/reset-password?token={token}",
141-
recipients=[user.email])
148+
recipients=[user.parent_email])
142149

143150
if current_app.config.get("TESTING", False):
144151
msg.extra_headers = {"X-Password-Reset-Token": token}
@@ -159,8 +166,8 @@ def reset_password():
159166
if token is None or password is None:
160167
return json_error("missing token or password")
161168

162-
if len(password) < 11 and len(password) > 120:
163-
return json_error("invalid password length (between 11 and 120)")
169+
if 8 > len(password) > 120:
170+
return json_error("invalid password length (between 8 and 120)")
164171

165172
try:
166173
reset_password_from_token(token, password)

CodeChallenge/auth.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from datetime import datetime
2+
13
import argon2
24
from flask import current_app
35
from flask_jwt_extended import JWTManager
@@ -10,10 +12,16 @@
1012

1113
class Users(db.Model):
1214
id = db.Column(db.Integer, primary_key=True)
13-
firstname = db.Column(db.String(80), nullable=True)
14-
lastname = db.Column(db.String(80), nullable=True)
15+
studentfirstname = db.Column(db.String(80), nullable=True)
16+
studentlastname = db.Column(db.String(80), nullable=True)
17+
18+
parentfirstname = db.Column(db.String(80), nullable=True)
19+
parentlastname = db.Column(db.String(80), nullable=True)
20+
1521
username = db.Column(db.String(80), unique=True, nullable=False)
16-
email = db.Column(db.String(120), unique=True, nullable=False)
22+
parent_email = db.Column(db.String(120), unique=False, nullable=False)
23+
student_email = db.Column(db.String(120), unique=False, nullable=True)
24+
dob = db.Column(db.String(10), nullable=False)
1725
is_admin = db.Column(db.Boolean, nullable=True)
1826
password = db.Column(db.String(120), nullable=False)
1927
is_active = db.Column(db.Boolean, default=False, nullable=False)
@@ -36,39 +44,40 @@ def hash_password(plaintext):
3644

3745

3846
def authenticate(username, password):
39-
user = Users.query.filter_by(email=username).first()
47+
user = Users.query.filter_by(username=username).first()
4048
if user and user.check_password(password):
4149
return user
4250

4351

4452
@jwt.user_loader_callback_loader
45-
def identity(identity):
46-
return Users.query.get(identity)
53+
def identity(ident):
54+
return Users.query.get(ident)
4755

4856

4957
def create_user(email, username, password):
5058
u = Users()
51-
u.email = email
59+
u.parent_email = email
5260
u.username = username
5361
u.password = hash_password(password)
62+
u.dob = datetime.now().strftime("%Y-%m-%d")
5463

5564
db.session.add(u)
5665
db.session.commit()
5766

5867

5968
def reset_user(email, password):
60-
u = Users.query.filter_by(email=email)
69+
u = Users.query.filter_by(parent_email=email)
6170
u.password = hash_password(password)
6271

6372
db.session.commit()
6473

6574

6675
def password_reset_token(user: Users) -> str:
6776
ts = URLSafeTimedSerializer(current_app.config["SECRET_KEY"])
68-
return ts.dumps(user.email, salt="recovery-key")
77+
return ts.dumps(user.parent_email, salt="recovery-key")
6978

7079

7180
def reset_password_from_token(token: str, password: str):
7281
ts = URLSafeTimedSerializer(current_app.config["SECRET_KEY"])
73-
email = ts.loads(token, salt="recovery-key", max_age=86400)
74-
reset_user(email, password)
82+
parent_email = ts.loads(token, salt="recovery-key", max_age=86400)
83+
reset_user(parent_email, password)

CodeChallenge/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class ProductionConfig(DefaultConfig):
4747
MAIL_SUPPRESS_SEND = False
4848
MAIL_USERNAME = os.getenv("MAIL_USERNAME")
4949
MAIL_PASSWORD = os.getenv("MAIL_PASSWORD")
50+
JWT_ACCESS_TOKEN_EXPIRES = 604800
5051

5152

5253
class DevelopmentConfig(ProductionConfig):

0 commit comments

Comments
 (0)