From bee244daa8f4b4c4b3b0b4f2cd1a159bf19dab3e Mon Sep 17 00:00:00 2001 From: Josh Schneier Date: Fri, 26 Dec 2014 18:37:59 -0500 Subject: [PATCH] closes #12 - set modified time for new files --- storages/backends/s3boto.py | 4 +++- tests/test_s3boto.py | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/storages/backends/s3boto.py b/storages/backends/s3boto.py index ce3f7992c..7377f6b32 100644 --- a/storages/backends/s3boto.py +++ b/storages/backends/s3boto.py @@ -1,6 +1,7 @@ import os import posixpath import mimetypes +from datetime import datetime from gzip import GzipFile from tempfile import SpooledTemporaryFile import warnings @@ -15,7 +16,7 @@ from boto.s3.connection import S3Connection, SubdomainCallingFormat from boto.exception import S3ResponseError from boto.s3.key import Key as S3Key - from boto.utils import parse_ts + from boto.utils import parse_ts, ISO8601 except ImportError: raise ImproperlyConfigured("Could not load Boto's S3 bindings.\n" "See https://github.com/boto/boto") @@ -410,6 +411,7 @@ def _save(self, name, content): key = self.bucket.new_key(encoded_name) if self.preload_metadata: self._entries[encoded_name] = key + key.last_modified = datetime.utcnow().strftime(ISO8601) key.set_metadata('Content-Type', content_type) self._save_content(key, content, headers=headers) diff --git a/tests/test_s3boto.py b/tests/test_s3boto.py index d76d1b2bf..10f85ee0a 100644 --- a/tests/test_s3boto.py +++ b/tests/test_s3boto.py @@ -8,6 +8,7 @@ from django.test import TestCase from django.core.files.base import ContentFile +from boto.utils import parse_ts from boto.s3.key import Key from storages.compat import urlparse @@ -24,12 +25,6 @@ def test_normal(self): value = s3boto.parse_ts_extended("Wed, 13 Mar 2013 12:45:49 GMT") self.assertEquals(value, datetime.datetime(2013, 3, 13, 12, 45, 49)) -class S3BotoTestCase(TestCase): - @mock.patch('storages.backends.s3boto.S3Connection') - def setUp(self, S3Connection): - self.storage = s3boto.S3BotoStorage() - self.storage._connection = mock.MagicMock() - class SafeJoinTest(TestCase): def test_normal(self): path = s3boto.safe_join("", "path/to/somewhere", "other", "path/to/somewhere") @@ -67,7 +62,11 @@ def test_trailing_slash_multi(self): self.assertEquals(path, "base_url/path/to/somewhere/") -class S3BotoStorageTests(S3BotoTestCase): +class S3BotoStorageTests(TestCase): + @mock.patch('storages.backends.s3boto.S3Connection') + def setUp(self, S3Connection): + self.storage = s3boto.S3BotoStorage() + self.storage._connection = mock.MagicMock() def test_clean_name(self): """ @@ -281,3 +280,10 @@ def test_generated_url_is_encoded(self): self.assertEqual(parsed_url.path, "/whacky%20%26%20filename.mp4") + def test_new_file_last_modified(self): + self.storage.preload_metadata = True + name = 'test_storage_save.txt' + content = ContentFile('new content') + self.storage.save(name, content) + parse_ts(self.storage.modified_time(name)) # no exception +