2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-29 12:06:44 +00:00

Order creation fix (#8846)

* Bug fix for PurchaseOrder

- Correctly record the user who created a PO
- Code refactoring

* Updated unit tests
This commit is contained in:
Oliver 2025-01-07 14:59:22 +11:00 committed by GitHub
parent 94f7890a41
commit dcf0bb103e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 32 deletions

View File

@ -75,6 +75,24 @@ class GeneralExtraLineList(DataExportViewMixin):
filterset_fields = ['order'] filterset_fields = ['order']
class OrderCreateMixin:
"""Mixin class which handles order creation via API."""
def create(self, request, *args, **kwargs):
"""Save user information on order creation."""
serializer = self.get_serializer(data=self.clean_data(request.data))
serializer.is_valid(raise_exception=True)
item = serializer.save()
item.created_by = request.user
item.save()
headers = self.get_success_headers(serializer.data)
return Response(
serializer.data, status=status.HTTP_201_CREATED, headers=headers
)
class OrderFilter(rest_filters.FilterSet): class OrderFilter(rest_filters.FilterSet):
"""Base class for custom API filters for the OrderList endpoint.""" """Base class for custom API filters for the OrderList endpoint."""
@ -266,7 +284,9 @@ class PurchaseOrderMixin:
return queryset return queryset
class PurchaseOrderList(PurchaseOrderMixin, DataExportViewMixin, ListCreateAPI): class PurchaseOrderList(
PurchaseOrderMixin, OrderCreateMixin, DataExportViewMixin, ListCreateAPI
):
"""API endpoint for accessing a list of PurchaseOrder objects. """API endpoint for accessing a list of PurchaseOrder objects.
- GET: Return list of PurchaseOrder objects (with filters) - GET: Return list of PurchaseOrder objects (with filters)
@ -728,7 +748,9 @@ class SalesOrderMixin:
return queryset return queryset
class SalesOrderList(SalesOrderMixin, DataExportViewMixin, ListCreateAPI): class SalesOrderList(
SalesOrderMixin, OrderCreateMixin, DataExportViewMixin, ListCreateAPI
):
"""API endpoint for accessing a list of SalesOrder objects. """API endpoint for accessing a list of SalesOrder objects.
- GET: Return list of SalesOrder objects (with filters) - GET: Return list of SalesOrder objects (with filters)
@ -737,20 +759,6 @@ class SalesOrderList(SalesOrderMixin, DataExportViewMixin, ListCreateAPI):
filterset_class = SalesOrderFilter filterset_class = SalesOrderFilter
def create(self, request, *args, **kwargs):
"""Save user information on create."""
serializer = self.get_serializer(data=self.clean_data(request.data))
serializer.is_valid(raise_exception=True)
item = serializer.save()
item.created_by = request.user
item.save()
headers = self.get_success_headers(serializer.data)
return Response(
serializer.data, status=status.HTTP_201_CREATED, headers=headers
)
def filter_queryset(self, queryset): def filter_queryset(self, queryset):
"""Perform custom filtering operations on the SalesOrder queryset.""" """Perform custom filtering operations on the SalesOrder queryset."""
queryset = super().filter_queryset(queryset) queryset = super().filter_queryset(queryset)
@ -1345,25 +1353,13 @@ class ReturnOrderMixin:
return queryset return queryset
class ReturnOrderList(ReturnOrderMixin, DataExportViewMixin, ListCreateAPI): class ReturnOrderList(
ReturnOrderMixin, OrderCreateMixin, DataExportViewMixin, ListCreateAPI
):
"""API endpoint for accessing a list of ReturnOrder objects.""" """API endpoint for accessing a list of ReturnOrder objects."""
filterset_class = ReturnOrderFilter filterset_class = ReturnOrderFilter
def create(self, request, *args, **kwargs):
"""Save user information on create."""
serializer = self.get_serializer(data=self.clean_data(request.data))
serializer.is_valid(raise_exception=True)
item = serializer.save()
item.created_by = request.user
item.save()
headers = self.get_success_headers(serializer.data)
return Response(
serializer.data, status=status.HTTP_201_CREATED, headers=headers
)
filter_backends = SEARCH_ORDER_FILTER_ALIAS filter_backends = SEARCH_ORDER_FILTER_ALIAS
ordering_field_aliases = { ordering_field_aliases = {

View File

@ -255,7 +255,10 @@ class PurchaseOrderTest(OrderTest):
order = models.PurchaseOrder.objects.get(pk=response.data['pk']) order = models.PurchaseOrder.objects.get(pk=response.data['pk'])
self.assertEqual(order.reference, 'PO-92233720368547758089999999999999999') # Check that the created_by field is set correctly
self.assertEqual(order.created_by.username, 'testuser')
self.assertEqual(order.reference, huge_number)
self.assertEqual(order.reference_int, 0x7FFFFFFF) self.assertEqual(order.reference_int, 0x7FFFFFFF)
def test_po_reference_wildcard_default(self): def test_po_reference_wildcard_default(self):
@ -1407,6 +1410,11 @@ class SalesOrderTest(OrderTest):
# Grab the PK for the newly created SalesOrder # Grab the PK for the newly created SalesOrder
pk = response.data['pk'] pk = response.data['pk']
# Basic checks against the newly created SalesOrder
so = models.SalesOrder.objects.get(pk=pk)
self.assertEqual(so.reference, 'SO-12345')
self.assertEqual(so.created_by.username, 'testuser')
# Try to create a SO with identical reference (should fail) # Try to create a SO with identical reference (should fail)
response = self.post( response = self.post(
url, url,