diff --git a/backend/POSITION_PERMISSIONS_TESTING.md b/backend/POSITION_PERMISSIONS_TESTING.md index 66d283e3..b53a0893 100644 --- a/backend/POSITION_PERMISSIONS_TESTING.md +++ b/backend/POSITION_PERMISSIONS_TESTING.md @@ -451,5 +451,257 @@ WHERE employees_position_groups.position_id = ? --- **Документ создан:** 2025-01-XX -**Последнее обновление:** После фикса Permission creation pattern -**Статус:** 🔄 Отладка тестовой инфраструктуры +**Последнее обновление:** ✅ ВСЕ ТЕСТЫ ПРОШЛИ (13/13 PASSED) +**Статус:** ✅ Готово к production тестированию + +## ВАЖНО: Что Делать Дальше + +### ✅ Что Мы Выяснили + +**Тесты показали, что логика `PositionRoleBackend` работает ПРАВИЛЬНО!** + +- ✅ Пользователи с должностями получают права из групп +- ✅ Права обновляются при смене должности +- ✅ Права удаляются при снятии должности +- ✅ `has_perm()` и `get_all_permissions()` работают корректно +- ✅ Добавлена проверка `is_active` (исправили баг) + +### 🔍 Где Искать Проблему + +Если кнопки **всё ещё не появляются** в production, проблема НЕ в коде, а в: + +1. **Кэширование прав Django** + - Django кэширует права в `_perm_cache` и `_user_perm_cache` + - После изменения должности нужен перелогин или очистка кэша + +2. **LDAP синхронизация групп** + - Проверить что `Position.groups` содержит правильные группы + - Проверить что `Group.permissions` содержит нужные права + +3. **Порядок AUTHENTICATION_BACKENDS** + - `PositionRoleBackend` должен быть в списке (сейчас на 4 месте ✅) + - Возможно другие backend'ы блокируют его работу + +### 📋 Чеклист Отладки Production + +#### Шаг 1: Проверить Права в Django Shell + +```python +from django.contrib.auth import get_user_model +User = get_user_model() + +# Замените на реального пользователя +user = User.objects.get(username='имя_пользователя') + +print(f"1. Position: {user.position}") +print(f"2. Position Groups: {user.position.groups.all() if user.position else 'NO POSITION'}") + +if user.position: + for group in user.position.groups.all(): + print(f" - Group: {group.name}") + print(f" Permissions: {list(group.permissions.values_list('codename', flat=True))}") + +print(f"\n3. User Permissions:") +print(f" All Permissions: {user.get_all_permissions()}") +print(f" Has feed.publish_company_post: {user.has_perm('feed.publish_company_post')}") +print(f" Has documents.add_document: {user.has_perm('documents.add_document')}") +``` + +**Ожидаемый результат:** +- `Position` должен быть не `None` +- `Position.groups` должны содержать группы +- `Group.permissions` должны включать нужные права +- `user.get_all_permissions()` должен возвращать права из должности +- `user.has_perm('feed.publish_company_post')` должен быть `True` + +#### Шаг 2: Проверить Базу Данных + +```sql +-- Проверить связь User → Employee → Position +SELECT u.username, e.id, p.name +FROM auth_user u +JOIN employees_employee e ON e.user_id = u.id +LEFT JOIN employees_position p ON e.position_id = p.id +WHERE u.username = 'имя_пользователя'; + +-- Проверить связь Position → Groups +SELECT p.name AS position, g.name AS group_name +FROM employees_position p +JOIN employees_position_groups pg ON pg.position_id = p.id +JOIN auth_group g ON pg.group_id = g.id +WHERE p.id = ; + +-- Проверить связь Group → Permissions +SELECT g.name AS group_name, p.codename +FROM auth_group g +JOIN auth_group_permissions gp ON gp.group_id = g.id +JOIN auth_permission p ON gp.permission_id = p.id +WHERE g.id IN ( + SELECT group_id FROM employees_position_groups + WHERE position_id = +); +``` + +#### Шаг 3: Очистить Кэш Прав + +```python +from django.contrib.auth import get_user_model +User = get_user_model() + +user = User.objects.get(username='имя_пользователя') + +# Очистить кэши прав +if hasattr(user, '_perm_cache'): + delattr(user, '_perm_cache') +if hasattr(user, '_user_perm_cache'): + delattr(user, '_user_perm_cache') + +# Или просто получить fresh instance +user = User.objects.get(id=user.id) + +# Проверить снова +print(user.has_perm('feed.publish_company_post')) +``` + +#### Шаг 4: Проверить Template Context + +В шаблоне `feed/feed_list.html`: +```django +{# DEBUG: Покажите права пользователя #} +{% if user.is_authenticated %} +

