Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IDPF-286 Add Update peoplefinder profile api endpoint #104

Merged
merged 9 commits into from
Feb 24, 2025
Merged
55 changes: 52 additions & 3 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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",
Expand All @@ -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="[email protected]",
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(),
)
65 changes: 61 additions & 4 deletions core/api/people_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -13,17 +18,69 @@

# 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_user(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, 400: Error}
)
def update_user(
request, slug: str, peoplefinder_profile: PeopleFinderProfileRequestSchema
) -> tuple[int, PeopleFinderProfile | dict]:
try:
profile = core_services.get_identity_by_id(id=peoplefinder_profile.sso_email_id)
core_services.update_peoplefinder_profile(
profile=profile,
slug=slug,
is_active=profile.is_active,
became_inactive=peoplefinder_profile.became_inactive,
edited_or_confirmed_at=peoplefinder_profile.edited_or_confirmed_at,
login_count=peoplefinder_profile.login_count,
first_name=peoplefinder_profile.first_name,
last_name=peoplefinder_profile.last_name,
preferred_first_name=peoplefinder_profile.preferred_first_name,
pronouns=peoplefinder_profile.pronouns,
name_pronunciation=peoplefinder_profile.name_pronunciation,
email_address=peoplefinder_profile.email_address,
contact_email_address=peoplefinder_profile.contact_email_address,
primary_phone_number=peoplefinder_profile.primary_phone_number,
secondary_phone_number=peoplefinder_profile.secondary_phone_number,
photo=peoplefinder_profile.photo,
photo_small=peoplefinder_profile.photo_small,
grade=peoplefinder_profile.grade,
manager_slug=peoplefinder_profile.manager_slug,
not_employee=peoplefinder_profile.not_employee,
workdays=peoplefinder_profile.workdays,
remote_working=peoplefinder_profile.remote_working,
usual_office_days=peoplefinder_profile.usual_office_days,
uk_office_location_id=peoplefinder_profile.uk_office_location_id,
location_in_building=peoplefinder_profile.location_in_building,
international_building=peoplefinder_profile.international_building,
country_id=peoplefinder_profile.country_id,
professions=peoplefinder_profile.professions,
additional_roles=peoplefinder_profile.additional_roles,
other_additional_roles=peoplefinder_profile.other_additional_roles,
key_skills=peoplefinder_profile.key_skills,
other_key_skills=peoplefinder_profile.other_key_skills,
learning_interests=peoplefinder_profile.learning_interests,
other_learning_interests=peoplefinder_profile.other_learning_interests,
fluent_languages=peoplefinder_profile.fluent_languages,
intermediate_languages=peoplefinder_profile.intermediate_languages,
previous_experience=peoplefinder_profile.previous_experience,
)
return 200, core_services.get_profile_by_slug(slug=slug)
except Profile.DoesNotExist:
return 404, {"message": "Profile does not exist"}
81 changes: 80 additions & 1 deletion core/schemas/profiles.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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")
97 changes: 95 additions & 2 deletions core/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Loading