diff --git a/src/core/models/users.py b/src/core/models/users.py index 134d8cc414d51ce4e9f022af77a32f78eea68b56..07d73c7325b7701bd08d82be117b2506bb1ba364 100644 --- a/src/core/models/users.py +++ b/src/core/models/users.py @@ -1,5 +1,6 @@ import logging import re +from contextlib import suppress from pathlib import Path from random import choices from string import ascii_lowercase, digits @@ -243,8 +244,30 @@ class PlatformUser(AbstractUser): def is_person(self): return self.user_type in self.PERSON_TYPES + @cached_property + def name(self) -> str: + """ + Shows the display name with username if they differ. + + This is used to make the name available in a way matching other models (e.g. for invitations). + + ReturnsL + str: The users display name. + """ + name = self.display_name + if self.first_name or self.last_name: + name += f' <{self.username}>' + return name + def get_display_name(self): - result = self.username if self.user_type != self.Type.SPEAKER else (self.first_name + ' ' + self.last_name).strip() + result = '' + if self.first_name: + result += self.first_name + if self.last_name: + result += f' {self.last_name}' + result = result.strip() + if not result: + result = self.username if self.pronouns: result += f' ({self.pronouns})' return result @@ -344,6 +367,8 @@ class PlatformUser(AbstractUser): # update the display name self.display_name = self.get_display_name() + with suppress(AttributeError): + del self.name # delete the cached property to force a refresh return super().save(*args, update_fields=update_fields, **kwargs) diff --git a/src/core/tests/users.py b/src/core/tests/users.py index 8f7d86b228aba0fc438f70386b91d574d5547b1c..60f308c2916dcdb41777a1c4f2ae17d19f967977 100644 --- a/src/core/tests/users.py +++ b/src/core/tests/users.py @@ -163,3 +163,34 @@ class UserRegistrationTests(TestCase): self.assertEqual(response.status_code, 302) user = PlatformUser.objects.get(username=username) self.assertTrue(len(user.slug) > 0) + + +class UserNameTests(TestCase): + def setUp(self) -> None: + self.user = PlatformUser(username='bernd') + self.user.save() + + def test_name_output(self): + self.assertEqual(self.user.display_name, 'bernd') + self.assertEqual(self.user.name, 'bernd') + + self.user.first_name = 'Bernd' + self.user.save() + self.user.refresh_from_db() + + self.assertEqual(self.user.display_name, 'Bernd') + self.assertEqual(self.user.name, 'Bernd <bernd>') + + self.user.last_name = 'Brot' + self.user.save() + self.user.refresh_from_db() + + self.assertEqual(self.user.display_name, 'Bernd Brot') + self.assertEqual(self.user.name, 'Bernd Brot <bernd>') + + self.user.pronouns = 'das' + self.user.save() + self.user.refresh_from_db() + + self.assertEqual(self.user.display_name, 'Bernd Brot (das)') + self.assertEqual(self.user.name, 'Bernd Brot (das) <bernd>') diff --git a/src/plainui/jinja2/plainui/user.html.j2 b/src/plainui/jinja2/plainui/user.html.j2 index 6f8f97ea3062c238e9159a5a7a5534ad80d6181f..32c954191bb1da131ad820aafac90f83918e3bf3 100644 --- a/src/plainui/jinja2/plainui/user.html.j2 +++ b/src/plainui/jinja2/plainui/user.html.j2 @@ -14,7 +14,7 @@ {% endblock title %} {% block content %} - {{ navMacro.top_nav(_("User Profile") ) }} + {{ navMacro.top_nav(_("User Profile %(username)s", username=display_user.username) ) }} <div class="hub-vlayout"> <div class="hub-row"> diff --git a/src/plainui/locale/de/LC_MESSAGES/django.po b/src/plainui/locale/de/LC_MESSAGES/django.po index 4d7fa38288aa558ebd095fd0fff06635de9b0d20..2d02369dfcd82ff74c89588de6c4b667f5a2848e 100644 --- a/src/plainui/locale/de/LC_MESSAGES/django.po +++ b/src/plainui/locale/de/LC_MESSAGES/django.po @@ -1087,5 +1087,6 @@ msgstr "Kommende Events" msgid "%(conf)s - User %(name)s" msgstr "" -msgid "User Profile" -msgstr "Profil" +#, python-format +msgid "User Profile %(username)s" +msgstr "Profil: %(username)s" diff --git a/src/plainui/locale/en/LC_MESSAGES/django.po b/src/plainui/locale/en/LC_MESSAGES/django.po index 9471456f32cfeff75332c7b02c8f442ffdf83014..3e63a2246b0737894c1febf00fd4f8c91d4a45b1 100644 --- a/src/plainui/locale/en/LC_MESSAGES/django.po +++ b/src/plainui/locale/en/LC_MESSAGES/django.po @@ -1087,5 +1087,6 @@ msgstr "" msgid "%(conf)s - User %(name)s" msgstr "" -msgid "User Profile" -msgstr "" +#, python-format +msgid "User Profile %(username)s" +msgstr "User Profile %(username)s"