Add custom InvenTreeDateFilter class (#5970)

- Fixes issues with naive datetimei object
- Suppress warning
- Closes https://github.com/inventree/InvenTree/issues/5223
This commit is contained in:
Oliver 2023-11-23 10:36:15 +11:00 committed by GitHub
parent 7dec1fcb25
commit cfddfa526e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 8 deletions

View File

@ -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"""

View File

@ -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:

View File

@ -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',