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

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

@@ -45,7 +45,10 @@ def generic_photo_delete(request, pk, photo_model, redirect_url_name, parent_att
def generic_photo_set_main(request, pk, photo_model, redirect_url_name, parent_attr, permission):
"""
Универсальная установка фото как главного (order = 0).
Универсальная установка фото как главного (is_main=True).
Автоматически сбрасывает is_main=False у старого главного фото.
Constraint на уровне БД гарантирует, что у сущности может быть только одно is_main=True.
Args:
request: HTTP request
@@ -64,24 +67,21 @@ def generic_photo_set_main(request, pk, photo_model, redirect_url_name, parent_a
messages.error(request, 'У вас нет прав для изменения порядка фотографий.')
return redirect(redirect_url_name, pk=parent_id)
# Получаем все фото этого родительского объекта
filter_kwargs = {f"{parent_attr}_id": parent_id}
photos = photo_model.objects.filter(**filter_kwargs).order_by('order')
# Если это уже главное фото, ничего не делаем
if photo.order == 0:
if photo.is_main:
messages.info(request, 'Это фото уже установлено как главное.')
return redirect(redirect_url_name, pk=parent_id)
# Меняем порядок: текущее главное фото становится вторым
old_order = photo.order
for p in photos:
if p.pk == photo.pk:
p.order = 0
p.save()
elif p.order == 0:
p.order = old_order
p.save()
# Сбрасываем is_main у старого главного фото
filter_kwargs = {f"{parent_attr}_id": parent_id, 'is_main': True}
old_main = photo_model.objects.filter(**filter_kwargs).first()
if old_main:
old_main.is_main = False
old_main.save(update_fields=['is_main'])
# Устанавливаем новое главное фото
photo.is_main = True
photo.save(update_fields=['is_main'])
messages.success(request, 'Фото установлено как главное!')
return redirect(redirect_url_name, pk=parent_id)