Реализована полная интеграция с ЕИС Закупки через 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]
6.4 KiB
6.4 KiB
Changelog
Все значимые изменения в проекте документируются в этом файле.
Формат основан на Keep a Changelog.
[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 trackingsync_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_atUUIDPrimaryKeyMixin— UUID вместо auto-increment IDSoftDeleteMixin— мягкое удаление сis_deleted,deleted_atAuditMixin— отслеживаниеcreated_by,updated_byOrderableMixin— полеorderдля сортировкиStatusMixin— статусы draft/active/inactive/archivedSlugMixin— 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— кастомные исключения APIpermissions.py— базовые permissions (IsOwner, IsAdminOrReadOnly и др.)pagination.py— CursorPaginationfilters.py— BaseFilterSetcache.py— декораторы кэшированияtasks.py— BaseTask для Celerylogging.py— структурированное логированиеmiddleware.py— RequestIDMiddlewaresignals.py— SignalDispatcherresponse.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.mdcustom_test_runner.py
[0.1.0] - 2026-01-20
Добавлено
- Начальная структура проекта
- Приложение
userс JWT аутентификацией - Базовые модели User и Profile
- Docker конфигурация
- Pre-commit hooks