diff --git a/conftest.py b/conftest.py index 96ee5fa..59abb3f 100644 --- a/conftest.py +++ b/conftest.py @@ -5,7 +5,7 @@ from profiles.models.combined import Profile from profiles.models.generic import Country, Email, UkStaffLocation -from profiles.models.peoplefinder import PeopleFinderProfile +from profiles.models.peoplefinder import PeopleFinderProfile, PeopleFinderTeam from profiles.models.staff_sso import StaffSSOProfile, StaffSSOProfileEmail @@ -82,6 +82,19 @@ def peoplefinder_profile(basic_user): ) +@pytest.fixture(scope="function") +def peoplefinder_team(): + return PeopleFinderTeam.objects.create( + slug="9c8d532c-3d44-40fd-a512-debd26af007f", + name="Team1Name", + abbreviation="T1N", + description="Team description", + leaders_ordering="alphabetical", + cost_code="CC1", + team_type="standard", + ) + + @pytest.fixture(autouse=True, scope="function") def default_country(): return Country.objects.create( diff --git a/core/services.py b/core/services.py index dd9cb7e..65b06ec 100644 --- a/core/services.py +++ b/core/services.py @@ -291,6 +291,49 @@ def get_peoplefinder_profile_by_slug(slug: str) -> PeopleFinderProfile: return profile_services.get_peoplefinder_profile_by_slug(slug=slug) +def create_peoplefinder_team( + slug: str, + name: str, + abbreviation: str, + description: str, + leaders_ordering: str | PeopleFinderTeamLeadersOrdering, + cost_code: str, + team_type: str | PeopleFinderTeamType, +) -> PeopleFinderTeam: + """ + Function to create a people finder team + """ + return profile_services.create_peoplefinder_team( + slug=slug, + name=name, + abbreviation=abbreviation, + description=description, + leaders_ordering=leaders_ordering, + cost_code=cost_code, + team_type=team_type, + ) + + +def update_peoplefinder_team( + slug: str, + name: Optional[str | Unset] = None, + abbreviation: Optional[str | Unset] = None, + description: Optional[str | Unset] = None, + leaders_ordering: Optional[str | PeopleFinderTeamLeadersOrdering | Unset] = None, + cost_code: Optional[str | Unset] = None, + team_type: Optional[str | PeopleFinderTeamType | Unset] = None, +) -> None: + profile_services.update_peoplefinder_team( + slug=slug, + name=name, + abbreviation=abbreviation, + description=description, + leaders_ordering=leaders_ordering, + cost_code=cost_code, + team_type=team_type, + ) + + def get_countries() -> list[Country]: """ Function for getting a list of all countries @@ -331,26 +374,3 @@ def get_professions() -> list[tuple[Profession, str]]: Function for getting a list of all professions """ return profile_services.get_professions() - - -def create_peoplefinder_team( - slug: str, - name: str, - abbreviation: str, - description: str, - leaders_ordering: str | PeopleFinderTeamLeadersOrdering, - cost_code: str, - team_type: str | PeopleFinderTeamType, -) -> PeopleFinderTeam: - """ - Function to create a people finder team - """ - return profile_services.create_peoplefinder_team( - slug=slug, - name=name, - abbreviation=abbreviation, - description=description, - leaders_ordering=leaders_ordering, - cost_code=cost_code, - team_type=team_type, - ) diff --git a/core/tests/test_services.py b/core/tests/test_services.py index a9f7e6b..0d974d6 100644 --- a/core/tests/test_services.py +++ b/core/tests/test_services.py @@ -249,3 +249,23 @@ def test_create_peoplefinder_team_core_services(): ) assert ex.value.args[0] == "Team has been previously created" + + +def test_update_peoplefinder_team(peoplefinder_team): + services.update_peoplefinder_team( + slug=peoplefinder_team.slug, + name="New Name", + abbreviation="NABV", + description="New Desc", + leaders_ordering="custom", + cost_code="CC123", + team_type="directorate", + ) + + peoplefinder_team.refresh_from_db() + assert peoplefinder_team.name == "New Name" + assert peoplefinder_team.abbreviation == "NABV" + assert peoplefinder_team.description == "New Desc" + assert peoplefinder_team.cost_code == "CC123" + assert peoplefinder_team.leaders_ordering == "custom" + assert peoplefinder_team.team_type == "directorate" diff --git a/profiles/services/__init__.py b/profiles/services/__init__.py index 00bb937..961c82b 100644 --- a/profiles/services/__init__.py +++ b/profiles/services/__init__.py @@ -408,6 +408,50 @@ def get_peoplefinder_profile_by_slug(slug: str) -> PeopleFinderProfile: return peoplefinder.get_by_slug(slug=slug) +def create_peoplefinder_team( + slug: str, + name: str, + abbreviation: str, + description: str, + leaders_ordering: str | PeopleFinderTeamLeadersOrdering, + cost_code: str, + team_type: str | PeopleFinderTeamType, +) -> PeopleFinderTeam: + """ + Creates a people finder team + """ + return peoplefinder.create_team( + slug=slug, + name=name, + abbreviation=abbreviation, + description=description, + leaders_ordering=leaders_ordering, + cost_code=cost_code, + team_type=team_type, + ) + + +def update_peoplefinder_team( + slug: str, + name: Optional[str | Unset] = None, + abbreviation: Optional[str | Unset] = None, + description: Optional[str | Unset] = None, + leaders_ordering: Optional[str | Unset] = None, + cost_code: Optional[str | Unset] = None, + team_type: Optional[str | Unset] = None, +) -> None: + peoplefinder_team = peoplefinder.get_team_by_slug(slug=slug) + peoplefinder.update_team( + peoplefinder_team=peoplefinder_team, + name=name, + abbreviation=abbreviation, + description=description, + leaders_ordering=leaders_ordering, + cost_code=cost_code, + team_type=team_type, + ) + + def get_countries() -> list[Country]: """ Gets all countries service @@ -448,26 +492,3 @@ def get_professions() -> list[tuple[Profession, str]]: Gets all professions """ return peoplefinder.get_professions() - - -def create_peoplefinder_team( - slug: str, - name: str, - abbreviation: str, - description: str, - leaders_ordering: str | PeopleFinderTeamLeadersOrdering, - cost_code: str, - team_type: str | PeopleFinderTeamType, -) -> PeopleFinderTeam: - """ - Creates a people finder team - """ - return peoplefinder.create_team( - slug=slug, - name=name, - abbreviation=abbreviation, - description=description, - leaders_ordering=leaders_ordering, - cost_code=cost_code, - team_type=team_type, - ) diff --git a/profiles/services/peoplefinder.py b/profiles/services/peoplefinder.py index eb8a05a..e495923 100644 --- a/profiles/services/peoplefinder.py +++ b/profiles/services/peoplefinder.py @@ -6,7 +6,7 @@ from django.contrib.auth import get_user_model from profiles.exceptions import ProfileExists, TeamExists -from profiles.models import LearningInterest, Workday +from profiles.models import LearningInterest, PeopleFinderTeam, Workday from profiles.models.generic import Country, Email, Profession, UkStaffLocation from profiles.models.peoplefinder import ( PeopleFinderProfile, @@ -39,6 +39,13 @@ def get_by_slug(slug: str, include_inactive: bool = False) -> PeopleFinderProfil return PeopleFinderProfile.objects.get(slug=slug, is_active=True) +def get_team_by_slug(slug: str) -> PeopleFinderTeam: + """ + Retrieve a People Finder Team by its Slug. + """ + return PeopleFinderTeam.objects.get(slug=slug) + + def create( slug: str, user: User, @@ -382,6 +389,112 @@ def update( peoplefinder_profile.save(update_fields=update_fields) +def delete_from_database( + peoplefinder_profile: PeopleFinderProfile, + reason: Optional[str] = None, + requesting_user: Optional[User] = None, +) -> None: + """Really delete a People Finder Profile""" + if reason is None: + reason = "Deleting People Finder Profile record" + requesting_user_id = "via-api" + if requesting_user is not None: + requesting_user_id = requesting_user.pk + LogEntry.objects.log_action( + user_id=requesting_user_id, + content_type_id=get_content_type_for_model(peoplefinder_profile).pk, + object_id=peoplefinder_profile.pk, + object_repr=str(peoplefinder_profile), + change_message=reason, + action_flag=DELETION, + ) + + peoplefinder_profile.delete() + + +def create_team( + slug: str, + name: str, + abbreviation: str, + description: str, + leaders_ordering: str | PeopleFinderTeamLeadersOrdering, + cost_code: str, + team_type: str | PeopleFinderTeamType, +) -> PeopleFinderTeam: + """ + Creates a people finder team + """ + try: + PeopleFinderTeam.objects.get(slug=slug) + raise TeamExists("Team has been previously created") + except PeopleFinderTeam.DoesNotExist: + team = PeopleFinderTeam( + slug=slug, + name=name, + abbreviation=abbreviation, + description=description, + leaders_ordering=leaders_ordering, + cost_code=cost_code, + team_type=team_type, + ) + team.full_clean() + team.save() + return team + + +def update_team( + peoplefinder_team: PeopleFinderTeam, + name: Optional[str | Unset] = None, + abbreviation: Optional[str | Unset] = None, + description: Optional[str | Unset] = None, + leaders_ordering: Optional[str | PeopleFinderTeamLeadersOrdering | Unset] = None, + cost_code: Optional[str | Unset] = None, + team_type: Optional[str | PeopleFinderTeamType | Unset] = None, +) -> None: + + update_fields: list = [] + + if name is not None: + if name is UNSET: + peoplefinder_team.name = None + else: + peoplefinder_team.name = name + update_fields.append("name") + if abbreviation is not None: + if abbreviation is UNSET: + peoplefinder_team.abbreviation = None + else: + peoplefinder_team.abbreviation = abbreviation + update_fields.append("abbreviation") + if description is not None: + if description is UNSET: + peoplefinder_team.description = None + else: + peoplefinder_team.description = description + update_fields.append("description") + if leaders_ordering is not None: + if leaders_ordering is UNSET: + peoplefinder_team.leaders_ordering = None + else: + peoplefinder_team.leaders_ordering = leaders_ordering + update_fields.append("leaders_ordering") + if cost_code is not None: + if cost_code is UNSET: + peoplefinder_team.cost_code = None + else: + peoplefinder_team.cost_code = cost_code + update_fields.append("cost_code") + if team_type is not None: + if team_type is UNSET: + peoplefinder_team.team_type = None + else: + peoplefinder_team.team_type = team_type + update_fields.append("team_type") + + peoplefinder_team.full_clean() + peoplefinder_team.save(update_fields=update_fields) + + ############################################################### # Email data methods ############################################################### @@ -412,29 +525,6 @@ def set_country(country_id: str | None) -> Optional[Country]: return None -def delete_from_database( - peoplefinder_profile: PeopleFinderProfile, - reason: Optional[str] = None, - requesting_user: Optional[User] = None, -) -> None: - """Really delete a People Finder Profile""" - if reason is None: - reason = "Deleting People Finder Profile record" - requesting_user_id = "via-api" - if requesting_user is not None: - requesting_user_id = requesting_user.pk - LogEntry.objects.log_action( - user_id=requesting_user_id, - content_type_id=get_content_type_for_model(peoplefinder_profile).pk, - object_id=peoplefinder_profile.pk, - object_repr=str(peoplefinder_profile), - change_message=reason, - action_flag=DELETION, - ) - - peoplefinder_profile.delete() - - def get_countries() -> list[Country]: """ Gets all countries service @@ -475,33 +565,3 @@ def get_professions() -> list[tuple[Profession, str]]: Gets all professions """ return Profession.choices - - -def create_team( - slug: str, - name: str, - abbreviation: str, - description: str, - leaders_ordering: str | PeopleFinderTeamLeadersOrdering, - cost_code: str, - team_type: str | PeopleFinderTeamType, -) -> PeopleFinderTeam: - """ - Creates a people finder team - """ - try: - PeopleFinderTeam.objects.get(slug=slug) - raise TeamExists("Team has been previously created") - except PeopleFinderTeam.DoesNotExist: - team = PeopleFinderTeam( - slug=slug, - name=name, - abbreviation=abbreviation, - description=description, - leaders_ordering=leaders_ordering, - cost_code=cost_code, - team_type=team_type, - ) - team.full_clean() - team.save() - return team diff --git a/profiles/tests/test_services_init.py b/profiles/tests/test_services_init.py index 1ba4b0f..65ec56e 100644 --- a/profiles/tests/test_services_init.py +++ b/profiles/tests/test_services_init.py @@ -168,6 +168,29 @@ def test_update_from_peoplefinder(mocker, combined_profile, peoplefinder_profile # TODO: Update test - Check for combined_profile updates after adding the functionality. +def test_update_peoplefinder_team(mocker, peoplefinder_team): + mock_pft_update_team = mocker.patch("profiles.services.peoplefinder.update_team") + services.update_peoplefinder_team( + slug=peoplefinder_team.slug, + name=peoplefinder_team.name, + abbreviation=peoplefinder_team.abbreviation, + description="New description", + leaders_ordering=peoplefinder_team.leaders_ordering, + cost_code=peoplefinder_team.cost_code, + team_type=peoplefinder_team.team_type, + ) + + mock_pft_update_team.assert_called_once_with( + peoplefinder_team=peoplefinder_team, + name=peoplefinder_team.name, + abbreviation=peoplefinder_team.abbreviation, + description="New description", + leaders_ordering=peoplefinder_team.leaders_ordering, + cost_code=peoplefinder_team.cost_code, + team_type=peoplefinder_team.team_type, + ) + + def test_delete_combined_profile(combined_profile, sso_profile) -> None: all_profiles = services.get_all_profiles(sso_email_id=combined_profile.sso_email_id) diff --git a/profiles/tests/test_services_peoplefinder.py b/profiles/tests/test_services_peoplefinder.py index dc6b48a..e39f22d 100644 --- a/profiles/tests/test_services_peoplefinder.py +++ b/profiles/tests/test_services_peoplefinder.py @@ -71,6 +71,25 @@ def test_update(peoplefinder_profile, combined_profile): assert peoplefinder_profile.grade == None +def test_update_team(peoplefinder_team): + + # Check the team name, cost code and description before update + assert peoplefinder_team.name == "Team1Name" + assert peoplefinder_team.description == "Team description" + assert peoplefinder_team.cost_code == "CC1" + + peoplefinder_services.update_team( + peoplefinder_team=peoplefinder_team, + name="New team name", + description="New Team Description", + cost_code=UNSET, + ) + # Check the team name, cost code and description after update + assert peoplefinder_team.name == "New team name" + assert peoplefinder_team.description == "New Team Description" + assert peoplefinder_team.cost_code is None + + def test_delete_from_database(peoplefinder_profile): obj_repr = str(peoplefinder_profile) peoplefinder_profile.refresh_from_db()