- Updated project description in __init__.py - Enhanced .gitignore to exclude additional data files - Modified User model to remove first_name and last_name fields - Improved instance save method in services.py to include updated_at field - Added API tokens to .env.example for external services - Cleaned up test files for better readability - Updated Dockerfile and docker-compose.yml for improved setup - Revised README.md to reflect project changes and added changelog
206 lines
10 KiB
Markdown
206 lines
10 KiB
Markdown
# Changelog
|
||
|
||
Все значимые изменения в проекте документируются в этом файле.
|
||
|
||
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/).
|
||
|
||
---
|
||
|
||
## [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
|