From 14188fbac43bb2f0517961a126f8b12f38e4da6c Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Thu, 15 Jan 2026 18:39:05 +0300 Subject: [PATCH] =?UTF-8?q?feat(orders):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D0=BE=D0=BB=D0=B5=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=D1=8E=D0=BC=D0=B5=20=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлено текстовое поле `summary` в модель `Order` для хранения краткого описания заказа на естественном языке. Обновлена форма `OrderForm` с добавлением виджета textarea, плейсхолдера и стилей. В шаблоны `order_form.html` и `order_detail.html` добавлены элементы для ввода и отображения резюме заказа. Создана соответствующая миграция. --- ...lter_glmintegration_model_name_and_more.py | 29 +++++++++++++++++++ myproject/orders/forms.py | 7 +++++ .../orders/migrations/0003_order_summary.py | 18 ++++++++++++ myproject/orders/models/order.py | 7 +++++ .../orders/templates/orders/order_detail.html | 6 ++++ .../orders/templates/orders/order_form.html | 26 ++++++++++++++++- 6 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 myproject/integrations/migrations/0009_alter_glmintegration_model_name_and_more.py create mode 100644 myproject/orders/migrations/0003_order_summary.py diff --git a/myproject/integrations/migrations/0009_alter_glmintegration_model_name_and_more.py b/myproject/integrations/migrations/0009_alter_glmintegration_model_name_and_more.py new file mode 100644 index 0000000..c64c3ae --- /dev/null +++ b/myproject/integrations/migrations/0009_alter_glmintegration_model_name_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.0.10 on 2026-01-15 12:25 + +import integrations.models.ai_services.openrouter +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('integrations', '0008_openrouter_temperature_choices'), + ] + + operations = [ + migrations.AlterField( + model_name='glmintegration', + name='model_name', + field=models.CharField(choices=[('glm-4', 'GLM-4 (Платная, дешевле)'), ('glm-4.7', 'GLM-4.7 (Платная)'), ('charglm-3', 'ChargLM-3 (Платная)'), ('glm-4.6v', 'GLM-4.6V (Бесплатная)'), ('glm-4.5v', 'GLM-4.5V (Бесплатная)'), ('glm-4.5-air', 'GLM-4.5-Air (Бесплатная)'), ('glm-4.5-flash', 'GLM-4.5-Flash (Бесплатная)'), ('glm-4.5-flashx', 'GLM-4.5-FlashX (Бесплатная)')], default='glm-4', help_text='Название используемой модели GLM (например, glm-4.7, glm-4)', max_length=100, verbose_name='Название модели'), + ), + migrations.AlterField( + model_name='openrouterintegration', + name='model_name', + field=models.CharField(choices=[('xiaomi/mimo-v2-flash:free', 'Xiaomi MIMO v2 Flash (Бесплатная)'), ('mistralai/devstral-2512:free', 'Mistral Devstral 2512 (Бесплатная)'), ('z-ai/glm-4.5-air:free', 'Z.AI GLM-4.5 Air (Бесплатная)'), ('qwen/qwen3-coder:free', 'Qwen 3 Coder (Бесплатная)')], default='xiaomi/mimo-v2-flash:free', help_text='Название используемой модели OpenRouter', max_length=100, verbose_name='Название модели'), + ), + migrations.AlterField( + model_name='openrouterintegration', + name='temperature', + field=models.FloatField(choices=[(0.1, '0.1 - Очень консервативно'), (0.3, '0.3 - Консервативно'), (0.5, '0.5 - Умеренно'), (0.7, '0.7 - Баланс (по умолчанию)'), (1.0, '1.0 - Креативно'), (1.5, '1.5 - Очень креативно'), (2.0, '2.0 - Максимальная креативность')], default=0.7, help_text='Параметр температуры для генерации (0.0-2.0)', validators=[integrations.models.ai_services.openrouter.validate_temperature], verbose_name='Температура'), + ), + ] diff --git a/myproject/orders/forms.py b/myproject/orders/forms.py index 395ef0d..9e6bc6a 100644 --- a/myproject/orders/forms.py +++ b/myproject/orders/forms.py @@ -194,9 +194,16 @@ class OrderForm(forms.ModelForm): 'needs_product_photo', 'needs_delivery_photo', 'special_instructions', + 'summary', ] widgets = { 'special_instructions': forms.Textarea(attrs={'rows': 3}), + 'summary': forms.Textarea(attrs={ + 'rows': 5, + 'placeholder': 'Кратко опишите заказ на естественном языке...', + 'class': 'form-control', + 'style': 'resize: vertical; min-height: 100px;' + }), } def __init__(self, *args, **kwargs): diff --git a/myproject/orders/migrations/0003_order_summary.py b/myproject/orders/migrations/0003_order_summary.py new file mode 100644 index 0000000..713e702 --- /dev/null +++ b/myproject/orders/migrations/0003_order_summary.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.10 on 2026-01-15 12:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0002_initial'), + ] + + operations = [ + migrations.AddField( + model_name='order', + name='summary', + field=models.TextField(blank=True, help_text="Краткое описание заказа на естественном языке (например: '21 фридом 60 см в упаковке на наше усмотрение')", null=True, verbose_name='Резюме заказа'), + ), + ] diff --git a/myproject/orders/models/order.py b/myproject/orders/models/order.py index b7786e6..be8fd7e 100644 --- a/myproject/orders/models/order.py +++ b/myproject/orders/models/order.py @@ -122,6 +122,13 @@ class Order(models.Model): help_text="Комментарии и пожелания к заказу" ) + summary = models.TextField( + blank=True, + null=True, + verbose_name="Резюме заказа", + help_text="Краткое описание заказа на естественном языке (например: '21 фридом 60 см в упаковке на наше усмотрение')" + ) + # Фото needs_product_photo = models.BooleanField( default=False, diff --git a/myproject/orders/templates/orders/order_detail.html b/myproject/orders/templates/orders/order_detail.html index af723af..93cbe6a 100644 --- a/myproject/orders/templates/orders/order_detail.html +++ b/myproject/orders/templates/orders/order_detail.html @@ -21,6 +21,12 @@ {% endif %} + {% if order.summary %} +
+
Резюме заказа:
+

{{ order.summary|linebreaks }}

+
+ {% endif %}
diff --git a/myproject/orders/templates/orders/order_form.html b/myproject/orders/templates/orders/order_form.html index f9dbdeb..322cdad 100644 --- a/myproject/orders/templates/orders/order_form.html +++ b/myproject/orders/templates/orders/order_form.html @@ -171,6 +171,16 @@ box-shadow: 0 0 20px rgba(220, 53, 69, 0.8), 0 0 30px rgba(220, 53, 69, 0.4); } } + + /* Стили для текстовой области резюме заказа */ + textarea[name="summary"] { + transition: border-color 0.3s ease, box-shadow 0.3s ease; + } + + textarea[name="summary"]:focus { + border-color: #80bdff; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + } {% endblock %} @@ -262,6 +272,20 @@
+ +
+
+
Резюме заказа
+
+
+
+ + {{ form.summary }} +
Введите краткое резюме заказа на естественном языке (например: '21 фридом 60 см в упаковке на наше усмотрение'). Можно использовать переносы строк.
+
+
+
+
@@ -1046,7 +1070,7 @@ document.addEventListener('DOMContentLoaded', function() {