feat(products): добавить загрузку изображений по URL для комплектов

Добавлена возможность загружать фотографии комплекта по прямой ссылке
на формах создания и редактирования. JavaScript скачивает изображение
и добавляет его как файл в форму для отправки на сервер.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-21 23:24:42 +03:00
parent 391d48640b
commit 036b9d1634
5 changed files with 520 additions and 5 deletions

View File

@@ -21,6 +21,7 @@ from .photo_management import (
productkit_photo_set_main,
productkit_photo_move_up,
productkit_photo_move_down,
productkit_photos_delete_bulk,
)
# Управление фотографиями (Category)
@@ -149,6 +150,7 @@ __all__ = [
'productkit_photo_set_main',
'productkit_photo_move_up',
'productkit_photo_move_down',
'productkit_photos_delete_bulk',
# Управление фотографиями Category
'category_photo_delete',

View File

@@ -380,3 +380,67 @@ def product_photos_delete_bulk(request):
'success': False,
'error': f'Ошибка сервера: {str(e)}'
}, status=500)
@require_http_methods(["POST"])
@login_required
def productkit_photos_delete_bulk(request):
"""
AJAX endpoint для массового удаления фотографий комплекта.
Ожидает JSON: {photo_ids: [1, 2, 3]}
Возвращает JSON: {success: true, deleted: 3} или {success: false, error: "..."}
"""
# Проверка прав доступа
if not request.user.has_perm('products.change_productkit'):
return JsonResponse({
'success': False,
'error': 'У вас нет прав для удаления фотографий'
}, status=403)
try:
# Получаем список photo_ids из JSON тела запроса
data = json.loads(request.body)
photo_ids = data.get('photo_ids', [])
if not photo_ids or not isinstance(photo_ids, list):
return JsonResponse({
'success': False,
'error': 'Неверный формат: требуется список photo_ids'
}, status=400)
# Удаляем фотографии
deleted_count = 0
for photo_id in photo_ids:
try:
photo = ProductKitPhoto.objects.get(pk=photo_id)
photo.delete() # Это вызовет ImageProcessor.delete_all_versions()
deleted_count += 1
except ProductKitPhoto.DoesNotExist:
# Если фото не найдена, просто пропускаем
continue
except Exception as e:
# Логируем ошибку но продолжаем удаление остальных
import logging
logger = logging.getLogger(__name__)
logger.error(f"Error deleting kit photo {photo_id}: {str(e)}", exc_info=True)
continue
return JsonResponse({
'success': True,
'deleted': deleted_count
})
except json.JSONDecodeError:
return JsonResponse({
'success': False,
'error': 'Неверный JSON формат'
}, status=400)
except Exception as e:
import logging
logger = logging.getLogger(__name__)
logger.error(f"Bulk kit photo deletion error: {str(e)}", exc_info=True)
return JsonResponse({
'success': False,
'error': f'Ошибка сервера: {str(e)}'
}, status=500)