diff --git a/backend/social/chat/apps.py b/backend/social/chat/apps.py index bdfbeb0..dd7ad1f 100644 --- a/backend/social/chat/apps.py +++ b/backend/social/chat/apps.py @@ -6,3 +6,6 @@ class ChatConfig(AppConfig): name = 'social.chat' label = "chat" + + def ready(self): + import social.chat.signals # noqa: F401 diff --git a/backend/social/chat/signals.py b/backend/social/chat/signals.py new file mode 100644 index 0000000..8f20c3d --- /dev/null +++ b/backend/social/chat/signals.py @@ -0,0 +1,35 @@ +from django.conf import settings +from django.db.models.signals import post_save +from django.dispatch import receiver + + +@receiver(post_save, sender=settings.AUTH_USER_MODEL) +def sync_dm_chat_identity(sender, instance, created, update_fields, **kwargs): + """Keep DM chat name/icon in sync when a user updates their username or avatar.""" + if created: + return + + changed = set(update_fields) if update_fields else None # None = full save + username_changed = changed is None or 'username' in changed + avatar_changed = changed is None or 'avatar' in changed + + if not (username_changed or avatar_changed): + return + + from .models import Chat + + dm_chats = Chat.objects.filter( + chat_type=Chat.ChatType.DM, + members=instance, + ).exclude(owner=instance) + + if not dm_chats.exists(): + return + + update_kwargs = {} + if username_changed: + update_kwargs['name'] = instance.username + if avatar_changed: + update_kwargs['icon'] = instance.avatar.name if instance.avatar else None + + dm_chats.update(**update_kwargs) diff --git a/backend/social/chat/views.py b/backend/social/chat/views.py index 0128422..bd8e004 100644 --- a/backend/social/chat/views.py +++ b/backend/social/chat/views.py @@ -53,7 +53,19 @@ class ChatViewSet(viewsets.ModelViewSet): return Chat.objects.filter(Q(members=user) | Q(owner=user)).distinct() def perform_create(self, serializer): - serializer.save(owner=self.request.user) + chat = serializer.save(owner=self.request.user) + if chat.chat_type == Chat.ChatType.DM: + other = chat.members.exclude(pk=self.request.user.pk).first() + if other: + update_fields = [] + if not chat.name: + chat.name = other.username + update_fields.append('name') + if not chat.icon and other.avatar: + chat.icon = other.avatar + update_fields.append('icon') + if update_fields: + chat.save(update_fields=update_fields) # ------------------------------------------------------------------ # Member management