Improve user search, DB nulls, and chat UI
Change username filter to use icontains for partial/case-insensitive matching. In CustomUser.save, introduce _NULLABLE_CHAR_FIELDS and convert empty string char fields to None to ensure nullable fields are stored consistently. Update CreateChatModal to always show a subtitle combining the user's full name and account creation date (joined with " · "), improving UI information.
This commit is contained in:
@@ -4,7 +4,7 @@ from django.contrib.auth import get_user_model
|
|||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
class UserFilter(django_filters.FilterSet):
|
class UserFilter(django_filters.FilterSet):
|
||||||
username = django_filters.CharFilter(field_name="username", lookup_expr="exact")
|
username = django_filters.CharFilter(field_name="username", lookup_expr="icontains")
|
||||||
role = django_filters.CharFilter(field_name="role", lookup_expr="exact")
|
role = django_filters.CharFilter(field_name="role", lookup_expr="exact")
|
||||||
email = django_filters.CharFilter(field_name="email", lookup_expr="icontains")
|
email = django_filters.CharFilter(field_name="email", lookup_expr="icontains")
|
||||||
phone_number = django_filters.CharFilter(field_name="phone_number", lookup_expr="icontains")
|
phone_number = django_filters.CharFilter(field_name="phone_number", lookup_expr="icontains")
|
||||||
|
|||||||
@@ -116,7 +116,13 @@ class CustomUser(SoftDeleteModel, AbstractUser):
|
|||||||
|
|
||||||
return super().delete(*args, **kwargs)
|
return super().delete(*args, **kwargs)
|
||||||
|
|
||||||
|
_NULLABLE_CHAR_FIELDS = ('phone_number', 'city', 'street', 'country', 'postal_code', 'email_verification_token')
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
|
for field in self._NULLABLE_CHAR_FIELDS:
|
||||||
|
if not getattr(self, field):
|
||||||
|
setattr(self, field, None)
|
||||||
|
|
||||||
is_new = self._state.adding # True if object hasn't been saved yet
|
is_new = self._state.adding # True if object hasn't been saved yet
|
||||||
|
|
||||||
# Pre-save flags for new users
|
# Pre-save flags for new users
|
||||||
|
|||||||
@@ -292,13 +292,16 @@ export default function CreateChatModal({ open, onClose }: Props) {
|
|||||||
<div className="text-sm font-medium text-brand-text">
|
<div className="text-sm font-medium text-brand-text">
|
||||||
{user.username}
|
{user.username}
|
||||||
</div>
|
</div>
|
||||||
{(user.first_name || user.last_name) && (
|
<div className="truncate text-xs text-brand-text/50">
|
||||||
<div className="truncate text-xs text-brand-text/50">
|
{[
|
||||||
{[user.first_name, user.last_name]
|
[user.first_name, user.last_name].filter(Boolean).join(" "),
|
||||||
.filter(Boolean)
|
user.create_time
|
||||||
.join(" ")}
|
? new Date(user.create_time).toLocaleDateString()
|
||||||
</div>
|
: null,
|
||||||
)}
|
]
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(" · ")}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{selectedUsers.some((s) => s.id === user.id) && (
|
{selectedUsers.some((s) => s.id === user.id) && (
|
||||||
<FiCheck size={14} className="shrink-0 text-brand-accent" />
|
<FiCheck size={14} className="shrink-0 text-brand-accent" />
|
||||||
|
|||||||
Reference in New Issue
Block a user