Реализована полная интеграция с ЕИС Закупки через SOAP API (FTP доступ закрыт с 01.01.2025). Добавлено: - ZakupkiClient с поддержкой SOAP методов getDocsByOrgRegionRequest и getDocsByReestrNumberRequest - Модель ProcurementRecord (18 полей, 3 индекса) - ProcurementService и ParserLoadLogService для бизнес-логики - Celery задачи parse_procurements и sync_procurements - Админка с цветовой индикацией статусов и фильтрами - 71 тест (unit + E2E с RUN_E2E_TESTS=1) Требования: токен SOAP API через Госуслуги 🤖 Generated with [Qoder][https://qoder.com]
136 lines
6.4 KiB
Markdown
136 lines
6.4 KiB
Markdown
# Changelog
|
||
|
||
Все значимые изменения в проекте документируются в этом файле.
|
||
|
||
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/).
|
||
|
||
---
|
||
|
||
## [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
|