diff --git a/myproject/products/apps.py b/myproject/products/apps.py index b19b826..c01347c 100644 --- a/myproject/products/apps.py +++ b/myproject/products/apps.py @@ -10,3 +10,13 @@ class ProductsConfig(AppConfig): Подключаем сигналы при готовности приложения. """ import products.signals # noqa + + # Регистрация декодеров HEIF/AVIF для Pillow (поддержка HEIC/HEIF/AVIF с iPhone и других устройств) + try: + from pillow_heif import register_heif_opener, register_avif_opener + register_heif_opener() + register_avif_opener() + except ImportError: + # Плагин может отсутствовать в окружении — не ломаем запуск приложения + # HEIC/HEIF/AVIF тогда не будут поддерживаться до установки зависимостей + pass diff --git a/myproject/products/templates/products/product_form.html b/myproject/products/templates/products/product_form.html index c8c55ed..4b10703 100644 --- a/myproject/products/templates/products/product_form.html +++ b/myproject/products/templates/products/product_form.html @@ -105,6 +105,20 @@ border-left: 3px solid #0d6efd !important; font-weight: 500 !important; } + + /* Стили для карточек фото */ + .hover-lift:hover { + transform: translateY(-5px); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; + } + + .photo-card .card { + border: 1px solid #e0e0e0; + } + + .photo-card:hover .card { + border-color: #667eea; + } {% endblock %} @@ -138,7 +152,254 @@
{{ form.name.errors }}
{% endif %} + +
+ + +
+
+
+ Фотографии товара +
+
+
+ + {% if object and product_photos %} +
+
+
+
+ Текущие фотографии + {{ photos_count }} +
+
+ +
+
+ {% for photo in product_photos %} +
+
+ +
+
+ +
+
+ + + {% if photo.order == 0 %} +
+ + Главное + +
+ {% endif %} + + +
+ Фото товара +
+ +
+ + {% if photo.order != 0 %} + + Сделать главным + + {% endif %} + + + + + + + Удалить + +
+ + +
+
+ + + + {% endfor %} +
+
+ + + + {% endif %} + + +
+
+ + +
+ + + + {% if object %} + Выберите фото для добавления к товару (можно выбрать несколько, до 10 штук всего) + {% else %} + Выберите фото для товара (можно выбрать несколько, до 10 штук) + {% endif %} + +
+
+ +
+ + +
@@ -223,7 +484,7 @@
{{ form.short_description }} - Используется для карточек товаров, превью и площадок + Может использоваться для карточек товаров на сайте {% if form.short_description.errors %}
{{ form.short_description.errors }}
{% endif %} @@ -471,12 +732,20 @@ {% endif %} -
- - - +
+
+ + +
+ + + {% if object %} Выберите фото для добавления к товару (можно выбрать несколько, до 10 штук всего) {% else %} @@ -491,11 +760,6 @@
Отмена - {% if perms.products.add_productkit %} - - Создать комплект - - {% endif %}
diff --git a/myproject/products/views/utils.py b/myproject/products/views/utils.py index 79c4760..d489ffe 100644 --- a/myproject/products/views/utils.py +++ b/myproject/products/views/utils.py @@ -10,11 +10,11 @@ def validate_photo(photo): Валидация загружаемого фото. Возвращает (True, None) если валидно, или (False, error_message) если ошибка. """ - max_size = 5 * 1024 * 1024 # 5MB - allowed_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp'] + max_size = 20 * 1024 * 1024 # 20MB + allowed_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.heic', '.heif'] if photo.size > max_size: - return False, f'Размер файла {photo.name} превышает 5MB.' + return False, f'Размер файла {photo.name} превышает 20MB.' ext = os.path.splitext(photo.name)[1].lower() if ext not in allowed_extensions: @@ -43,8 +43,8 @@ def handle_photos(request, parent_obj, photo_model, parent_field_name): if not photos: return errors - # МАКСИМУМ 10 ФОТО на товар/комплект/категорию - MAX_PHOTOS = 10 + # МАКСИМУМ 5 ФОТО на товар/комплект/категорию + MAX_PHOTOS = 5 # Получаем количество уже существующих фото filter_kwargs = {parent_field_name: parent_obj} diff --git a/myproject/requirements.txt b/myproject/requirements.txt index 16f5feb..19e2081 100644 --- a/myproject/requirements.txt +++ b/myproject/requirements.txt @@ -18,7 +18,8 @@ django-tenants==3.7.0 kombu==5.6.0 packaging==25.0 phonenumbers==9.0.17 -pillow==11.0.0 +pillow>=12.0.0 +pillow-heif>=0.15.0 prompt_toolkit==3.0.52 psycopg2-binary==2.9.11 python-dateutil==2.9.0.post0 diff --git a/requirements.txt b/requirements.txt index b256ee7..19e2081 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,34 @@ +amqp==5.3.1 +asgiref==3.9.0 +billiard==4.2.2 +celery==5.4.0 +click==8.3.0 +click-didyoumean==0.3.1 +click-plugins==1.1.1.2 +click-repl==0.3.0 +colorama==0.4.6 Django==5.0.10 -django-tenants==3.7.0 +django-celery-results==2.5.1 +django-environ==0.12.0 django-filter==24.3 -django-simple-history==3.10.1 django-nested-admin==4.1.5 django-phonenumber-field==8.3.0 -django-environ==0.12.0 -psycopg2-binary==2.9.11 -Pillow==11.0.0 +django-simple-history==3.10.1 +django-tenants==3.7.0 +kombu==5.6.0 +packaging==25.0 phonenumbers==9.0.17 +pillow>=12.0.0 +pillow-heif>=0.15.0 +prompt_toolkit==3.0.52 +psycopg2-binary==2.9.11 +python-dateutil==2.9.0.post0 +python-monkey-business==1.1.0 +redis==5.0.8 +six==1.17.0 +sqlparse==0.5.3 +typing_extensions==4.15.0 +tzdata==2025.2 Unidecode==1.4.0 +vine==5.1.0 +wcwidth==0.2.14