From a073b1aa779e72f0053f3b455b4ab43c6d040e3b Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sun, 16 Nov 2025 02:08:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=89=D0=B5=D0=B3=D0=BE=20=D0=BB=D0=B8=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D0=B0=20=D1=84=D0=BE=D1=82=D0=BE=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Проверяется количество уже существующих фото перед загрузкой новых - Блокируется загрузка если уже есть 10 фото (максимум) - При превышении загружается только доступное количество слотов - Информативные сообщения об ошибках и предупреждения для пользователя - Исправлена проблема с накоплением фото при многократном редактировании --- myproject/products/views/utils.py | 35 ++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/myproject/products/views/utils.py b/myproject/products/views/utils.py index 532f79d..79c4760 100644 --- a/myproject/products/views/utils.py +++ b/myproject/products/views/utils.py @@ -43,15 +43,36 @@ def handle_photos(request, parent_obj, photo_model, parent_field_name): if not photos: return errors - # МАКСИМУМ 10 ФОТО - сохраняем первые 10, остальные отклоняем + # МАКСИМУМ 10 ФОТО на товар/комплект/категорию MAX_PHOTOS = 10 - if len(photos) > MAX_PHOTOS: - warnings.append(f'Загружено {len(photos)} фото, но обработано только первые {MAX_PHOTOS}. ' - f'Максимум {MAX_PHOTOS} фото на товар.') - photos = photos[:MAX_PHOTOS] - - # Получаем максимальный order для этого родительского объекта + + # Получаем количество уже существующих фото filter_kwargs = {parent_field_name: parent_obj} + existing_count = photo_model.objects.filter(**filter_kwargs).count() + + # Проверяем общий лимит (существующие + новые) + total_after_upload = existing_count + len(photos) + + if existing_count >= MAX_PHOTOS: + # Уже достигнут лимит - новые фото не принимаем + errors.append( + f'Достигнут лимит: максимум {MAX_PHOTOS} фото. ' + f'Сейчас уже загружено {existing_count} фото. ' + f'Удалите лишние фото перед добавлением новых.' + ) + return errors + + if total_after_upload > MAX_PHOTOS: + # Превышение лимита - сохраняем только те фото, которые влезают + available_slots = MAX_PHOTOS - existing_count + warnings.append( + f'Можно загрузить только {available_slots} фото ' + f'(уже есть {existing_count}, лимит {MAX_PHOTOS}). ' + f'Обработано первые {available_slots} из {len(photos)} загруженных файлов.' + ) + photos = photos[:available_slots] + + # Получаем максимальный order для этого родительского объекта max_order = photo_model.objects.filter(**filter_kwargs).aggregate( models.Max('order') )['order__max']