Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 31 additions & 2 deletions tapir/welcomedesk/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,25 @@
)


def split_name(full_name):
"Currently, only full-names are stored for co-purchaser. This could be replaced by a new Co-Purchaser-model storing first and last name separately and make this function obsolete (here)"
if not full_name:
return "", ""
parts = full_name.strip().split()
if len(parts) == 1:
return parts[0], ""
i_split = -1

prefixes = {"von", "van", "de", "der", "den", "del", "da", "du", "le", "la"}
if any(part.lower() in prefixes for part in parts):
for i, part in enumerate(parts):
if part.lower() in prefixes:
i_split = i
break

return " ".join(parts[:i_split]), " ".join(parts[i_split:])


class ShareOwnerForWelcomeDeskSerializer(serializers.ModelSerializer):
display_name = serializers.SerializerMethodField()
can_shop = serializers.SerializerMethodField()
Expand Down Expand Up @@ -55,13 +74,23 @@ def get_can_shop(self, share_owner: ShareOwner) -> bool:
def get_co_purchaser(share_owner: ShareOwner) -> str | None:
if not share_owner.user:
return None
return share_owner.user.co_purchaser
first_name, last_name = split_name(share_owner.user.co_purchaser)
if not last_name:
return first_name

initials = ".".join(word[0] for word in last_name.split()) + "."
return f"{first_name} {initials}".strip()

@staticmethod
def get_co_purchaser_2(share_owner: ShareOwner) -> str | None:
if not share_owner.user:
return None
return share_owner.user.co_purchaser_2
first_name, last_name = split_name(share_owner.user.co_purchaser_2)
if not last_name:
return first_name

initials = ".".join(word[0] for word in last_name.split()) + "."
return f"{first_name} {initials}".strip()

def get_warnings(self, share_owner: ShareOwner) -> list[str]:
return WelcomeDeskWarningsService.build_warnings(
Expand Down
21 changes: 21 additions & 0 deletions tapir/welcomedesk/tests/test_split_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from tapir.welcomedesk.serializers import split_name
import pytest


@pytest.mark.parametrize(
"full_name,expected_first,expected_last",
[
("", "", ""),
("John", "John", ""),
("John Doe", "John", "Doe"),
("Jean Paul Sartre", "Jean Paul", "Sartre"),
("Annegret Kramp-Karrenbauer", "Annegret", "Kramp-Karrenbauer"),
("Marie-Louise von Franz", "Marie-Louise", "von Franz"),
("Pellegrino van Dijk", "Pellegrino", "van Dijk"),
(" Giacinto De Sousa", "Giacinto", "De Sousa"),
("Alyssa van der Noot", "Alyssa", "van der Noot"),
("Anton Berta; Caesar Emil", "Anton Berta; Caesar", "Emil"),
],
)
def test_split_name_manual(full_name, expected_first, expected_last):
assert split_name(full_name) == (expected_first, expected_last)