feat(orders): добавить фильтр для показа завершённых заказов

Добавлен новый булевый фильтр "show_all_orders" в OrderFilter, позволяющий отображать все заказы, включая завершённые и отменённые. Обновлён шаблон order_list.html с добавлением тумблера для автоматической отправки формы при переключении фильтра. Фильтр по умолчанию показывает только активные заказы.
This commit is contained in:
2026-01-21 21:16:58 +03:00
parent 622c544182
commit 07a9de040f
2 changed files with 47 additions and 2 deletions

View File

@@ -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

View File

@@ -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 %}