Sync DM chat name/icon on user changes
Add a signal to keep direct-message chat name and icon in sync when a user updates their username or avatar, and register it in AppConfig.ready. Also initialize a DM chat's name/icon on creation from the other member's username/avatar if those fields are missing, saving only the changed fields.
This commit is contained in:
@@ -6,3 +6,6 @@ class ChatConfig(AppConfig):
|
|||||||
name = 'social.chat'
|
name = 'social.chat'
|
||||||
|
|
||||||
label = "chat"
|
label = "chat"
|
||||||
|
|
||||||
|
def ready(self):
|
||||||
|
import social.chat.signals # noqa: F401
|
||||||
|
|||||||
35
backend/social/chat/signals.py
Normal file
35
backend/social/chat/signals.py
Normal file
@@ -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)
|
||||||
@@ -53,7 +53,19 @@ class ChatViewSet(viewsets.ModelViewSet):
|
|||||||
return Chat.objects.filter(Q(members=user) | Q(owner=user)).distinct()
|
return Chat.objects.filter(Q(members=user) | Q(owner=user)).distinct()
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
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
|
# Member management
|
||||||
|
|||||||
Reference in New Issue
Block a user