diff --git a/.gitignore b/.gitignore index 51cc949e137154da9a41a28c542629235625a18b..69ba52b504a86b77038e20be73e678bc9fe4adb7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ __pycache__ *.coverage */coverage htmlcov -.pytest_cache \ No newline at end of file +.pytest_cache +/.idea \ No newline at end of file diff --git a/server/app/__init__.py b/server/app/__init__.py index 677eb3d8dc99158a976708232801107a340e2dfb..6655bdb00a0c113a530685810cf828340a450be2 100644 --- a/server/app/__init__.py +++ b/server/app/__init__.py @@ -38,4 +38,4 @@ def identity(payload): def check_if_token_in_blacklist(decrypted_token): jti = decrypted_token["jti"] - return models.Blacklist.query.filter_by(jti=jti).first() != None + return models.Blacklist.query.filter_by(jti=jti).first() is not None diff --git a/server/app/api/admin.py b/server/app/api/admin.py index 1d935910fc21a39ca4ac1b91f205bc3f5d5c4d8c..92d3922ca1ee1324566ce886a50155ab31ca8e1d 100644 --- a/server/app/api/admin.py +++ b/server/app/api/admin.py @@ -1,7 +1,6 @@ ### # Admin stuff placed here for later use # No need to implement this before the application is somewhat done -# Only adding basic thigns like addning countries ### from flask import Blueprint diff --git a/server/app/api/users.py b/server/app/api/users.py index 5678e92cbc1b3d3d27a1a45150af3b5e580e3a18..94f2107cea6abd03666e6f990fb4a252a8d519e0 100644 --- a/server/app/api/users.py +++ b/server/app/api/users.py @@ -1,12 +1,11 @@ import datetime +import app.database.controller as dbc from app import db from app.api import api_blueprint -from app.database.controller import add_user from app.database.models import Blacklist, User -from app.utils.validator import edit_user_schema, login_schema, register_schema, validateObject +from app.utils.validator import edit_user_schema, login_schema, register_schema, validate_object from flask import request -from flask.globals import session from flask_jwt_extended import ( create_access_token, create_refresh_token, @@ -36,15 +35,15 @@ def test_auth(): def login(): json_dict = request.get_json(force=True) - validate_msg = validateObject(login_schema, json_dict) - if validate_msg != None: + validate_msg = validate_object(login_schema, json_dict) + if validate_msg is not None: return {"message": validate_msg}, 400 email = json_dict["email"] password = json_dict["password"] user = User.query.filter_by(email=email).first() - # Dont show the user that the email was correct unless the password was also correct + # Don't show the user that the email was correct unless the password was also correct if not user: return {"message": "The email or password you entered is incorrect."}, 401 @@ -82,17 +81,16 @@ def refresh(): def create(): json_dict = request.get_json(force=True) - validate_msg = validateObject(register_schema, json_dict) - if validate_msg != None: + validate_msg = validate_object(register_schema, json_dict) + if validate_msg is not None: return {"message": validate_msg}, 400 existing_user = User.query.filter_by(email=json_dict["email"]).first() - if existing_user != None: + if existing_user is not None: return {"message": "User already exists"}, 400 - add_user(json_dict["email"], json_dict["password"], json_dict["role"], json_dict["city"]) - db.session.commit() + dbc.add.user(json_dict["email"], json_dict["password"], json_dict["role"], json_dict["city"]) item_user = User.query.filter_by(email=json_dict["email"]).first() @@ -104,8 +102,8 @@ def create(): def edit(): json_dict = request.get_json(force=True) - validate_msg = validateObject(edit_user_schema, json_dict) - if validate_msg != None: + validate_msg = validate_object(edit_user_schema, json_dict) + if validate_msg is not None: return {"message": validate_msg}, 400 user = get_current_user() diff --git a/server/app/database/__init__.py b/server/app/database/__init__.py index 4a1dc8b75fcd414adf91d242e8367c98d763db55..c6d0e5328b43cbc5ff1651bd63d7fe5f14d963d5 100644 --- a/server/app/database/__init__.py +++ b/server/app/database/__init__.py @@ -1,6 +1,5 @@ import sqlalchemy as sa from flask_sqlalchemy.model import Model -from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.sql import func diff --git a/server/app/database/controller.py b/server/app/database/controller.py deleted file mode 100644 index 385e9f05c28ca97031643c5184d9a809a8e1eea5..0000000000000000000000000000000000000000 --- a/server/app/database/controller.py +++ /dev/null @@ -1,9 +0,0 @@ -from app import db -from app.database.models import City, Role, User - - -def add_user(email, plaintext_password, role, city): - item_role = Role.query.filter_by(name=role).first() - item_city = City.query.filter_by(name=city).first() - user = User(email, plaintext_password, item_role.id, item_city.id) - db.session.add(user) diff --git a/server/app/database/controller/__init__.py b/server/app/database/controller/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b3cfb1fc8c5cc4edcd7a01d0d829689084a3e063 --- /dev/null +++ b/server/app/database/controller/__init__.py @@ -0,0 +1,2 @@ +# import add, get +from app.database.controller import add, get diff --git a/server/app/database/controller/add.py b/server/app/database/controller/add.py new file mode 100644 index 0000000000000000000000000000000000000000..d00b791f931188e4f95b31aa858e9bc5b2481e53 --- /dev/null +++ b/server/app/database/controller/add.py @@ -0,0 +1,31 @@ +from app import db +from app.database.models import City, Competition, Role, Slide, Style, User + + +def user(email, plaintext_password, role, city): + item_role = Role.query.filter(Role.name == role).first() + item_city = City.query.filter(City.name == city).first() + + new_user = User(email, plaintext_password, item_role.id, item_city.id) + db.session.add(new_user) + db.session.commit() + + return User.query.filter(User.email == email).first() + + +def competition(name, style_id, city_id): + db.session.add(Competition(name, style_id, city_id)) + db.session.commit() + + filters = (Competition.name == name) & (Competition.city_id == city_id) + return Competition.query.filter(filters).first() + + +def slide(competition_id): + # item_slides = Slide.query.filter(Slide.competition_id == competition_id).order_by(Slide.order).all() + order = Slide.query.filter(Slide.competition_id == competition_id).count() + db.session.add(Slide(order, competition_id)) + db.session.commit() + + filters = (Slide.order == order) & (Competition.competition_id == competition_id) + return Slide.query.filter(filters).first() diff --git a/server/app/database/controller/get.py b/server/app/database/controller/get.py new file mode 100644 index 0000000000000000000000000000000000000000..9a4fb26b360708d2aa076af1ec3b21e3a44f8fbb --- /dev/null +++ b/server/app/database/controller/get.py @@ -0,0 +1,7 @@ +from app import db +from app.database.models import City, Competition, Role, Slide, Style, User +from sqlalchemy import and_, or_ + + +def user(): + return diff --git a/server/app/database/models.py b/server/app/database/models.py index 7cf7e5dc933948d98123f12d2a33e05193de0499..29e076dcefd9e60fda434ee49caa29ee243cba4e 100644 --- a/server/app/database/models.py +++ b/server/app/database/models.py @@ -1,7 +1,4 @@ -from enum import unique - from app import bcrypt, db -from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.ext.hybrid import hybrid_method, hybrid_property STRING_SIZE = 254 @@ -45,10 +42,9 @@ class User(db.Model): _password = db.Column(db.LargeBinary(60), nullable=False) - # Change to false for Two factor authen authenticated = db.Column(db.Boolean, default=False) - twoAuthConfirmed = db.Column(db.Boolean, default=True) - twoAuthCode = db.Column(db.String(STRING_SIZE), nullable=True) + # twoAuthConfirmed = db.Column(db.Boolean, default=True) + # twoAuthCode = db.Column(db.String(STRING_SIZE), nullable=True) role_id = db.Column(db.Integer, db.ForeignKey("role.id"), nullable=False) city_id = db.Column(db.Integer, db.ForeignKey("city.id"), nullable=False) diff --git a/server/app/database/populate.py b/server/app/database/populate.py index 47891acff7d7a49eeaf3df56ac50304d1796ad98..7eb587107096619050b8c2c3dece8ce6996eddd9 100644 --- a/server/app/database/populate.py +++ b/server/app/database/populate.py @@ -1,5 +1,5 @@ +import app.database.controller as dbc from app import db -from app.database.controller import add_user from app.database.models import City, MediaType, QuestionType, Role media_types = ["Image", "Video"] @@ -11,24 +11,23 @@ cities = ["Linköping"] def add_default_values(): # Add media types - for type in media_types: - db.session.add(MediaType(type)) + for item in media_types: + db.session.add(MediaType(item)) # Add question types - for type in question_types: - db.session.add(QuestionType(type)) + for item in question_types: + db.session.add(QuestionType(item)) # Add roles - for role in roles: - db.session.add(Role(role)) + for item in roles: + db.session.add(Role(item)) # Add cities - for city in cities: - db.session.add(City(city)) + for item in cities: + db.session.add(City(item)) # Commit changes to db db.session.commit() # Add user with role and city - add_user("test@test.se", "password", "Admin", "Linköping") - db.session.commit() + dbc.add.user("test@test.se", "password", "Admin", "Linköping") diff --git a/server/app/utils/test_helpers.py b/server/app/utils/test_helpers.py index e6d34cce5688189b98f0d5e31c5e9b06e97507fb..b8798492782df1abd79e36b30b8cb55f1f1c25c1 100644 --- a/server/app/utils/test_helpers.py +++ b/server/app/utils/test_helpers.py @@ -2,21 +2,21 @@ from app import db # Try insert invalid row. If it fails then the test is passed -def assert_insert_fail(type, *args): +def assert_insert_fail(db_type, *args): try: - db.session.add(type(*args)) + db.session.add(db_type(*args)) db.session.commit() assert False except: db.session.rollback() -def assert_exists(type, length, **kwargs): - items = type.query.filter_by(**kwargs).all() +def assert_exists(db_type, length, **kwargs): + items = db_type.query.filter_by(**kwargs).all() assert len(items) == length return items[0] -def assert_object_values(object, dict): - for k, v in dict.items(): - assert getattr(object, k) == v +def assert_object_values(obj, values): + for k, v in values.items(): + assert getattr(obj, k) == v diff --git a/server/app/utils/validator.py b/server/app/utils/validator.py index 497d3b413b32131d3ded9f1cd3845b6c630fe163..2e31fac5e82b3e301bc1c86c8acf4e0b84a9d5ad 100644 --- a/server/app/utils/validator.py +++ b/server/app/utils/validator.py @@ -1,7 +1,7 @@ from cerberus import Validator -def validateObject(schema, obj, allow_unknown=False): +def validate_object(schema, obj, allow_unknown=False): v = Validator(schema, allow_unknown) if not v.validate(obj): return v.errors diff --git a/server/tests/test_db.py b/server/tests/test_db.py index e561f97026d87f1a7bcfea6e8b51f6007e4a631f..a68012798e042677774122f07b9ccf37257de39a 100644 --- a/server/tests/test_db.py +++ b/server/tests/test_db.py @@ -1,5 +1,4 @@ import pytest -from app.database.controller import add_user from app.database.models import ( City, Competition, @@ -14,6 +13,7 @@ from app.database.models import ( Team, User, ) +import app.database.controller as dbc from app.database.populate import add_default_values from app.utils.test_helpers import * @@ -27,7 +27,7 @@ def test_user(client): item_user = User.query.filter_by(email="test@test.se").first() # Assert user - assert item_user != None + assert item_user is not None assert item_user.city.name == "Linköping" assert item_user.role.name == "Admin" @@ -52,7 +52,7 @@ def test_media_style(client): # Assert image item_media = Media.query.filter_by(filename="bild.png").first() - assert item_media != None + assert item_media is not None assert len(item_user.media) == 1 assert item_media.upload_by.email == "test@test.se" @@ -62,7 +62,7 @@ def test_media_style(client): # Assert style item_style = Style.query.filter_by(name="template").first() - assert item_style != None + assert item_style is not None assert len(item_media.styles) == 1 assert item_style.bg_image.filename == "bild.png" @@ -95,7 +95,7 @@ def test_question(client): item_competition = Competition.query.filter_by(name="teknik8").first() item_competition_2 = Competition.query.filter_by(name="teknik9").first() - assert item_competition != None + assert item_competition is not None assert item_competition.id == 1 assert item_competition.style.name == "template" assert item_competition.city.name == "Linköping" @@ -131,9 +131,9 @@ def test_question(client): item_slide2 = Slide.query.filter_by(order=2).first() item_slide3 = Slide.query.filter_by(order=3).first() - assert item_slide1 != None - assert item_slide2 != None - assert item_slide3 != None + assert item_slide1 is not None + assert item_slide2 is not None + assert item_slide3 is not None # Add questions question_type_bool = QuestionType.query.filter_by(name="Boolean").first() @@ -143,8 +143,8 @@ def test_question(client): db.session.add(Question("Fråga2", 1, question_type_multiple.id, item_slide3.id)) db.session.commit() - assert question_type_bool != None - assert question_type_multiple != None + assert question_type_bool is not None + assert question_type_multiple is not None item_q1 = Question.query.filter_by(name="Fråga1").first() item_q2 = Question.query.filter_by(name="Fråga2").first()