From 861e30e8d6fa346ac716331dde90a54bdad5f32c Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 26 May 2020 20:04:48 +1000 Subject: [PATCH] Add a special serializer class for FileField which has a custom to_representation function - This was solving a very subtle bug which will probably only ever apply to a single installation instance - Future me will most likely not remember what this was for or how it works - In any case, there we go - Ref: http://www.cdrf.co/3.9/rest_framework.fields/Field.html (cherry picked from commit 7305094854eef4ff69da6eb62598ef64aadf6cc2) --- InvenTree/InvenTree/serializers.py | 32 ++++++++++++++++++++++++++++++ InvenTree/stock/serializers.py | 3 +++ 2 files changed, 35 insertions(+) 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)