feat(orders): добавить фильтр для показа завершённых заказов
Добавлен новый булевый фильтр "show_all_orders" в OrderFilter, позволяющий отображать все заказы, включая завершённые и отменённые. Обновлён шаблон order_list.html с добавлением тумблера для автоматической отправки формы при переключении фильтра. Фильтр по умолчанию показывает только активные заказы.
This commit is contained in:
@@ -101,11 +101,19 @@ class OrderFilter(django_filters.FilterSet):
|
|||||||
widget=forms.Select(attrs={'class': 'form-select'})
|
widget=forms.Select(attrs={'class': 'form-select'})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Фильтр: показывать все заказы, включая завершённые и отменённые
|
||||||
|
show_all_orders = django_filters.BooleanFilter(
|
||||||
|
method='filter_show_all_orders',
|
||||||
|
label='Включая завершённые',
|
||||||
|
widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Order
|
model = Order
|
||||||
fields = ['search', 'status', 'delivery_type', 'payment_status',
|
fields = ['search', 'status', 'delivery_type', 'payment_status',
|
||||||
'delivery_date_after', 'delivery_date_before',
|
'delivery_date_after', 'delivery_date_before',
|
||||||
'created_at_after', 'created_at_before']
|
'created_at_after', 'created_at_before',
|
||||||
|
'show_all_orders']
|
||||||
|
|
||||||
def filter_search(self, queryset, name, value):
|
def filter_search(self, queryset, name, value):
|
||||||
"""
|
"""
|
||||||
@@ -134,3 +142,18 @@ class OrderFilter(django_filters.FilterSet):
|
|||||||
elif value == 'pickup':
|
elif value == 'pickup':
|
||||||
return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_PICKUP)
|
return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_PICKUP)
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
def filter_show_all_orders(self, queryset, name, value):
|
||||||
|
"""
|
||||||
|
Фильтр для показа всех заказов.
|
||||||
|
- Если False или не передан: только активные заказы
|
||||||
|
(статусы с is_positive_end=False И is_negative_end=False)
|
||||||
|
- Если True: все заказы без ограничений
|
||||||
|
"""
|
||||||
|
if not value:
|
||||||
|
# Активные заказы = НЕ (is_positive_end OR is_negative_end)
|
||||||
|
return queryset.filter(
|
||||||
|
Q(status__isnull=True) |
|
||||||
|
(Q(status__is_positive_end=False) & Q(status__is_negative_end=False))
|
||||||
|
)
|
||||||
|
return queryset
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
</h5>
|
</h5>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<form method="get">
|
<form method="get" id="order-filter-form">
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<!-- Поиск -->
|
<!-- Поиск -->
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
@@ -86,6 +86,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Тумблер "Включая завершённые" -->
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input type="checkbox" name="show_all_orders" class="form-check-input" id="id_show_all_orders"
|
||||||
|
{% if request.GET.show_all_orders %}checked{% endif %}>
|
||||||
|
<label class="form-check-label" for="id_show_all_orders">
|
||||||
|
Включая завершённые
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Календарный фильтр по дате доставки (вторая строка) -->
|
<!-- Календарный фильтр по дате доставки (вторая строка) -->
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
@@ -388,6 +401,15 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Тумблер "Включая завершённые" - автоматическая отправка формы
|
||||||
|
const showAllOrdersSwitch = document.getElementById('id_show_all_orders');
|
||||||
|
const filterForm = document.getElementById('order-filter-form');
|
||||||
|
if (showAllOrdersSwitch && filterForm) {
|
||||||
|
showAllOrdersSwitch.addEventListener('change', function() {
|
||||||
|
filterForm.submit();
|
||||||
|
});
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user