diff --git a/conftest.py b/conftest.py index 77fedac5..3901b46c 100644 --- a/conftest.py +++ b/conftest.py @@ -4,7 +4,7 @@ from django.contrib.auth import get_user_model from profiles.models.combined import Profile -from profiles.models.generic import Email +from profiles.models.generic import Country, Email, UkStaffLocation from profiles.models.peoplefinder import PeopleFinderProfile from profiles.models.staff_sso import StaffSSOProfile, StaffSSOProfileEmail @@ -63,7 +63,7 @@ def combined_profile(sso_profile): @pytest.fixture(scope="function") def peoplefinder_profile(basic_user): - peoplefinder_profile = PeopleFinderProfile.objects.create( + return PeopleFinderProfile.objects.create( slug="9c8d532c-3d44-40fd-a512-debd26af007f", user=basic_user, first_name="John", @@ -76,4 +76,53 @@ def peoplefinder_profile(basic_user): learning_interests=["everything"], edited_or_confirmed_at=dt.datetime.now(), ) - return peoplefinder_profile + + +@pytest.fixture(autouse=True, scope="function") +def default_country(): + return Country.objects.create( + reference_id="CTHMTC00260", + name="UK", + type="country", + iso_1_code="31", + iso_2_code="66", + iso_3_code="2", + ) + + +@pytest.fixture(autouse=True, scope="function") +def uk_staff_location(): + return UkStaffLocation.objects.create( + code="location_1", + name="OAB_UK", + city="London", + organisation="DBT", + building_name="OAB", + ) + + +@pytest.fixture(autouse=True, scope="function") +def manager_user(): + return User.objects.create_user( + sso_email_id="manager_sso_email@email.com", + is_active=True, + is_staff=False, + is_superuser=False, + ) + + +@pytest.fixture(scope="function") +def manager(manager_user): + return PeopleFinderProfile.objects.create( + slug="734e7872-27f7-481b-9659-6632adf02268", + user=manager_user, + first_name="Jane", + last_name="Manager", + grade="G6", + workdays=["Monday", "Tuesday"], + professions=["Manager"], + additional_roles=["Line Manager"], + key_skills=["managing"], + learning_interests=["management"], + edited_or_confirmed_at=dt.datetime.now(), + ) diff --git a/core/api/people_finder.py b/core/api/people_finder.py index 9db9dbfa..f9bbd6ef 100644 --- a/core/api/people_finder.py +++ b/core/api/people_finder.py @@ -2,8 +2,13 @@ from core import services as core_services from core.schemas import Error -from core.schemas.profiles import ProfileMinimal +from core.schemas.profiles import ( + PeopleFinderProfileRequestSchema, + PeopleFinderProfileResponseSchema, + ProfileMinimal, +) from profiles.models.combined import Profile +from profiles.models.peoplefinder import PeopleFinderProfile router = Router() @@ -13,17 +18,73 @@ # NB this is a placeholder to get the router running, it may need editing or deleting etc. @profile_router.get( - "{id}", + "{slug}", response={ 200: ProfileMinimal, 404: Error, }, ) -def get_user(request, id: str): +def get_profile(request, slug: str): """Just a demo, do not build against this""" try: - return core_services.get_identity_by_id(id=id) + return core_services.get_profile_by_slug(slug=slug) except Profile.DoesNotExist: return 404, { "message": "Unable to find user", } + + +@profile_router.put( + "{slug}", response={200: PeopleFinderProfileResponseSchema, 404: Error} +) +def update_profile( + request, slug: str, profile_request: PeopleFinderProfileRequestSchema +) -> tuple[int, PeopleFinderProfile | dict]: + try: + combined_profile = core_services.get_identity_by_id( + id=profile_request.sso_email_id + ) + core_services.update_peoplefinder_profile( + profile=combined_profile, + slug=slug, + is_active=combined_profile.is_active, + became_inactive=profile_request.became_inactive, + edited_or_confirmed_at=profile_request.edited_or_confirmed_at, + login_count=profile_request.login_count, + first_name=profile_request.first_name, + last_name=profile_request.last_name, + preferred_first_name=profile_request.preferred_first_name, + pronouns=profile_request.pronouns, + name_pronunciation=profile_request.name_pronunciation, + email_address=profile_request.email_address, + contact_email_address=profile_request.contact_email_address, + primary_phone_number=profile_request.primary_phone_number, + secondary_phone_number=profile_request.secondary_phone_number, + photo=profile_request.photo, + photo_small=profile_request.photo_small, + grade=profile_request.grade, + manager_slug=profile_request.manager_slug, + not_employee=profile_request.not_employee, + workdays=profile_request.workdays, + remote_working=profile_request.remote_working, + usual_office_days=profile_request.usual_office_days, + uk_office_location_id=profile_request.uk_office_location_id, + location_in_building=profile_request.location_in_building, + international_building=profile_request.international_building, + country_id=profile_request.country_id, + professions=profile_request.professions, + additional_roles=profile_request.additional_roles, + other_additional_roles=profile_request.other_additional_roles, + key_skills=profile_request.key_skills, + other_key_skills=profile_request.other_key_skills, + learning_interests=profile_request.learning_interests, + other_learning_interests=profile_request.other_learning_interests, + fluent_languages=profile_request.fluent_languages, + intermediate_languages=profile_request.intermediate_languages, + previous_experience=profile_request.previous_experience, + ) + return 200, core_services.get_profile_by_slug(slug=slug) + except Profile.DoesNotExist: + return 404, {"message": "Profile does not exist"} + except PeopleFinderProfile.DoesNotExist: + return 404, {"message": "People finder profile does not exist"} diff --git a/core/schemas/profiles.py b/core/schemas/profiles.py index 4bf6e2d4..48a147a3 100644 --- a/core/schemas/profiles.py +++ b/core/schemas/profiles.py @@ -1,4 +1,8 @@ -from ninja import Field, ModelSchema +from datetime import datetime +from typing import List, Optional +from uuid import UUID + +from ninja import Field, ModelSchema, Schema from profiles.models.combined import Profile @@ -15,3 +19,78 @@ class Meta: "contact_email", "emails", ] + + +class PeopleFinderProfileRequestSchema(Schema): + sso_email_id: str + became_inactive: Optional[datetime] = None + edited_or_confirmed_at: Optional[datetime] = None + login_count: Optional[int] = None + first_name: Optional[str] = None + preferred_first_name: Optional[str] = None + last_name: Optional[str] = None + pronouns: Optional[str] = None + name_pronunciation: Optional[str] = None + email_address: Optional[str] = None + contact_email_address: Optional[str] = None + primary_phone_number: Optional[str] = None + secondary_phone_number: Optional[str] = None + photo: Optional[str] = None + photo_small: Optional[str] = None + grade: Optional[str] = None + manager_slug: Optional[str] = None + not_employee: Optional[bool] = None + workdays: Optional[List[str]] = None + remote_working: Optional[str] = None + usual_office_days: Optional[str] = None + uk_office_location_id: Optional[str] = None + location_in_building: Optional[str] = None + international_building: Optional[str] = None + country_id: Optional[str] = None + professions: Optional[List[str]] = None + additional_roles: Optional[List[str]] = None + other_additional_roles: Optional[str] = None + key_skills: Optional[List[str]] = None + other_key_skills: Optional[str] = None + learning_interests: Optional[List[str]] = None + other_learning_interests: Optional[str] = None + fluent_languages: Optional[str] = None + intermediate_languages: Optional[str] = None + previous_experience: Optional[str] = None + + +class PeopleFinderProfileResponseSchema(Schema): + became_inactive: Optional[datetime | None] = Field(alias="became_inactive") + edited_or_confirmed_at: Optional[datetime] = Field(alias="edited_or_confirmed_at") + login_count: Optional[int] = Field(alias="login_count") + first_name: Optional[str] = Field(alias="first_name") + preferred_first_name: Optional[str] = Field(alias="preferred_first_name") + last_name: Optional[str] = Field(alias="last_name") + pronouns: Optional[str] = Field(alias="pronouns") + name_pronunciation: Optional[str] = Field(alias="name_pronunciation") + email_address: Optional[str] = Field(alias="email.address") + contact_email_address: Optional[str] = Field(alias="contact_email.address") + primary_phone_number: Optional[str] = Field(alias="primary_phone_number") + secondary_phone_number: Optional[str] = Field(alias="secondary_phone_number") + photo: Optional[str] = Field(alias="photo") + photo_small: Optional[str] = Field(alias="photo_small") + grade: Optional[str] = Field(alias="grade") + manager_slug: Optional[UUID] = Field(alias="manager.slug") + not_employee: Optional[bool] = Field(alias="not_employee") + workdays: Optional[List[str]] = Field(alias="workdays") + remote_working: Optional[str] = Field(alias="remote_working") + usual_office_days: Optional[str] = Field(alias="usual_office_days") + uk_office_location_id: Optional[str] = Field(alias="uk_office_location.code") + location_in_building: Optional[str] = Field(alias="location_in_building") + international_building: Optional[str] = Field(alias="international_building") + country_id: Optional[str] = Field(alias="country.reference_id") + professions: Optional[List[str]] = Field(alias="professions") + additional_roles: Optional[List[str]] = Field(alias="additional_roles") + other_additional_roles: Optional[str] = Field(alias="other_additional_roles") + key_skills: Optional[List[str]] = Field(alias="key_skills") + other_key_skills: Optional[str] = Field(alias="other_key_skills") + learning_interests: Optional[List[str]] = Field(alias="learning_interests") + other_learning_interests: Optional[str] = Field(alias="other_learning_interests") + fluent_languages: Optional[str] = Field(alias="fluent_languages") + intermediate_languages: Optional[str] = Field(alias="intermediate_languages") + previous_experience: Optional[str] = Field(alias="previous_experience") diff --git a/core/services.py b/core/services.py index a9a84499..dc52f2ae 100644 --- a/core/services.py +++ b/core/services.py @@ -4,6 +4,7 @@ from profiles import services as profile_services from profiles.models.combined import Profile +from profiles.models.peoplefinder import PeopleFinderProfile from profiles.types import UNSET, Unset # noqa from user import services as user_services from user.models import User @@ -28,6 +29,15 @@ def get_identity_by_id(id: str, include_inactive: bool = False) -> Profile: ) +def get_profile_by_slug( + slug: str, include_inactive: bool = False +) -> PeopleFinderProfile: + """ + Retrieve a peoplefinder profile by its slug. + """ + return profile_services.get_by_slug(slug=slug, include_inactive=include_inactive) + + def create_peoplefinder_profile( slug: str, sso_email_id: str, @@ -63,12 +73,12 @@ def create_peoplefinder_profile( fluent_languages: Optional[str] = None, intermediate_languages: Optional[str] = None, previous_experience: Optional[str] = None, -): +) -> PeopleFinderProfile: """ Entrypoint for peoplefinder profile creation. Triggers the creation of Peoplefinder record. """ user = user_services.get_by_id(sso_email_id=sso_email_id) - profile_services.create_from_peoplefinder( + return profile_services.create_from_peoplefinder( slug=slug, user=user, is_active=user.is_active, @@ -107,6 +117,89 @@ def create_peoplefinder_profile( ) +def update_peoplefinder_profile( + profile: Profile, + slug: str, + is_active: bool, + became_inactive: Optional[datetime] = None, + edited_or_confirmed_at: Optional[datetime] = None, + login_count: Optional[int] = None, + first_name: Optional[str] = None, + last_name: Optional[str] = None, + preferred_first_name: Optional[str | Unset] = None, + pronouns: Optional[str | Unset] = None, + name_pronunciation: Optional[str | Unset] = None, + email_address: Optional[str | Unset] = None, + contact_email_address: Optional[str | Unset] = None, + primary_phone_number: Optional[str | Unset] = None, + secondary_phone_number: Optional[str | Unset] = None, + photo: Optional[str | Unset] = None, + photo_small: Optional[str | Unset] = None, + grade: Optional[str | Unset] = None, + manager_slug: Optional[str | Unset] = None, + not_employee: Optional[bool | Unset] = None, + workdays: Optional[list[str] | Unset] = None, + remote_working: Optional[str | Unset] = None, + usual_office_days: Optional[str | Unset] = None, + uk_office_location_id: Optional[str | Unset] = None, + location_in_building: Optional[str | Unset] = None, + international_building: Optional[str | Unset] = None, + country_id: Optional[str] = None, + professions: Optional[list[str] | Unset] = None, + additional_roles: Optional[list[str] | Unset] = None, + other_additional_roles: Optional[str | Unset] = None, + key_skills: Optional[list[str] | Unset] = None, + other_key_skills: Optional[str | Unset] = None, + learning_interests: Optional[list[str] | Unset] = None, + other_learning_interests: Optional[str | Unset] = None, + fluent_languages: Optional[str | Unset] = None, + intermediate_languages: Optional[str | Unset] = None, + previous_experience: Optional[str | Unset] = None, +) -> None: + """ + Entrypoint for peoplefinder profile creation. Triggers the creation of Peoplefinder record. + """ + profile_services.update_from_peoplefinder( + profile=profile, + slug=slug, + is_active=is_active, + became_inactive=became_inactive, + edited_or_confirmed_at=edited_or_confirmed_at, + login_count=login_count, + first_name=first_name, + last_name=last_name, + preferred_first_name=preferred_first_name, + pronouns=pronouns, + name_pronunciation=name_pronunciation, + email_address=email_address, + contact_email_address=contact_email_address, + primary_phone_number=primary_phone_number, + secondary_phone_number=secondary_phone_number, + photo=photo, + photo_small=photo_small, + grade=grade, + manager_slug=manager_slug, + not_employee=not_employee, + workdays=workdays, + remote_working=remote_working, + usual_office_days=usual_office_days, + uk_office_location_id=uk_office_location_id, + location_in_building=location_in_building, + international_building=international_building, + country_id=country_id, + professions=professions, + additional_roles=additional_roles, + other_additional_roles=other_additional_roles, + key_skills=key_skills, + other_key_skills=other_key_skills, + learning_interests=learning_interests, + other_learning_interests=other_learning_interests, + fluent_languages=fluent_languages, + intermediate_languages=intermediate_languages, + previous_experience=previous_experience, + ) + + def create_identity( id: str, first_name: str, diff --git a/core/tests/test_services.py b/core/tests/test_services.py index 32c91a04..77e5a09b 100644 --- a/core/tests/test_services.py +++ b/core/tests/test_services.py @@ -16,6 +16,7 @@ from profiles import services as profile_services from profiles.models import PeopleFinderProfile from profiles.models.combined import Profile +from profiles.models.generic import Country, Email from profiles.models.staff_sso import StaffSSOProfile from profiles.services import peoplefinder as peoplefinder_services from profiles.services import staff_sso as sso_profile_services @@ -178,3 +179,45 @@ def test_delete_identity() -> None: ) assert str(uex.value.args[0]) == "User does not exist" + + +def test_update_peoplefinder_profile(combined_profile, peoplefinder_profile, manager): + # Create a new country to update the existing one + Country.objects.create( + reference_id="country2", + name="country2", + type="country", + iso_1_code="33", + iso_2_code="63", + iso_3_code="23", + ) + + services.update_peoplefinder_profile( + profile=combined_profile, + slug=peoplefinder_profile.slug, + is_active=combined_profile.is_active, + email_address="new_super_fancy_email@gov.uk", + country_id="country2", + uk_office_location_id="location_1", + manager_slug=manager.slug, + ) + + peoplefinder_profile.refresh_from_db() + assert peoplefinder_profile.email.address == "new_super_fancy_email@gov.uk" + assert peoplefinder_profile.country.reference_id == "country2" + assert peoplefinder_profile.uk_office_location.code == "location_1" + assert peoplefinder_profile.manager == manager + + # Delete identity and try to update the peoplefinder profile + services.delete_identity(profile=combined_profile) + + with pytest.raises(PeopleFinderProfile.DoesNotExist): + services.update_peoplefinder_profile( + profile=combined_profile, + slug=peoplefinder_profile.slug, + is_active=combined_profile.is_active, + email_address="new_super_fancy_email@gov.uk", + country_id="country2", + uk_office_location_id="location_1", + manager_slug=manager.slug, + ) diff --git a/profiles/services/__init__.py b/profiles/services/__init__.py index 25291090..e988c52b 100644 --- a/profiles/services/__init__.py +++ b/profiles/services/__init__.py @@ -31,6 +31,13 @@ def get_by_id(sso_email_id: str, include_inactive: bool = False) -> Profile: ) +def get_by_slug(slug: str, include_inactive: bool = False) -> PeopleFinderProfile: + """ + Retrieve a peoplefinder profile by its slug. + """ + return peoplefinder.get_by_slug(slug=slug, include_inactive=include_inactive) + + def generate_combined_profile_data(sso_email_id: str): """ Figures out which info we have in specific profiles and runs through the @@ -167,8 +174,8 @@ def create_from_peoplefinder( fluent_languages: Optional[str] = None, intermediate_languages: Optional[str] = None, previous_experience: Optional[str] = None, -): - peoplefinder.create( +) -> PeopleFinderProfile: + return peoplefinder.create( slug=slug, user=user, is_active=is_active, @@ -212,27 +219,32 @@ def create_from_peoplefinder( def update_from_peoplefinder( # TODO: update_from_peoplefinder() needs updating later profile: Profile, + slug: str, + is_active: bool, + became_inactive: Optional[datetime] = None, + edited_or_confirmed_at: Optional[datetime] = None, + login_count: Optional[int] = None, first_name: Optional[str] = None, last_name: Optional[str] = None, preferred_first_name: Optional[str | Unset] = None, pronouns: Optional[str | Unset] = None, name_pronunciation: Optional[str | Unset] = None, - email: Optional[str | Unset] = None, - contact_email: Optional[str | Unset] = None, + email_address: Optional[str | Unset] = None, + contact_email_address: Optional[str | Unset] = None, primary_phone_number: Optional[str | Unset] = None, secondary_phone_number: Optional[str | Unset] = None, photo: Optional[str | Unset] = None, photo_small: Optional[str | Unset] = None, grade: Optional[str | Unset] = None, - manager: Optional[PeopleFinderProfile | Unset] = None, + manager_slug: Optional[str | Unset] = None, not_employee: Optional[bool | Unset] = None, workdays: Optional[list[str] | Unset] = None, remote_working: Optional[str | Unset] = None, usual_office_days: Optional[str | Unset] = None, - uk_office_location: Optional[UkStaffLocation | Unset] = None, + uk_office_location_id: Optional[str | Unset] = None, location_in_building: Optional[str | Unset] = None, international_building: Optional[str | Unset] = None, - country: Optional[Country] = None, + country_id: Optional[str] = None, professions: Optional[list[str] | Unset] = None, additional_roles: Optional[list[str] | Unset] = None, other_additional_roles: Optional[str | Unset] = None, @@ -245,31 +257,34 @@ def update_from_peoplefinder( previous_experience: Optional[str | Unset] = None, ) -> None: # TODO: use get_by_id to get the peoplefinder_profile - user = User.objects.get(sso_email_id=profile.sso_email_id) - peoplefinder_profile = PeopleFinderProfile.objects.get(user=user) + peoplefinder_profile = peoplefinder.get_by_slug(slug=slug, include_inactive=True) peoplefinder.update( peoplefinder_profile=peoplefinder_profile, + is_active=is_active, + became_inactive=became_inactive, + edited_or_confirmed_at=edited_or_confirmed_at, + login_count=login_count, first_name=first_name, last_name=last_name, preferred_first_name=preferred_first_name, pronouns=pronouns, name_pronunciation=name_pronunciation, - email=email, - contact_email=contact_email, + email_address=email_address, + contact_email_address=contact_email_address, primary_phone_number=primary_phone_number, secondary_phone_number=secondary_phone_number, photo=photo, photo_small=photo_small, grade=grade, - manager=manager, + manager_slug=manager_slug, not_employee=not_employee, workdays=workdays, remote_working=remote_working, usual_office_days=usual_office_days, - uk_office_location=uk_office_location, + uk_office_location_id=uk_office_location_id, location_in_building=location_in_building, international_building=international_building, - country=country, + country_id=country_id, professions=professions, additional_roles=additional_roles, other_additional_roles=other_additional_roles, diff --git a/profiles/services/peoplefinder.py b/profiles/services/peoplefinder.py index 947728bb..46ee3705 100644 --- a/profiles/services/peoplefinder.py +++ b/profiles/services/peoplefinder.py @@ -111,27 +111,31 @@ def create( def update( peoplefinder_profile: PeopleFinderProfile, - first_name: Optional[str] = None, - last_name: Optional[str] = None, + is_active: bool, + became_inactive: Optional[datetime] = None, + edited_or_confirmed_at: Optional[datetime] = None, + login_count: Optional[int] = None, + first_name: Optional[str | Unset] = None, + last_name: Optional[str | Unset] = None, preferred_first_name: Optional[str | Unset] = None, pronouns: Optional[str | Unset] = None, name_pronunciation: Optional[str | Unset] = None, - email: Optional[str | Unset] = None, - contact_email: Optional[str | Unset] = None, + email_address: Optional[str | Unset] = None, + contact_email_address: Optional[str | Unset] = None, primary_phone_number: Optional[str | Unset] = None, secondary_phone_number: Optional[str | Unset] = None, photo: Optional[str | Unset] = None, photo_small: Optional[str | Unset] = None, grade: Optional[str | Unset] = None, - manager: Optional[PeopleFinderProfile | Unset] = None, + manager_slug: Optional[str | Unset] = None, not_employee: Optional[bool | Unset] = None, workdays: Optional[list[str] | Unset] = None, remote_working: Optional[str | Unset] = None, usual_office_days: Optional[str | Unset] = None, - uk_office_location: Optional[UkStaffLocation | Unset] = None, + uk_office_location_id: Optional[str | Unset] = None, location_in_building: Optional[str | Unset] = None, international_building: Optional[str | Unset] = None, - country: Optional[Country] = None, + country_id: Optional[str | Unset] = None, professions: Optional[list[str] | Unset] = None, additional_roles: Optional[list[str] | Unset] = None, other_additional_roles: Optional[str | Unset] = None, @@ -145,13 +149,40 @@ def update( ) -> None: update_fields: list = [] - # first_name and last_name cannot be unset + + peoplefinder_profile.is_active = is_active + update_fields.append("is_active") + + if became_inactive is not None: + if became_inactive is UNSET: + peoplefinder_profile.became_inactive = None + else: + peoplefinder_profile.became_inactive = became_inactive + update_fields.append("became_inactive") + if edited_or_confirmed_at is not None: + if edited_or_confirmed_at is UNSET: + peoplefinder_profile.edited_or_confirmed_at = None + else: + peoplefinder_profile.edited_or_confirmed_at = edited_or_confirmed_at + update_fields.append("edited_or_confirmed_at") + if login_count is not None: + if login_count is UNSET: + peoplefinder_profile.login_count = None + else: + peoplefinder_profile.login_count = login_count + update_fields.append("login_count") if first_name is not None: + if first_name is UNSET: + peoplefinder_profile.first_name = None + else: + peoplefinder_profile.first_name = first_name update_fields.append("first_name") - peoplefinder_profile.first_name = first_name if last_name is not None: + if last_name is UNSET: + peoplefinder_profile.last_name = None + else: + peoplefinder_profile.last_name = last_name update_fields.append("last_name") - peoplefinder_profile.last_name = last_name if preferred_first_name is not None: if preferred_first_name is UNSET: peoplefinder_profile.preferred_first_name = None @@ -176,17 +207,19 @@ def update( else: peoplefinder_profile.name_pronunciation = name_pronunciation update_fields.append("name_pronunciation") - if email is not None: - if email is UNSET: + if email_address is not None: + if email_address is UNSET: peoplefinder_profile.email = None else: - peoplefinder_profile.email = email + peoplefinder_profile.email = set_email_details(address=email_address) update_fields.append("email") - if contact_email is not None: - if contact_email is UNSET: + if contact_email_address is not None: + if contact_email_address is UNSET: peoplefinder_profile.contact_email = None else: - peoplefinder_profile.contact_email = contact_email + peoplefinder_profile.contact_email = set_email_details( + address=contact_email_address + ) update_fields.append("contact_email") if primary_phone_number is not None: if primary_phone_number is UNSET: @@ -218,11 +251,11 @@ def update( else: peoplefinder_profile.grade = grade update_fields.append("grade") - if manager is not None: - if manager is UNSET: + if manager_slug is not None: + if manager_slug is UNSET: peoplefinder_profile.manager = None else: - peoplefinder_profile.manager = manager + peoplefinder_profile.manager = set_manager(manager_slug=manager_slug) update_fields.append("manager") if not_employee is not None: if not_employee is UNSET: @@ -248,11 +281,13 @@ def update( else: peoplefinder_profile.usual_office_days = usual_office_days update_fields.append("usual_office_days") - if uk_office_location is not None: - if uk_office_location is UNSET: + if uk_office_location_id is not None: + if uk_office_location_id is UNSET: peoplefinder_profile.uk_office_location = None else: - peoplefinder_profile.uk_office_location = uk_office_location + peoplefinder_profile.uk_office_location = set_uk_office_location( + uk_office_location_id=uk_office_location_id + ) update_fields.append("uk_office_location") if location_in_building is not None: if location_in_building is UNSET: @@ -266,9 +301,11 @@ def update( else: peoplefinder_profile.international_building = international_building update_fields.append("international_building") - # Country cannot be unset - if country is not None: - peoplefinder_profile.country = country + if country_id is not None: + if country_id is UNSET: + peoplefinder_profile.country = None # type: ignore + else: + peoplefinder_profile.country = set_country(country_id=country_id) update_fields.append("country") if professions is not None: if professions is UNSET: @@ -338,7 +375,8 @@ def update( ############################################################### def set_email_details(address: str | None) -> Optional[Email]: if address is not None and len(address.strip()) > 0: - return Email.objects.get_or_create(address=address) + email, _ = Email.objects.get_or_create(address=address) + return email return None diff --git a/profiles/tests/test_services_init.py b/profiles/tests/test_services_init.py index 1262229f..af872188 100644 --- a/profiles/tests/test_services_init.py +++ b/profiles/tests/test_services_init.py @@ -121,36 +121,40 @@ def test_create_from_sso(mocker): def test_update_from_peoplefinder(mocker, combined_profile, peoplefinder_profile): mock_pf_update = mocker.patch("profiles.services.peoplefinder.update") - Country.objects.create(reference_id="CTHMTC00260") - services.update_from_peoplefinder( profile=combined_profile, + is_active=combined_profile.is_active, + slug=peoplefinder_profile.slug, first_name="Jackson", ) mock_pf_update.assert_called_once_with( peoplefinder_profile=peoplefinder_profile, + is_active=True, + became_inactive=None, + edited_or_confirmed_at=None, + login_count=None, first_name="Jackson", last_name=None, preferred_first_name=None, pronouns=None, name_pronunciation=None, - email=None, - contact_email=None, + email_address=None, + contact_email_address=None, primary_phone_number=None, secondary_phone_number=None, photo=None, photo_small=None, grade=None, - manager=None, + manager_slug=None, not_employee=None, workdays=None, remote_working=None, usual_office_days=None, - uk_office_location=None, + uk_office_location_id=None, location_in_building=None, international_building=None, - country=None, + country_id=None, professions=None, additional_roles=None, other_additional_roles=None, diff --git a/profiles/tests/test_services_peoplefinder.py b/profiles/tests/test_services_peoplefinder.py index c1ab8a17..a3c3abad 100644 --- a/profiles/tests/test_services_peoplefinder.py +++ b/profiles/tests/test_services_peoplefinder.py @@ -14,9 +14,6 @@ def test_create(peoplefinder_profile): - # Create the default country - Country.objects.create(reference_id="CTHMTC00260") - # Create staff location UkStaffLocation.objects.create( code="test", @@ -53,10 +50,7 @@ def test_create(peoplefinder_profile): assert peoplefinder_profile.manager == manager -def test_update(peoplefinder_profile): - # Create the default country - Country.objects.create(reference_id="CTHMTC00260") - +def test_update(peoplefinder_profile, combined_profile): # Check the first_name last_name and grade before update assert peoplefinder_profile.first_name == "John" assert peoplefinder_profile.last_name == "Doe" @@ -64,12 +58,14 @@ def test_update(peoplefinder_profile): peoplefinder_services.update( peoplefinder_profile=peoplefinder_profile, + is_active=combined_profile.is_active, first_name="James", grade=UNSET, ) # Check the first_name, last_name and grade after update assert peoplefinder_profile.first_name == "James" assert peoplefinder_profile.last_name == "Doe" + assert peoplefinder_profile.is_active == combined_profile.is_active assert peoplefinder_profile.grade == None @@ -91,9 +87,6 @@ def test_delete_from_database(peoplefinder_profile): def test_get_by_id(peoplefinder_profile): - # create the default country - Country.objects.create(reference_id="CTHMTC00260") - # Get an active people finder profile actual = peoplefinder_services.get_by_slug(slug=peoplefinder_profile.slug) assert actual.user.sso_email_id == peoplefinder_profile.user.sso_email_id