From cfddfa526e3d9b75a6de967aa5be05dcc0e2b0f9 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 23 Nov 2023 10:36:15 +1100 Subject: [PATCH] Add custom InvenTreeDateFilter class (#5970) - Fixes issues with naive datetimei object - Suppress warning - Closes https://github.com/inventree/InvenTree/issues/5223 --- InvenTree/InvenTree/filters.py | 23 +++++++++++++++++++++++ InvenTree/part/api.py | 6 +++--- InvenTree/stock/api.py | 10 +++++----- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/InvenTree/InvenTree/filters.py b/InvenTree/InvenTree/filters.py index 560e859a57..0f49ebba08 100644 --- a/InvenTree/InvenTree/filters.py +++ b/InvenTree/InvenTree/filters.py @@ -1,11 +1,34 @@ """General filters for InvenTree.""" +from datetime import datetime + +from django.conf import settings +from django.utils import timezone +from django.utils.timezone import make_aware + from django_filters import rest_framework as rest_filters from rest_framework import filters import InvenTree.helpers +class InvenTreeDateFilter(rest_filters.DateFilter): + """Custom DateFilter class which handles timezones correctly.""" + + def filter(self, qs, value): + """Override the filter method to handle timezones correctly.""" + + if settings.USE_TZ: + + # Check if value is already timezone aware + if value is not None and not timezone.is_aware(value): + tz = timezone.get_current_timezone() + value = datetime(value.year, value.month, value.day) + value = make_aware(value, tz, True) + + return super().filter(qs, value) + + class InvenTreeSearchFilter(filters.SearchFilter): """Custom search filter which allows adjusting of search terms dynamically""" diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index ab725d3b76..d8ffa7e873 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -20,7 +20,7 @@ from build.models import Build, BuildItem from InvenTree.api import (APIDownloadMixin, AttachmentMixin, ListCreateDestroyAPIView, MetadataView) from InvenTree.filters import (ORDER_FILTER, SEARCH_ORDER_FILTER, - SEARCH_ORDER_FILTER_ALIAS, + SEARCH_ORDER_FILTER_ALIAS, InvenTreeDateFilter, InvenTreeSearchFilter) from InvenTree.helpers import (DownloadFile, increment_serial_number, isNull, str2bool, str2int) @@ -971,8 +971,8 @@ class PartFilter(rest_filters.FilterSet): tags_slug = rest_filters.CharFilter(field_name='tags__slug', lookup_expr='iexact') # Created date filters - created_before = rest_filters.DateFilter(label='Updated before', field_name='creation_date', lookup_expr='lte') - created_after = rest_filters.DateFilter(label='Updated after', field_name='creation_date', lookup_expr='gte') + created_before = InvenTreeDateFilter(label='Updated before', field_name='creation_date', lookup_expr='lte') + created_after = InvenTreeDateFilter(label='Updated after', field_name='creation_date', lookup_expr='gte') class PartMixin: diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 05d8cf4e89..0e11037392 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -26,7 +26,7 @@ from generic.states.api import StatusView from InvenTree.api import (APIDownloadMixin, AttachmentMixin, ListCreateDestroyAPIView, MetadataView) from InvenTree.filters import (ORDER_FILTER, SEARCH_ORDER_FILTER, - SEARCH_ORDER_FILTER_ALIAS) + SEARCH_ORDER_FILTER_ALIAS, InvenTreeDateFilter) from InvenTree.helpers import (DownloadFile, extract_serial_numbers, isNull, str2bool, str2int) from InvenTree.mixins import (CreateAPI, CustomRetrieveUpdateDestroyAPI, @@ -680,17 +680,17 @@ class StockFilter(rest_filters.FilterSet): ).distinct() # Update date filters - updated_before = rest_filters.DateFilter(label='Updated before', field_name='updated', lookup_expr='lte') - updated_after = rest_filters.DateFilter(label='Updated after', field_name='updated', lookup_expr='gte') + updated_before = InvenTreeDateFilter(label='Updated before', field_name='updated', lookup_expr='lte') + updated_after = InvenTreeDateFilter(label='Updated after', field_name='updated', lookup_expr='gte') # Stock "expiry" filters - expiry_date_lte = rest_filters.DateFilter( + expiry_date_lte = InvenTreeDateFilter( label=_("Expiry date before"), field_name='expiry_date', lookup_expr='lte', ) - expiry_date_gte = rest_filters.DateFilter( + expiry_date_gte = InvenTreeDateFilter( label=_('Expiry date after'), field_name='expiry_date', lookup_expr='gte',