Улучшена фильтрация заказов по дате доставки
This commit is contained in:
@@ -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):
|
||||
"""
|
||||
Фильтр для показа всех заказов.
|
||||
|
||||
Reference in New Issue
Block a user