Coverage for functions \ flipdare \ util \ user_util.py: 93%
42 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
1#!/usr/bin/env python
2# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved.
3#
4# This file is part of Flipdare's proprietary software and contains
5# confidential and copyrighted material. Unauthorised copying,
6# modification, distribution, or use of this file is strictly
7# prohibited without prior written permission from Flipdare Pty Ltd.
8#
9# This software includes third-party components licensed under MIT,
10# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details.
11#
14from flipdare.app_globals import string_has_alpha
17class UserUtil:
19 def __init__(self) -> None:
20 pass
22 @staticmethod
23 def contact_name(email: str, display_name: str | None = None, name: str | None = None) -> str:
24 if display_name and string_has_alpha(display_name):
25 return display_name
26 if name and string_has_alpha(name):
27 return name
29 name = email.split("@", maxsplit=1)[0]
30 if "." not in name:
31 # just return the first part of the email as the name, capitalized
32 return name.capitalize()
34 return UserUtil.guess_name_from_email(email)
36 @staticmethod
37 def safe_name(email: str, display_name: str | None = None, name: str | None = None) -> str:
38 if display_name and string_has_alpha(display_name):
39 return display_name
40 if name and string_has_alpha(name):
41 return name
43 # email must exist in a valid user
44 return UserUtil.guess_name_from_email(email)
46 @staticmethod
47 def guess_name_from_email(email: str) -> str:
48 """Extract name from email address."""
49 name = email.split("@", maxsplit=1)[0]
50 if "." not in name:
51 name = name.capitalize()
52 else:
53 firstname = name.split(".")[0]
54 firstname = firstname.capitalize()
56 lastname = name.split(".")[-1]
57 lastname = lastname.capitalize()
59 name = f"{firstname} {lastname}"
61 return name
63 @staticmethod
64 def split_name(name: str) -> tuple[str | None, str | None]:
65 """
66 Split full name into first and last name.
68 Returns:
69 Tuple of (first_name, last_name)
71 """
72 if name.strip() == "":
73 return None, None
75 name_parts = name.split()
76 if len(name_parts) == 1:
77 return name, None
79 first_name = name_parts[0]
80 last_name = " ".join(name_parts[1:]) if len(name_parts) > 1 else None
82 return first_name, last_name