Add InventoryDetail filter

This commit is contained in:
sosokker 2023-11-19 12:56:22 +07:00
parent 83f55e8193
commit 7c841cf5f6
5 changed files with 51 additions and 22 deletions

View File

@ -1,5 +1,6 @@
import django_filters import django_filters
from inventory.models import Warehouse, Inventory from django_filters import OrderingFilter
from inventory.models import Warehouse, Inventory, Item
class WarehouseFilter(django_filters.FilterSet): class WarehouseFilter(django_filters.FilterSet):
class Meta: class Meta:
@ -25,4 +26,28 @@ class InventoryFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Inventory model = Inventory
fields = [] fields = []
class ItemFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='icontains', label='Item Name')
category = django_filters.CharFilter(field_name='category__name', lookup_expr='icontains', label='Category')
warehouse = django_filters.CharFilter(field_name='inventory__warehouse__name', lookup_expr='icontains', label='Warehouse')
quantity = django_filters.NumberFilter(label='Quantity', widget=django_filters.widgets.RangeWidget(attrs={'placeholder': 'Range'}))
weight = django_filters.NumberFilter(label='Weight', widget=django_filters.widgets.RangeWidget(attrs={'placeholder': 'Range'}))
ordering = OrderingFilter(
fields=(
('quantity', 'quantity'),
('weight', 'weight'),
('inventory__warehouse__name', 'warehouse_name'),
),
field_labels={
'quantity': 'Quantity',
'weight': 'Weight',
'inventory__warehouse__name': 'Warehouse Name',
}
)
class Meta:
model = Item
fields = ['name', 'category', 'warehouse', 'quantity', 'weight']

View File

@ -1,12 +1,12 @@
from typing import Any from typing import Any
from django.shortcuts import render from django.shortcuts import get_object_or_404, render
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django_filters.views import FilterView from django_filters.views import FilterView
from inventory.filters import WarehouseFilter, InventoryFilter from inventory.filters import WarehouseFilter, InventoryFilter, ItemFilter
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from inventory.models import Warehouse, Inventory from inventory.models import Warehouse, Inventory, Item
from inventory.utils import stock_percentage_all, count_pending_supply from inventory.utils import stock_percentage_all, count_pending_supply
from transaction.models import Customer from transaction.models import Customer
@ -52,12 +52,20 @@ class WarehouseDetailView(FilterView, LoginRequiredMixin):
return context return context
class InventoryView(TemplateView, LoginRequiredMixin): class InventoryView(FilterView, LoginRequiredMixin):
template_name = "inventory/inventory.html" template_name = "inventory/inventory.html"
model = Item
filterset_class = ItemFilter
def get_queryset(self):
queryset = super().get_queryset()
inventory_id = self.kwargs.get('iid')
inventory = get_object_or_404(Inventory, id=inventory_id)
return queryset.filter(inventory=inventory)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
inventory = Inventory.objects.get(id=self.kwargs.get('iid')) inventory = get_object_or_404(Inventory, id=self.kwargs.get('iid'))
context['item_list'] = inventory.item_set.all() context['item_list'] = inventory.item_set.all()
context['inventory_name'] = inventory.stock_identifier context['inventory_name'] = inventory.stock_identifier
context['warehouse_name'] = inventory.warehouse.name context['warehouse_name'] = inventory.warehouse.name

View File

@ -29,19 +29,15 @@
<h6 class="m-0 font-weight-bold text-primary">Filter</h6> <h6 class="m-0 font-weight-bold text-primary">Filter</h6>
</a> </a>
<!-- Card Content - Collapse --> <!-- Card Content - Collapse -->
<form method="get"> <form method="get" class="p-4">
<div class="row g-3 align-items-center mx-2 my-4"> {{ filter.form.as_p }}
{{ filter.form.as_p }} <label for="{{ filter.form.ordering.id_for_label }}">Sort by:</label>
<div class="col-auto"> {{ filter.form.ordering }}
<button type="submit" class="btn btn-primary">Filter</button> <input type="submit" value="Apply">
</div> <a href={{ request.path }} class="btn btn-danger">
<div class="col-auto"> <i class="fas fa-trash"></i> Clear Filter
<a href={{ request.path }} class="btn btn-danger"> </a>
<i class="fas fa-trash"></i> Clear Filter </form>
</a>
</div>
</div>
</form>
</div> </div>

View File

@ -46,7 +46,7 @@
<button type="submit" class="btn btn-primary">Filter</button> <button type="submit" class="btn btn-primary">Filter</button>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<a href="{% url 'warehouse' %}" class="btn btn-danger"> <a href={{ request.path }} class="btn btn-danger">
<i class="fas fa-trash"></i> Clear Filter <i class="fas fa-trash"></i> Clear Filter
</a> </a>
</div> </div>

View File

@ -13,7 +13,7 @@
<hr class="sidebar-divider my-0"> <hr class="sidebar-divider my-0">
<!-- Nav Item - Dashboard --> <!-- Nav Item - Dashboard -->
<li class="nav-item active"> <li class="nav-item">
<a class="nav-link" href={% url 'overview' %}> <a class="nav-link" href={% url 'overview' %}>
<i class="fas fa-fw fa-tachometer-alt"></i> <i class="fas fa-fw fa-tachometer-alt"></i>
<span>Overview</span></a> <span>Overview</span></a>