mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Improve filtering / ordering / sorting for purchase-order API
This commit is contained in:
parent
5e9b012031
commit
25e5a64cee
@ -12,6 +12,15 @@ class StatusCode:
|
||||
""" Return the status code label associated with the provided value """
|
||||
return cls.options.get(value, value)
|
||||
|
||||
@classmethod
|
||||
def value(cls, label):
|
||||
""" Return the value associated with the provided label """
|
||||
for k in cls.options.keys():
|
||||
if cls.options[k].lower() == label.lower():
|
||||
return k
|
||||
|
||||
raise ValueError("Label not found")
|
||||
|
||||
|
||||
class OrderStatus(StatusCode):
|
||||
|
||||
|
@ -31,6 +31,7 @@ class CompanyList(generics.ListCreateAPIView):
|
||||
|
||||
serializer_class = CompanySerializer
|
||||
queryset = Company.objects.all()
|
||||
|
||||
permission_classes = [
|
||||
permissions.IsAuthenticated,
|
||||
]
|
||||
|
@ -7,9 +7,16 @@ from __future__ import unicode_literals
|
||||
|
||||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from rest_framework import generics, permissions
|
||||
from rest_framework import filters
|
||||
from rest_framework.response import Response
|
||||
|
||||
from django.conf import settings
|
||||
from django.conf.urls import url
|
||||
|
||||
from InvenTree.status_codes import OrderStatus
|
||||
|
||||
import os
|
||||
|
||||
from .models import PurchaseOrder, PurchaseOrderLineItem
|
||||
from .serializers import POSerializer, POLineItemSerializer
|
||||
|
||||
@ -24,18 +31,71 @@ class POList(generics.ListCreateAPIView):
|
||||
queryset = PurchaseOrder.objects.all()
|
||||
serializer_class = POSerializer
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
queryset = self.get_queryset().prefetch_related('supplier', 'lines')
|
||||
|
||||
queryset = self.filter_queryset(queryset)
|
||||
|
||||
# Special filtering for 'status' field
|
||||
if 'status' in request.GET:
|
||||
status = request.GET['status']
|
||||
|
||||
# First attempt to filter by integer value
|
||||
try:
|
||||
status = int(status)
|
||||
queryset = queryset.filter(status=status)
|
||||
except ValueError:
|
||||
try:
|
||||
value = OrderStatus.value(status)
|
||||
queryset = queryset.filter(status=value)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
data = queryset.values(
|
||||
'pk',
|
||||
'supplier',
|
||||
'supplier__name',
|
||||
'supplier__image',
|
||||
'reference',
|
||||
'description',
|
||||
'URL',
|
||||
'status',
|
||||
'notes',
|
||||
'creation_date',
|
||||
)
|
||||
|
||||
for item in data:
|
||||
|
||||
order = queryset.get(pk=item['pk'])
|
||||
|
||||
item['supplier__image'] = os.path.join(settings.MEDIA_URL, item['supplier__image'])
|
||||
item['status_text'] = OrderStatus.label(item['status'])
|
||||
item['lines'] = order.lines.count()
|
||||
|
||||
return Response(data)
|
||||
|
||||
permission_classes = [
|
||||
permissions.IsAuthenticated,
|
||||
]
|
||||
|
||||
filter_backends = [
|
||||
DjangoFilterBackend,
|
||||
filters.SearchFilter,
|
||||
filters.OrderingFilter,
|
||||
]
|
||||
|
||||
filter_fields = [
|
||||
'supplier',
|
||||
]
|
||||
|
||||
ordering_fields = [
|
||||
'creation_date',
|
||||
'reference',
|
||||
]
|
||||
|
||||
ordering = '-creation_date'
|
||||
|
||||
|
||||
class PODetail(generics.RetrieveUpdateAPIView):
|
||||
""" API endpoint for detail view of a PurchaseOrder object """
|
||||
|
@ -1,6 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block page_title %}
|
||||
InvenTree | Purchase Orders
|
||||
@ -19,6 +20,9 @@ InvenTree | Purchase Orders
|
||||
|
||||
{% include "order/po_table.html" with toolbar='#table-buttons' %}
|
||||
|
||||
<table class='table table-striped table-condensed po-table' id='purchase-order-table'>
|
||||
</table>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block js_ready %}
|
||||
@ -35,4 +39,52 @@ $("#po-create").click(function() {
|
||||
$("#po-table").inventreeTable({
|
||||
});
|
||||
|
||||
$("#purchase-order-table").inventreeTable({
|
||||
url: "{% url 'api-po-list' %}",
|
||||
formatNoMatches: function() { return "{% trans "No purchase orders found" %}"; },
|
||||
columns: [
|
||||
{
|
||||
field: 'pk',
|
||||
title: 'ID',
|
||||
visible: false,
|
||||
},
|
||||
{
|
||||
sortable: true,
|
||||
field: 'supplier',
|
||||
title: 'Supplier',
|
||||
formatter: function(value, row, index, field) {
|
||||
return imageHoverIcon(row.supplier__image) + renderLink(row.supplier__name, '/company/' + value + '/');
|
||||
}
|
||||
},
|
||||
{
|
||||
sortable: true,
|
||||
field: 'reference',
|
||||
title: 'Reference',
|
||||
formatter: function(value, row, index, field) {
|
||||
return renderLink(value, "/order/purchase-order/" + row.pk + "/");
|
||||
}
|
||||
},
|
||||
{
|
||||
sortable: true,
|
||||
field: 'creation_date',
|
||||
title: 'Date',
|
||||
},
|
||||
{
|
||||
sortable: true,
|
||||
field: 'description',
|
||||
title: 'Description',
|
||||
},
|
||||
{
|
||||
sortable: true,
|
||||
field: 'status_text',
|
||||
title: 'Status',
|
||||
},
|
||||
{
|
||||
sortable: true,
|
||||
field: 'lines',
|
||||
title: 'Items'
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user