diff --git a/core/api/people_finder.py b/core/api/people_finder.py index c1d481c..efc6a63 100644 --- a/core/api/people_finder.py +++ b/core/api/people_finder.py @@ -243,3 +243,21 @@ def get_learning_interests(request): return 500, { "message": f"Could not get learning interests, reason: {unknown_error}" } + + +@reference_router.get( + "professions/", + response={ + 200: list[TextChoiceResponseSchema], + 500: Error, + }, +) +def get_professions(request): + try: + professions = [ + {"key": key, "value": value} + for key, value in core_services.get_professions() + ] + return 200, professions + except Exception as unknown_error: + return 500, {"message": f"Could not get professions, reason: {unknown_error}"} diff --git a/core/services.py b/core/services.py index 7b7c26b..6379839 100644 --- a/core/services.py +++ b/core/services.py @@ -5,7 +5,7 @@ from profiles import services as profile_services from profiles.models import LearningInterest, Workday from profiles.models.combined import Profile -from profiles.models.generic import Country, UkStaffLocation +from profiles.models.generic import Country, Profession, UkStaffLocation from profiles.models.peoplefinder import PeopleFinderProfile, RemoteWorking from profiles.types import UNSET, Unset # noqa from user import services as user_services @@ -318,3 +318,10 @@ def get_learning_interests() -> list[tuple[LearningInterest, str]]: Function for getting a list of all learning interests """ return profile_services.get_learning_interests() + + +def get_professions() -> list[tuple[Profession, str]]: + """ + Function for getting a list of all professions + """ + return profile_services.get_professions() diff --git a/docs/apis/people-finder.md b/docs/apis/people-finder.md index c0a8dc0..94d1486 100644 --- a/docs/apis/people-finder.md +++ b/docs/apis/people-finder.md @@ -9,3 +9,4 @@ The ID service exposes an API that provides read and edit functionality designed `remote_working/` : lists remote working options `workdays/` : lists workday options `learning_interests/` : lists learning interests +`professions/` : lists professions diff --git a/e2e_tests/test_peoplefinder.py b/e2e_tests/test_peoplefinder.py index 5e07715..78249d1 100644 --- a/e2e_tests/test_peoplefinder.py +++ b/e2e_tests/test_peoplefinder.py @@ -7,6 +7,7 @@ from core.schemas.peoplefinder import CreateProfileRequest from profiles.models import LearningInterest, Workday +from profiles.models.generic import Profession from profiles.models.peoplefinder import RemoteWorking @@ -254,3 +255,50 @@ def test_get_learning_interest(mocker): assert json.loads(response.content) == { "message": "Could not get learning interests, reason: mocked-test-exception" } + + +def test_get_professions(mocker): + url = reverse("people-finder:get_professions") + client = Client() + response = client.get( + url, + content_type="application/json", + ) + assert response.status_code == 200 + assert json.loads(response.content) == [ + {"key": key, "value": value} for key, value in Profession.choices + ] + + mocker.patch( + "core.services.get_professions", + return_value={ + "COMMERCIAL": "Government commercial and contract management", + "CORP_FINANCE": "Corporate finance profession", + "COUNTER_FRAUD": "Counter-fraud standards and profession", + "DIGITAL_DATA_TECH": "Digital, data and technology profession", + "GOV_COMMS": "Government communication service", + }, + ) + + response = client.get( + url, + content_type="application/json", + ) + + assert response.status_code == 500 + assert json.loads(response.content) == { + "message": "Could not get professions, reason: too many values to unpack (expected 2)" + } + + mocker.patch( + "core.services.get_professions", side_effect=Exception("mocked-test-exception") + ) + response = client.get( + url, + content_type="application/json", + ) + + assert response.status_code == 500 + assert json.loads(response.content) == { + "message": "Could not get professions, reason: mocked-test-exception" + } diff --git a/profiles/services/__init__.py b/profiles/services/__init__.py index 1551099..2fc8fa1 100644 --- a/profiles/services/__init__.py +++ b/profiles/services/__init__.py @@ -9,7 +9,7 @@ from profiles.exceptions import NonCombinedProfileExists from profiles.models import Workday from profiles.models.combined import Profile -from profiles.models.generic import Country, UkStaffLocation +from profiles.models.generic import Country, Profession, UkStaffLocation from profiles.models.peoplefinder import ( LearningInterest, PeopleFinderProfile, @@ -438,3 +438,10 @@ def get_learning_interests() -> list[tuple[LearningInterest, str]]: Gets all learning interests """ return peoplefinder.get_learning_interests() + + +def get_professions() -> list[tuple[Profession, str]]: + """ + Gets all professions + """ + return peoplefinder.get_professions() diff --git a/profiles/services/peoplefinder.py b/profiles/services/peoplefinder.py index 69dc4f3..fd46536 100644 --- a/profiles/services/peoplefinder.py +++ b/profiles/services/peoplefinder.py @@ -7,7 +7,7 @@ from profiles.exceptions import ProfileExists from profiles.models import LearningInterest, Workday -from profiles.models.generic import Country, Email, UkStaffLocation +from profiles.models.generic import Country, Email, Profession, UkStaffLocation from profiles.models.peoplefinder import PeopleFinderProfile, RemoteWorking from profiles.types import UNSET, Unset @@ -462,3 +462,10 @@ def get_learning_interests() -> list[tuple[LearningInterest, str]]: Gets all learning interests """ return LearningInterest.choices + + +def get_professions() -> list[tuple[Profession, str]]: + """ + Gets all professions + """ + return Profession.choices diff --git a/profiles/tests/test_services_peoplefinder.py b/profiles/tests/test_services_peoplefinder.py index 9364a50..1427934 100644 --- a/profiles/tests/test_services_peoplefinder.py +++ b/profiles/tests/test_services_peoplefinder.py @@ -179,3 +179,40 @@ def test_get_learning_interest_options(): ("Ministerial submissions", "Ministerial Submissions"), ("Coding", "Coding"), ] + + +def test_get_professions(): + options = peoplefinder_services.get_professions() + + assert options == [ + ("Government commercial and contract management", "Commercial"), + ("Corporate finance profession", "Corp Finance"), + ("Counter-fraud standards and profession", "Counter Fraud"), + ("Digital, data and technology profession", "Digital Data Tech"), + ("Government communication service", "Gov Comms"), + ("Government economic service", "Gov Economics"), + ("Government finance profession", "Gov Finance"), + ("Government IT profession", "Gov It"), + ("Government knowledge and information management profession", "Gov Knowledge"), + ("Government legal service", "Gov Legal"), + ("Government occupational psychology profession", "Gov Occupational"), + ("Government operational research service", "Gov Operational"), + ("Government planning inspectors", "Gov Planning Inspectors"), + ("Government planning profession", "Gov Planning Profession"), + ("Government property profession", "Gov Property"), + ("Government security profession", "Gov Security"), + ("Government science and engineering profession", "Gov Science"), + ("Government social research profession", "Gov Social"), + ("Government statistical service profession", "Gov Statistical"), + ("Government tax profession", "Gov Tax"), + ("Government veterinary profession", "Gov Vet"), + ("Human resources profession", "Human Resources"), + ("Intelligence analysis", "Intelligence Analysis"), + ("Internal audit profession", "Internal Audit"), + ("Medical profession", "Medical Profession"), + ("Operational delivery profession", "Operation Delivery"), + ("Policy profession", "Policy Profiession"), + ("Procurement profession", "Procurement Profession"), + ("Project delivery profession", "Project Delivery"), + ("International trade profession", "International Trade"), + ]