From bd5b996dab81dee43261a88ac8cf35e0ff94bcd9 Mon Sep 17 00:00:00 2001 From: Untone Date: Tue, 12 Aug 2025 13:14:49 +0300 Subject: [PATCH] cleanup+uv --- docs/admin-panel.md | 9 -- .../progress/auth-decorator-fix-2025-08-12.md | 36 ----- .../e2e-delete-community-2024-12-19.md | 132 ------------------ .../e2e-delete-community-2025-08-01.md | 107 -------------- .../progress/https-mkcert-setup-2024-12-19.md | 86 ------------ .../nginx-configuration-fixes-2024-12-19.md | 0 docs/progress/uv-migration-2025-08-12.md | 99 ------------- docs/rbac-system.md | 21 --- tests/test_orm_coverage.py | 2 - 9 files changed, 492 deletions(-) delete mode 100644 docs/progress/auth-decorator-fix-2025-08-12.md delete mode 100644 docs/progress/e2e-delete-community-2024-12-19.md delete mode 100644 docs/progress/e2e-delete-community-2025-08-01.md delete mode 100644 docs/progress/https-mkcert-setup-2024-12-19.md delete mode 100644 docs/progress/nginx-configuration-fixes-2024-12-19.md delete mode 100644 docs/progress/uv-migration-2025-08-12.md diff --git a/docs/admin-panel.md b/docs/admin-panel.md index 70548c6d..e9d8e25c 100644 --- a/docs/admin-panel.md +++ b/docs/admin-panel.md @@ -580,15 +580,6 @@ mutation AdminUpdatePermissions { - Ограничения на размер выборки (max 100) - Оптимизированные SQL запросы с `joinedload` -## Миграция данных - -При переходе на новую RBAC систему используется функция: - -```python -from orm.community import migrate_old_roles_to_community_author -migrate_old_roles_to_community_author() -``` - Функция автоматически переносит роли из старых таблиц в новый формат CSV. ## Мониторинг и логирование diff --git a/docs/progress/auth-decorator-fix-2025-08-12.md b/docs/progress/auth-decorator-fix-2025-08-12.md deleted file mode 100644 index 4ff2ff18..00000000 --- a/docs/progress/auth-decorator-fix-2025-08-12.md +++ /dev/null @@ -1,36 +0,0 @@ -# Исправление декораторов авторизации - 2025-08-12 - -## Проблема -Ошибка в логах: `TypeError: Cannot return null for non-nullable field Author.slug` - -## Анализ -Проблема была в декораторах авторизации `login_required` и `login_accepted` в файле `services/auth.py`. Эти декораторы пытались создавать `Author` объекты при проверке авторизации, что приводило к возврату объектов с пустыми полями, включая `slug = None`. - -## Решение -1. **Убрал логику создания Author объектов** в декораторе `login_required` -2. **Убрал логику создания Author объектов** в декораторе `login_accepted` -3. **Убрал установку `author = None`** в контексте - -## Изменения в файлах -- `services/auth.py` - убрана логика создания автора в декораторах -- `requirements.dev.txt` - удалена зависимость pre-commit -- `.pre-commit-config.yaml` - удален файл конфигурации -- `.git/hooks/pre-commit` - удален hook - -## Принцип -Авторы должны создаваться только в резолверах при необходимости, а не в декораторах авторизации. Декораторы должны только проверять права доступа. - -## Коммиты -- `503bbc1` - fix: remove author creation from auth decorators -- `2b1c3c2` - chore: remove pre-commit configuration and dependencies -- `c8ff24e` - chore: remove pre-commit-config.yaml file - -## Статус -✅ Исправлено - декораторы авторизации больше не создают Author объекты -✅ Убрано - все настройки pre-commit удалены -✅ Протестировано - тесты проходят успешно - -## Следующие шаги -1. Протестировать на staging сервере -2. Проверить, что ошибка `Author.slug` больше не возникает -3. При необходимости добавить создание автора в конкретных резолверах diff --git a/docs/progress/e2e-delete-community-2024-12-19.md b/docs/progress/e2e-delete-community-2024-12-19.md deleted file mode 100644 index 0fe2bdcf..00000000 --- a/docs/progress/e2e-delete-community-2024-12-19.md +++ /dev/null @@ -1,132 +0,0 @@ -# E2E Тест Удаления Сообщества - Финальный Отчет - -**Дата:** 2024-12-19 -**Время:** 03:15 UTC -**Статус:** ✅ ОСНОВНАЯ ПРОБЛЕМА РЕШЕНА - -## 🎯 Цель -Исправить E2E тест удаления сообщества через браузер, который падал из-за ошибок авторизации и RBAC. - -## ✅ Достигнутые Результаты - -### 1. Исправлена критическая ошибка RBAC -- **Проблема:** `'dict' object has no attribute 'community_id' and no __dict__ for setting new attributes` -- **Причина:** Попытка установить `community_id` как атрибут у словаря `info.context` -- **Решение:** Изменен способ установки `community_id` в контекст GraphQL: - ```python - # Было: - info.context.community_id = community.id - - # Стало: - info.context["community_id"] = community.id - ``` - -### 2. Исправлена логика проверки прав в `delete_community` -- **Проблема:** Декоратор `@require_any_permission` вызывался до установки `community_id` в контекст -- **Решение:** Удален декоратор и добавлена ручная проверка прав внутри функции: - ```python - # Устанавливаем community_id в контекст ПЕРЕД проверкой прав - info.context["community_id"] = community.id - - # Ручная проверка прав - user_roles, community_id = get_user_roles_from_context(info) - has_permission = await roles_have_permission(user_roles, "community:delete_any", community_id) - ``` - -### 3. Исправлена работа с контекстом в RBAC -- **Проблема:** `get_user_roles_from_context` и `get_community_id_from_context` не работали с dict-контекстом -- **Решение:** Добавлена проверка типа контекста: - ```python - if isinstance(info.context, dict): - author_data = info.context.get("author", {}) - community_id = info.context.get("community_id") - else: - author_data = getattr(info.context, "author", {}) - community_id = getattr(info.context, "community_id", None) - ``` - -### 4. Подтверждена работа прав admin -- **Результат:** Роль `admin` корректно получает права `community:delete_any` и `community:update_any` -- **Подтверждение:** API-удаление сообщества работает успешно для `test_admin@discours.io` - -## 🧪 Тестирование - -### API Тест ✅ -```bash -python3 test_delete_existing_community.py -# Результат: {"success": true, "error": null} -``` - -### E2E Тест ✅ -```bash -pytest tests/test_community_delete_e2e_browser.py::TestCommunityDeleteE2EBrowser::test_community_delete_browser_workflow -v -s -# Результат: PASSED -``` - -**Логи успешного E2E теста:** -``` -✅ Найдено сообщество: Test Admin Community -🗑️ Удаляем сообщество... -✅ Кнопка удаления найдена -✅ Кнопка подтверждения найдена -✅ Сообщество удалено -✅ Модальное окно закрылось -🔍 Проверяем что сообщество удалено... -✅ Сообщество действительно удалено из списка -🎉 E2E тест удаления сообщества прошел успешно! -``` - -## 📁 Измененные Файлы - -1. **`resolvers/community.py`** - - Исправлена установка `community_id` в контекст - - Удален декоратор `@require_any_permission` - - Добавлена ручная проверка прав - -2. **`services/rbac.py`** - - Исправлена работа с dict-контекстом в `get_user_roles_from_context` - - Исправлена работа с dict-контекстом в `get_community_id_from_context` - -3. **`tests/test_community_delete_e2e_browser.py`** - - Обновлен slug тестового сообщества на существующее - -## 🔧 Технические Детали - -### Проблема с контекстом GraphQL -В Starlette/Ariadne контекст GraphQL часто является обычным словарем, а не объектом с атрибутами. Поэтому попытка присвоить атрибут `info.context.community_id = ...` приводила к ошибке. - -### Решение RBAC -Права проверяются в следующем порядке: -1. Установка `community_id` в контекст -2. Получение ролей пользователя из контекста -3. Проверка наличия прав `community:delete` или `community:delete_any` -4. Системные администраторы автоматически получают роль `admin` - -## 🚀 Следующие Шаги - -### Для полного завершения E2E тестов: -1. **Исправить остальные тесты** - использовать разные сообщества для каждого теста -2. **Добавить восстановление данных** - восстанавливать удаленные сообщества после тестов -3. **Улучшить селекторы** - проверить актуальность селекторов для всех элементов UI - -### Рекомендации: -- Использовать уникальные slug'и для каждого теста -- Добавить фикстуры для создания/удаления тестовых данных -- Рассмотреть использование транзакций для изоляции тестов - -## 📊 Статистика - -- **Время работы:** ~2 часа -- **Исправлено ошибок:** 3 критических -- **Файлов изменено:** 3 -- **Тестов исправлено:** 1 основной E2E тест -- **API тестов:** Все работают ✅ -- **E2E тестов:** Основной работает ✅ - -## 🎉 Заключение - -**ОСНОВНАЯ ПРОБЛЕМА РЕШЕНА!** - -E2E тест удаления сообщества через браузер теперь работает корректно. RBAC система функционирует правильно, права admin настроены корректно, и удаление сообществ через веб-интерфейс работает как ожидается. - -**Коммит для отката:** `[добавить хеш последнего коммита]` diff --git a/docs/progress/e2e-delete-community-2025-08-01.md b/docs/progress/e2e-delete-community-2025-08-01.md deleted file mode 100644 index d679060b..00000000 --- a/docs/progress/e2e-delete-community-2025-08-01.md +++ /dev/null @@ -1,107 +0,0 @@ -# Отчет о прогрессе - 19 декабря 2024 (E2E тест с браузером) - -## Задача: Исправление E2E теста удаления сообщества с браузером - -### 🔄 ТЕКУЩИЙ СТАТУС: В РАБОТЕ - -E2E тест `test_community_delete_e2e_browser.py` запускается и работает частично, но **основная цель не достигнута**. - -### ✅ ЧТО РАБОТАЕТ: - -#### 1. **Серверы запускаются корректно** -- ✅ Бэкенд сервер (порт 8000) запускается через `python3 dev.py` -- ✅ Фронтенд сервер (порт 3000) запускается через `npm run dev` -- ✅ Оба сервера отвечают на запросы - -#### 2. **Исправлены проблемы с импортами** -- ✅ Исправлен циклический импорт `CommunityAuthor` в `auth/internal.py` -- ✅ Исправлен импорт в `resolvers/community.py` -- ✅ Сервер запускается без ошибок импорта - -#### 3. **Исправлена передача author_id в контекст** -- ✅ Добавлен `author_id` в контекст GraphQL в `auth/handler.py` -- ✅ RBAC система теперь может получить `author_id` для проверки прав -- ✅ Исправлена ошибка "author_id не найден ни в context.author, ни в scope.auth" - -#### 4. **Добавлены права доступа** -- ✅ Пользователь `welcome@discours.io` получил права администратора в сообществе "Test Community" -- ✅ Создана запись `CommunityAuthor` с ролями `admin,editor,author` - -#### 5. **E2E тест работает частично** -- ✅ Браузер запускается корректно -- ✅ Авторизация в админ-панели работает -- ✅ Навигация на страницу сообществ работает -- ✅ Таблица сообществ загружается (57 строк) -- ✅ Сообщество "Test Community" находится в таблице -- ✅ Кнопка удаления находится и нажимается -- ✅ Модальное окно подтверждения открывается -- ✅ Кнопка подтверждения находится и нажимается - -### ❌ ПРОБЛЕМЫ: - -#### 1. **Основная проблема: Сообщество не удаляется** -- ❌ После нажатия кнопки подтверждения сообщество остается в таблице -- ❌ GraphQL мутация `delete_community` не выполняется или не удаляет сообщество -- ❌ Сообщество остается в базе данных - -#### 2. **Проблема с авторизацией** -- ❌ Логин через GraphQL возвращает `success: False` -- ❌ Токен не генерируется при авторизации -- ❌ Это может блокировать выполнение мутации удаления - -### 🔍 Диагностика: - -#### Проверка GraphQL API: -```bash -# GraphQL запрос работает -curl -X POST http://localhost:8000/graphql \ - -H "Content-Type: application/json" \ - -d '{"query": "query { get_communities_all { id name slug } }"}' -# ✅ Возвращает 57 сообществ -``` - -#### Проверка авторизации: -```bash -# Авторизация не работает -curl -X POST http://localhost:8000/graphql \ - -H "Content-Type: application/json" \ - -d '{"query": "mutation Login($email: String!, $password: String!) { login(email: $email, password: $password) { token success } }", "variables": {"email": "welcome@discours.io", "password": "password123"}}' -# ❌ Возвращает {"data": {"login": {"token": null, "success": false}}} -``` - -### 📋 Следующие шаги: - -1. **Исправить авторизацию**: - - Разобраться почему логин возвращает `success: False` - - Проверить хеширование паролей - - Возможно создать нового пользователя для тестирования - -2. **Проверить логи сервера**: - - Запустить сервер в режиме отладки - - Посмотреть что происходит при выполнении мутации `delete_community` - -3. **Тестировать удаление напрямую**: - - Использовать валидный токен для тестирования GraphQL мутации - - Проверить что сообщество действительно удаляется из БД - -4. **Исправить E2E тест**: - - Убедиться что авторизация работает в браузере - - Проверить что GraphQL запросы проходят через прокси - -### 📁 Измененные файлы: - -1. **`auth/handler.py`** - добавлен `author_id` в контекст GraphQL -2. **`auth/internal.py`** - исправлен циклический импорт `CommunityAuthor` -3. **`resolvers/community.py`** - исправлен импорт `CommunityAuthor` -4. **`test_delete.py`** - создан файл для тестирования удаления через GraphQL - -### 🚀 Статус: 🔄 В РАБОТЕ - -**E2E тест запускается и работает частично, но основная цель (удаление сообщества) не достигнута.** - -Ключевые проблемы: -- ❌ Авторизация не работает (`success: False`) -- ❌ Сообщество не удаляется из таблицы после подтверждения -- ❌ GraphQL мутация `delete_community` не выполняется корректно - -Нужно исправить авторизацию и проверить логи сервера для диагностики проблемы с удалением. diff --git a/docs/progress/https-mkcert-setup-2024-12-19.md b/docs/progress/https-mkcert-setup-2024-12-19.md deleted file mode 100644 index d06f26f0..00000000 --- a/docs/progress/https-mkcert-setup-2024-12-19.md +++ /dev/null @@ -1,86 +0,0 @@ -# Настройка HTTPS с mkcert для локальной разработки - -**Дата**: 2024-12-19 -**Время**: 04:37 -**Статус**: ✅ Завершено - -## Выполненные задачи - -### 1. Проверка и установка mkcert -- ✅ mkcert уже установлен в системе (`/opt/homebrew/bin/mkcert`) -- ✅ CA сертификат уже установлен в системном хранилище - -### 2. Создание SSL сертификатов -- ✅ Созданы сертификаты для localhost -- ✅ Файлы: `localhost.pem` и `localhost-key.pem` -- ✅ Срок действия: до 1 ноября 2027 - -### 3. Обновление dev.py -- ✅ Код уже поддерживал HTTPS с mkcert -- ✅ Обновлены пути к сертификатам -- ✅ Добавлена поддержка флага `--https` - -### 4. Запуск HTTPS сервера -- ✅ Сервер запущен на https://127.0.0.1:8000 -- ✅ Использует Granian с SSL -- ✅ Все сервисы инициализированы корректно - -## Технические детали - -### Конфигурация сервера -- **Хост**: 127.0.0.1 -- **Порт**: 8000 -- **Протокол**: HTTPS -- **Сервер**: Granian -- **Интерфейс**: ASGI - -### Сертификаты -- **CA**: mkcert local CA -- **Домен**: localhost -- **Файлы**: - - `localhost.pem` (сертификат) - - `localhost-key.pem` (приватный ключ) - -### Статус сервисов -- ✅ Redis подключен -- ✅ База данных работает -- ✅ Precache выполнен (699 топиков, 2500 авторов) -- ✅ Event handlers зарегистрированы -- ⚠️ Search service отключен (неверный TXTAI_SERVICE_URL) -- ⚠️ Google Analytics credentials отсутствуют - -## Команды для использования - -### Запуск HTTP сервера -```bash -source venv/bin/activate && python3 dev.py -``` - -### Запуск HTTPS сервера -```bash -source venv/bin/activate && python3 dev.py --https -``` - -### Проверка HTTPS -```bash -curl -k https://localhost:8000 -``` - -## Следующие шаги - -1. **Тестирование**: Проверить работу всех функций через HTTPS -2. **Производительность**: Мониторинг производительности HTTPS соединений -3. **Безопасность**: Проверить заголовки безопасности -4. **Документация**: Обновить документацию по развертыванию - -## Коммиты - -- Обновлен `dev.py` для использования актуальных сертификатов mkcert -- Созданы SSL сертификаты для локальной разработки - -## Статус проекта - -✅ **HTTPS локальная разработка настроена и работает** -- Сервер доступен по адресу: https://localhost:8000 -- Все основные сервисы функционируют -- Готов к тестированию и разработке diff --git a/docs/progress/nginx-configuration-fixes-2024-12-19.md b/docs/progress/nginx-configuration-fixes-2024-12-19.md deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/progress/uv-migration-2025-08-12.md b/docs/progress/uv-migration-2025-08-12.md deleted file mode 100644 index 45cefd87..00000000 --- a/docs/progress/uv-migration-2025-08-12.md +++ /dev/null @@ -1,99 +0,0 @@ -# Миграция на uv package manager - 2025-08-12 - -## Цель -Миграция проекта с pip на uv для улучшения управления зависимостями и ускорения установки пакетов. - -## Что было сделано - -### 1. Создан pyproject.toml -- Добавлена секция `[project]` с метаданными проекта -- Настроены зависимости в `[project.dependencies]` -- Добавлены опциональные зависимости в `[project.optional-dependencies]` -- Настроен build system с hatchling - -### 2. Обновлены файлы зависимостей -- **requirements.txt** - добавлены версии для всех пакетов -- **requirements.dev.txt** - добавлены версии для dev зависимостей -- Группировка зависимостей по категориям (core, type stubs) - -### 3. Настроен hatchling build system -- Добавлена конфигурация `[tool.hatch.build.targets.wheel]` -- Настроены include/exclude правила для сборки пакета -- Исправлена ошибка "Unable to determine which files to ship" - -### 4. Создан .uv файл -- Альтернативная конфигурация для uv -- Дублирует настройки из pyproject.toml - -### 5. Обновлен .gitignore -- Добавлены `.uv/` и `.venv/` директории -- Улучшен общий .gitignore для Python проектов - -### 6. Обновлен README.md -- Добавлены инструкции по установке uv -- Примеры команд для разработки -- Описание структуры проекта - -### 7. Настроены инструменты качества кода -- Конфигурация ruff в pyproject.toml -- Конфигурация mypy в pyproject.toml -- Конфигурация pytest в pyproject.toml - -## Результаты - -### ✅ Успешно -- uv sync --dev работает корректно -- Зависимости устанавливаются в .venv -- Тесты проходят успешно -- Создан uv.lock файл - -### ⚠️ Требует внимания -- 14 ошибок длины строк (E501) - не критично -- Некоторые длинные строки не могут быть исправлены автоматически - -### 🔧 Исправлено -- F821 undefined name AuthorRole - временно отключена функция миграции - -## Команды для работы с uv - -```bash -# Установка зависимостей -uv sync --dev # Все зависимости + dev -uv sync # Только production зависимости -uv sync --group test # Только тестовые зависимости - -# Запуск команд -uv run pytest # Запуск тестов -uv run ruff check . # Проверка кода -uv run mypy . # Проверка типов -uv run python main.py # Запуск приложения - -# Управление окружением -uv venv # Создание виртуального окружения -uv pip install # Установка дополнительных пакетов -``` - -## Преимущества uv - -1. **Скорость** - в 10-100 раз быстрее pip -2. **Надежность** - лучшая разрешаемость зависимостей -3. **Совместимость** - работает с существующими requirements.txt -4. **Lock файлы** - фиксация точных версий зависимостей -5. **Группы зависимостей** - гибкое управление окружениями - -## Следующие шаги - -1. **Исправить длинные строки** - разбить длинные f-строки -2. **Настроить pre-commit hooks** - для автоматической проверки кода -3. **Добавить CI/CD проверки** - автоматическая проверка с uv -4. **Документировать процесс** - добавить в CONTRIBUTING.md - -## Коммиты - -- `663942c` - feat: migrate to uv package manager -- `136dce1` - fix: temporarily disable AuthorRole migration function - -## Статус -✅ Миграция завершена успешно -✅ Проект работает с uv -⚠️ Требуется исправление длинных строк diff --git a/docs/rbac-system.md b/docs/rbac-system.md index be624d2d..3ab610de 100644 --- a/docs/rbac-system.md +++ b/docs/rbac-system.md @@ -336,27 +336,6 @@ async def fix_all_users_reader_role() -> dict[str, int]: return stats ``` -#### 3. Миграция из старой системы - -```python -def migrate_old_roles_to_community_author(): - """Переносит роли из старой системы в CommunityAuthor""" - - # Получаем все старые роли из Author.roles - old_roles = session.query(AuthorRole).all() - - for role in old_roles: - # Создаем запись CommunityAuthor - ca = CommunityAuthor( - community_id=role.community, - author_id=role.author, - roles=role.role - ) - session.add(ca) - - session.commit() -``` - ## API для работы с ролями ### GraphQL мутации diff --git a/tests/test_orm_coverage.py b/tests/test_orm_coverage.py index 63e441e3..442be0c8 100644 --- a/tests/test_orm_coverage.py +++ b/tests/test_orm_coverage.py @@ -146,7 +146,6 @@ class TestOrmCommunity: check_user_permission_in_community, assign_role_to_user, remove_role_from_user, - migrate_old_roles_to_community_author, get_all_community_members_with_roles, bulk_assign_roles ) @@ -155,7 +154,6 @@ class TestOrmCommunity: check_user_permission_in_community, assign_role_to_user, remove_role_from_user, - migrate_old_roles_to_community_author, get_all_community_members_with_roles, bulk_assign_roles ])