2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-17 12:35:46 +00:00

Merge pull request #2020 from SchrodingersGat/mpn-sorting-fix

Mpn sorting fix
This commit is contained in:
Oliver
2021-08-26 22:06:06 +10:00
committed by GitHub
6 changed files with 144 additions and 24 deletions

View File

@ -7,11 +7,12 @@ from __future__ import unicode_literals
from django.conf.urls import url, include
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework as rest_filters
from rest_framework import generics
from rest_framework import filters, status
from rest_framework.response import Response
from InvenTree.filters import InvenTreeOrderingFilter
from InvenTree.helpers import str2bool
from InvenTree.api import AttachmentMixin
from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus
@ -144,7 +145,7 @@ class POList(generics.ListCreateAPIView):
return queryset
filter_backends = [
DjangoFilterBackend,
rest_filters.DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter,
]
@ -214,6 +215,14 @@ class POLineItemList(generics.ListCreateAPIView):
queryset = PurchaseOrderLineItem.objects.all()
serializer_class = POLineItemSerializer
def get_queryset(self, *args, **kwargs):
queryset = super().get_queryset(*args, **kwargs)
queryset = POLineItemSerializer.annotate_queryset(queryset)
return queryset
def get_serializer(self, *args, **kwargs):
try:
@ -226,18 +235,26 @@ class POLineItemList(generics.ListCreateAPIView):
return self.serializer_class(*args, **kwargs)
filter_backends = [
DjangoFilterBackend,
rest_filters.DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter
InvenTreeOrderingFilter
]
ordering_field_aliases = {
'MPN': 'part__manufacturer_part__MPN',
'SKU': 'part__SKU',
'part_name': 'part__part__name',
}
ordering_fields = [
'part__part__name',
'part__MPN',
'part__SKU',
'reference',
'MPN',
'part_name',
'purchase_price',
'quantity',
'received',
'reference',
'SKU',
'total_price',
]
search_fields = [
@ -262,6 +279,14 @@ class POLineItemDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = PurchaseOrderLineItem.objects.all()
serializer_class = POLineItemSerializer
def get_queryset(self):
queryset = super().get_queryset()
queryset = POLineItemSerializer.annotate_queryset(queryset)
return queryset
class SOAttachmentList(generics.ListCreateAPIView, AttachmentMixin):
"""
@ -272,7 +297,7 @@ class SOAttachmentList(generics.ListCreateAPIView, AttachmentMixin):
serializer_class = SOAttachmentSerializer
filter_backends = [
DjangoFilterBackend,
rest_filters.DjangoFilterBackend,
]
filter_fields = [
@ -396,7 +421,7 @@ class SOList(generics.ListCreateAPIView):
return queryset
filter_backends = [
DjangoFilterBackend,
rest_filters.DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter,
]
@ -495,7 +520,7 @@ class SOLineItemList(generics.ListCreateAPIView):
return queryset
filter_backends = [
DjangoFilterBackend,
rest_filters.DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter
]
@ -580,7 +605,7 @@ class SOAllocationList(generics.ListCreateAPIView):
return queryset
filter_backends = [
DjangoFilterBackend,
rest_filters.DjangoFilterBackend,
]
# Default filterable fields
@ -598,7 +623,7 @@ class POAttachmentList(generics.ListCreateAPIView, AttachmentMixin):
serializer_class = POAttachmentSerializer
filter_backends = [
DjangoFilterBackend,
rest_filters.DjangoFilterBackend,
]
filter_fields = [

View File

@ -7,8 +7,9 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from django.db import models
from django.db.models import Case, When, Value
from django.db.models import BooleanField
from django.db.models import BooleanField, ExpressionWrapper, F
from rest_framework import serializers
from sql_util.utils import SubqueryCount
@ -109,6 +110,23 @@ class POSerializer(InvenTreeModelSerializer):
class POLineItemSerializer(InvenTreeModelSerializer):
@staticmethod
def annotate_queryset(queryset):
"""
Add some extra annotations to this queryset:
- Total price = purchase_price * quantity
"""
queryset = queryset.annotate(
total_price=ExpressionWrapper(
F('purchase_price') * F('quantity'),
output_field=models.DecimalField()
)
)
return queryset
def __init__(self, *args, **kwargs):
part_detail = kwargs.pop('part_detail', False)
@ -123,6 +141,8 @@ class POLineItemSerializer(InvenTreeModelSerializer):
quantity = serializers.FloatField(default=1)
received = serializers.FloatField(default=0)
total_price = serializers.FloatField(read_only=True)
part_detail = PartBriefSerializer(source='get_base_part', many=False, read_only=True)
supplier_part_detail = SupplierPartSerializer(source='part', many=False, read_only=True)
@ -158,6 +178,7 @@ class POLineItemSerializer(InvenTreeModelSerializer):
'purchase_price_string',
'destination',
'destination_detail',
'total_price',
]

View File

@ -294,7 +294,7 @@ $("#po-line-table").inventreeTable({
{
field: 'part',
sortable: true,
sortName: 'part__part__name',
sortName: 'part_name',
title: '{% trans "Part" %}',
switchable: false,
formatter: function(value, row, index, field) {
@ -314,7 +314,7 @@ $("#po-line-table").inventreeTable({
},
{
sortable: true,
sortName: 'part__SKU',
sortName: 'SKU',
field: 'supplier_part_detail.SKU',
title: '{% trans "SKU" %}',
formatter: function(value, row, index, field) {
@ -327,7 +327,7 @@ $("#po-line-table").inventreeTable({
},
{
sortable: true,
sortName: 'part__MPN',
sortName: 'MPN',
field: 'supplier_part_detail.manufacturer_part_detail.MPN',
title: '{% trans "MPN" %}',
formatter: function(value, row, index, field) {
@ -364,6 +364,7 @@ $("#po-line-table").inventreeTable({
}
},
{
field: 'total_price',
sortable: true,
field: 'total_price',
title: '{% trans "Total price" %}',
@ -384,7 +385,7 @@ $("#po-line-table").inventreeTable({
}
},
{
sortable: true,
sortable: false,
field: 'received',
switchable: false,
title: '{% trans "Received" %}',