Skip to content
Snippets Groups Projects
Commit 2682bb89 authored by robban64's avatar robban64
Browse files

fix: database get functions now works for postgre and auth locked work with...

fix: database get functions now works for postgre and auth locked work with right timezone in postgre.
parent 93baed60
No related branches found
No related tags found
No related merge requests found
...@@ -3,7 +3,7 @@ All API calls concerning question answers. ...@@ -3,7 +3,7 @@ All API calls concerning question answers.
Default route: /api/auth Default route: /api/auth
""" """
from datetime import datetime, timedelta from datetime import datetime, timedelta, timezone
import app.core.http_codes as codes import app.core.http_codes as codes
import app.database.controller as dbc import app.database.controller as dbc
...@@ -114,22 +114,26 @@ class AuthLogin(Resource): ...@@ -114,22 +114,26 @@ class AuthLogin(Resource):
if not item_user: if not item_user:
api.abort(codes.UNAUTHORIZED, "Invalid email or password") api.abort(codes.UNAUTHORIZED, "Invalid email or password")
now = datetime.now()
# Login with existing email but with wrong password # Login with existing email but with wrong password
if not item_user.is_correct_password(password): if not item_user.is_correct_password(password):
# Increase the login attempts every time the user tries to login with wrong password # Increase the login attempts every time the user tries to login with wrong password
item_user.login_attempts += 1 item_user.login_attempts += 1
# Lock the user out for some time # Lock the user out for some time
if item_user.login_attempts == USER_LOGIN_LOCKED_ATTEMPTS: if item_user.login_attempts >= USER_LOGIN_LOCKED_ATTEMPTS:
item_user.locked = datetime.now() + USER_LOGIN_LOCKED_EXPIRES item_user.locked = now + USER_LOGIN_LOCKED_EXPIRES
dbc.utils.commit() dbc.utils.commit()
api.abort(codes.UNAUTHORIZED, "Invalid email or password") api.abort(codes.UNAUTHORIZED, "Invalid email or password")
# Otherwise if login was successful but the user is locked # Otherwise if login was successful but the user is locked
if item_user.locked: if item_user.locked:
print(item_user.locked)
print(now)
# Check if locked is greater than now # Check if locked is greater than now
if item_user.locked > datetime.now(): if item_user.locked.timestamp() > now.timestamp():
api.abort(codes.UNAUTHORIZED, f"Try again in {item_user.locked} hours.") api.abort(codes.UNAUTHORIZED, f"Try again in {item_user.locked} hours.")
else: else:
item_user.locked = None item_user.locked = None
......
...@@ -129,7 +129,7 @@ def question(competition_id, slide_id, question_id): ...@@ -129,7 +129,7 @@ def question(competition_id, slide_id, question_id):
join_slide = Slide.id == Question.slide_id join_slide = Slide.id == Question.slide_id
filters = (Competition.id == competition_id) & (Slide.id == slide_id) & (Question.id == question_id) filters = (Competition.id == competition_id) & (Slide.id == slide_id) & (Question.id == question_id)
return Question.query.join(Competition, join_competition).join(Slide, join_slide).filter(filters).first_extended() return Question.query.join(Slide, join_slide).join(Competition, join_competition).filter(filters).first_extended()
def question_list(competition_id, slide_id): def question_list(competition_id, slide_id):
...@@ -142,7 +142,7 @@ def question_list(competition_id, slide_id): ...@@ -142,7 +142,7 @@ def question_list(competition_id, slide_id):
join_slide = Slide.id == Question.slide_id join_slide = Slide.id == Question.slide_id
filters = (Competition.id == competition_id) & (Slide.id == slide_id) filters = (Competition.id == competition_id) & (Slide.id == slide_id)
return Question.query.join(Competition, join_competition).join(Slide, join_slide).filter(filters).all() return Question.query.join(Slide, join_slide).join(Competition, join_competition).filter(filters).all()
def question_list_for_competition(competition_id): def question_list_for_competition(competition_id):
...@@ -155,7 +155,7 @@ def question_list_for_competition(competition_id): ...@@ -155,7 +155,7 @@ def question_list_for_competition(competition_id):
join_slide = Slide.id == Question.slide_id join_slide = Slide.id == Question.slide_id
filters = Competition.id == competition_id filters = Competition.id == competition_id
return Question.query.join(Competition, join_competition).join(Slide, join_slide).filter(filters).all() return Question.query.join(Slide, join_slide).join(Competition, join_competition).filter(filters).all()
### Question Alternative ### ### Question Alternative ###
...@@ -181,9 +181,9 @@ def question_alternative( ...@@ -181,9 +181,9 @@ def question_alternative(
) )
return ( return (
QuestionAlternative.query.join(Competition, join_competition) QuestionAlternative.query.join(Question, join_question)
.join(Slide, join_slide) .join(Slide, join_slide)
.join(Question, join_question) .join(Competition, join_competition)
.filter(filters) .filter(filters)
.first_extended() .first_extended()
) )
...@@ -201,9 +201,9 @@ def question_alternative_list(competition_id, slide_id, question_id): ...@@ -201,9 +201,9 @@ def question_alternative_list(competition_id, slide_id, question_id):
filters = (Competition.id == competition_id) & (Slide.id == slide_id) & (Question.id == question_id) filters = (Competition.id == competition_id) & (Slide.id == slide_id) & (Question.id == question_id)
return ( return (
QuestionAlternative.query.join(Competition, join_competition) QuestionAlternative.query.join(Question, join_question)
.join(Slide, join_slide) .join(Slide, join_slide)
.join(Question, join_question) .join(Competition, join_competition)
.filter(filters) .filter(filters)
.all() .all()
) )
...@@ -221,8 +221,8 @@ def question_score(competition_id, team_id, question_id, required=True): ...@@ -221,8 +221,8 @@ def question_score(competition_id, team_id, question_id, required=True):
join_team = Team.id == QuestionScore.team_id join_team = Team.id == QuestionScore.team_id
filters = (Competition.id == competition_id) & (Team.id == team_id) & (QuestionScore.question_id == question_id) filters = (Competition.id == competition_id) & (Team.id == team_id) & (QuestionScore.question_id == question_id)
return ( return (
QuestionScore.query.join(Competition, join_competition) QuestionScore.query.join(Team, join_team)
.join(Team, join_team) .join(Competition, join_competition)
.filter(filters) .filter(filters)
.first_extended(required) .first_extended(required)
) )
...@@ -236,7 +236,7 @@ def question_score_list(competition_id, team_id): ...@@ -236,7 +236,7 @@ def question_score_list(competition_id, team_id):
join_competition = Competition.id == Team.competition_id join_competition = Competition.id == Team.competition_id
join_team = Team.id == QuestionScore.team_id join_team = Team.id == QuestionScore.team_id
filters = (Competition.id == competition_id) & (Team.id == team_id) filters = (Competition.id == competition_id) & (Team.id == team_id)
return QuestionScore.query.join(Competition, join_competition).join(Team, join_team).filter(filters).all() return QuestionScore.query.join(Team, join_team).join(Competition, join_competition).filter(filters).all()
def question_alternative_answer(competition_id, team_id, question_alternative_id, required=True): def question_alternative_answer(competition_id, team_id, question_alternative_id, required=True):
...@@ -252,8 +252,8 @@ def question_alternative_answer(competition_id, team_id, question_alternative_id ...@@ -252,8 +252,8 @@ def question_alternative_answer(competition_id, team_id, question_alternative_id
& (QuestionAlternativeAnswer.question_alternative_id == question_alternative_id) & (QuestionAlternativeAnswer.question_alternative_id == question_alternative_id)
) )
return ( return (
QuestionAlternativeAnswer.query.join(Competition, join_competition) QuestionAlternativeAnswer.query.join(Team, join_team)
.join(Team, join_team) .join(Competition, join_competition)
.filter(filters) .filter(filters)
.first_extended(required) .first_extended(required)
) )
...@@ -267,7 +267,7 @@ def question_alternative_answer_list(competition_id, team_id): ...@@ -267,7 +267,7 @@ def question_alternative_answer_list(competition_id, team_id):
join_competition = Competition.id == Team.competition_id join_competition = Competition.id == Team.competition_id
join_team = Team.id == QuestionAlternativeAnswer.team_id join_team = Team.id == QuestionAlternativeAnswer.team_id
filters = (Competition.id == competition_id) & (Team.id == team_id) filters = (Competition.id == competition_id) & (Team.id == team_id)
query = QuestionAlternativeAnswer.query.join(Competition, join_competition).join(Team, join_team).filter(filters) query = QuestionAlternativeAnswer.query.join(Team, join_team).join(Competition, join_competition).filter(filters)
# Get total score # Get total score
# sum = query.with_entities(func.sum(QuestionAnswer.score)).all() # sum = query.with_entities(func.sum(QuestionAnswer.score)).all()
items = query.all() items = query.all()
...@@ -288,8 +288,8 @@ def component(competition_id, slide_id, component_id): ...@@ -288,8 +288,8 @@ def component(competition_id, slide_id, component_id):
poly = with_polymorphic(Component, [TextComponent, ImageComponent]) poly = with_polymorphic(Component, [TextComponent, ImageComponent])
return ( return (
db.session.query(poly) db.session.query(poly)
.join(Competition, join_competition)
.join(Slide, join_slide) .join(Slide, join_slide)
.join(Competition, join_competition)
.filter(filters) .filter(filters)
.first_extended() .first_extended()
) )
...@@ -304,7 +304,7 @@ def component_list(competition_id, slide_id): ...@@ -304,7 +304,7 @@ def component_list(competition_id, slide_id):
join_competition = Competition.id == Slide.competition_id join_competition = Competition.id == Slide.competition_id
join_slide = Slide.id == Component.slide_id join_slide = Slide.id == Component.slide_id
filters = (Competition.id == competition_id) & (Slide.id == slide_id) filters = (Competition.id == competition_id) & (Slide.id == slide_id)
return Component.query.join(Competition, join_competition).join(Slide, join_slide).filter(filters).all() return Component.query.join(Slide, join_slide).join(Competition, join_competition).filter(filters).all()
### Competitions ### ### Competitions ###
......
...@@ -63,7 +63,7 @@ class User(db.Model): ...@@ -63,7 +63,7 @@ class User(db.Model):
authenticated = db.Column(db.Boolean, default=False) authenticated = db.Column(db.Boolean, default=False)
login_attempts = db.Column(db.Integer, nullable=False, default=0) login_attempts = db.Column(db.Integer, nullable=False, default=0)
locked = db.Column(db.DateTime(timezone=True), nullable=True, default=None) locked = db.Column(db.DateTime(timezone=False), nullable=True, default=None)
role_id = db.Column(db.Integer, db.ForeignKey("role.id"), nullable=False) role_id = db.Column(db.Integer, db.ForeignKey("role.id"), nullable=False)
city_id = db.Column(db.Integer, db.ForeignKey("city.id"), nullable=False) city_id = db.Column(db.Integer, db.ForeignKey("city.id"), nullable=False)
......
...@@ -2,51 +2,67 @@ import os ...@@ -2,51 +2,67 @@ import os
from datetime import timedelta from datetime import timedelta
class DevDbConfig:
HOST = "localhost"
PORT = 5432
USER = "postgres"
PASSWORD = "password"
DATABASE = "teknik8"
SQLALCHEMY_DATABASE_URI = "postgresql://" + USER + ":" + PASSWORD + "@" + HOST + ":" + str(PORT) + "/" + DATABASE
class TestDbConfig:
HOST = "localhost"
PORT = 5432
USER = "postgres"
PASSWORD = "password"
DATABASE = "teknik8-test"
SQLALCHEMY_DATABASE_URI = "postgresql://" + USER + ":" + PASSWORD + "@" + HOST + ":" + str(PORT) + "/" + DATABASE
class LiteDevDbConfig:
SQLALCHEMY_DATABASE_URI = "sqlite:///database.db"
class LiteTestDbConfig:
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"
class Config: class Config:
DEBUG = False DEBUG = False
TESTING = False TESTING = False
BUNDLE_ERRORS = True BUNDLE_ERRORS = True
SQLALCHEMY_DATABASE_URI = "sqlite:///database.db"
SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = False
JWT_SECRET_KEY = "super-secret" JWT_SECRET_KEY = "super-secret"
JWT_BLACKLIST_ENABLED = True JWT_BLACKLIST_ENABLED = True
JWT_BLACKLIST_TOKEN_CHECKS = ["access", "refresh"] JWT_BLACKLIST_TOKEN_CHECKS = ["access", "refresh"]
JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=2) JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=2)
# JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30) # JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)
JSON_SORT_KEYS = False
UPLOADED_PHOTOS_DEST = os.path.join(os.getcwd(), "app", "static", "images") UPLOADED_PHOTOS_DEST = os.path.join(os.getcwd(), "app", "static", "images")
THUMBNAIL_SIZE = (120, 120) THUMBNAIL_SIZE = (120, 120)
SECRET_KEY = os.urandom(24) SECRET_KEY = os.urandom(24)
SQLALCHEMY_ECHO = False
USER_LOGIN_LOCKED_ATTEMPTS = 12 USER_LOGIN_LOCKED_ATTEMPTS = 12
USER_LOGIN_LOCKED_EXPIRES = timedelta(hours=3) USER_LOGIN_LOCKED_EXPIRES = timedelta(hours=3)
JSON_SORT_KEYS = False
class DevelopmentConfig(Config): class DevelopmentConfig(Config, LiteDevDbConfig):
DEBUG = True DEBUG = True
SQLALCHEMY_ECHO = False
# HOST = "localhost"
# PORT = 5432
# USER = "postgres"
# PASSWORD = "password"
# DATABASE = "teknik8"
# SQLALCHEMY_DATABASE_URI = "sqlite:///database.db"
# SQLALCHEMY_DATABASE_URI = "postgresql://" + USER + ":" + PASSWORD + "@" + HOST + ":" + str(PORT) + "/" + DATABASE
class TestingConfig(Config): class TestingConfig(Config, LiteTestDbConfig):
TESTING = True TESTING = True
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"
USER_LOGIN_LOCKED_ATTEMPTS = 4 USER_LOGIN_LOCKED_ATTEMPTS = 4
USER_LOGIN_LOCKED_EXPIRES = timedelta(seconds=4) USER_LOGIN_LOCKED_EXPIRES = timedelta(seconds=4)
class ProductionConfig(Config): class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = "sqlite:///database.db" DEBUG = False
TESTING = False
# HOST = "localhost" # HOST = "localhost"
# PORT = 5432 # PORT = 5432
# USER = "postgres" # USER = "postgres"
# PASSWORD = "password" # PASSWORD = "password"
# DATABASE = "teknik8" # DATABASE = "teknik8"
# SQLALCHEMY_DATABASE_URI = "sqlite:///database.db"
# SQLALCHEMY_DATABASE_URI = "postgresql://" + USER + ":" + PASSWORD + "@" + HOST + ":" + str(PORT) + "/" + DATABASE # SQLALCHEMY_DATABASE_URI = "postgresql://" + USER + ":" + PASSWORD + "@" + HOST + ":" + str(PORT) + "/" + DATABASE
...@@ -84,16 +84,16 @@ def _add_items(): ...@@ -84,16 +84,16 @@ def _add_items():
for k in range(3): for k in range(3):
x = random.randrange(1, 500) x = random.randrange(1, 500)
y = random.randrange(1, 500) y = random.randrange(1, 500)
w = random.randrange(150, 400) w = 350
h = random.randrange(150, 400) h = 50
dbc.add.component( dbc.add.component(
1, item_slide.id, 1, x, y, w, h, text=f"<p><span style='font-size: 24pt;'>{k}</span></p>" 1, item_slide.id, 1, x, y, w, h, text=f"<p><span style='font-size: 24pt;'>{k}</span></p>"
) )
for k in range(3): for k in range(3):
x = random.randrange(1, 500) x = random.randrange(1, 500)
y = random.randrange(1, 500) y = random.randrange(1, 500)
w = random.randrange(150, 400) w = 350
h = random.randrange(150, 400) h = 50
dbc.add.component( dbc.add.component(
1, item_slide.id, 3, x, y, w, h, text=f"<p><span style='font-size: 24pt;'>{k}</span></p>" 1, item_slide.id, 3, x, y, w, h, text=f"<p><span style='font-size: 24pt;'>{k}</span></p>"
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment