Skip to content

Commit

Permalink
add project, skills and update user test case for duplicate user
Browse files Browse the repository at this point in the history
  • Loading branch information
Maxcutex committed Jan 16, 2021
1 parent b8170cf commit 9da6748
Show file tree
Hide file tree
Showing 22 changed files with 1,131 additions and 13 deletions.
2 changes: 2 additions & 0 deletions app/blueprints/base_blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ def register(self):
from app.blueprints.activity_blueprint import activity_blueprint
from app.blueprints.skills_category_blueprint import skills_category_blueprint
from app.blueprints.user_employment_blueprint import user_employment_blueprint
from app.blueprints.user_project_blueprint import user_project_blueprint

self.app.register_blueprint(home_blueprint)
self.app.register_blueprint(activity_blueprint)
self.app.register_blueprint(role_blueprint)
self.app.register_blueprint(user_blueprint)
self.app.register_blueprint(skills_category_blueprint)
self.app.register_blueprint(user_employment_blueprint)
self.app.register_blueprint(user_project_blueprint)
19 changes: 11 additions & 8 deletions app/blueprints/user_employment_blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,17 @@ def create_user_employment():


@user_employment_blueprint.route("/<int:user_employment_id>", methods=["PUT", "PATCH"])
# @Security.validator([
# "user_id|required:int",
# "institution_name|required:string",
# "job_title|required:string",
# "start_date|required:date",
# "end_date|required:date",
# "is_current|required",
# ])
@Security.validator(
[
"user_id|required:int",
"institution_name|required:string",
"job_title|required:string",
"start_date|required:date",
"end_date|required:date",
"is_current|required",
"skills|optional:list_int",
]
)
# @Auth.has_permission(["update_user_employment_history"])
# @swag_from("documentation/update_user_employment.yml")
def update_user_employment(user_employment_id):
Expand Down
71 changes: 71 additions & 0 deletions app/blueprints/user_project_blueprint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from app.blueprints.base_blueprint import (
Blueprint,
BaseBlueprint,
request,
Security,
Auth,
)
from app.controllers.user_project_controller import UserProjectController

url_prefix = "{}/user_project".format(BaseBlueprint.base_url_prefix)
user_project_blueprint = Blueprint("user_project", __name__, url_prefix=url_prefix)
user_project_controller = UserProjectController(request)


@user_project_blueprint.route("/user/<int:user_id>", methods=["GET"])
@Auth.has_permission(["view_user_project"])
# @swag_from('documentation/get_all_user_project.yml')
def list_user_projects(user_id):
return user_project_controller.list_user_projects(user_id)


@user_project_blueprint.route("/user-single/<int:user_project_id>", methods=["GET"])
@Auth.has_permission(["view_user_project"])
# @swag_from('documentation/get_user_project_by_id.yml')
def get_user_project(user_project_id):
return user_project_controller.get_user_project(user_project_id)


@user_project_blueprint.route("/", methods=["POST"])
@Security.validator(
[
"user_id|required:int",
"project_name|required:string",
"project_url|optional:string",
"project_description|required:string",
"start_date|required:date",
"end_date|required:date",
"is_current|required",
"skills|optional:list_int",
]
)
@Auth.has_permission(["create_user_project"])
# @swag_from('documentation/create_user_project.yml')
def create_user_project():
return user_project_controller.create_user_project()


@user_project_blueprint.route("/<int:user_project_id>", methods=["PUT", "PATCH"])
@Security.validator(
[
"user_id|required:int",
"project_name|required:string",
"project_url|optional:string",
"project_description|required:string",
"start_date|required:date",
"end_date|required:date",
"is_current|required",
"skills|optional:list_int",
]
)
# @Auth.has_permission(["update_user_project"])
# @swag_from("documentation/update_user_project.yml")
def update_user_project(user_project_id):
return user_project_controller.update_user_project(user_project_id)


@user_project_blueprint.route("/<int:user_project_id>", methods=["DELETE"])
@Auth.has_permission(["delete_user_project"])
# @swag_from("documentation/delete_user_project.yml")
def delete_user_project(user_project_id):
return user_project_controller.delete_user_project(user_project_id)
15 changes: 15 additions & 0 deletions app/controllers/user_employment_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ def create_user_employment(self):
return self.handle_response(
"Start Date cannot be greater than End date ", status_code=400
)

if skills is not None:
self._validate_skills(skills)

