Skip to content

Commit 2c3eef6

Browse files
louizcodingjoe
authored andcommitted
Fix the path splitting when generating variation names
Using the standard os.path.split function, easier and safer. The previous code relied on the presence of a '/' char in the filename. This would failed when using upload_to=callable that returns a simple filename without any directory.
1 parent 61ce8cf commit 2c3eef6

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def run(self):
3333

3434
setup(
3535
name='django-stdimage',
36-
version='2.0.5',
36+
version='2.0.6',
3737
description='Django Standarized Image Field',
3838
author='codingjoe',
3939
url='https://github.com/codingjoe/django-stdimage',

stdimage/models.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -115,21 +115,15 @@ def render_variation(cls, file_name, variation, replace=False,
115115
@classmethod
116116
def get_variation_name(cls, file_name, variation_name):
117117
"""Return the variation file name based on the variation."""
118-
ext = cls.get_file_extension(file_name)
119-
path = file_name.rsplit('/', 1)[0]
120-
file_name = file_name.rsplit('/', 1)[-1].rsplit('.', 1)[0]
118+
path, ext = os.path.splitext(file_name)
119+
path, file_name = os.path.split(path)
121120
file_name = '{file_name}.{variation_name}{extension}'.format(**{
122121
'file_name': file_name,
123122
'variation_name': variation_name,
124123
'extension': ext,
125124
})
126125
return os.path.join(path, file_name)
127126

128-
@staticmethod
129-
def get_file_extension(filename):
130-
"""Return the file extension."""
131-
return os.path.splitext(filename)[1].lower()
132-
133127
def delete(self, save=True):
134128
self.delete_variations()
135129
super(StdImageFieldFile, self).delete(save)

tests/models.py

+7
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,12 @@ class UtilVariationsModel(models.Model):
118118
)
119119

120120

121+
class ThumbnailWithoutDirectoryModel(models.Model):
122+
"""Save into a generated filename that does not contain any '/' char"""
123+
image = StdImageField(
124+
upload_to=lambda instance, filename: 'custom.gif',
125+
variations={'thumbnail': {'width': 150, 'height': 150}},
126+
)
127+
121128
post_delete.connect(pre_delete_delete_callback, sender=SimpleModel)
122129
pre_save.connect(pre_save_delete_callback, sender=AdminDeleteModel)

tests/test_models.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class UUID4Monkey(object):
2222
SimpleModel, ResizeModel, AdminDeleteModel,
2323
ThumbnailModel, ResizeCropModel, AutoSlugClassNameDirModel,
2424
UUIDModel,
25-
UtilVariationsModel)
25+
UtilVariationsModel,
26+
ThumbnailWithoutDirectoryModel)
2627

2728
IMG_DIR = os.path.join(settings.MEDIA_ROOT, 'img')
2829

@@ -144,6 +145,18 @@ def test_fore_min_size(self):
144145
path = os.path.join(IMG_DIR, 'image.gif')
145146
assert not os.path.exists(path)
146147

148+
def test_thumbnail_save_without_directory(self):
149+
obj = ThumbnailWithoutDirectoryModel.objects.create(
150+
image=self.fixtures['100.gif']
151+
)
152+
obj.save()
153+
# Our model saves the images directly into the MEDIA_ROOT directory
154+
# not IMG_DIR, under a custom name
155+
original = os.path.join(settings.MEDIA_ROOT, 'custom.gif')
156+
thumbnail = os.path.join(settings.MEDIA_ROOT, 'custom.thumbnail.gif')
157+
assert os.path.exists(original)
158+
assert os.path.exists(thumbnail)
159+
147160

148161
class TestUtils(TestStdImage):
149162
"""Tests Utils"""

0 commit comments

Comments
 (0)