From 3653981416146bdceb1ff6106c9c3d35d9c7db0e Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Tue, 23 Apr 2013 15:12:57 +0000 Subject: [PATCH] Added ImageField support for inline replacements (#86) --- docs/changelog.rst | 1 + mongoengine/fields.py | 24 ++++++++++-------------- tests/fields/file_tests.py | 30 ++++++++++++++++++++++++++++++ tests/fields/mongodb_leaf.png | Bin 0 -> 4971 bytes 4 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 tests/fields/mongodb_leaf.png diff --git a/docs/changelog.rst b/docs/changelog.rst index d22fc60..476753d 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.8.X ================ +- ImageFields now support inline replacements (#86) - Added SequenceField.set_next_value(value) helper (#159) - Updated .only() behaviour - now like exclude it is chainable (#202) - Added with_limit_and_skip support to count() (#235) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 4fc65c7..4530429 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -1165,13 +1165,11 @@ class FileField(BaseField): grid_file.delete() except: pass - # Create a new file with the new data - grid_file.put(value) - else: - # Create a new proxy object as we don't already have one - instance._data[key] = self.proxy_class(key=key, instance=instance, - collection_name=self.collection_name) - instance._data[key].put(value) + + # Create a new proxy object as we don't already have one + instance._data[key] = self.proxy_class(key=key, instance=instance, + collection_name=self.collection_name) + instance._data[key].put(value) else: instance._data[key] = value @@ -1208,6 +1206,8 @@ class ImageGridFsProxy(GridFSProxy): Insert a image in database applying field properties (size, thumbnail_size) """ + if not self.instance: + import ipdb; ipdb.set_trace(); field = self.instance._fields[self.key] try: @@ -1235,10 +1235,7 @@ class ImageGridFsProxy(GridFSProxy): size = field.thumbnail_size if size['force']: - thumbnail = ImageOps.fit(img, - (size['width'], - size['height']), - Image.ANTIALIAS) + thumbnail = ImageOps.fit(img, (size['width'], size['height']), Image.ANTIALIAS) else: thumbnail = img.copy() thumbnail.thumbnail((size['width'], @@ -1246,8 +1243,7 @@ class ImageGridFsProxy(GridFSProxy): Image.ANTIALIAS) if thumbnail: - thumb_id = self._put_thumbnail(thumbnail, - img_format) + thumb_id = self._put_thumbnail(thumbnail, img_format) else: thumb_id = None @@ -1350,7 +1346,7 @@ class ImageField(FileField): if isinstance(att, (tuple, list)): if PY3: value = dict(itertools.zip_longest(params_size, att, - fillvalue=None)) + fillvalue=None)) else: value = dict(map(None, params_size, att)) diff --git a/tests/fields/file_tests.py b/tests/fields/file_tests.py index 44d2862..c5842d8 100644 --- a/tests/fields/file_tests.py +++ b/tests/fields/file_tests.py @@ -16,6 +16,7 @@ from mongoengine.connection import get_db from mongoengine.python_support import PY3, b, StringIO TEST_IMAGE_PATH = os.path.join(os.path.dirname(__file__), 'mongoengine.png') +TEST_IMAGE2_PATH = os.path.join(os.path.dirname(__file__), 'mongodb_leaf.png') class FileTest(unittest.TestCase): @@ -217,6 +218,19 @@ class FileTest(unittest.TestCase): self.assertEqual(marmot.photo.content_type, 'image/jpeg') self.assertEqual(marmot.photo.foo, 'bar') + def test_file_reassigning(self): + class TestFile(Document): + the_file = FileField() + TestFile.drop_collection() + + test_file = TestFile(the_file=open(TEST_IMAGE_PATH, 'rb')).save() + self.assertEqual(test_file.the_file.get().length, 8313) + + test_file = TestFile.objects.first() + test_file.the_file = open(TEST_IMAGE2_PATH, 'rb') + test_file.save() + self.assertEqual(test_file.the_file.get().length, 4971) + def test_file_boolean(self): """Ensure that a boolean test of a FileField indicates its presence """ @@ -264,6 +278,22 @@ class FileTest(unittest.TestCase): t.image.delete() + def test_image_field_reassigning(self): + if PY3: + raise SkipTest('PIL does not have Python 3 support') + + class TestFile(Document): + the_file = ImageField() + TestFile.drop_collection() + + test_file = TestFile(the_file=open(TEST_IMAGE_PATH, 'rb')).save() + self.assertEqual(test_file.the_file.size, (371, 76)) + + test_file = TestFile.objects.first() + test_file.the_file = open(TEST_IMAGE2_PATH, 'rb') + test_file.save() + self.assertEqual(test_file.the_file.size, (45, 101)) + def test_image_field_resize(self): if PY3: raise SkipTest('PIL does not have Python 3 support') diff --git a/tests/fields/mongodb_leaf.png b/tests/fields/mongodb_leaf.png new file mode 100644 index 0000000000000000000000000000000000000000..36661cefc824b1707a9a6063d133cefe3566e1a9 GIT binary patch literal 4971 zcmV-x6O`4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XU000XU0RWnu7ytkc?MXyIRCoc^ zTx*OTRT(~W`M$liv?9=Q-7ZBg?UscIL7{S~{J>Oftboy=iB=P-L@Ce^2(~VzNNU(d z)MEHiLIP?a0#-wiU<~39ei#f=%GRb7soO493zb{Tx8EF}=RN1lH#6US*PTt^Y-i5x zy*%eV&zv)t-72lMD*CwU@vA&UCcAY(6%|IIH?>+sr&yCzP1E$5~jDW6IrmiiO zN*^82*KGUJ@~YMsmV)rug&T)g&qTBfjr7XLSDqDV^+bg0q+AM=^8C9#)Sy>9wqm)` z>P1iU0*qAP1GG|e7T&dFOVPj!iS(6^T=`uU>E8ovNdvV4`oMRlz3Ya4G;%?az@6o; zZ7%=y@*gTs{|q=m2fzhC5NH*K5^1sPMf#Zqca98o?Ifc(Ezno|>WX#Ri`Fx;S^%R2 z@TiHKhyyUiS-z)VICpz$ z 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