Улучшена фильтрация заказов по дате доставки
This commit is contained in:
@@ -32,9 +32,9 @@ class OrderFilter(django_filters.FilterSet):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Фильтр по диапазону дат доставки (используем delivery__delivery_date после рефакторинга)
|
# Фильтр по диапазону дат доставки (используем delivery__delivery_date после рефакторинга)
|
||||||
|
# Кастомные методы для показа заказов без даты в нейтральных статусах
|
||||||
delivery_date_after = django_filters.DateFilter(
|
delivery_date_after = django_filters.DateFilter(
|
||||||
field_name='delivery__delivery_date',
|
method='filter_delivery_date_after',
|
||||||
lookup_expr='gte',
|
|
||||||
label='Дата доставки от',
|
label='Дата доставки от',
|
||||||
widget=forms.DateInput(attrs={
|
widget=forms.DateInput(attrs={
|
||||||
'class': 'form-control date-input',
|
'class': 'form-control date-input',
|
||||||
@@ -43,8 +43,7 @@ class OrderFilter(django_filters.FilterSet):
|
|||||||
)
|
)
|
||||||
|
|
||||||
delivery_date_before = django_filters.DateFilter(
|
delivery_date_before = django_filters.DateFilter(
|
||||||
field_name='delivery__delivery_date',
|
method='filter_delivery_date_before',
|
||||||
lookup_expr='lte',
|
|
||||||
label='Дата доставки до',
|
label='Дата доставки до',
|
||||||
widget=forms.DateInput(attrs={
|
widget=forms.DateInput(attrs={
|
||||||
'class': 'form-control date-input',
|
'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.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_PICKUP)
|
||||||
return queryset
|
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):
|
def filter_show_all_orders(self, queryset, name, value):
|
||||||
"""
|
"""
|
||||||
Фильтр для показа всех заказов.
|
Фильтр для показа всех заказов.
|
||||||
|
|||||||
Reference in New Issue
Block a user