user_employment = self.user_employment_repo.new_user_employment(
user_id=user_id,
institution_name=institution_name,
Expand All @@ -109,6 +113,15 @@ def create_user_employment(self):
except Exception as e:
return self.handle_response("Error processing: " + str(e), status_code=400)

def _validate_skills(self, skills):
for skill in skills:
skill_data = self.skill_repo.find_first(id=skill)
if skill_data is None:
return self.handle_response(
"One of the skills is invalid", status_code=400
)
return

def _process_skills(self, user_employment_id, skills):
skills_dict = []

Expand Down Expand Up @@ -150,6 +163,8 @@ def update_user_employment(self, update_id):
return self.handle_response(
"Invalid or incorrect user_employment_id provided", status_code=400
)
if skills is not None:
self._validate_skills(skills)

user_employment = self.user_employment_repo.get(user_employment_id)

Expand Down
205 changes: 205 additions & 0 deletions app/controllers/user_project_controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
import datetime

from app.controllers.base_controller import BaseController
from app.repositories import SkillRepo, UserProjectSkillRepo, UserProjectRepo, UserRepo


class UserProjectController(BaseController):
def __init__(self, request):
BaseController.__init__(self, request)
self.user_repo = UserRepo()
self.user_project_repo = UserProjectRepo()
self.user_project_skill_repo = UserProjectSkillRepo()
self.skill_repo = SkillRepo()

def _get_project_skills(self, project_id):
skills_list = []
skills = self.user_project_skill_repo.get_unpaginated(
user_project_id=project_id
)
for skill in skills:
skill_data = self.skill_repo.find_first(id=skill)
skill_dict = skill_data.serialize()
skill_dict["name"] = skill_data.name
skills_list.append(skill_dict)
return skills_list

def list_user_projects(self, user_id):
user_projects = self.user_project_repo.get_unpaginated(user_id=user_id)

user_project_list = []
for user_project in user_projects:
user_project_dict = user_project.serialize()
user_project_dict["skills"] = self._get_project_skills(user_project.id)
user_project_list.append(user_project_dict)
return self.handle_response(
"OK",
payload={
"user_projects": user_project_list,
},
)

def get_user_project(self, user_project_id):
user_project = self.user_project_repo.get(user_project_id)

if user_project:
user_project_dict = user_project.serialize()
user_project_dict["skills"] = self._get_project_skills(user_project.id)
return self.handle_response(
"OK", payload={"user_project": user_project_dict}
)
return self.handle_response(
"Invalid User Project or Missing user_project_id", status_code=400
)

def create_user_project(self):
(
user_id,
project_name,
project_url,
project_description,
start_date,
end_date,
is_current,
skills,
) = self.request_params(
"user_id",
"project_name",
"project_url",
"project_description",
"start_date",
"end_date",
"is_current",
"skills",
)
try:

if not isinstance(start_date, datetime.date):
start_date = datetime.datetime.strptime(start_date, "%Y-%m-%d")
end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")

if start_date > end_date:
return self.handle_response(
"Start Date cannot be greater than End date ", status_code=400
)
if skills is not None:
self._validate_skills(skills)

user_project = self.user_project_repo.new_user_project(
user_id=user_id,
project_name=project_name,
project_url=project_url,
project_description=project_description,
start_date=start_date,
end_date=end_date,
is_current=is_current,
)
skills_dict = self._process_skills(user_project.id, skills)

user_project_serialized = user_project.serialize()
user_project_serialized["skills"] = skills_dict
return self.handle_response(
"OK",
payload={"user_project": user_project_serialized},
status_code=201,
)
except Exception as e:
return self.handle_response("Error processing: " + str(e), status_code=400)

def _validate_skills(self, skills):
for skill in skills:
skill_data = self.skill_repo.find_first(id=skill)
if skill_data is None:
return self.handle_response(
"One of the skills is invalid", status_code=400
)
return

def _process_skills(self, user_project_id, skills):
skills_dict = []

if skills is not None:

for skill in skills:
user_project_skills = (
self.user_project_skill_repo.new_user_project_skill(
user_project_id=user_project_id, skill_id=skill
)
)
skill_data = self.skill_repo.find_first(id=skill)
user_project_skill_dict = user_project_skills.serialize()
user_project_skill_dict["name"] = skill_data.name
skills_dict.append(user_project_skill_dict)
return skills_dict

def update_user_project(self, update_id):
(
user_id,
user_project_id,
project_name,
project_url,
project_description,
start_date,
end_date,
is_current,
skills,
) = self.request_params(
"user_id",
"user_project_id",
"project_name",
"project_url",
"project_description",
"start_date",
"end_date",
"is_current",
"skills",
)
if update_id != user_project_id:
return self.handle_response(
"Invalid or incorrect user_project_id provided", status_code=400
)

if skills is not None:
self._validate_skills(skills)

user_project = self.user_project_repo.get(user_project_id)

if not isinstance(start_date, datetime.date):
start_date = datetime.datetime.strptime(start_date, "%Y-%m-%d")
end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")

if user_project:
updates = {
"project_name": project_name,
"project_url": project_url,
"project_description": project_description,
"start_date": start_date,
"end_date": end_date,
"is_current": is_current,
}

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
return self.handle_response(
"OK",
payload={"user_project": user_project_serialized},
)

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

def delete_user_project(self, user_project_id):
user_project = self.user_project_repo.get(user_project_id)

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

Expand All @@ -25,6 +26,7 @@
"Skill",
"UserSkills",
"UserProject",
"UserProjectSkill",
"UserEmploymentSkill",
"UserEmployment",
"UserEducation",
Expand All @@ -38,6 +40,7 @@
UserEmployment,
UserEmploymentSkill,
UserProject,
UserProjectSkill,
UserSkills,
Role,
Permission,
Expand All @@ -52,6 +55,7 @@
UserEmployment,
UserEmploymentSkill,
UserProject,
UserProjectSkill,
UserSkills,
Role,
Permission,
Expand All @@ -66,6 +70,7 @@
UserEmployment,
UserEmploymentSkill,
UserProject,
UserProjectSkill,
UserSkills,
Role,
Permission,
Expand Down
1 change: 0 additions & 1 deletion app/models/user_employment_skill.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from .base_model import BaseModel, db
from app.utils.enums import Gender


class UserEmploymentSkill(BaseModel):
Expand Down
Loading

0 comments on commit 9da6748

Please sign in to comment.