- Реализован импорт Product из CSV/XLSX через Celery с прогресс-баром - Параллельная загрузка фото товаров с внешних URL (масштабируемость до 500+ товаров) - Добавлена модель ProductImportJob для отслеживания статуса импорта - Создан таск download_product_photo_async для загрузки фото в фоне - Интеграция с существующим ImageProcessor (синхронная обработка через use_async=False) - Добавлены view и template для импорта с real-time обновлением через AJAX FIX: Исправлен баг со счётчиком SKU - инкремент только после успешного сохранения - Добавлен SKUCounter.peek_next_value() - возвращает следующий номер БЕЗ инкремента - Добавлен SKUCounter.increment_counter() - инкрементирует счётчик - generate_product_sku() использует peek_next_value() вместо get_next_value() - Добавлен post_save сигнал increment_sku_counter_after_save() для инкремента после создания - Предотвращает пропуски номеров при ошибках валидации (например cost_price NULL) FIX: Исправлена ошибка с is_main в ProductPhoto - ProductPhoto не имеет поля is_main, используется только order - Первое фото (order=0) автоматически считается главным - Удалён параметр is_main из download_product_photo_async и _collect_photo_tasks Изменены файлы: - products/models/base.py - методы для управления счётчиком SKU - products/models/import_job.py - модель для отслеживания импорта - products/services/import_export.py - сервис импорта с поддержкой Celery - products/tasks.py - таски для асинхронного импорта и загрузки фото - products/signals.py - сигнал для инкремента счётчика после сохранения - products/utils/sku_generator.py - использование peek_next_value() - products/views/product_import_views.py - view для импорта - products/templates/products/product_import*.html - UI для импорта - docker/entrypoint.sh - настройка Celery worker (concurrency=4) - requirements.txt - добавлен requests для загрузки фото
41 lines
780 B
Plaintext
41 lines
780 B
Plaintext
amqp==5.3.1
|
|
asgiref==3.9.0
|
|
billiard==4.2.2
|
|
celery==5.4.0
|
|
click==8.3.0
|
|
click-didyoumean==0.3.1
|
|
click-plugins==1.1.1.2
|
|
click-repl==0.3.0
|
|
colorama==0.4.6
|
|
Django==5.0.10
|
|
django-celery-results==2.5.1
|
|
django-debug-toolbar==6.1.0
|
|
django-environ==0.12.0
|
|
django-filter==24.3
|
|
django-nested-admin==4.1.5
|
|
django-phonenumber-field==8.3.0
|
|
django-simple-history==3.10.1
|
|
django-tenants==3.7.0
|
|
et_xmlfile==2.0.0
|
|
gunicorn==21.2.0
|
|
kombu==5.6.0
|
|
openpyxl==3.1.5
|
|
packaging==25.0
|
|
phonenumbers==9.0.17
|
|
pillow==12.0.0
|
|
pillow_heif==1.1.1
|
|
prompt_toolkit==3.0.52
|
|
psycopg2-binary==2.9.11
|
|
python-dateutil==2.9.0.post0
|
|
python-monkey-business==1.1.0
|
|
redis==5.0.8
|
|
requests==2.31.0
|
|
six==1.17.0
|
|
sqlparse==0.5.3
|
|
typing_extensions==4.15.0
|
|
tzdata==2025.2
|
|
Unidecode==1.4.0
|
|
vine==5.1.0
|
|
wcwidth==0.2.14
|
|
whitenoise==6.6.0
|