Улучшение системы работы с фото: добавлена команда очистки битых записей и оптимизация обработки изображений
This commit is contained in:
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
]
|
||||
Reference in New Issue
Block a user