Улучшение системы работы с фото: добавлена команда очистки битых записей и оптимизация обработки изображений

This commit is contained in:
2026-01-06 09:25:37 +03:00
parent 0f19542ac9
commit 288716deba
14 changed files with 535 additions and 122 deletions

View File

@@ -0,0 +1,52 @@
# Generated by Django 5.0.10 on 2026-01-06 05:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('products', '0002_productimportjob'),
]
operations = [
migrations.AlterModelOptions(
name='productcategoryphoto',
options={'ordering': ['-is_main', 'order', '-created_at'], 'verbose_name': 'Фото категории', 'verbose_name_plural': 'Фото категорий'},
),
migrations.AlterModelOptions(
name='productkitphoto',
options={'ordering': ['-is_main', 'order', '-created_at'], 'verbose_name': 'Фото комплекта', 'verbose_name_plural': 'Фото комплектов'},
),
migrations.AlterModelOptions(
name='productphoto',
options={'ordering': ['-is_main', 'order', '-created_at'], 'verbose_name': 'Фото товара', 'verbose_name_plural': 'Фото товаров'},
),
migrations.AddField(
model_name='productcategoryphoto',
name='is_main',
field=models.BooleanField(db_index=True, default=False, help_text='Главное фото отображается в карточках, каталоге и превью. Может быть только одно.', verbose_name='Главное фото'),
),
migrations.AddField(
model_name='productkitphoto',
name='is_main',
field=models.BooleanField(db_index=True, default=False, help_text='Главное фото отображается в карточках, каталоге и превью. Может быть только одно.', verbose_name='Главное фото'),
),
migrations.AddField(
model_name='productphoto',
name='is_main',
field=models.BooleanField(db_index=True, default=False, help_text='Главное фото отображается в карточках, каталоге и превью. Может быть только одно.', verbose_name='Главное фото'),
),
migrations.AddConstraint(
model_name='productcategoryphoto',
constraint=models.UniqueConstraint(condition=models.Q(('is_main', True)), fields=('category',), name='unique_main_photo_per_category'),
),
migrations.AddConstraint(
model_name='productkitphoto',
constraint=models.UniqueConstraint(condition=models.Q(('is_main', True)), fields=('kit',), name='unique_main_photo_per_kit'),
),
migrations.AddConstraint(
model_name='productphoto',
constraint=models.UniqueConstraint(condition=models.Q(('is_main', True)), fields=('product',), name='unique_main_photo_per_product'),
),
]

View File

@@ -0,0 +1,68 @@
# Generated by Django 5.0.10 on 2026-01-06 05:03
from django.db import migrations
def set_main_photo_from_order(apps, schema_editor):
"""
Data migration: устанавливает is_main=True для фото с order=0.
Для каждой сущности (product, kit, category) находит фото с order=0
и устанавливает ему is_main=True.
Если у сущности нет фото с order=0, устанавливает is_main=True для первого фото.
"""
ProductPhoto = apps.get_model('products', 'ProductPhoto')
ProductKitPhoto = apps.get_model('products', 'ProductKitPhoto')
ProductCategoryPhoto = apps.get_model('products', 'ProductCategoryPhoto')
Product = apps.get_model('products', 'Product')
ProductKit = apps.get_model('products', 'ProductKit')
ProductCategory = apps.get_model('products', 'ProductCategory')
# Обрабатываем ProductPhoto
for product in Product.objects.all():
photos = ProductPhoto.objects.filter(product=product).order_by('order', '-created_at')
if photos.exists():
main_photo = photos.filter(order=0).first() or photos.first()
main_photo.is_main = True
main_photo.save(update_fields=['is_main'])
# Обрабатываем ProductKitPhoto
for kit in ProductKit.objects.all():
photos = ProductKitPhoto.objects.filter(kit=kit).order_by('order', '-created_at')
if photos.exists():
main_photo = photos.filter(order=0).first() or photos.first()
main_photo.is_main = True
main_photo.save(update_fields=['is_main'])
# Обрабатываем ProductCategoryPhoto
for category in ProductCategory.objects.all():
photos = ProductCategoryPhoto.objects.filter(category=category).order_by('order', '-created_at')
if photos.exists():
main_photo = photos.filter(order=0).first() or photos.first()
main_photo.is_main = True
main_photo.save(update_fields=['is_main'])
def reverse_main_photo(apps, schema_editor):
"""
Reverse migration: сбрасывает is_main в False для всех фото.
"""
ProductPhoto = apps.get_model('products', 'ProductPhoto')
ProductKitPhoto = apps.get_model('products', 'ProductKitPhoto')
ProductCategoryPhoto = apps.get_model('products', 'ProductCategoryPhoto')
ProductPhoto.objects.filter(is_main=True).update(is_main=False)
ProductKitPhoto.objects.filter(is_main=True).update(is_main=False)
ProductCategoryPhoto.objects.filter(is_main=True).update(is_main=False)
class Migration(migrations.Migration):
dependencies = [
('products', '0003_alter_productcategoryphoto_options_and_more'),
]
operations = [
migrations.RunPython(set_main_photo_from_order, reverse_main_photo),
]