diff --git a/.travis.yml b/.travis.yml index 326c22d0159d..2245157e708f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ services: # Package installation install: - python setup.py install - - pip install psycopg2 elasticsearch wand embedly + - pip install psycopg2 elasticsearch wand embedly mock python-dateutil - pip install coveralls # Pre-test configuration before_script: diff --git a/requirements-dev.txt b/requirements-dev.txt index b69c5d4e05b7..6bc561b0caef 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,3 +2,4 @@ coverage==3.7.1 flake8==2.2.1 mock==1.0.1 +python-dateutil==2.2 diff --git a/tox.ini b/tox.ini index 2b17c65baf28..5e68ac99a306 100644 --- a/tox.ini +++ b/tox.ini @@ -3,6 +3,7 @@ dj16= Django>=1.6,<1.7 elasticsearch==1.1.0 mock==1.0.1 + python-dateutil==2.2 [tox] envlist = diff --git a/wagtail/wagtailimages/tests.py b/wagtail/wagtailimages/tests.py index 007c6cd5d3d1..8790293daac3 100644 --- a/wagtail/wagtailimages/tests.py +++ b/wagtail/wagtailimages/tests.py @@ -1,9 +1,12 @@ import json +import datetime from mock import MagicMock +import dateutil.parser from django.utils import six from django.utils.http import urlquote +from django.utils import timezone from django.test import TestCase from django import template from django.contrib.auth.models import User, Group, Permission @@ -538,6 +541,14 @@ def test_get(self): self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-Type'], 'image/jpeg') + # Make sure the cache headers are set to expire after at least one month + self.assertIn('Cache-Control', response) + self.assertEqual(response['Cache-Control'].split('=')[0], 'max-age') + self.assertTrue(int(response['Cache-Control'].split('=')[1]) > datetime.timedelta(days=30).seconds) + + self.assertIn('Expires', response) + self.assertTrue(dateutil.parser.parse(response['Expires']) > timezone.now() + datetime.timedelta(days=30)) + def test_get_invalid_signature(self): """ Test that an invalid signature returns a 403 response diff --git a/wagtail/wagtailimages/views/frontend.py b/wagtail/wagtailimages/views/frontend.py index b5ccf6e6e28b..a7bea5122e31 100644 --- a/wagtail/wagtailimages/views/frontend.py +++ b/wagtail/wagtailimages/views/frontend.py @@ -1,12 +1,14 @@ from django.shortcuts import get_object_or_404 from django.http import HttpResponse from django.core.exceptions import PermissionDenied +from django.views.decorators.cache import cache_page from wagtail.wagtailimages.models import get_image_model from wagtail.wagtailimages.utils import InvalidFilterSpecError, verify_signature from wagtail.wagtailimages import image_processor +@cache_page(60 * 60 * 24 * 60) # Cache for 60 days def serve(request, signature, image_id, filter_spec): image = get_object_or_404(get_image_model(), id=image_id)