diff --git a/myproject/orders/filters.py b/myproject/orders/filters.py index 238b604..b4cc615 100644 --- a/myproject/orders/filters.py +++ b/myproject/orders/filters.py @@ -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): """ Фильтр для показа всех заказов.