diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 70912f4f31..dfaa761279 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,12 +1,16 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 405 +INVENTREE_API_VERSION = 406 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v406 -> 2025-10-08: https://github.com/inventree/InvenTree/pull/10532 + - Set return type for background task overview + - Implement serializer for part serial number detail + v405 -> 2025-10-07: https://github.com/inventree/InvenTree/pull/10530 - Add response to generic/status endpoint - Fix logic for generic status model lookup to allow searching by class name string diff --git a/src/backend/InvenTree/common/api.py b/src/backend/InvenTree/common/api.py index 97d9fb7e50..a28bf451cf 100644 --- a/src/backend/InvenTree/common/api.py +++ b/src/backend/InvenTree/common/api.py @@ -557,6 +557,7 @@ class BackgroundTaskOverview(APIView): permission_classes = [IsAuthenticatedOrReadScope, IsAdminUser] serializer_class = None + @extend_schema(responses={200: common.serializers.TaskOverviewSerializer}) def get(self, request, fmt=None): """Return information about the current status of the background task queue.""" import django_q.models as q_models diff --git a/src/backend/InvenTree/part/api.py b/src/backend/InvenTree/part/api.py index 0f357c1370..5c2af9911b 100644 --- a/src/backend/InvenTree/part/api.py +++ b/src/backend/InvenTree/part/api.py @@ -46,7 +46,6 @@ from InvenTree.mixins import ( SerializerContextMixin, UpdateAPI, ) -from InvenTree.serializers import EmptySerializer from stock.models import StockLocation from . import serializers as part_serializers @@ -594,19 +593,7 @@ class PartSerialNumberDetail(RetrieveAPI): """API endpoint for returning extra serial number information about a particular part.""" queryset = Part.objects.all() - serializer_class = EmptySerializer - - def retrieve(self, request, *args, **kwargs): - """Return serial number information for the referenced Part instance.""" - part = self.get_object() - - # Calculate the "latest" serial number - latest_serial = part.get_latest_serial_number() - next_serial = part.get_next_serial_number() - - data = {'latest': latest_serial, 'next': next_serial} - - return Response(data) + serializer_class = part_serializers.PartSerialNumberSerializer class PartCopyBOM(CreateAPI): diff --git a/src/backend/InvenTree/part/serializers.py b/src/backend/InvenTree/part/serializers.py index 9bb435f7cb..01bb99ca00 100644 --- a/src/backend/InvenTree/part/serializers.py +++ b/src/backend/InvenTree/part/serializers.py @@ -1548,6 +1548,21 @@ class PartPricingSerializer(InvenTree.serializers.InvenTreeModelSerializer): pricing.update_pricing() +class PartSerialNumberSerializer(InvenTree.serializers.InvenTreeModelSerializer): + """Serializer for Part serial number information.""" + + class Meta: + """Metaclass defining serializer fields.""" + + model = Part + fields = ['latest', 'next'] + + latest = serializers.CharField( + source='get_latest_serial_number', read_only=True, allow_null=True + ) + next = serializers.CharField(source='get_next_serial_number', read_only=True) + + class PartRelationSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for a PartRelated model."""