Corp/backend/scripts/diagnostic/check_chat_access.py
Игорь Надеин ee6e840252 Реорганизация документации и скриптов проекта
- Создана структура docs/ с категориями: completed, guides, architecture, diagnostic, in-progress, reports
- Перемещено 47+ MD файлов из корня проекта в docs/
- Удалено 6 устаревших/дублирующихся файлов
- Создана структура backend/scripts/ для тестов и утилит
- Перемещено 35 Python скриптов в backend/scripts/
- Создана структура backend/docs/ для технической документации
- Перемещено 12 MD файлов backend в backend/docs/
- Перемещены LDAP тестовые данные в backend/tests/fixtures/
- Добавлены README файлы для навигации
- Добавлены правила в .github/copilot-instructions.md для размещения документации

Результат:
- Корень проекта: только README.md
- Корень backend/: только manage.py и Django приложения
- Вся документация организована в структурированные папки
2025-12-26 13:49:51 +03:00

94 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 communications.models import Chat, ChatMembership
from django.db.models import Q
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 == "department":
print(f" Отдел: {chat.department}")
if chat.department:
# Используем get_participants для department чатов
dept_users = chat.get_participants
print(f" Сотрудники отдела: {[u.username or u.id for u in dept_users[:5]]}")
# Проверяем membership
memberships = ChatMembership.objects.filter(chat=chat)
if memberships.exists():
print(f" Участники (через ChatMembership): {[m.user.username for m in memberships]}")
# Проверяем доступ для каждого пользователя
print(f"\n Доступ пользователей к этому чату:")
for user in users[:3]:
departments = user.departments
membership_chat_ids = ChatMembership.objects.filter(
user=user
).values_list('chat_id', flat=True)
has_access = Chat.objects.filter(
Q(type="global")
| Q(type="department", department__in=departments)
| Q(type="private", 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_dept = chat.type == "department" and departments.filter(id=chat.department_id).exists()
is_private = chat.type == "private" and chat.participants.filter(id=user.id).exists()
is_member = chat.id in membership_chat_ids
print(f" - Глобальный: {is_global}")
print(f" - Отдел: {is_dept}")
print(f" - Личный участник: {is_private}")
print(f" - Через membership: {is_member}")
print(f" - Отделы пользователя: {[d.name for d in departments]}")
if __name__ == "__main__":
check_chat_access()