From bfb32f3bf6facf7828abb30ae8c1944ba9dac479 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 18 Nov 2021 21:26:26 +1100 Subject: [PATCH 1/2] Record the user information when creating or updating a stock item --- InvenTree/stock/api.py | 24 ++++++++++++++---------- InvenTree/stock/models.py | 15 +++++++-------- InvenTree/stock/serializers.py | 9 +++++++++ 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 2ffc2e8d69..909900a0b4 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -69,6 +69,13 @@ class StockDetail(generics.RetrieveUpdateDestroyAPIView): return queryset + def get_serializer_context(self): + + ctx = super().get_serializer_context() + ctx['user'] = self.request.user + + return ctx + def get_serializer(self, *args, **kwargs): kwargs['part_detail'] = True @@ -79,16 +86,6 @@ class StockDetail(generics.RetrieveUpdateDestroyAPIView): return self.serializer_class(*args, **kwargs) - def update(self, request, *args, **kwargs): - """ - Record the user who updated the item - """ - - # TODO: Record the user! - # user = request.user - - return super().update(request, *args, **kwargs) - def perform_destroy(self, instance): """ Instead of "deleting" the StockItem @@ -392,6 +389,13 @@ class StockList(generics.ListCreateAPIView): queryset = StockItem.objects.all() filterset_class = StockFilter + def get_serializer_context(self): + + ctx = super().get_serializer_context() + ctx['user'] = self.request.user + + return ctx + def create(self, request, *args, **kwargs): """ Create a new StockItem object via the API. diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 8e07074a76..70e557a901 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -265,15 +265,15 @@ class StockItem(MPTTModel): user = kwargs.pop('user', None) + if user is None: + user = getattr(self, '_user', None) + # If 'add_note = False' specified, then no tracking note will be added for item creation add_note = kwargs.pop('add_note', True) notes = kwargs.pop('notes', '') - - if not self.pk: - # StockItem has not yet been saved - add_note = add_note and True - else: + + if self.pk: # StockItem has already been saved # Check if "interesting" fields have been changed @@ -301,11 +301,10 @@ class StockItem(MPTTModel): except (ValueError, StockItem.DoesNotExist): pass - add_note = False - super(StockItem, self).save(*args, **kwargs) - if add_note: + # If user information is provided, and no existing note exists, create one! + if user and self.tracking_info.count() == 0: tracking_info = { 'status': self.status, diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index 850ebcea3b..c2116b5dba 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -79,6 +79,15 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeModelSerializer): - Includes serialization for the item location """ + def update(self, instance, validated_data): + """ + Custom update method to pass the user information through to the instance + """ + + instance._user = self.context['user'] + + return super().update(instance, validated_data) + @staticmethod def annotate_queryset(queryset): """ From 15a0d260f8d9426ba07b94a140bbd415c851dada Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 18 Nov 2021 23:15:40 +1100 Subject: [PATCH 2/2] Handle case where user is not specified --- InvenTree/stock/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 909900a0b4..0c045f1cf5 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -72,7 +72,7 @@ class StockDetail(generics.RetrieveUpdateDestroyAPIView): def get_serializer_context(self): ctx = super().get_serializer_context() - ctx['user'] = self.request.user + ctx['user'] = getattr(self.request, 'user', None) return ctx @@ -392,7 +392,7 @@ class StockList(generics.ListCreateAPIView): def get_serializer_context(self): ctx = super().get_serializer_context() - ctx['user'] = self.request.user + ctx['user'] = getattr(self.request, 'user', None) return ctx