From dbadd149137b660b984c6c853fca7c0ca86200ca Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Tue, 27 Jan 2026 18:27:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=BE=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B4=D0=B0=D1=82=D0=B5=20=D0=B4=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myproject/orders/filters.py | 49 ++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 4 deletions(-) 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): """ Фильтр для показа всех заказов.