Files
octopus/myproject/products/views/photo_management.py

311 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Универсальные функции для управления фотографиями товаров, комплектов и категорий.
Устраняет дублирование кода для операций: delete, set_main, move_up, move_down.
"""
from django.shortcuts import get_object_or_404, redirect
from django.contrib import messages
from ..models import ProductPhoto, ProductKitPhoto, ProductCategoryPhoto
# ====================================
# Универсальные функции
# ====================================
def generic_photo_delete(request, pk, photo_model, redirect_url_name, parent_attr, permission):
"""
Универсальное удаление фотографии.
Args:
request: HTTP request
pk: ID фотографии
photo_model: Модель фото (ProductPhoto, ProductKitPhoto, ProductCategoryPhoto)
redirect_url_name: Имя URL для редиректа ('products:product-update', etc.)
parent_attr: Имя атрибута родителя ('product', 'kit', 'category')
permission: Требуемое разрешение ('products.change_product', etc.)
"""
photo = get_object_or_404(photo_model, pk=pk)
parent = getattr(photo, parent_attr)
parent_id = parent.id
# Проверка прав доступа
if not request.user.has_perm(permission):
messages.error(request, 'У вас нет прав для удаления фотографий.')
return redirect(redirect_url_name, pk=parent_id)
photo.delete()
messages.success(request, 'Фото успешно удалено!')
return redirect(redirect_url_name, pk=parent_id)
def generic_photo_set_main(request, pk, photo_model, redirect_url_name, parent_attr, permission):
"""
Универсальная установка фото как главного (order = 0).
Args:
request: HTTP request
pk: ID фотографии
photo_model: Модель фото
redirect_url_name: Имя URL для редиректа
parent_attr: Имя атрибута родителя ('product', 'kit', 'category')
permission: Требуемое разрешение
"""
photo = get_object_or_404(photo_model, pk=pk)
parent = getattr(photo, parent_attr)
parent_id = parent.id
# Проверка прав доступа
if not request.user.has_perm(permission):
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:
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()
messages.success(request, 'Фото установлено как главное!')
return redirect(redirect_url_name, pk=parent_id)
def generic_photo_move_up(request, pk, photo_model, redirect_url_name, parent_attr, permission):
"""
Универсальное перемещение фото вверх (уменьшить order).
Args:
request: HTTP request
pk: ID фотографии
photo_model: Модель фото
redirect_url_name: Имя URL для редиректа
parent_attr: Имя атрибута родителя ('product', 'kit', 'category')
permission: Требуемое разрешение
"""
photo = get_object_or_404(photo_model, pk=pk)
parent = getattr(photo, parent_attr)
parent_id = parent.id
# Проверка прав доступа
if not request.user.has_perm(permission):
messages.error(request, 'У вас нет прав для изменения порядка фотографий.')
return redirect(redirect_url_name, pk=parent_id)
# Если это уже первое фото
if photo.order == 0:
messages.info(request, 'Это фото уже первое в списке.')
return redirect(redirect_url_name, pk=parent_id)
# Находим предыдущее фото
filter_kwargs = {
f"{parent_attr}_id": parent_id,
'order__lt': photo.order
}
prev_photo = photo_model.objects.filter(**filter_kwargs).order_by('-order').first()
if prev_photo:
# Меняем местами
photo.order, prev_photo.order = prev_photo.order, photo.order
photo.save()
prev_photo.save()
messages.success(request, 'Фото перемещено вверх!')
return redirect(redirect_url_name, pk=parent_id)
def generic_photo_move_down(request, pk, photo_model, redirect_url_name, parent_attr, permission):
"""
Универсальное перемещение фото вниз (увеличить order).
Args:
request: HTTP request
pk: ID фотографии
photo_model: Модель фото
redirect_url_name: Имя URL для редиректа
parent_attr: Имя атрибута родителя ('product', 'kit', 'category')
permission: Требуемое разрешение
"""
photo = get_object_or_404(photo_model, pk=pk)
parent = getattr(photo, parent_attr)
parent_id = parent.id
# Проверка прав доступа
if not request.user.has_perm(permission):
messages.error(request, 'У вас нет прав для изменения порядка фотографий.')
return redirect(redirect_url_name, pk=parent_id)
# Находим следующее фото
filter_kwargs = {
f"{parent_attr}_id": parent_id,
'order__gt': photo.order
}
next_photo = photo_model.objects.filter(**filter_kwargs).order_by('order').first()
if next_photo:
# Меняем местами
photo.order, next_photo.order = next_photo.order, photo.order
photo.save()
next_photo.save()
messages.success(request, 'Фото перемещено вниз!')
else:
messages.info(request, 'Это фото уже последнее в списке.')
return redirect(redirect_url_name, pk=parent_id)
# ====================================
# Обертки для Product Photos
# ====================================
def product_photo_delete(request, pk):
"""Удаление фотографии товара"""
return generic_photo_delete(
request, pk,
photo_model=ProductPhoto,
redirect_url_name='products:product-update',
parent_attr='product',
permission='products.change_product'
)
def product_photo_set_main(request, pk):
"""Установка фото товара как главного (order = 0)"""
return generic_photo_set_main(
request, pk,
photo_model=ProductPhoto,
redirect_url_name='products:product-update',
parent_attr='product',
permission='products.change_product'
)
def product_photo_move_up(request, pk):
"""Переместить фото товара вверх (уменьшить order)"""
return generic_photo_move_up(
request, pk,
photo_model=ProductPhoto,
redirect_url_name='products:product-update',
parent_attr='product',
permission='products.change_product'
)
def product_photo_move_down(request, pk):
"""Переместить фото товара вниз (увеличить order)"""
return generic_photo_move_down(
request, pk,
photo_model=ProductPhoto,
redirect_url_name='products:product-update',
parent_attr='product',
permission='products.change_product'
)
# ====================================
# Обертки для ProductKit Photos
# ====================================
def productkit_photo_delete(request, pk):
"""Удаление фотографии комплекта"""
return generic_photo_delete(
request, pk,
photo_model=ProductKitPhoto,
redirect_url_name='products:productkit-update',
parent_attr='kit',
permission='products.change_productkit'
)
def productkit_photo_set_main(request, pk):
"""Установка фото комплекта как главного (order = 0)"""
return generic_photo_set_main(
request, pk,
photo_model=ProductKitPhoto,
redirect_url_name='products:productkit-update',
parent_attr='kit',
permission='products.change_productkit'
)
def productkit_photo_move_up(request, pk):
"""Переместить фото комплекта вверх (уменьшить order)"""
return generic_photo_move_up(
request, pk,
photo_model=ProductKitPhoto,
redirect_url_name='products:productkit-update',
parent_attr='kit',
permission='products.change_productkit'
)
def productkit_photo_move_down(request, pk):
"""Переместить фото комплекта вниз (увеличить order)"""
return generic_photo_move_down(
request, pk,
photo_model=ProductKitPhoto,
redirect_url_name='products:productkit-update',
parent_attr='kit',
permission='products.change_productkit'
)
# ====================================
# Обертки для Category Photos
# ====================================
def category_photo_delete(request, pk):
"""Удаление фотографии категории"""
return generic_photo_delete(
request, pk,
photo_model=ProductCategoryPhoto,
redirect_url_name='products:category-update',
parent_attr='category',
permission='products.change_productcategory'
)
def category_photo_set_main(request, pk):
"""Установка фото категории как главного (order = 0)"""
return generic_photo_set_main(
request, pk,
photo_model=ProductCategoryPhoto,
redirect_url_name='products:category-update',
parent_attr='category',
permission='products.change_productcategory'
)
def category_photo_move_up(request, pk):
"""Переместить фото категории вверх (уменьшить order)"""
return generic_photo_move_up(
request, pk,
photo_model=ProductCategoryPhoto,
redirect_url_name='products:category-update',
parent_attr='category',
permission='products.change_productcategory'
)
def category_photo_move_down(request, pk):
"""Переместить фото категории вниз (увеличить order)"""
return generic_photo_move_down(
request, pk,
photo_model=ProductCategoryPhoto,
redirect_url_name='products:category-update',
parent_attr='category',
permission='products.change_productcategory'
)