diff --git a/demo/demoproject/storage/tests.py b/demo/demoproject/storage/tests.py index 1924f48..8536781 100644 --- a/demo/demoproject/storage/tests.py +++ b/demo/demoproject/storage/tests.py @@ -1,7 +1,9 @@ +import datetime import unittest from django.core.files.base import ContentFile from django.core.urlresolvers import reverse +from django.http.response import HttpResponseNotModified import django.test from django_downloadview import assert_download_response, temporary_media_root @@ -31,6 +33,32 @@ class StaticPathTestCase(django.test.TestCase): basename='1.txt', mime_type='text/plain') + @temporary_media_root() + def test_not_modified_download_response(self): + """'storage:static_path' sends not modified response if unmodified.""" + setup_file('1.txt') + url = reverse('storage:static_path', kwargs={'path': '1.txt'}) + response = self.client.get( + url, + HTTP_IF_MODIFIED_SINCE='Sat, 29 Oct {year} 19:43:31 GMT'.format( + year=datetime.date.today().year + 4) + ) + self.assertTrue(isinstance(response, HttpResponseNotModified)) + + @temporary_media_root() + def test_modified_since_download_response(self): + """'storage:static_path' streams file if modified.""" + setup_file('1.txt') + url = reverse('storage:static_path', kwargs={'path': '1.txt'}) + response = self.client.get( + url, + HTTP_IF_MODIFIED_SINCE='Sat, 29 Oct 1980 19:43:31 GMT') + assert_download_response(self, + response, + content=file_content, + basename='1.txt', + mime_type='text/plain') + class DynamicPathIntegrationTestCase(django.test.TestCase): """Integration tests around ``storage:dynamic_path`` URL.""" diff --git a/django_downloadview/views/base.py b/django_downloadview/views/base.py index a8b9c82..29121c3 100644 --- a/django_downloadview/views/base.py +++ b/django_downloadview/views/base.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- """Base material for download views: :class:`DownloadMixin` and :class:`BaseDownloadView`""" +import calendar + from django.http import HttpResponseNotModified, Http404 from django.views.generic.base import View from django.views.static import was_modified_since @@ -111,7 +113,8 @@ class DownloadMixin(object): return file_instance.was_modified_since(since) except (AttributeError, NotImplementedError): try: - modification_time = file_instance.modified_time + modification_time = calendar.timegm( + file_instance.modified_time.utctimetuple()) size = file_instance.size except (AttributeError, NotImplementedError): return True diff --git a/tests/views.py b/tests/views.py index bfa9aa7..80c6907 100644 --- a/tests/views.py +++ b/tests/views.py @@ -2,6 +2,7 @@ """Tests around :mod:`django_downloadview.views`.""" import os import unittest +from datetime import datetime try: from unittest import mock except ImportError: @@ -92,7 +93,7 @@ class DownloadMixinTestCase(unittest.TestCase): file_wrapper.was_modified_since = mock.Mock( side_effect=AttributeError) file_wrapper.size = mock.sentinel.size - file_wrapper.modified_time = mock.sentinel.modified_time + file_wrapper.modified_time = datetime.now() was_modified_since_mock = mock.Mock( return_value=mock.sentinel.was_modified) mixin = views.DownloadMixin()