mirror of
https://github.com/himool/HimoolERP.git
synced 2026-01-21 00:31:00 +08:00
49 lines
2.5 KiB
Python
49 lines
2.5 KiB
Python
from django_filters import rest_framework as filters
|
|
from .models import Flow, Inventory
|
|
from django.db.models import Q, F
|
|
|
|
|
|
class InventoryFilter(filters.FilterSet):
|
|
warehouse = filters.NumberFilter(field_name='warehouse')
|
|
category = filters.NumberFilter(field_name='goods__category')
|
|
min_quantity = filters.NumberFilter(field_name='quantity', lookup_expr='gte')
|
|
max_quantity = filters.NumberFilter(field_name='quantity', lookup_expr='lte')
|
|
is_filter_zero = filters.BooleanFilter(method='is_filter_zero_filter', label='is_filter_zero')
|
|
is_filter_negative = filters.BooleanFilter(method='is_filter_negative_filter', label='is_filter_negative')
|
|
is_show_warning = filters.BooleanFilter(method='is_show_warning_filter', label='is_show_warning')
|
|
search = filters.CharFilter(method='search_filter', label='search_filter')
|
|
ordering = filters.CharFilter(method='ordering_filter', label='ordering_filter')
|
|
|
|
class Meta:
|
|
model = Inventory
|
|
fields = ['warehouse', 'category', 'min_quantity', 'max_quantity', 'is_filter_zero', 'search',
|
|
'is_filter_negative', 'ordering', 'is_show_warning']
|
|
|
|
def is_filter_zero_filter(self, queryset, name, value):
|
|
return queryset.exclude(quantity=0) if value else queryset
|
|
|
|
def is_filter_negative_filter(self, queryset, name, value):
|
|
return queryset.filter(quantity__gte=0) if value else queryset
|
|
|
|
def is_show_warning_filter(self, queryset, name, value):
|
|
return queryset.filter(quantity__lte=F('goods__inventory_warning_lower_limit')) if value else queryset
|
|
|
|
def search_filter(self, queryset, name, value):
|
|
return queryset.filter(Q(goods__name__startswith=value) | Q(goods__code__startswith=value))
|
|
|
|
def ordering_filter(self, queryset, name, value):
|
|
ordering_fields = {'goods_code': 'goods__code', '-goods_code': '-goods__code', 'goods_name': 'goods__name',
|
|
'-goods_name': '-goods__name', 'category': 'goods__category', '-category': '-goods__category',
|
|
'warehouse': 'warehouse', '-warehouse': '-warehouse', 'quantity': 'quantity',
|
|
'-quantity': '-quantity', 'purchase_price': 'goods__purchase_price',
|
|
'-purchase_price': '-goods__purchase_price'}
|
|
|
|
return queryset.order_by(ordering_fields.get(value, 'goods__code'))
|
|
|
|
|
|
class FlowFilter(filters.FilterSet):
|
|
category = filters.NumberFilter(field_name='goods__category')
|
|
|
|
class Meta:
|
|
model = Flow
|
|
fields = ['warehouse', 'type', 'category']
|