Commit e06df4ba by Simon Chen

ECOM-5264 Make sure the banner image is stored at the correct path in S3

parent 16e6f8c7
...@@ -15,13 +15,13 @@ from haystack.query import SearchQuerySet ...@@ -15,13 +15,13 @@ from haystack.query import SearchQuerySet
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords
from sortedm2m.fields import SortedManyToManyField from sortedm2m.fields import SortedManyToManyField
from stdimage.models import StdImageField from stdimage.models import StdImageField
from stdimage.utils import UploadToAutoSlugClassNameDir
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
from course_discovery.apps.core.models import Currency, Partner from course_discovery.apps.core.models import Currency, Partner
from course_discovery.apps.course_metadata.query import CourseQuerySet from course_discovery.apps.course_metadata.query import CourseQuerySet
from course_discovery.apps.course_metadata.utils import clean_query from course_discovery.apps.course_metadata.utils import clean_query
from course_discovery.apps.ietf_language_tags.models import LanguageTag from course_discovery.apps.ietf_language_tags.models import LanguageTag
from course_discovery.apps.course_metadata.utils import UploadToFieldNamePath
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -587,7 +587,7 @@ class Program(TimeStampedModel): ...@@ -587,7 +587,7 @@ class Program(TimeStampedModel):
max_hours_effort_per_week = models.PositiveSmallIntegerField(null=True, blank=True) max_hours_effort_per_week = models.PositiveSmallIntegerField(null=True, blank=True)
authoring_organizations = SortedManyToManyField(Organization, blank=True, related_name='authored_programs') authoring_organizations = SortedManyToManyField(Organization, blank=True, related_name='authored_programs')
banner_image = StdImageField( banner_image = StdImageField(
upload_to=UploadToAutoSlugClassNameDir(path='/media/programs/banner_images', populate_from='uuid'), upload_to=UploadToFieldNamePath(populate_from='uuid', path='media/programs/banner_images'),
blank=True, blank=True,
null=True, null=True,
variations={ variations={
......
...@@ -362,7 +362,7 @@ class ProgramTests(TestCase): ...@@ -362,7 +362,7 @@ class ProgramTests(TestCase):
def test_banner_image(self): def test_banner_image(self):
self.program.banner_image = make_image_file('test_banner.jpg') self.program.banner_image = make_image_file('test_banner.jpg')
self.program.save() self.program.save()
image_url_prefix = '{}program/'.format(settings.MEDIA_URL) image_url_prefix = '{}media/programs/banner_images/'.format(settings.MEDIA_URL)
self.assertIn(image_url_prefix, self.program.banner_image.url) self.assertIn(image_url_prefix, self.program.banner_image.url)
for size_key in self.program.banner_image.field.variations: for size_key in self.program.banner_image.field.variations:
# Get different sizes specs from the model field # Get different sizes specs from the model field
......
import os
import ddt
from django.test import TestCase
from course_discovery.apps.course_metadata.tests.factories import ProgramFactory
from course_discovery.apps.course_metadata import utils
@ddt.ddt
class UploadToFieldNamePathTests(TestCase):
"""
Test the utiltity object 'UploadtoFieldNamePath'
"""
def setUp(self):
super(UploadToFieldNamePathTests, self).setUp()
self.program = ProgramFactory()
@ddt.data(
('/media/program', 'uuid', '.jpeg'),
('/media/program', 'title', '.jpeg'),
('/media', 'uuid', '.jpeg'),
('/media', 'title', '.txt'),
('', 'title', ''),
)
@ddt.unpack
def test_upload_to(self, path, field, ext):
upload_to = utils.UploadToFieldNamePath(populate_from=field, path=path)
upload_path = upload_to(self.program, 'name' + ext)
expected = os.path.join(path, str(getattr(self.program, field)) + ext)
self.assertEqual(upload_path, expected)
from stdimage.utils import UploadTo
RESERVED_ELASTICSEARCH_QUERY_OPERATORS = ('AND', 'OR', 'NOT', 'TO',) RESERVED_ELASTICSEARCH_QUERY_OPERATORS = ('AND', 'OR', 'NOT', 'TO',)
...@@ -24,3 +26,19 @@ def clean_query(query): ...@@ -24,3 +26,19 @@ def clean_query(query):
query = query.replace(old, new) query = query.replace(old, new)
return query return query
class UploadToFieldNamePath(UploadTo):
"""
This is a utility to create file path for uploads based on instance field value
"""
def __init__(self, populate_from, **kwargs):
self.populate_from = populate_from
super(UploadToFieldNamePath, self).__init__(populate_from, **kwargs)
def __call__(self, instance, filename):
field_value = getattr(instance, self.populate_from)
self.kwargs.update({
'name': field_value
})
return super(UploadToFieldNamePath, self).__call__(instance, filename)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment