Files
mostovik-backend/CHANGELOG.md
Aleksandr Meshchriakov 052389d921 refactor(parsers): перенести тесты в ROOT_DIR/tests и синхронизировать контракты задач
- перенесены тесты parsers из src/apps/parsers/tests в tests/apps/parsers

- обновлены тесты задач под текущее поведение Celery (ошибки пробрасываются исключениями)

- убрана зависимость тестов от внешнего брокера через локальные eager-вызовы

- добавлены/уточнены фабрики и импорты для единой структуры тестов

- обновлены README и CHANGELOG с новым правилом размещения тестов и запуском
2026-03-04 15:35:50 +01:00

246 lines
13 KiB
Markdown
Raw Permalink 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.
# Changelog
Все значимые изменения в проекте документируются в этом файле.
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/).
---
## [Unreleased]
### Изменено
- Тесты парсеров перенесены из `src/apps/parsers/tests` в `tests/apps/parsers` для единого правила хранения тестов в `ROOT_DIR/tests`.
- Обновлены импорты и вспомогательный e2e-скрипт `run_checko_e2e.py` после переноса тестов.
- Актуализированы проверки в `tests/apps/parsers/test_tasks.py` под текущее поведение Celery-задач (ошибки пробрасываются исключениями), а также убрана зависимость от внешнего брокера в тестовых сценариях через локальные eager-вызовы.
### Документация
- README дополнен явным правилом по размещению тестов и примерами корректного запуска тестов через `scripts/run-tests.sh`.
## [0.5.0] - 2026-02-18
### Добавлено
- Fail-fast проверки зависимостей на старте приложения: `apps.core.startup_checks` (DB/Redis с таймаутами и аварийным выходом при недоступности)
- Единый Docker-образ `docker/Dockerfile` и набор entrypoint-скриптов в `docker/scripts/` для web/celery/migrations/check-deps
- Новые шаблоны окружения: `.env.dev`, `.env.prod.example`
- Скрипт `scripts/run-tests.sh` и новая структура директорий `input/` с `.gitkeep` для обработки входящих файлов
### Изменено
- Реорганизована структура Django-конфига: удалён `src/config`, добавлены `src/core` и `src/settings`; обновлены импорты и точки входа (`asgi`, `wsgi`, `celery`, `urls`, `manage.py`)
- Обновлены `docker-compose.dev.yml` и `docker-compose.prod.yml` под новую структуру сервисов, env и startup-проверок
- Расширена OpenAPI-документация:
- введены `swagger_tag`, `ErrorResponses` и новые стандартные ответы (`202`, `503`)
- унифицированы и уточнены `responses` в `apps.core.views`, `apps.parsers.views`, `apps.user.views`
- добавлен endpoint-обёртка `TokenVerifySwaggerView` для документации проверки JWT
- Актуализированы CI/CD и инфраструктурные файлы: `.gitea/workflows/ci-cd.yml`, `Makefile`, `.pre-commit-config.yaml`, `pyproject.toml`, `uv.lock`, `README.md`, `tests/README.md`
- Обновлены тесты под новую структуру настроек и API-контракты (`tests/apps/core/*`, `tests/apps/user/*`)
### Удалено
- Устаревшие файлы деплоя и окружения: `deploy/*`, `docker/Dockerfile.web`, `docker/Dockerfile.celery`, `.env.example`, `.env.test`
- Устаревшие dependency-файлы и утилиты: `requirements.txt`, `requirements-dev.txt`, `run_tests.py`, `check_tests.py`, `sitecustomize.py`
- Временные/лишние артефакты (включая тестовый xlsx во `src/input/fns/`)
---
## [0.4.1] - 2026-02-02
### Исправлено
#### CI/CD Pipeline
- Удалена зависимость от GitHub Actions (сеть блокирует доступ к GitHub)
- `actions/checkout@v4``git clone` с переменными Gitea
- `actions/setup-python@v4` → установка через `apt-get`
- `docker/build-push-action@v5` → чистые `docker build/push` команды
- Тесты используют `config.settings.test` (SQLite in-memory) вместо PostgreSQL service
#### Code Quality
- Исправлены ошибки ruff lint:
- Сортировка импортов (I001)
- Удалены неиспользуемые импорты и переменные (F401, F841)
- Добавлены noqa для тестового кода (S106, S314)
---
## [0.4.0] - 2026-01-28
### Добавлено
#### Парсер ФНС бухгалтерской отчетности (`apps.parsers.clients.fns`)
- **FNSExcelParser** — парсер Excel файлов бухгалтерской отчетности:
- Формат файла: `fin_{external_id}_{ogrn}.xlsx`
- Поддержка форм: №1 (Баланс), №2 (Прибыль/Убыток), №3 (Капитал), №4 (Денежные потоки), №6 (Целевое использование)
- Автоматическое определение года и формы по структуре листа
- Извлечение значений period_start/period_end для каждой строки
- **Модели** (`models.py`):
- `FinancialReport` — отчет с метаданными (external_id, ogrn, file_hash, status, source)
- `FinancialReportLine` — строки отчета (form_code, line_code, year, period_start, period_end)
- SHA256 хэш файла для дедупликации
- Индексы: ogrn, year, form_code+line_code
- **Сервисный слой** (`services.py`):
- `FNSReportService` — сохранение отчетов, проверка дубликатов по хешу
- Поиск по ОГРН
- Bulk-сохранение строк отчета
- **Celery задачи** (`tasks.py`):
- `scan_fns_directory` — периодическое сканирование папки каждые 5 минут
- `process_fns_file` — обработка одного файла
- `process_fns_files_batch` — пакетная обработка через API
- Перемещение файлов в `processed/` или `failed/`
- **API endpoints** (`views.py`, `urls.py`):
- `POST /api/v1/fns/upload/` — пакетная загрузка файлов
- `GET /api/v1/fns/reports/` — список отчетов с фильтрацией
- `GET /api/v1/fns/reports/{id}/` — детали отчета со строками
- Swagger теги для группировки в документации
- **Админка** (`admin.py`):
- `FinancialReportAdmin` с inline для строк
- Цветовая индикация статусов
- Фильтры: status, source, ogrn
#### Тестирование
- 25 unit-тестов для парсера, схем и сервиса
- Покрытие: валидация имени файла, парсинг значений, сохранение отчетов
### Конфигурация
- `FNS_WATCH_DIRECTORY` — папка для мониторинга (`/src/input/fns`)
- `FNS_PROCESSED_DIRECTORY` — папка обработанных файлов
- `FNS_FAILED_DIRECTORY` — папка с ошибками
- Celery Beat: `scan-fns-directory` каждые 5 минут
---
## [0.3.0] - 2026-01-27
### Добавлено
#### Парсер zakupki.gov.ru (`apps.parsers.clients.zakupki`)
- **ZakupkiClient** — клиент для получения данных о закупках:
- Интеграция через SOAP API (FTP закрыт с 01.01.2025)
- Методы: `getDocsByOrgRegionRequest`, `getDocsByReestrNumberRequest`
- Парсинг XML/ZIP архивов с поддержкой множественных кодировок (UTF-8, Windows-1251)
- Поддержка прокси-серверов
- Маппинг 80+ регионов РФ
- **Модель ProcurementRecord** (`models.py`):
- 18 полей: номер закупки, ИНН/КПП/ОГРН заказчика, НМЦ, тип закона (44-ФЗ/223-ФЗ), статус
- Поля региона, года, месяца для фильтрации
- `load_batch` для отслеживания пакетной загрузки
- 3 индекса для оптимизации запросов
- **Сервисный слой** (`services.py`):
- `ProcurementService` — сохранение, поиск, отслеживание загрузок
- `ParserLoadLogService` — логирование результатов парсинга
- Bulk-операции с chunking и обработкой дубликатов
- **Celery задачи** (`tasks.py`):
- `parse_procurements` — загрузка по региону/году/месяцу с BackgroundJob tracking
- `sync_procurements` — синхронизация помесячно с автопродолжением
- **Админка** (`admin.py`):
- Цветовая индикация статусов
- Поиск по номеру закупки, ИНН, ОГРН, названию заказчика
- Фильтры: тип закона, статус, регион, batch, дата создания
- Read-only режим
#### Тестирование
- 71 тест (66 unit + 5 E2E)
- `ProcurementRecordFactory` с Faker("ru_RU")
- E2E тесты с реальными HTTP-запросами (активация: `RUN_E2E_TESTS=1`)
- Покрытие: клиент, сервисы, задачи
### Требования для работы
- Токен SOAP API (получается через Госуслуги на `https://zakupki.gov.ru/pmd/auth/welcome`)
---
## [0.2.0] - 2026-01-21
### Добавлено
#### Core Module (`apps.core`)
- **Model Mixins** (`mixins.py`):
- `TimestampMixin` — автоматические `created_at`, `updated_at`
- `UUIDPrimaryKeyMixin` — UUID вместо auto-increment ID
- `SoftDeleteMixin` — мягкое удаление с `is_deleted`, `deleted_at`
- `AuditMixin` — отслеживание `created_by`, `updated_by`
- `OrderableMixin` — поле `order` для сортировки
- `StatusMixin` — статусы draft/active/inactive/archived
- `SlugMixin` — URL-friendly идентификаторы
- **Base Services** (`services.py`):
- `BaseService` — базовый CRUD сервис
- `BaseReadOnlyService` — только чтение
- `TransactionMixin` — управление транзакциями
- `BulkOperationsMixin` — массовые операции (bulk_create_chunked, bulk_update_or_create, bulk_delete, bulk_update_fields)
- `QueryOptimizerMixin` — декларативная оптимизация запросов (select_related, prefetch_related, only, defer)
- `BackgroundJobService` — управление фоновыми задачами
- **Base ViewSets** (`viewsets.py`):
- `BaseViewSet` — базовый CRUD ViewSet с пагинацией, фильтрацией, логированием
- `ReadOnlyViewSet` — только чтение
- `OwnerViewSet` — фильтрация по владельцу
- `BulkMixin` — массовые операции через API (bulk_create, bulk_update, bulk_delete)
- **Background Job Tracking** (`models.py`):
- Модель `BackgroundJob` для отслеживания Celery задач
- API endpoints: `GET /api/v1/jobs/`, `GET /api/v1/jobs/{task_id}/`
- Статусы: pending, started, success, failure, revoked, retry
- Прогресс выполнения и результаты
- **Management Commands** (`management/commands/base.py`):
- `BaseAppCommand` — базовый класс для команд
- Поддержка `--dry-run`, `--silent`
- Прогресс-бар, измерение времени, логирование
- **Прочее**:
- `exceptions.py` — кастомные исключения API
- `permissions.py` — базовые permissions (IsOwner, IsAdminOrReadOnly и др.)
- `pagination.py` — CursorPagination
- `filters.py` — BaseFilterSet
- `cache.py` — декораторы кэширования
- `tasks.py` — BaseTask для Celery
- `logging.py` — структурированное логирование
- `middleware.py` — RequestIDMiddleware
- `signals.py` — SignalDispatcher
- `response.py` — унифицированные API ответы
- `openapi.py` — декоратор для документации
#### Тестирование
- Переход на `factory_boy` + `faker` (вместо model_bakery + uuid)
- Фабрики: `UserFactory`, `ProfileFactory`
- 297 тестов
#### Конфигурация
- API versioning: `/api/v1/`
- Отдельный `test.py` для настроек тестов
- Обновлён `pyproject.toml`
- Правила разработки в `.qoder/rules/main.md`
### Изменено
- Структура тестов перенесена в `/tests/apps/`
- Удалён `conftest.py` (pytest не используется)
- Обновлены URLs с namespace
### Удалено
- `ruff.toml` (конфигурация перенесена в pyproject.toml)
- `CI_CD_SUMMARY.md`
- `custom_test_runner.py`
---
## [0.1.0] - 2026-01-20
### Добавлено
- Начальная структура проекта
- Приложение `user` с JWT аутентификацией
- Базовые модели User и Profile
- Docker конфигурация
- Pre-commit hooks