forked from erp-dev/erp
feat: added mdy stagging upload to tiia, and change outgoing_date to datetime type
This commit is contained in:
@@ -7,14 +7,18 @@ from rest_framework.response import Response
|
||||
from rest_framework.permissions import BasePermission
|
||||
from rest_framework.permissions import DjangoModelPermissions
|
||||
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db.models import CharField, Prefetch
|
||||
from django.db.models.functions import Cast, Coalesce
|
||||
from django.views.decorators.cache import cache_page
|
||||
from django.views.decorators.http import condition
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.utils import timezone
|
||||
from django.utils.dateparse import parse_date, parse_datetime
|
||||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from django_filters import rest_framework as django_filters
|
||||
from django_filters import IsoDateTimeFilter
|
||||
from datetime import datetime, time, timedelta
|
||||
|
||||
from flower.viewsets import LimitedModelViewSet
|
||||
from printing import models
|
||||
@@ -75,8 +79,8 @@ class PrintingOrderFilterSet(django_filters.FilterSet):
|
||||
is_fabric_received = django_filters.BooleanFilter()
|
||||
is_invalid = django_filters.BooleanFilter()
|
||||
area = django_filters.CharFilter(lookup_expr='icontains')
|
||||
outgoing_date_from = django_filters.DateFilter(field_name='outgoing_date', lookup_expr='gte')
|
||||
outgoing_date_to = django_filters.DateFilter(field_name='outgoing_date', lookup_expr='lte')
|
||||
outgoing_date_from = django_filters.CharFilter(method='filter_outgoing_date_from')
|
||||
outgoing_date_to = django_filters.CharFilter(method='filter_outgoing_date_to')
|
||||
created_date_from = django_filters.DateFilter(field_name='created_at', lookup_expr='gte')
|
||||
created_date_to = django_filters.DateFilter(field_name='created_at', method='filter_created_date_to')
|
||||
|
||||
@@ -84,6 +88,58 @@ class PrintingOrderFilterSet(django_filters.FilterSet):
|
||||
model = models.PrintingOrder
|
||||
fields = ['customer', 'is_urgent', 'is_fabric_received', 'is_invalid']
|
||||
|
||||
@staticmethod
|
||||
def _parse_date_or_datetime(value: str | None) -> tuple[datetime | None, bool]:
|
||||
"""
|
||||
解析日期/日期时间字符串为“当前时区”的 aware datetime。
|
||||
|
||||
返回:
|
||||
- (dt, has_time)
|
||||
- has_time=True:输入包含时间(datetime)
|
||||
- has_time=False:输入为纯日期(date-only)
|
||||
"""
|
||||
s = (value or '').strip()
|
||||
if not s:
|
||||
return None, False
|
||||
|
||||
tz = timezone.get_current_timezone()
|
||||
|
||||
# 注意:Django 的 parse_datetime 在某些版本会把纯日期(YYYY-MM-DD)也解析成 00:00:00,
|
||||
# 这会让“to=日期”语义从“包含整天”退化为“<= 当天 00:00:00”。因此这里先尝试 parse_date。
|
||||
d = parse_date(s)
|
||||
if d is not None:
|
||||
dt0 = timezone.make_aware(datetime.combine(d, time.min), tz)
|
||||
return dt0, False
|
||||
|
||||
dt = parse_datetime(s)
|
||||
if dt is not None:
|
||||
if timezone.is_naive(dt):
|
||||
dt = timezone.make_aware(dt, tz)
|
||||
else:
|
||||
dt = timezone.localtime(dt, tz)
|
||||
return dt, True
|
||||
|
||||
return None, False
|
||||
|
||||
def filter_outgoing_date_from(self, queryset, name, value):
|
||||
dt, _has_time = self._parse_date_or_datetime(value)
|
||||
if dt is None:
|
||||
# 与 DRF/DjangoFilterBackend 行为保持一致:参数非法返回 400
|
||||
raise ValidationError('outgoing_date_from 必须是日期或日期时间')
|
||||
return queryset.filter(outgoing_date__gte=dt)
|
||||
|
||||
def filter_outgoing_date_to(self, queryset, name, value):
|
||||
dt, has_time = self._parse_date_or_datetime(value)
|
||||
if dt is None:
|
||||
raise ValidationError('outgoing_date_to 必须是日期或日期时间')
|
||||
|
||||
# 纯日期:包含整天 => outgoing_date < 次日 00:00:00
|
||||
if not has_time:
|
||||
return queryset.filter(outgoing_date__lt=dt + timedelta(days=1))
|
||||
|
||||
# 日期时间:按“<=”包含到秒
|
||||
return queryset.filter(outgoing_date__lte=dt)
|
||||
|
||||
def filter_created_date_to(self, queryset, name, value):
|
||||
"""
|
||||
过滤 created_at <= 指定日期的 23:59:59.999999
|
||||
|
||||
Reference in New Issue
Block a user