Files
mostovik-backend/CHANGELOG.md
Aleksandr Meshchriakov c6483d8427 feat(parsers): добавлен парсер zakupki.gov.ru с SOAP API интеграцией
Реализована полная интеграция с ЕИС Закупки через 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]
2026-01-27 16:01:28 +01:00

136 lines
6.4 KiB
Markdown
Raw 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/).
---
## [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