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
This commit is contained in:
Oliver Walters 2020-05-26 20:04:48 +10:00
parent 03cc6892ea
commit 7305094854
2 changed files with 35 additions and 0 deletions

View File

@ -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))

View File

@ -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)