diff --git a/backend/communications/management/commands/update_department_chat_names.py b/backend/communications/management/commands/update_department_chat_names.py new file mode 100644 index 00000000..9cb0099b --- /dev/null +++ b/backend/communications/management/commands/update_department_chat_names.py @@ -0,0 +1,41 @@ +""" +Management command для обновления названий основных чатов отделов +""" +from django.core.management.base import BaseCommand +from communications.models import Chat + + +class Command(BaseCommand): + help = 'Обновляет названия основных чатов отделов' + + def handle(self, *args, **options): + # Находим все основные чаты отделов без названия + chats = Chat.objects.filter( + type='department', + is_main=True + ).select_related('department') + + updated = 0 + for chat in chats: + if not chat.name or chat.name == '': + old_name = chat.name or '(пусто)' + chat.name = f"Основной чат {chat.department.name}" + chat.save() + self.stdout.write( + self.style.SUCCESS( + f'✓ Обновлен чат ID {chat.id}: ' + f'"{old_name}" → "{chat.name}"' + ) + ) + updated += 1 + + if updated == 0: + self.stdout.write( + self.style.WARNING('Нет чатов для обновления') + ) + else: + self.stdout.write( + self.style.SUCCESS( + f'\n✓ Обновлено названий: {updated}' + ) + ) diff --git a/backend/communications/signals.py b/backend/communications/signals.py index bfcf20ca..429bc6cb 100644 --- a/backend/communications/signals.py +++ b/backend/communications/signals.py @@ -16,7 +16,12 @@ def create_main_department_chat(sender, instance, created, **kwargs): if not Chat.objects.filter( type="department", department=instance, is_main=True ).exists(): - Chat.objects.create(type="department", department=instance, is_main=True) + Chat.objects.create( + type="department", + department=instance, + is_main=True, + name=f"Основной чат {instance.name}" + ) @receiver(pre_save, sender='communications.Chat') diff --git a/backend/static/css/components/chat-list-enhanced.css b/backend/static/css/components/chat-list-enhanced.css index e892b86f..7217bf4d 100644 --- a/backend/static/css/components/chat-list-enhanced.css +++ b/backend/static/css/components/chat-list-enhanced.css @@ -86,7 +86,7 @@ .card-icon img { width: 44px; height: 44px; - border-radius: 8px; /* Овальная форма вместо круглой */ + border-radius: 50%; /* Круглая форма */ object-fit: cover; border: 2px solid var(--bs-border-color); } diff --git a/backend/templates/communications/chat_list.html b/backend/templates/communications/chat_list.html index 6ce2bb28..ce03c72c 100644 --- a/backend/templates/communications/chat_list.html +++ b/backend/templates/communications/chat_list.html @@ -101,6 +101,11 @@
{{ chat.name|default:"Глобальный чат" }} + {% if chat.is_main %} + + Основной + + {% endif %} {{ chat.messages.count }} @@ -129,6 +134,11 @@
@@ -157,12 +167,26 @@ data-chat-id="{{ chat.pk }}" data-type="department" data-last-ts="{% if last %}{{ last.created_at|date:'U' }}000{% else %}{{ chat.created_at|date:'U' }}000{% endif %}" - data-haystack="{{ chat.department.name }}"> -
+ data-haystack="{{ chat.name|default:'Основной чат' }} {{ chat.department.name }}"> + + {# Аватар чата отдела или иконка #} +
+ {% if chat.avatar %} + {{ chat.name|default:'Основной чат' }} + {% else %} + + {% endif %} +
+
- Чат отдела: {{ chat.department.name }} + {{ chat.name|default:"Основной чат" }} + {% if chat.is_main %} + + Основной + + {% endif %} {{ chat.messages.count }} @@ -171,14 +195,18 @@ data-unread>+{{ chat.unread_count|default:0 }}
+ {# Название отдела таким же шрифтом как последнее сообщение #} + + {{ chat.department.name }} + {% if last %} - {{ last.created_at|date:"d.m.Y H:i" }} · + · {{ last.created_at|date:"d.m.Y H:i" }} · {{ last.author.get_full_name|default:last.author.username }}: - {{ last.content|default:"(вложение)"|truncatechars:120 }} + {{ last.content|default:"(вложение)"|truncatechars:100 }} {% else %} - Сообщений пока нет. + · Сообщений пока нет {% endif %}
@@ -191,6 +219,11 @@ @@ -220,12 +253,22 @@ data-type="private" data-last-ts="{% if last %}{{ last.created_at|date:'U' }}000{% else %}{{ chat.created_at|date:'U' }}000{% endif %}" data-haystack="{% for u in chat.participants.all %}{% if u != user %} {{ u.get_full_name|default:u.username }}{% endif %}{% endfor %}"> + + {# Аватар собеседника #}
{% with p0=chat.participants.all.0 p1=chat.participants.all.1 %} - {% if p0 and p0 != user and p0.avatar %} - {{ p0.get_full_name|default:p0.username }} - {% elif p1 and p1 != user and p1.avatar %} - {{ p1.get_full_name|default:p1.username }} + {% if p0 and p0 != user %} + {% if p0.avatar %} + {{ p0.get_full_name|default:p0.username }} + {% else %} + + {% endif %} + {% elif p1 and p1 != user %} + {% if p1.avatar %} + {{ p1.get_full_name|default:p1.username }} + {% else %} + + {% endif %} {% else %} {% endif %} @@ -317,13 +360,19 @@ data-unread>+{{ chat.unread_count|default:0 }}
+ {# Описание группы если есть #} + {% if chat.description %} + + {{ chat.description|truncatechars:80 }} + + {% endif %} {% if last %} - {{ last.created_at|date:"d.m.Y H:i" }} · + {% if chat.description %}
{% endif %}{{ last.created_at|date:"d.m.Y H:i" }} · {{ last.author.get_full_name|default:last.author.username }}: - {{ last.content|default:"(вложение)"|truncatechars:120 }} + {{ last.content|default:"(вложение)"|truncatechars:100 }}
- {% else %} + {% elif not chat.description %} Сообщений пока нет. {% endif %}