diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 4ad5d1b87a..6b40b8eb31 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -8,6 +8,9 @@ from __future__ import unicode_literals from rest_framework import serializers +import os + +from django.conf import settings from django.contrib.auth.models import User @@ -50,3 +53,32 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): instance.clean() return data + + +class InvenTreeAttachmentSerializerField(serializers.FileField): + """ + Override the DRF native FileField serializer, + to remove the leading server path. + + For example, the FileField might supply something like: + + http://127.0.0.1:8000/media/foo/bar.jpg + + Whereas we wish to return: + + /media/foo/bar.jpg + + Why? You can't handle the why! + + Actually, if the server process is serving the data at 127.0.0.1, + but a proxy service (e.g. nginx) is then providing DNS lookup to the outside world, + then an attachment which prefixes the "address" of the internal server + will not be accessible from the outside world. + """ + + def to_representation(self, value): + + if not value: + return None + + return os.path.join(str(settings.MEDIA_URL), str(value)) diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index 0e63de46f2..b1d30d0e87 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -15,6 +15,7 @@ from django.db.models.functions import Coalesce from company.serializers import SupplierPartSerializer from part.serializers import PartBriefSerializer from InvenTree.serializers import UserSerializerBrief, InvenTreeModelSerializer +from InvenTree.serializers import InvenTreeAttachmentSerializerField class LocationBriefSerializer(InvenTreeModelSerializer): @@ -232,6 +233,8 @@ class StockItemTestResultSerializer(InvenTreeModelSerializer): key = serializers.CharField(read_only=True) + attachment = InvenTreeAttachmentSerializerField() + def __init__(self, *args, **kwargs): user_detail = kwargs.pop('user_detail', False)