Улучшена фильтрация заказов по дате доставки

This commit is contained in:
2026-01-27 18:27:05 +03:00
parent 907c21f22e
commit dbadd14913

View File

@@ -32,9 +32,9 @@ class OrderFilter(django_filters.FilterSet):
)
# Фильтр по диапазону дат доставки (используем delivery__delivery_date после рефакторинга)
# Кастомные методы для показа заказов без даты в нейтральных статусах
delivery_date_after = django_filters.DateFilter(
field_name='delivery__delivery_date',
lookup_expr='gte',
method='filter_delivery_date_after',
label='Дата доставки от',
widget=forms.DateInput(attrs={
'class': 'form-control date-input',
@@ -43,8 +43,7 @@ class OrderFilter(django_filters.FilterSet):
)
delivery_date_before = django_filters.DateFilter(
field_name='delivery__delivery_date',
lookup_expr='lte',
method='filter_delivery_date_before',
label='Дата доставки до',
widget=forms.DateInput(attrs={
'class': 'form-control date-input',
@@ -143,6 +142,48 @@ class OrderFilter(django_filters.FilterSet):
return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_PICKUP)
return queryset
def _get_null_date_condition(self):
"""
Условие для заказов без даты в нейтральных статусах.
Такие заказы всегда должны быть видны, чтобы не потерялись.
"""
# Заказы без даты И в нейтральном статусе (не завершены положительно/отрицательно)
return (
Q(delivery__delivery_date__isnull=True) &
(
Q(status__isnull=True) |
(Q(status__is_positive_end=False) & Q(status__is_negative_end=False))
)
)
def filter_delivery_date_after(self, queryset, name, value):
"""
Фильтр по дате доставки (от).
Всегда показывает заказы без даты в нейтральных статусах.
"""
if not value:
return queryset
# Заказы с датой >= value ИЛИ без даты в нейтральных статусах
return queryset.filter(
Q(delivery__delivery_date__gte=value) |
self._get_null_date_condition()
)
def filter_delivery_date_before(self, queryset, name, value):
"""
Фильтр по дате доставки (до).
Всегда показывает заказы без даты в нейтральных статусах.
"""
if not value:
return queryset
# Заказы с датой <= value ИЛИ без даты в нейтральных статусах
return queryset.filter(
Q(delivery__delivery_date__lte=value) |
self._get_null_date_condition()
)
def filter_show_all_orders(self, queryset, name, value):
"""
Фильтр для показа всех заказов.