diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 58d33697b7..baf08e112b 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -85,8 +85,10 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): """ def __init__(self, instance=None, data=empty, **kwargs): - - # self.instance = instance + """ + Custom __init__ routine to ensure that *default* values (as specified in the ORM) + are used by the DRF serializers, *if* the values are not provided by the user. + """ # If instance is None, we are creating a new instance if instance is None and data is not empty: @@ -193,7 +195,15 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): try: instance.full_clean() except (ValidationError, DjangoValidationError) as exc: - raise ValidationError(detail=serializers.as_serializer_error(exc)) + + data = exc.message_dict + + # Change '__all__' key (django style) to 'non_field_errors' (DRF style) + if '__all__' in data: + data['non_field_errors'] = data['__all__'] + del data['__all__'] + + raise ValidationError(data) return data diff --git a/InvenTree/templates/js/translated/part.js b/InvenTree/templates/js/translated/part.js index 988481d77c..f8b410c9c0 100644 --- a/InvenTree/templates/js/translated/part.js +++ b/InvenTree/templates/js/translated/part.js @@ -173,7 +173,32 @@ function editPart(pk, options={}) { title: '{% trans "Edit Part" %}', reload: true, }); +} + +function duplicatePart(pk, options={}) { + + // First we need all the part information + inventreeGet(`/api/part/${pk}/`, {}, { + + success: function(response) { + + var fields = partFields({ + duplicate: true + }); + + constructForm('{% url "api-part-list" %}', { + method: 'POST', + fields: fields, + title: '{% trans "Duplicate Part" %}', + data: response, + onSuccess: function(data) { + // Follow the new part + location.href = `/part/${data.pk}/`; + } + }); + } + }); }