From 2876e7c5489a0acdd3f879e1cfa3b02afba7d19e Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Mon, 10 May 2021 01:43:33 +0530 Subject: [PATCH 01/17] feat: add feature to the List Users API to filter users by skill --- app/api/dao/user.py | 31 ++++----- app/api/resources/user.py | 6 +- tests/users/test_dao_filter_by_skill.py | 89 +++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 tests/users/test_dao_filter_by_skill.py diff --git a/app/api/dao/user.py b/app/api/dao/user.py index c38343917..9725c8c51 100644 --- a/app/api/dao/user.py +++ b/app/api/dao/user.py @@ -152,6 +152,7 @@ def get_user_by_username(username: str): def list_users( user_id: int, search_query: str = "", + skill: str = "", page: int = DEFAULT_PAGE, per_page: int = DEFAULT_USERS_PER_PAGE, is_verified=None, @@ -161,6 +162,7 @@ def list_users( Arguments: user_id: The ID of the user to be listed. search_query: The search query for name of the users to be found. + skill: The skill of the user to be listed. is_verified: Status of the user's verification; None when provided as an argument. page: The page of users to be returned per_page: The number of users to return per page @@ -170,22 +172,21 @@ def list_users( """ - users_list = ( - UserModel.query.filter( - UserModel.id != user_id, - not is_verified or UserModel.is_email_verified, - func.lower(UserModel.name).contains(search_query.lower()) - | func.lower(UserModel.username).contains(search_query.lower()), - ) - .order_by(UserModel.id) - .paginate( - page=page, - per_page=per_page, - error_out=False, - max_per_page=UserDAO.MAX_USERS_PER_PAGE, - ) - .items + users_list_query = UserModel.query.filter( + UserModel.id != user_id, + not is_verified or UserModel.is_email_verified, + func.lower(UserModel.name).contains(search_query.lower()) + | func.lower(UserModel.username).contains(search_query.lower()) ) + if skill != '': + users_list_query = users_list_query.filter(func.lower(UserModel.skills) == func.lower(skill)) + + users_list = users_list_query.order_by(UserModel.id).paginate( + page=page, + per_page=per_page, + error_out=False, + max_per_page=UserDAO.MAX_USERS_PER_PAGE, + ).items list_of_users = [user.json() for user in users_list] diff --git a/app/api/resources/user.py b/app/api/resources/user.py index 41f4bbd66..d3b1e1f73 100644 --- a/app/api/resources/user.py +++ b/app/api/resources/user.py @@ -38,6 +38,7 @@ class UserList(Resource): "list_users", params={ "search": "Search query", + "skills": "Search based on skill", "page": "specify page of users (default: 1)", "per_page": "specify number of users per page (default: 10)", }, @@ -75,7 +76,7 @@ def get(cls): ) user_id = get_jwt_identity() - return DAO.list_users(user_id, request.args.get("search", ""), page, per_page) + return DAO.list_users(user_id, request.args.get("search", ""), request.args.get("skills", ""), page, per_page) @users_ns.route("users/") @@ -242,6 +243,7 @@ class VerifiedUser(Resource): "get_verified_users", params={ "search": "Search query", + "skills": "Search based on skill", "page": "specify page of users", "per_page": "specify number of users per page", }, @@ -280,7 +282,7 @@ def get(cls): user_id = get_jwt_identity() return DAO.list_users( - user_id, request.args.get("search", ""), page, per_page, is_verified=True + user_id, request.args.get("search", ""), request.args.get("skills", ""), page, per_page, is_verified=True ) diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py new file mode 100644 index 000000000..55303cd88 --- /dev/null +++ b/tests/users/test_dao_filter_by_skill.py @@ -0,0 +1,89 @@ +import unittest + +from flask import json +from tests.base_test_case import BaseTestCase +from app.database.models.user import UserModel +from app.database.sqlalchemy_extension import db +from tests.test_data import user1, user2, user3 +from tests.test_utils import get_test_request_header + + +class FilterUsersBySkill(BaseTestCase): + + def insert_entries_in_database(self): + + # Insert data of the first entry + self.first_user = UserModel( + name=user1["name"], + email=user1["email"], + username=user1["username"], + password=user1["password"], + terms_and_conditions_checked=user1["terms_and_conditions_checked"], + ) + self.first_user.is_email_verified = True + self.first_user.skills = "Problem Solving" + + db.session.add(self.first_user) + db.session.commit() + + # Insert data of the second entry + self.second_user = UserModel( + name=user2["name"], + email=user2["email"], + username=user2["username"], + password=user2["password"], + terms_and_conditions_checked=user2["terms_and_conditions_checked"], + ) + self.second_user.is_email_verified = True + self.second_user.skills = "Problem Solving" + + db.session.add(self.second_user) + db.session.commit() + + # Insert data of the third entry + self.third_user = UserModel( + name=user3["name"], + email=user3["email"], + username=user3["username"], + password=user3["password"], + terms_and_conditions_checked=user3["terms_and_conditions_checked"], + ) + self.third_user.is_email_verified = True + self.third_user.skills = "Critical thinking" + + db.session.add(self.third_user) + db.session.commit() + + def test_case_1(self): + self.insert_entries_in_database() + + auth_header = get_test_request_header(self.admin_user.id) + expected_response_1 = "Problem Solving" + + actual_response_1 = self.client.get( + "/users/verified?skills=Problem Solving", + headers=auth_header, + content_type="application/json", + ) + + for data in json.loads(actual_response_1.data): + self.assertEqual(expected_response_1, data['skills']) + + def test_case_2(self): + self.insert_entries_in_database() + + auth_header = get_test_request_header(self.admin_user.id) + expected_response_2 = "Critical thinking" + + actual_response_2 = self.client.get( + "/users/verified?skills=Critical thinking", + headers=auth_header, + content_type="application/json", + ) + + for data in json.loads(actual_response_2.data): + self.assertEqual(expected_response_2, data['skills']) + + +if __name__ == "__main__": + unittest.main() From fd71462b3785cbd41e73711d102aa4ddedb75bf5 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Mon, 10 May 2021 17:30:57 +0530 Subject: [PATCH 02/17] feat: add feature to the List Users API to filter users by skill --- app/api/dao/user.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/api/dao/user.py b/app/api/dao/user.py index 9725c8c51..020b5fd83 100644 --- a/app/api/dao/user.py +++ b/app/api/dao/user.py @@ -150,12 +150,12 @@ def get_user_by_username(username: str): @staticmethod def list_users( - user_id: int, - search_query: str = "", - skill: str = "", - page: int = DEFAULT_PAGE, - per_page: int = DEFAULT_USERS_PER_PAGE, - is_verified=None, + user_id: int, + search_query: str = "", + skill: str = "", + page: int = DEFAULT_PAGE, + per_page: int = DEFAULT_USERS_PER_PAGE, + is_verified=None, ): """Retrieves a list of verified users with the specified ID. @@ -201,7 +201,7 @@ def list_users( # is_available is true # when either need_mentoring or available_to_mentor is true user["is_available"] = ( - user["need_mentoring"] or user["available_to_mentor"] + user["need_mentoring"] or user["available_to_mentor"] ) return list_of_users, HTTPStatus.OK @@ -663,8 +663,8 @@ def get_user_dashboard(user_id): ) if current_relation != ( - messages.NOT_IN_MENTORED_RELATION_CURRENTLY, - HTTPStatus.OK, + messages.NOT_IN_MENTORED_RELATION_CURRENTLY, + HTTPStatus.OK, ): response["tasks_todo"] = marshal( [ From d6df0d2ccf7dd0b9742b50e84d618b9a2d222dbb Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Mon, 10 May 2021 18:23:05 +0530 Subject: [PATCH 03/17] feat: add feature to the List Users API to filter users by skill --- app/api/dao/user.py | 42 ++++++++++++++----------- app/api/resources/user.py | 16 ++++++++-- tests/users/test_dao_filter_by_skill.py | 5 ++- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/app/api/dao/user.py b/app/api/dao/user.py index 020b5fd83..620b9af45 100644 --- a/app/api/dao/user.py +++ b/app/api/dao/user.py @@ -150,12 +150,12 @@ def get_user_by_username(username: str): @staticmethod def list_users( - user_id: int, - search_query: str = "", - skill: str = "", - page: int = DEFAULT_PAGE, - per_page: int = DEFAULT_USERS_PER_PAGE, - is_verified=None, + user_id: int, + search_query: str = "", + skill: str = "", + page: int = DEFAULT_PAGE, + per_page: int = DEFAULT_USERS_PER_PAGE, + is_verified=None, ): """Retrieves a list of verified users with the specified ID. @@ -176,17 +176,23 @@ def list_users( UserModel.id != user_id, not is_verified or UserModel.is_email_verified, func.lower(UserModel.name).contains(search_query.lower()) - | func.lower(UserModel.username).contains(search_query.lower()) + | func.lower(UserModel.username).contains(search_query.lower()), ) - if skill != '': - users_list_query = users_list_query.filter(func.lower(UserModel.skills) == func.lower(skill)) + if skill != "": + users_list_query = users_list_query.filter( + func.lower(UserModel.skills) == func.lower(skill) + ) - users_list = users_list_query.order_by(UserModel.id).paginate( - page=page, - per_page=per_page, - error_out=False, - max_per_page=UserDAO.MAX_USERS_PER_PAGE, - ).items + users_list = ( + users_list_query.order_by(UserModel.id) + .paginate( + page=page, + per_page=per_page, + error_out=False, + max_per_page=UserDAO.MAX_USERS_PER_PAGE, + ) + .items + ) list_of_users = [user.json() for user in users_list] @@ -201,7 +207,7 @@ def list_users( # is_available is true # when either need_mentoring or available_to_mentor is true user["is_available"] = ( - user["need_mentoring"] or user["available_to_mentor"] + user["need_mentoring"] or user["available_to_mentor"] ) return list_of_users, HTTPStatus.OK @@ -663,8 +669,8 @@ def get_user_dashboard(user_id): ) if current_relation != ( - messages.NOT_IN_MENTORED_RELATION_CURRENTLY, - HTTPStatus.OK, + messages.NOT_IN_MENTORED_RELATION_CURRENTLY, + HTTPStatus.OK, ): response["tasks_todo"] = marshal( [ diff --git a/app/api/resources/user.py b/app/api/resources/user.py index d3b1e1f73..a1f79ad72 100644 --- a/app/api/resources/user.py +++ b/app/api/resources/user.py @@ -76,7 +76,13 @@ def get(cls): ) user_id = get_jwt_identity() - return DAO.list_users(user_id, request.args.get("search", ""), request.args.get("skills", ""), page, per_page) + return DAO.list_users( + user_id, + request.args.get("search", ""), + request.args.get("skills", ""), + page, + per_page, + ) @users_ns.route("users/") @@ -282,10 +288,14 @@ def get(cls): user_id = get_jwt_identity() return DAO.list_users( - user_id, request.args.get("search", ""), request.args.get("skills", ""), page, per_page, is_verified=True + user_id, + request.args.get("search", ""), + request.args.get("skills", ""), + page, + per_page, + is_verified=True, ) - @users_ns.route("register") class UserRegister(Resource): @classmethod diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 55303cd88..4a583d431 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -9,7 +9,6 @@ class FilterUsersBySkill(BaseTestCase): - def insert_entries_in_database(self): # Insert data of the first entry @@ -67,7 +66,7 @@ def test_case_1(self): ) for data in json.loads(actual_response_1.data): - self.assertEqual(expected_response_1, data['skills']) + self.assertEqual(expected_response_1, data["skills"]) def test_case_2(self): self.insert_entries_in_database() @@ -82,7 +81,7 @@ def test_case_2(self): ) for data in json.loads(actual_response_2.data): - self.assertEqual(expected_response_2, data['skills']) + self.assertEqual(expected_response_2, data["skills"]) if __name__ == "__main__": From f60c559c02ab56603f8616b3635d62a9ba60fc1f Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Mon, 10 May 2021 18:26:10 +0530 Subject: [PATCH 04/17] feat: add feature to the List Users API to filter users by skill --- app/api/resources/user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/api/resources/user.py b/app/api/resources/user.py index a1f79ad72..67632fb31 100644 --- a/app/api/resources/user.py +++ b/app/api/resources/user.py @@ -296,6 +296,7 @@ def get(cls): is_verified=True, ) + @users_ns.route("register") class UserRegister(Resource): @classmethod From e80cdbd345a3b62daeea4e18ea257ef60ec603a0 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Tue, 11 May 2021 19:16:17 +0530 Subject: [PATCH 05/17] incorporated review comments --- app/api/resources/user.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/api/resources/user.py b/app/api/resources/user.py index 67632fb31..86a362e22 100644 --- a/app/api/resources/user.py +++ b/app/api/resources/user.py @@ -78,8 +78,8 @@ def get(cls): user_id = get_jwt_identity() return DAO.list_users( user_id, - request.args.get("search", ""), - request.args.get("skills", ""), + request.args.get("search", None), + request.args.get("skills", None), page, per_page, ) @@ -289,8 +289,8 @@ def get(cls): user_id = get_jwt_identity() return DAO.list_users( user_id, - request.args.get("search", ""), - request.args.get("skills", ""), + request.args.get("search", None), + request.args.get("skills", None), page, per_page, is_verified=True, From 424daca84ea5ea25a5c66b57fd0dd32354858ee2 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Tue, 11 May 2021 19:27:58 +0530 Subject: [PATCH 06/17] incorporated review comments --- app/api/dao/user.py | 2 +- app/api/resources/user.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/api/dao/user.py b/app/api/dao/user.py index 620b9af45..d4c6cca71 100644 --- a/app/api/dao/user.py +++ b/app/api/dao/user.py @@ -178,7 +178,7 @@ def list_users( func.lower(UserModel.name).contains(search_query.lower()) | func.lower(UserModel.username).contains(search_query.lower()), ) - if skill != "": + if skill: users_list_query = users_list_query.filter( func.lower(UserModel.skills) == func.lower(skill) ) diff --git a/app/api/resources/user.py b/app/api/resources/user.py index 86a362e22..11ba635f2 100644 --- a/app/api/resources/user.py +++ b/app/api/resources/user.py @@ -78,7 +78,7 @@ def get(cls): user_id = get_jwt_identity() return DAO.list_users( user_id, - request.args.get("search", None), + request.args.get("search", ""), request.args.get("skills", None), page, per_page, @@ -215,7 +215,7 @@ def delete(cls): class ChangeUserPassword(Resource): @classmethod @jwt_required - @users_ns.doc("update_user_password") + @users_ns.doc("updateNone_user_password") @users_ns.expect( auth_header_parser, change_password_request_data_model, validate=True ) @@ -289,7 +289,7 @@ def get(cls): user_id = get_jwt_identity() return DAO.list_users( user_id, - request.args.get("search", None), + request.args.get("search", ""), request.args.get("skills", None), page, per_page, From 458bcc0053bbf5435b71dbdb8d9a1d9660f7db5d Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Fri, 14 May 2021 01:13:51 +0530 Subject: [PATCH 07/17] made changes --- tests/users/test_dao_filter_by_skill.py | 33 ++++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 4a583d431..667d33ba4 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -1,6 +1,7 @@ import unittest from flask import json +from http import HTTPStatus from tests.base_test_case import BaseTestCase from app.database.models.user import UserModel from app.database.sqlalchemy_extension import db @@ -8,7 +9,7 @@ from tests.test_utils import get_test_request_header -class FilterUsersBySkill(BaseTestCase): +class TestFilterUsersBySkill(BaseTestCase): def insert_entries_in_database(self): # Insert data of the first entry @@ -53,35 +54,43 @@ def insert_entries_in_database(self): db.session.add(self.third_user) db.session.commit() - def test_case_1(self): + def test_filter_users_by_skill_problem_solving(self): self.insert_entries_in_database() auth_header = get_test_request_header(self.admin_user.id) - expected_response_1 = "Problem Solving" - - actual_response_1 = self.client.get( + expected_response = {"user1": "Problem Solving", "user2": "Problem Solving"} + + actual_response = self.client.get( "/users/verified?skills=Problem Solving", headers=auth_header, content_type="application/json", ) - for data in json.loads(actual_response_1.data): - self.assertEqual(expected_response_1, data["skills"]) + self.assertEqual(HTTPStatus.OK, actual_response.status_code) + + for data in json.loads(actual_response.data): + + if data["username"] in expected_response.keys(): + self.assertEqual(expected_response[data["username"]], data["skills"]) - def test_case_2(self): + def test_filter_users_by_skill_critical_thinking(self): self.insert_entries_in_database() auth_header = get_test_request_header(self.admin_user.id) - expected_response_2 = "Critical thinking" + expected_response = {"user3": "Critical thinking"} - actual_response_2 = self.client.get( + actual_response = self.client.get( "/users/verified?skills=Critical thinking", headers=auth_header, content_type="application/json", ) - for data in json.loads(actual_response_2.data): - self.assertEqual(expected_response_2, data["skills"]) + self.assertEqual(HTTPStatus.OK, actual_response.status_code) + + for data in json.loads(actual_response.data): + + if data["username"] in expected_response.keys(): + self.assertEqual(expected_response[data["username"]], data["skills"]) if __name__ == "__main__": From 8308492619e70b7a6ad6a5f37029a46748a0ec66 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Fri, 14 May 2021 01:19:45 +0530 Subject: [PATCH 08/17] made changes --- tests/users/test_dao_filter_by_skill.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 667d33ba4..63e002342 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -59,7 +59,7 @@ def test_filter_users_by_skill_problem_solving(self): auth_header = get_test_request_header(self.admin_user.id) expected_response = {"user1": "Problem Solving", "user2": "Problem Solving"} - + actual_response = self.client.get( "/users/verified?skills=Problem Solving", headers=auth_header, From e4fbd3fd7a28a29ae39f7319184cfc37377936d8 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Sun, 16 May 2021 00:24:05 +0530 Subject: [PATCH 09/17] incorporated changes --- app/api/dao/user.py | 11 +++---- requirements.txt | 1 + tests/users/test_dao_filter_by_skill.py | 41 ++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/app/api/dao/user.py b/app/api/dao/user.py index d4c6cca71..27e22aae9 100644 --- a/app/api/dao/user.py +++ b/app/api/dao/user.py @@ -4,6 +4,7 @@ from typing import Dict from flask_restx import marshal from sqlalchemy import func +from nltk.stem import PorterStemmer from app import messages from app.api.email_utils import confirm_token @@ -179,10 +180,8 @@ def list_users( | func.lower(UserModel.username).contains(search_query.lower()), ) if skill: - users_list_query = users_list_query.filter( - func.lower(UserModel.skills) == func.lower(skill) - ) - + ps = PorterStemmer() + users_list_query = users_list_query.filter(func.lower(UserModel.skills).contains(ps.stem(skill.lower()))) users_list = ( users_list_query.order_by(UserModel.id) .paginate( @@ -669,8 +668,8 @@ def get_user_dashboard(user_id): ) if current_relation != ( - messages.NOT_IN_MENTORED_RELATION_CURRENTLY, - HTTPStatus.OK, + messages.NOT_IN_MENTORED_RELATION_CURRENTLY, + HTTPStatus.OK, ): response["tasks_todo"] = marshal( [ diff --git a/requirements.txt b/requirements.txt index e994c9c3b..e26ff1bde 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ gunicorn==20.0.4 psycopg2-binary==2.8.6 python-dotenv==0.14.0 six==1.11.0 +nltk==3.6.2 diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 63e002342..92c59e1b7 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -5,7 +5,7 @@ from tests.base_test_case import BaseTestCase from app.database.models.user import UserModel from app.database.sqlalchemy_extension import db -from tests.test_data import user1, user2, user3 +from tests.test_data import user1, user2, user3, user4 from tests.test_utils import get_test_request_header @@ -54,6 +54,20 @@ def insert_entries_in_database(self): db.session.add(self.third_user) db.session.commit() + #Insert data of the fourth entry + self.fourth_user = UserModel( + name=user4["name"], + email=user4["email"], + username=user4["username"], + password=user4["password"], + terms_and_conditions_checked=user4["terms_and_conditions_checked"], + ) + self.fourth_user.is_email_verified = True + self.fourth_user.skills = "Creativity" + + db.session.add(self.fourth_user) + db.session.commit() + def test_filter_users_by_skill_problem_solving(self): self.insert_entries_in_database() @@ -61,7 +75,7 @@ def test_filter_users_by_skill_problem_solving(self): expected_response = {"user1": "Problem Solving", "user2": "Problem Solving"} actual_response = self.client.get( - "/users/verified?skills=Problem Solving", + "/users/verified?skills=problem solving", headers=auth_header, content_type="application/json", ) @@ -73,14 +87,33 @@ def test_filter_users_by_skill_problem_solving(self): if data["username"] in expected_response.keys(): self.assertEqual(expected_response[data["username"]], data["skills"]) - def test_filter_users_by_skill_critical_thinking(self): + def test_filter_users_by_skill_critical(self): self.insert_entries_in_database() auth_header = get_test_request_header(self.admin_user.id) expected_response = {"user3": "Critical thinking"} actual_response = self.client.get( - "/users/verified?skills=Critical thinking", + "/users/verified?skills=Critical", + headers=auth_header, + content_type="application/json", + ) + + self.assertEqual(HTTPStatus.OK, actual_response.status_code) + + for data in json.loads(actual_response.data): + + if data["username"] in expected_response.keys(): + self.assertEqual(expected_response[data["username"]], data["skills"]) + + def test_filter_users_by_skill_creative(self): + self.insert_entries_in_database() + + auth_header = get_test_request_header(self.admin_user.id) + expected_response = {"user4": "Creativity"} + + actual_response = self.client.get( + "/users/verified?skills=Creative", headers=auth_header, content_type="application/json", ) From c38f7151ccb4a5ea25a8423352d6f38b300b5610 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Sun, 16 May 2021 00:29:06 +0530 Subject: [PATCH 10/17] made necessary changes --- app/api/dao/user.py | 8 +++++--- tests/users/test_dao_filter_by_skill.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/api/dao/user.py b/app/api/dao/user.py index 27e22aae9..542a4eba3 100644 --- a/app/api/dao/user.py +++ b/app/api/dao/user.py @@ -181,7 +181,9 @@ def list_users( ) if skill: ps = PorterStemmer() - users_list_query = users_list_query.filter(func.lower(UserModel.skills).contains(ps.stem(skill.lower()))) + users_list_query = users_list_query.filter( + func.lower(UserModel.skills).contains(ps.stem(skill.lower())) + ) users_list = ( users_list_query.order_by(UserModel.id) .paginate( @@ -668,8 +670,8 @@ def get_user_dashboard(user_id): ) if current_relation != ( - messages.NOT_IN_MENTORED_RELATION_CURRENTLY, - HTTPStatus.OK, + messages.NOT_IN_MENTORED_RELATION_CURRENTLY, + HTTPStatus.OK, ): response["tasks_todo"] = marshal( [ diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 92c59e1b7..406fa15a9 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -54,7 +54,7 @@ def insert_entries_in_database(self): db.session.add(self.third_user) db.session.commit() - #Insert data of the fourth entry + # Insert data of the fourth entry self.fourth_user = UserModel( name=user4["name"], email=user4["email"], From 3d4c9d71761d8674d487b05c35ddf23644fb2770 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Wed, 19 May 2021 00:36:17 +0530 Subject: [PATCH 11/17] removed fts functionality --- app/api/dao/user.py | 4 +-- requirements.txt | 2 +- tests/users/test_dao_filter_by_skill.py | 37 ++----------------------- 3 files changed, 4 insertions(+), 39 deletions(-) diff --git a/app/api/dao/user.py b/app/api/dao/user.py index 542a4eba3..d371919ff 100644 --- a/app/api/dao/user.py +++ b/app/api/dao/user.py @@ -4,7 +4,6 @@ from typing import Dict from flask_restx import marshal from sqlalchemy import func -from nltk.stem import PorterStemmer from app import messages from app.api.email_utils import confirm_token @@ -180,9 +179,8 @@ def list_users( | func.lower(UserModel.username).contains(search_query.lower()), ) if skill: - ps = PorterStemmer() users_list_query = users_list_query.filter( - func.lower(UserModel.skills).contains(ps.stem(skill.lower())) + func.lower(UserModel.skills) == func.lower(skill) ) users_list = ( users_list_query.order_by(UserModel.id) diff --git a/requirements.txt b/requirements.txt index e26ff1bde..2120cd0fc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,4 @@ gunicorn==20.0.4 psycopg2-binary==2.8.6 python-dotenv==0.14.0 six==1.11.0 -nltk==3.6.2 + diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 406fa15a9..0c71447aa 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -54,20 +54,6 @@ def insert_entries_in_database(self): db.session.add(self.third_user) db.session.commit() - # Insert data of the fourth entry - self.fourth_user = UserModel( - name=user4["name"], - email=user4["email"], - username=user4["username"], - password=user4["password"], - terms_and_conditions_checked=user4["terms_and_conditions_checked"], - ) - self.fourth_user.is_email_verified = True - self.fourth_user.skills = "Creativity" - - db.session.add(self.fourth_user) - db.session.commit() - def test_filter_users_by_skill_problem_solving(self): self.insert_entries_in_database() @@ -75,7 +61,7 @@ def test_filter_users_by_skill_problem_solving(self): expected_response = {"user1": "Problem Solving", "user2": "Problem Solving"} actual_response = self.client.get( - "/users/verified?skills=problem solving", + "/users/verified?skills=Problem Solving", headers=auth_header, content_type="application/json", ) @@ -94,26 +80,7 @@ def test_filter_users_by_skill_critical(self): expected_response = {"user3": "Critical thinking"} actual_response = self.client.get( - "/users/verified?skills=Critical", - headers=auth_header, - content_type="application/json", - ) - - self.assertEqual(HTTPStatus.OK, actual_response.status_code) - - for data in json.loads(actual_response.data): - - if data["username"] in expected_response.keys(): - self.assertEqual(expected_response[data["username"]], data["skills"]) - - def test_filter_users_by_skill_creative(self): - self.insert_entries_in_database() - - auth_header = get_test_request_header(self.admin_user.id) - expected_response = {"user4": "Creativity"} - - actual_response = self.client.get( - "/users/verified?skills=Creative", + "/users/verified?skills=Critical thinking", headers=auth_header, content_type="application/json", ) From bee18f0a79f236e138b86c35784e710aefcb511c Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Sat, 29 May 2021 12:49:16 +0530 Subject: [PATCH 12/17] removed verify-user condition --- tests/users/test_dao_filter_by_skill.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 0c71447aa..0fcb8637c 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -5,7 +5,7 @@ from tests.base_test_case import BaseTestCase from app.database.models.user import UserModel from app.database.sqlalchemy_extension import db -from tests.test_data import user1, user2, user3, user4 +from tests.test_data import user1, user2, user3 from tests.test_utils import get_test_request_header @@ -58,7 +58,7 @@ def test_filter_users_by_skill_problem_solving(self): self.insert_entries_in_database() auth_header = get_test_request_header(self.admin_user.id) - expected_response = {"user1": "Problem Solving", "user2": "Problem Solving"} + expected_response = "Problem Solving" actual_response = self.client.get( "/users/verified?skills=Problem Solving", @@ -69,15 +69,13 @@ def test_filter_users_by_skill_problem_solving(self): self.assertEqual(HTTPStatus.OK, actual_response.status_code) for data in json.loads(actual_response.data): - - if data["username"] in expected_response.keys(): - self.assertEqual(expected_response[data["username"]], data["skills"]) + self.assertEqual(expected_response, data["skills"]) def test_filter_users_by_skill_critical(self): self.insert_entries_in_database() auth_header = get_test_request_header(self.admin_user.id) - expected_response = {"user3": "Critical thinking"} + expected_response = "Critical thinking" actual_response = self.client.get( "/users/verified?skills=Critical thinking", @@ -88,9 +86,7 @@ def test_filter_users_by_skill_critical(self): self.assertEqual(HTTPStatus.OK, actual_response.status_code) for data in json.loads(actual_response.data): - - if data["username"] in expected_response.keys(): - self.assertEqual(expected_response[data["username"]], data["skills"]) + self.assertEqual(expected_response, data["skills"]) if __name__ == "__main__": From 7d2437031db496670ef109e3baf41e3da89f88b7 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Fri, 10 Sep 2021 22:07:58 +0530 Subject: [PATCH 13/17] Incorporated review comments --- app/database/models/user.py | 7 +++--- requirements.txt | 1 + tests/users/test_dao_filter_by_skill.py | 31 +++++-------------------- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/app/database/models/user.py b/app/database/models/user.py index 90cd11979..105601ad5 100644 --- a/app/database/models/user.py +++ b/app/database/models/user.py @@ -59,7 +59,8 @@ class UserModel(db.Model): need_mentoring = db.Column(db.Boolean) available_to_mentor = db.Column(db.Boolean) - def __init__(self, name, username, password, email, terms_and_conditions_checked): + def __init__(self, name, username, password, email, terms_and_conditions_checked, need_mentoring=False, + available_to_mentor=False): """Initialises userModel class with name, username, password, email, and terms_and_conditions_checked.""" # required fields @@ -78,8 +79,8 @@ def __init__(self, name, username, password, email, terms_and_conditions_checked # optional fields - self.need_mentoring = False - self.available_to_mentor = False + self.need_mentoring = need_mentoring + self.available_to_mentor = available_to_mentor def json(self): """Returns Usermodel object in json format.""" diff --git a/requirements.txt b/requirements.txt index dffef6143..a706a505a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ gunicorn==20.0.4 psycopg2-binary==2.8.6 python-dotenv==0.18.0 six==1.11.0 +pre-commit \ No newline at end of file diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 0fcb8637c..8a8aa9699 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -10,16 +10,11 @@ class TestFilterUsersBySkill(BaseTestCase): - def insert_entries_in_database(self): - + def setUp(self): + super().setUp() + # Insert data of the first entry - self.first_user = UserModel( - name=user1["name"], - email=user1["email"], - username=user1["username"], - password=user1["password"], - terms_and_conditions_checked=user1["terms_and_conditions_checked"], - ) + self.first_user = UserModel(**user1) self.first_user.is_email_verified = True self.first_user.skills = "Problem Solving" @@ -27,13 +22,7 @@ def insert_entries_in_database(self): db.session.commit() # Insert data of the second entry - self.second_user = UserModel( - name=user2["name"], - email=user2["email"], - username=user2["username"], - password=user2["password"], - terms_and_conditions_checked=user2["terms_and_conditions_checked"], - ) + self.second_user = UserModel(**user2) self.second_user.is_email_verified = True self.second_user.skills = "Problem Solving" @@ -41,13 +30,7 @@ def insert_entries_in_database(self): db.session.commit() # Insert data of the third entry - self.third_user = UserModel( - name=user3["name"], - email=user3["email"], - username=user3["username"], - password=user3["password"], - terms_and_conditions_checked=user3["terms_and_conditions_checked"], - ) + self.third_user = UserModel(**user3) self.third_user.is_email_verified = True self.third_user.skills = "Critical thinking" @@ -55,7 +38,6 @@ def insert_entries_in_database(self): db.session.commit() def test_filter_users_by_skill_problem_solving(self): - self.insert_entries_in_database() auth_header = get_test_request_header(self.admin_user.id) expected_response = "Problem Solving" @@ -72,7 +54,6 @@ def test_filter_users_by_skill_problem_solving(self): self.assertEqual(expected_response, data["skills"]) def test_filter_users_by_skill_critical(self): - self.insert_entries_in_database() auth_header = get_test_request_header(self.admin_user.id) expected_response = "Critical thinking" From 3333ec0334eef02fc11f947e032e4c2fa6e8c3fc Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Fri, 10 Sep 2021 22:18:18 +0530 Subject: [PATCH 14/17] Incorporated review comments --- app/database/models/user.py | 12 ++++++++++-- tests/users/test_dao_filter_by_skill.py | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/database/models/user.py b/app/database/models/user.py index 105601ad5..e5ff95357 100644 --- a/app/database/models/user.py +++ b/app/database/models/user.py @@ -59,8 +59,16 @@ class UserModel(db.Model): need_mentoring = db.Column(db.Boolean) available_to_mentor = db.Column(db.Boolean) - def __init__(self, name, username, password, email, terms_and_conditions_checked, need_mentoring=False, - available_to_mentor=False): + def __init__( + self, + name, + username, + password, + email, + terms_and_conditions_checked, + need_mentoring=False, + available_to_mentor=False + ): """Initialises userModel class with name, username, password, email, and terms_and_conditions_checked.""" # required fields diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 8a8aa9699..973dc88a7 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -13,6 +13,7 @@ class TestFilterUsersBySkill(BaseTestCase): def setUp(self): super().setUp() + # Insert data of the first entry self.first_user = UserModel(**user1) self.first_user.is_email_verified = True From b416b381bf6bb5d281b87e033074fb2d2be0f752 Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Fri, 10 Sep 2021 22:21:36 +0530 Subject: [PATCH 15/17] Removed lint errors --- app/database/models/user.py | 16 ++++++++-------- tests/users/test_dao_filter_by_skill.py | 1 - 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/database/models/user.py b/app/database/models/user.py index e5ff95357..9f1da8cea 100644 --- a/app/database/models/user.py +++ b/app/database/models/user.py @@ -60,14 +60,14 @@ class UserModel(db.Model): available_to_mentor = db.Column(db.Boolean) def __init__( - self, - name, - username, - password, - email, - terms_and_conditions_checked, - need_mentoring=False, - available_to_mentor=False + self, + name, + username, + password, + email, + terms_and_conditions_checked, + need_mentoring=False, + available_to_mentor=False ): """Initialises userModel class with name, username, password, email, and terms_and_conditions_checked.""" # required fields diff --git a/tests/users/test_dao_filter_by_skill.py b/tests/users/test_dao_filter_by_skill.py index 973dc88a7..eaf70491a 100644 --- a/tests/users/test_dao_filter_by_skill.py +++ b/tests/users/test_dao_filter_by_skill.py @@ -12,7 +12,6 @@ class TestFilterUsersBySkill(BaseTestCase): def setUp(self): super().setUp() - # Insert data of the first entry self.first_user = UserModel(**user1) From 34b440c0e760393fce95e3bc4d4447f7e662729f Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Fri, 10 Sep 2021 22:24:24 +0530 Subject: [PATCH 16/17] Removed lint errors --- app/database/models/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/database/models/user.py b/app/database/models/user.py index 9f1da8cea..ae7ebb7b2 100644 --- a/app/database/models/user.py +++ b/app/database/models/user.py @@ -67,7 +67,7 @@ def __init__( email, terms_and_conditions_checked, need_mentoring=False, - available_to_mentor=False + available_to_mentor=False, ): """Initialises userModel class with name, username, password, email, and terms_and_conditions_checked.""" # required fields From 7f158f9d7ead5f2e8680d4e98832f725bd540b3e Mon Sep 17 00:00:00 2001 From: "B.Ashita" Date: Sat, 9 Oct 2021 21:53:45 +0530 Subject: [PATCH 17/17] Removed error --- app/api/resources/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/resources/user.py b/app/api/resources/user.py index 6ee820f9e..db991f74a 100644 --- a/app/api/resources/user.py +++ b/app/api/resources/user.py @@ -233,7 +233,7 @@ def delete(cls): class ChangeUserPassword(Resource): @classmethod @jwt_required - @users_ns.doc("updateNone_user_password") + @users_ns.doc("update_user_password") @users_ns.expect( auth_header_parser, change_password_request_data_model, validate=True )