Skip to content

Commit

Permalink
add user skills endpoints and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Maxcutex committed Jan 17, 2021
1 parent 3d1566d commit 3a83e3b
Show file tree
Hide file tree
Showing 17 changed files with 481 additions and 19 deletions.
2 changes: 1 addition & 1 deletion app/controllers/role_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def update_role(self, role_id):
if help_:
updates["help"] = help_

self.role_repo.update(role, **updates)
role = self.role_repo.update(role, **updates)
return self.handle_response("OK", payload={"role": role.serialize()})
return self.handle_response(
"Invalid or incorrect role_id provided", status_code=400
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/skill_category_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ def update_skills_category(self, skills_category_id):
if help_:
updates["help"] = help_

self.skill_category_repo.update(skills_category, **updates)
skills_category = self.skill_category_repo.update(
skills_category, **updates
)
return self.handle_response(
"OK", payload={"skills_category": skills_category.serialize()}
)
Expand Down
12 changes: 10 additions & 2 deletions app/controllers/user_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,12 @@ def list_user(self, id):

return self.handle_response("User not found", status_code=404)

def update_profile_summary(self):
pass

def update_profile_image(self):
pass

def update_user(self, user_id):
user = self.user_repo.find_first_(id=user_id)

Expand Down Expand Up @@ -305,8 +311,10 @@ def authenticate_user(self):
"iss": "accounts.webspoons.com",
}
token = Auth.encode_token(user_data)
return self.handle_response("OK", payload={"token": token}, status_code=200)
return self.handle_response(
"OK", payload={"token": token, "user": user.email}, status_code=200
)

return self.handle_response(
"Username/password combination is wrong", status_code=404
"Username/password combination is wrong", status_code=400
)
4 changes: 3 additions & 1 deletion app/controllers/user_employment_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,9 @@ def update_user_employment(self, update_id):
"is_current": is_current,
}

self.user_employment_repo.update(user_employment, **updates)
user_employment = self.user_employment_repo.update(
user_employment, **updates
)
skills_dict = self._process_skills(user_employment.id, skills)
user_employment_serialized = user_employment.serialize()
user_employment_serialized["skills"] = skills_dict
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/user_project_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ def update_user_project(self, update_id):
"is_current": is_current,
}

self.user_project_repo.update(user_project, **updates)
user_project = self.user_project_repo.update(user_project, **updates)
skills_dict = self._process_skills(user_project.id, skills)
user_project_serialized = user_project.serialize()
user_project_serialized["skills"] = skills_dict
Expand Down
110 changes: 110 additions & 0 deletions app/controllers/user_skill_controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import datetime

from app.controllers.base_controller import BaseController
from app.repositories import SkillRepo, UserRepo
from app.repositories.user_skill_repo import UserSkillRepo


class UserSkillController(BaseController):
def __init__(self, request):
BaseController.__init__(self, request)
self.user_repo = UserRepo()
self.user_skill_repo = UserSkillRepo()
self.skill_repo = SkillRepo()

def list_user_skills(self, user_id):
user_skills = self.user_skill_repo.get_unpaginated(user_id=user_id)

user_skill_list = []
for user_skill in user_skills:
user_skill_dict = user_skill.serialize()
user_skill_dict["skills"] = self._get_project_skills(user_skill.id)
user_skill_list.append(user_skill_dict)
return self.handle_response(
"OK",
payload={
"user_skills": user_skill_list,
},
)

def get_user_skill(self, user_skill_id):
user_skill = self.user_skill_repo.get(user_skill_id)

if user_skill:
user_skill_dict = user_skill.serialize()
return self.handle_response("OK", payload={"user_skill": user_skill_dict})
return self.handle_response(
"Invalid User Project or Missing user_skill_id", status_code=400
)

def create_user_skill(self):
(skill_level, years, skill_id, user_id,) = self.request_params(
"skill_level",
"years",
"skill_id",
"user_id",
)
try:
skill_data = self.skill_repo.find_first(id=skill_id)
if skill_data is None:
return self.handle_response("Skill Id is invalid", status_code=400)
user_skill = self.user_skill_repo.new_user_skill(
skill_level=skill_level, years=years, skill_id=skill_id, user_id=user_id
)

return self.handle_response(
"OK",
payload={"user_skill": user_skill.serialize()},
status_code=201,
)
except Exception as e:
return self.handle_response("Error processing: " + str(e), status_code=400)

def update_user_skill(self, update_id):
(user_id, skill_level, years, skill_id,) = self.request_params(
"user_id",
"skill_level",
"years",
"skill_id",
)
if update_id != user_id:
return self.handle_response(
"Invalid or incorrect user_skill_id provided", status_code=400
)

skill_data = self.skill_repo.find_first(id=skill_id)
if skill_data is None:
return self.handle_response("Skill Id is invalid", status_code=400)

user_skill = self.user_skill_repo.get(user_id)

if user_skill:
updates = {
"skill_level": skill_level,
"years": years,
"skill_id": skill_id,
"user_id": user_id,
}

user_skill = self.user_skill_repo.update(user_skill, **updates)
return self.handle_response(
"OK",
payload={"user_skill": user_skill.serialize()},
)

return self.handle_response(
"Invalid or incorrect user_skill_id provided", status_code=400
)

def delete_user_skill(self, user_skill_id):
user_skill = self.user_skill_repo.get(user_skill_id)

if user_skill:
updates = {"is_deleted": True}
self.user_skill_repo.update(user_skill, **updates)
return self.handle_response(
"user skill deleted", payload={"status": "success"}
)
return self.handle_response(
"Invalid or incorrect user_skill_id provided", status_code=404
)
10 changes: 5 additions & 5 deletions app/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from .user_employment_skill import UserEmploymentSkill
from .user_project import UserProject
from .user_project_skill import UserProjectSkill
from .user_skills import UserSkills
from .user_skill import UserSkill
from .location import Location

