feat(products): добавить интерфейс маркетинговых флагов
Добавлены поля is_new, is_popular, is_special в форму продукта. Настроено отображение полей в виде переключателей (switch). Добавлено отображение бейджей флагов в списке товаров и на странице детализации продукта.
This commit is contained in:
@@ -98,7 +98,8 @@ class ProductForm(SKUUniqueMixin, forms.ModelForm):
|
|||||||
model = Product
|
model = Product
|
||||||
fields = [
|
fields = [
|
||||||
'name', 'sku', 'description', 'short_description', 'categories',
|
'name', 'sku', 'description', 'short_description', 'categories',
|
||||||
'tags', 'base_unit', 'price', 'sale_price', 'status'
|
'tags', 'base_unit', 'price', 'sale_price', 'status',
|
||||||
|
'is_new', 'is_popular', 'is_special'
|
||||||
]
|
]
|
||||||
labels = {
|
labels = {
|
||||||
'name': 'Название',
|
'name': 'Название',
|
||||||
@@ -149,6 +150,13 @@ class ProductForm(SKUUniqueMixin, forms.ModelForm):
|
|||||||
self.fields['base_unit'].required = False
|
self.fields['base_unit'].required = False
|
||||||
self.fields['base_unit'].help_text = 'Базовая единица для учета товара на складе. На основе этой единицы можно создать единицы продажи.'
|
self.fields['base_unit'].help_text = 'Базовая единица для учета товара на складе. На основе этой единицы можно создать единицы продажи.'
|
||||||
|
|
||||||
|
# Маркетинговые флаги (switch-стиль)
|
||||||
|
for flag_field in ['is_new', 'is_popular', 'is_special']:
|
||||||
|
self.fields[flag_field].widget.attrs.update({
|
||||||
|
'class': 'form-check-input',
|
||||||
|
'role': 'switch'
|
||||||
|
})
|
||||||
|
|
||||||
def clean_name(self):
|
def clean_name(self):
|
||||||
"""Валидация уникальности имени для активных товаров"""
|
"""Валидация уникальности имени для активных товаров"""
|
||||||
name = self.cleaned_data.get('name')
|
name = self.cleaned_data.get('name')
|
||||||
|
|||||||
@@ -338,6 +338,23 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Маркетинговые флаги:</th>
|
||||||
|
<td>
|
||||||
|
{% if product.is_new %}
|
||||||
|
<span class="badge bg-warning text-dark"><i class="bi bi-stars"></i> Новинка</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if product.is_popular %}
|
||||||
|
<span class="badge bg-danger"><i class="bi bi-fire"></i> Популярный</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if product.is_special %}
|
||||||
|
<span class="badge bg-success"><i class="bi bi-percent"></i> Спецпредложение</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if not product.is_new and not product.is_popular and not product.is_special %}
|
||||||
|
<span class="text-muted">-</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Дата создания:</th>
|
<th>Дата создания:</th>
|
||||||
<td>{{ product.created_at }}</td>
|
<td>{{ product.created_at }}</td>
|
||||||
|
|||||||
@@ -530,6 +530,43 @@
|
|||||||
|
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
|
|
||||||
|
<!-- Блок: Маркетинговые флаги -->
|
||||||
|
<div class="mb-4">
|
||||||
|
<h5 class="mb-3"><i class="bi bi-tag"></i> Маркетинговые флаги</h5>
|
||||||
|
<p class="text-muted small mb-3">Отображаются на внешних площадках (Recommerce и др.)</p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
{{ form.is_new }}
|
||||||
|
<label class="form-check-label" for="id_is_new">
|
||||||
|
<i class="bi bi-stars text-warning"></i> Новинка
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted d-block ms-4">Товар отображается как новый</small>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
{{ form.is_popular }}
|
||||||
|
<label class="form-check-label" for="id_is_popular">
|
||||||
|
<i class="bi bi-fire text-danger"></i> Популярный
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted d-block ms-4">Товар отображается как популярный</small>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
{{ form.is_special }}
|
||||||
|
<label class="form-check-label" for="id_is_special">
|
||||||
|
<i class="bi bi-percent text-success"></i> Спецпредложение
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted d-block ms-4">Акционный товар (+ автоматически при скидке)</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="my-4">
|
||||||
|
|
||||||
<!-- Блок 2.5: Информация о наличии (только при редактировании) -->
|
<!-- Блок 2.5: Информация о наличии (только при редактировании) -->
|
||||||
{% if object %}
|
{% if object %}
|
||||||
<div class="mb-4 p-3 bg-info-light rounded border border-info">
|
<div class="mb-4 p-3 bg-info-light rounded border border-info">
|
||||||
|
|||||||
@@ -246,6 +246,11 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<a href="{% url 'products:productkit-detail' item.pk %}">{{ item.name }}</a>
|
<a href="{% url 'products:productkit-detail' item.pk %}">{{ item.name }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="mt-1">
|
||||||
|
{% if item.is_new %}<span class="badge bg-warning text-dark" title="Новинка"><i class="bi bi-stars"></i></span>{% endif %}
|
||||||
|
{% if item.is_popular %}<span class="badge bg-danger" title="Популярный"><i class="bi bi-fire"></i></span>{% endif %}
|
||||||
|
{% if item.is_special %}<span class="badge bg-success" title="Спецпредложение"><i class="bi bi-percent"></i></span>{% endif %}
|
||||||
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td><code class="small">{{ item.sku }}</code></td>
|
<td><code class="small">{{ item.sku }}</code></td>
|
||||||
<td>
|
<td>
|
||||||
|
|||||||
Reference in New Issue
Block a user