При асинхронной обработке фото нужно сначала сохранить файл в БД,
потом запустить Celery task. Иначе task не найдет файл.
Изменения:
- BasePhoto.save() теперь сохраняет файл перед запуском task
- Исправлена проблема 'Photo has no image file' в Celery worker
🤖 Generated with Claude Code
36 lines
2.8 KiB
Python
36 lines
2.8 KiB
Python
# Generated by Django 5.0.10 on 2025-11-15 07:53
|
||
|
||
from django.db import migrations, models
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
|
||
dependencies = [
|
||
('products', '0001_initial'),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name='PhotoProcessingStatus',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('photo_id', models.IntegerField(help_text='ID объекта ProductPhoto/ProductKitPhoto/ProductCategoryPhoto', verbose_name='ID фото')),
|
||
('photo_model', models.CharField(help_text='Полный путь модели (e.g., products.ProductPhoto)', max_length=100, verbose_name='Модель фото')),
|
||
('status', models.CharField(choices=[('pending', 'В очереди'), ('processing', 'Обрабатывается'), ('completed', 'Завершено'), ('failed', 'Ошибка')], db_index=True, default='pending', max_length=20, verbose_name='Статус обработки')),
|
||
('task_id', models.CharField(blank=True, db_index=True, help_text='Уникальный ID задачи для отслеживания', max_length=255, verbose_name='ID задачи Celery')),
|
||
('error_message', models.TextField(blank=True, help_text='Детальное описание ошибки при обработке', verbose_name='Сообщение об ошибке')),
|
||
('result_data', models.JSONField(blank=True, default=dict, help_text='JSON с информацией о качестве, путях и метаданных', verbose_name='Результаты обработки')),
|
||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')),
|
||
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Дата обновления')),
|
||
('started_at', models.DateTimeField(blank=True, null=True, verbose_name='Время начала обработки')),
|
||
('completed_at', models.DateTimeField(blank=True, null=True, verbose_name='Время завершения обработки')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Статус обработки фото',
|
||
'verbose_name_plural': 'Статусы обработки фото',
|
||
'ordering': ['-created_at'],
|
||
'indexes': [models.Index(fields=['photo_id', 'photo_model'], name='products_ph_photo_i_e42a67_idx'), models.Index(fields=['task_id'], name='products_ph_task_id_748118_idx'), models.Index(fields=['status'], name='products_ph_status_1182b4_idx'), models.Index(fields=['status', 'created_at'], name='products_ph_status_41d415_idx')],
|
||
},
|
||
),
|
||
]
|