diff --git a/rest_models/__init__.py b/rest_models/__init__.py index c873ab2..c0360d9 100644 --- a/rest_models/__init__.py +++ b/rest_models/__init__.py @@ -1,4 +1,4 @@ -__VERSION__ = '1.8.1' +__VERSION__ = '1.8.2' try: from rest_models.checks import register_checks diff --git a/rest_models/backend/compiler.py b/rest_models/backend/compiler.py index 4e1692e..34022f3 100644 --- a/rest_models/backend/compiler.py +++ b/rest_models/backend/compiler.py @@ -7,6 +7,7 @@ import re from collections import defaultdict, namedtuple +import six from django.core.exceptions import ImproperlyConfigured from django.db.models import FileField, Transform from django.db.models.aggregates import Count @@ -1289,12 +1290,17 @@ def resolve_data_n_files(self): if isinstance(field, FileField): fieldfile = field.pre_save(val.instance, False) # file.name is the return of our storage.save => we get the content file instead of his name - # to retreive it there. + # file.name can be a string, in this case, we did got the file at all, he is unmodified file = fieldfile.name - if file is not None: # field value can be None.... - files[field.column] = (file.name, file, file.content_type) - else: + if file is None: + # field can be set to None data[field.column] = None + elif isinstance(file, six.string_types): + # str => we don't change it since it's not comming from our custom storage + pass + else: + files[field.column] = (file.name, file, file.content_type) + else: fieldname = field.concrete and field.db_column or field.name data[fieldname] = field.get_db_prep_save(val, connection=self.connection) diff --git a/rest_models/tests/tests_upload_files.py b/rest_models/tests/tests_upload_files.py index 85fb5fa..4e6b470 100644 --- a/rest_models/tests/tests_upload_files.py +++ b/rest_models/tests/tests_upload_files.py @@ -182,3 +182,23 @@ def test_null_value_update_from_client(self): self.assertEqual(review_client.photo.url, 'http://testserver/media/%s' % self.img_name2) self.assertEqual(review_client.photo.file.read(), image_test) self.assertEqual(review_client.comment, 'comment') + + def test_save_unchanged_file(self): + + review_api = apimodels.Review.objects.create( + comment="coucou", + photo=SimpleUploadedFile(self.img_name, image_test, 'image/png'), + ) + + review_client = clientmodels.Review.objects.get(pk=review_api.pk) + self.assertEqual(review_client.photo.url, 'http://testserver/media/%s' % self.img_name) + self.assertEqual(review_client.photo.name, self.img_name) + + review_client.save() + self.assertEqual(review_client.photo.url, 'http://testserver/media/%s' % self.img_name) + self.assertEqual(review_client.photo.name, self.img_name) + review_client.comment = 'eratum' + review_client.save() + self.assertEqual(review_client.photo.url, 'http://testserver/media/%s' % self.img_name) + self.assertEqual(review_client.photo.name, self.img_name) + self.assertEqual(review_client.photo.file.read(), image_test)