__all__ = (
Expand All @@ -24,7 +24,7 @@
"User",
"SkillCategory",
"Skill",
"UserSkills",
"UserSkill",
"UserProject",
"UserProjectSkill",
"UserEmploymentSkill",
Expand All @@ -41,7 +41,7 @@
UserEmploymentSkill,
UserProject,
UserProjectSkill,
UserSkills,
UserSkill,
Role,
Permission,
UserRole,
Expand All @@ -56,7 +56,7 @@
UserEmploymentSkill,
UserProject,
UserProjectSkill,
UserSkills,
UserSkill,
Role,
Permission,
UserRole,
Expand All @@ -71,7 +71,7 @@
UserEmploymentSkill,
UserProject,
UserProjectSkill,
UserSkills,
UserSkill,
Role,
Permission,
UserRole,
Expand Down
1 change: 1 addition & 0 deletions app/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class User(BaseModel):
location_id = db.Column(db.Integer(), db.ForeignKey("locations.id"), default=1)
location = db.relationship("Location", lazy=False)
image_url = db.Column(db.String, nullable=True)
profile_summary = db.Column(db.Text, nullable=True)
gender = db.Column(db.Enum(Gender), nullable=True)
date_of_birth = db.Column(db.Date(), nullable=False)
user_role = db.relationship("UserRole", backref="user_roles", lazy=True)
Expand Down
8 changes: 5 additions & 3 deletions app/models/user_skills.py → app/models/user_skill.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from .base_model import BaseModel, db
from app.utils.enums import Gender, SkillLevels
from app.utils.enums import SkillLevel


class UserSkills(BaseModel):
class UserSkill(BaseModel):

__tablename__ = "user_skills"

skill_level = db.Column(db.Enum(SkillLevels))
skill_level = db.Column(db.Enum(SkillLevel))
years = db.Column(db.Integer(), nullable=False)
skill_id = db.Column(db.Integer(), db.ForeignKey("skills.id"))
skill = db.relationship("Skill", lazy=False)
user = db.relationship("User", lazy=False)
user_id = db.Column(db.Integer(), db.ForeignKey("users.id"))
19 changes: 19 additions & 0 deletions app/repositories/user_skill_repo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from app.repositories.base_repo import BaseRepo
from app.models.user_skill import UserSkill


class UserSkillRepo(BaseRepo):
def __init__(self):
BaseRepo.__init__(self, UserSkill)

def new_user_skill(self, skill_level, years, skill_id, user_id, is_deleted=False):
new_user_skill = UserSkill(
skill_level=skill_level,
years=years,
skill_id=skill_id,
is_deleted=is_deleted,
user_id=user_id,
)

new_user_skill.save()
return new_user_skill
2 changes: 1 addition & 1 deletion app/utils/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class MealTypes(BaseEnum):
protein = "protein"


class SkillLevels(BaseEnum):
class SkillLevel(BaseEnum):
beginner = "beginner"
intermediate = "intermediate"
expert = "expert"
Expand Down
4 changes: 2 additions & 2 deletions app/utils/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
FaqCategoryType,
MealTypes,
MealPeriods,
SkillLevels,
SkillLevel,
Gender,
)

Expand Down Expand Up @@ -780,7 +780,7 @@ def validate_enums(validator, key, value):
"FaqCategoryType": [
value.value for value in FaqCategoryType.__members__.values()
],
"SkillLevels": [value.value for value in SkillLevels.__members__.values()],
"SkillLevel": [value.value for value in SkillLevel.__members__.values()],
"Gender": [value.value for value in Gender.__members__.values()],
"MealTypes": [value.value for value in MealTypes.__members__.values()],
"MealPeriods": [value.value for value in MealPeriods.__members__.values()],
Expand Down
45 changes: 45 additions & 0 deletions factories/user_skill_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import datetime

import factory
from app.models import UserSkill
from app.utils import db
from faker import Faker
from faker.providers import misc

from factories import SkillFactory, UserFactory

fake = Faker()
fake.add_provider(misc)


class UserSkillFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = UserSkill
sqlalchemy_session = db.session

id = factory.Sequence(lambda n: n)
skill_level = "intermediate" # change to a faker of random enum values
years = 4 # Change to a random number faker
skill = factory.SubFactory(SkillFactory)
skill_id = factory.SelfAttribute("skill.id")
is_deleted = fake.boolean(chance_of_getting_true=0)
created_at = datetime.datetime.now()
updated_at = datetime.datetime.now()
user = factory.SubFactory(UserFactory)
user_id = factory.SelfAttribute("user.id")


class UserSkillFactoryFake(factory.Factory):
class Meta:
model = UserSkill

id = factory.Sequence(lambda n: n)
skill_level = "intermediate" # change to a faker of random enum values
years = 4 # Change to a random number faker
skill = factory.SubFactory(SkillFactory)
skill_id = factory.SelfAttribute("skill.id")
is_deleted = fake.boolean(chance_of_getting_true=0)
created_at = datetime.datetime.now()
updated_at = datetime.datetime.now()
user = factory.SubFactory(UserFactory)
user_id = factory.SelfAttribute("user.id")
2 changes: 0 additions & 2 deletions tests/unit/controllers/test_user_project_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
from app.repositories.user_project_repo import UserProjectRepo
from factories.skill_category_factory import (
CategoryWithSkillsFactory,
SkillFactory,
SkillFactoryFake,
)
from tests.base_test_case import BaseTestCase

Expand Down
Loading

0 comments on commit 3a83e3b

Please sign in to comment.