User: {{ user.username }}

+

Position: {{ user.position }}

+

Has publish_company_post: {{ perms.feed.publish_company_post }}

+

Has publish_department_post: {{ perms.feed.publish_department_post }}

+

Is Staff: {{ user.is_staff }}

+{% endif %} +``` + +#### Шаг 5: Проверить Middleware + +В `settings.py` убедитесь что есть: +```python +MIDDLEWARE = [ + ... + 'django.contrib.auth.middleware.AuthenticationMiddleware', + ... +] +``` + +#### Шаг 6: Перезапустить Сервер + +```bash +# Остановить +Ctrl+C + +# Очистить кэш (если используется Redis/Memcached) +python manage.py shell +>>> from django.core.cache import cache +>>> cache.clear() +>>> exit() + +# Запустить снова +python manage.py runserver +``` + +#### Шаг 7: Перелогинить Пользователя + +- Попросите пользователя выйти из системы +- Войти заново +- Проверить видимость кнопок + +### 🐛 Возможные Проблемы + +#### Проблема 1: Position.groups пустые + +**Симптом:** `user.position.groups.all()` возвращает пустой список + +**Решение:** +```python +from employees.models import Position +from django.contrib.auth.models import Group + +# Найти или создать группу +pub_group = Group.objects.get(name="publishers") + +# Назначить группу должности +position = Position.objects.get(name="Инженер") +position.groups.add(pub_group) +``` + +#### Проблема 2: Group.permissions пустые + +**Симптом:** `group.permissions.all()` возвращает пустой список + +**Решение:** +```python +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType + +# Найти Content Type +ct = ContentType.objects.get(app_label="feed", model="post") + +# Найти или создать Permission +perm = Permission.objects.filter( + codename="publish_company_post", + content_type=ct +).first() + +if not perm: + perm = Permission.objects.create( + codename="publish_company_post", + name="Can publish company post", + content_type=ct + ) + +# Добавить в группу +pub_group = Group.objects.get(name="publishers") +pub_group.permissions.add(perm) +``` + +#### Проблема 3: LDAP не синхронизирует группы + +**Симптом:** В LDAP нет группы `POS_Инженер` + +**Решение:** +```python +from employees.models import Position +from employees.ldap.services import PositionService + +position = Position.objects.get(name="Инженер") +dn = PositionService._ensure_position_group(position) +print(f"LDAP Group DN: {dn}") +``` + +### � Итоговая Таблица Результатов Тестов + +| Тест | Статус | Что проверяет | +|------|--------|---------------| +| test_user_without_position_has_no_permissions | ✅ PASS | Без должности = нет прав | +| test_user_with_position_gets_permissions | ✅ PASS | С должностью = права есть | +| test_position_change_updates_permissions | ✅ PASS | Смена должности обновляет права | +| test_remove_position_removes_permissions | ✅ PASS | Удаление должности убирает права | +| test_multiple_users_with_same_position | ✅ PASS | Несколько user одна должность | +| test_superuser_has_all_permissions | ✅ PASS | Superuser имеет все права | +| test_position_group_permissions_are_additive | ✅ PASS | Несколько групп складываются | +| test_get_all_permissions_includes_position_perms | ✅ PASS | get_all_permissions() работает | +| test_position_without_groups_grants_no_permissions | ✅ PASS | Должность без групп = нет прав | +| test_inactive_user_has_no_permissions | ✅ PASS | Неактивный user = нет прав | +| test_position_permissions_with_direct_user_permissions | ✅ PASS | Прямые + должность аддитивны | +| test_feed_permissions_through_position | ✅ PASS | Реальные feed права работают | +| test_documents_permissions_through_position | ✅ PASS | Реальные document права работают | + +### 🎯 Рекомендации + +1. **Запустить отладочный скрипт** (Шаг 1) чтобы увидеть текущее состояние +2. **Проверить LDAP синхронизацию** группы для должности +3. **Очистить кэш** и перелогинить пользователя +4. **Если проблема остаётся:** Показать вывод отладочного скрипта + +**Результат должен быть:** Кнопки появляются у пользователей с нужными должностями! 🎉 + +--- + +**Документ создан:** 2025-01-XX +**Последнее обновление:** ✅ ВСЕ ТЕСТЫ ПРОШЛИ (13/13 PASSED) +**Статус:** ✅ Готово к production тестированию