124 lines
4.5 KiB
Python
124 lines
4.5 KiB
Python
#!/usr/bin/env python
|
||
"""
|
||
Скрипт для проверки доступа к чатам
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
|
||
import django
|
||
|
||
# Настройка Django
|
||
sys.path.insert(0, os.path.dirname(__file__))
|
||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "eusrr_backend.settings")
|
||
django.setup()
|
||
|
||
from django.contrib.auth import get_user_model
|
||
from django.db.models import Q
|
||
|
||
from communications.models import Chat, ChatMembership
|
||
|
||
User = get_user_model()
|
||
|
||
|
||
def check_chat_access():
|
||
print("=" * 60)
|
||
print("ПРОВЕРКА ДОСТУПА К ЧАТАМ")
|
||
print("=" * 60)
|
||
|
||
# Получаем текущего пользователя (первого активного)
|
||
users = User.objects.filter(is_active=True)
|
||
if not users.exists():
|
||
print("❌ Нет активных пользователей!")
|
||
return
|
||
|
||
print(f"\n📋 Всего активных пользователей: {users.count()}")
|
||
for user in users[:5]:
|
||
print(f" - {user.username} (ID: {user.id})")
|
||
|
||
# Проверяем чаты
|
||
print(f"\n📨 Всего чатов в системе: {Chat.objects.count()}")
|
||
|
||
for chat in Chat.objects.all()[:10]:
|
||
print(f"\n{'=' * 60}")
|
||
print(f"📌 Чат ID: {chat.id}")
|
||
print(f" Тип: {chat.type}")
|
||
print(f" Название: {chat.name or '(без названия)'}")
|
||
print(f" Создан: {chat.created_at}")
|
||
|
||
if chat.type == "private":
|
||
participants = chat.participants.all()
|
||
print(
|
||
f" Участники (через participants): {[u.username for u in participants]}"
|
||
)
|
||
|
||
if chat.type == "group" or chat.type == "channel":
|
||
# Для групповых чатов и каналов показываем участников
|
||
participants = chat.participants.all()
|
||
if participants.exists():
|
||
print(f" Участники: {[u.username for u in participants[:5]]}")
|
||
|
||
# Для каналов может быть привязан объект через GenericFK
|
||
if chat.context_object:
|
||
print(
|
||
f" Привязан к: {chat.context_object} (тип: {chat.context_content_type})"
|
||
)
|
||
|
||
# Проверяем membership
|
||
memberships = ChatMembership.objects.filter(chat=chat)
|
||
if memberships.exists():
|
||
print(
|
||
f" Участники (через ChatMembership): {[m.user.username for m in memberships]}"
|
||
)
|
||
|
||
# Проверяем доступ для каждого пользователя
|
||
print("\n Доступ пользователей к этому чату:")
|
||
for user in users[:3]:
|
||
membership_chat_ids = ChatMembership.objects.filter(user=user).values_list(
|
||
"chat_id", flat=True
|
||
)
|
||
|
||
has_access = (
|
||
Chat.objects.filter(
|
||
Q(type="global")
|
||
| Q(type="private", participants=user)
|
||
| Q(type="group", participants=user)
|
||
| Q(type="channel", participants=user)
|
||
| Q(id__in=membership_chat_ids)
|
||
)
|
||
.filter(id=chat.id)
|
||
.exists()
|
||
)
|
||
|
||
status = "✅" if has_access else "❌"
|
||
print(
|
||
f" {status} {user.username}: {'Доступ есть' if has_access else 'Доступа нет'}"
|
||
)
|
||
|
||
if not has_access:
|
||
# Детальная проверка
|
||
is_global = chat.type == "global"
|
||
is_private = (
|
||
chat.type == "private"
|
||
and chat.participants.filter(id=user.id).exists()
|
||
)
|
||
is_group = (
|
||
chat.type == "group"
|
||
and chat.participants.filter(id=user.id).exists()
|
||
)
|
||
is_channel = (
|
||
chat.type == "channel"
|
||
and chat.participants.filter(id=user.id).exists()
|
||
)
|
||
is_member = chat.id in membership_chat_ids
|
||
|
||
print(f" - Глобальный: {is_global}")
|
||
print(f" - Личный участник: {is_private}")
|
||
print(f" - Группа: {is_group}")
|
||
print(f" - Канал: {is_channel}")
|
||
print(f" - Через membership: {is_member}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
check_chat_access()
|