mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-04 07:05:41 +00:00 
			
		
		
		
	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:
		@@ -1,11 +1,34 @@
 | 
				
			|||||||
"""General filters for InvenTree."""
 | 
					"""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 django_filters import rest_framework as rest_filters
 | 
				
			||||||
from rest_framework import filters
 | 
					from rest_framework import filters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import InvenTree.helpers
 | 
					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):
 | 
					class InvenTreeSearchFilter(filters.SearchFilter):
 | 
				
			||||||
    """Custom search filter which allows adjusting of search terms dynamically"""
 | 
					    """Custom search filter which allows adjusting of search terms dynamically"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ from build.models import Build, BuildItem
 | 
				
			|||||||
from InvenTree.api import (APIDownloadMixin, AttachmentMixin,
 | 
					from InvenTree.api import (APIDownloadMixin, AttachmentMixin,
 | 
				
			||||||
                           ListCreateDestroyAPIView, MetadataView)
 | 
					                           ListCreateDestroyAPIView, MetadataView)
 | 
				
			||||||
from InvenTree.filters import (ORDER_FILTER, SEARCH_ORDER_FILTER,
 | 
					from InvenTree.filters import (ORDER_FILTER, SEARCH_ORDER_FILTER,
 | 
				
			||||||
                               SEARCH_ORDER_FILTER_ALIAS,
 | 
					                               SEARCH_ORDER_FILTER_ALIAS, InvenTreeDateFilter,
 | 
				
			||||||
                               InvenTreeSearchFilter)
 | 
					                               InvenTreeSearchFilter)
 | 
				
			||||||
from InvenTree.helpers import (DownloadFile, increment_serial_number, isNull,
 | 
					from InvenTree.helpers import (DownloadFile, increment_serial_number, isNull,
 | 
				
			||||||
                               str2bool, str2int)
 | 
					                               str2bool, str2int)
 | 
				
			||||||
@@ -971,8 +971,8 @@ class PartFilter(rest_filters.FilterSet):
 | 
				
			|||||||
    tags_slug = rest_filters.CharFilter(field_name='tags__slug', lookup_expr='iexact')
 | 
					    tags_slug = rest_filters.CharFilter(field_name='tags__slug', lookup_expr='iexact')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Created date filters
 | 
					    # Created date filters
 | 
				
			||||||
    created_before = rest_filters.DateFilter(label='Updated before', field_name='creation_date', lookup_expr='lte')
 | 
					    created_before = InvenTreeDateFilter(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_after = InvenTreeDateFilter(label='Updated after', field_name='creation_date', lookup_expr='gte')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PartMixin:
 | 
					class PartMixin:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ from generic.states.api import StatusView
 | 
				
			|||||||
from InvenTree.api import (APIDownloadMixin, AttachmentMixin,
 | 
					from InvenTree.api import (APIDownloadMixin, AttachmentMixin,
 | 
				
			||||||
                           ListCreateDestroyAPIView, MetadataView)
 | 
					                           ListCreateDestroyAPIView, MetadataView)
 | 
				
			||||||
from InvenTree.filters import (ORDER_FILTER, SEARCH_ORDER_FILTER,
 | 
					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,
 | 
					from InvenTree.helpers import (DownloadFile, extract_serial_numbers, isNull,
 | 
				
			||||||
                               str2bool, str2int)
 | 
					                               str2bool, str2int)
 | 
				
			||||||
from InvenTree.mixins import (CreateAPI, CustomRetrieveUpdateDestroyAPI,
 | 
					from InvenTree.mixins import (CreateAPI, CustomRetrieveUpdateDestroyAPI,
 | 
				
			||||||
@@ -680,17 +680,17 @@ class StockFilter(rest_filters.FilterSet):
 | 
				
			|||||||
        ).distinct()
 | 
					        ).distinct()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Update date filters
 | 
					    # Update date filters
 | 
				
			||||||
    updated_before = rest_filters.DateFilter(label='Updated before', field_name='updated', lookup_expr='lte')
 | 
					    updated_before = InvenTreeDateFilter(label='Updated before', field_name='updated', lookup_expr='lte')
 | 
				
			||||||
    updated_after = rest_filters.DateFilter(label='Updated after', field_name='updated', lookup_expr='gte')
 | 
					    updated_after = InvenTreeDateFilter(label='Updated after', field_name='updated', lookup_expr='gte')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Stock "expiry" filters
 | 
					    # Stock "expiry" filters
 | 
				
			||||||
    expiry_date_lte = rest_filters.DateFilter(
 | 
					    expiry_date_lte = InvenTreeDateFilter(
 | 
				
			||||||
        label=_("Expiry date before"),
 | 
					        label=_("Expiry date before"),
 | 
				
			||||||
        field_name='expiry_date',
 | 
					        field_name='expiry_date',
 | 
				
			||||||
        lookup_expr='lte',
 | 
					        lookup_expr='lte',
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expiry_date_gte = rest_filters.DateFilter(
 | 
					    expiry_date_gte = InvenTreeDateFilter(
 | 
				
			||||||
        label=_('Expiry date after'),
 | 
					        label=_('Expiry date after'),
 | 
				
			||||||
        field_name='expiry_date',
 | 
					        field_name='expiry_date',
 | 
				
			||||||
        lookup_expr='gte',
 | 
					        lookup_expr='gte',
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user