Skip to content

Commit

Permalink
Merge pull request #2 from rloomans/cache-media-files
Browse files Browse the repository at this point in the history
Allow caching of media files
  • Loading branch information
rloomans committed Dec 22, 2016
2 parents 4f9997e + e1ac2ea commit 821f022
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 7 deletions.
36 changes: 36 additions & 0 deletions teamtemp/headers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-

# https://djangosnippets.org/snippets/2895/


from functools import wraps

from django.utils.decorators import available_attrs


def header(name, value):
# View decorator that sets a response header.
#
# Example:
# @header('X-Powered-By', 'Django')
# def view(request, ...):
# ....
#
# For class-based views use:
# @method_decorator(header('X-Powered-By', 'Django'))
# def get(self, request, ...)
# ...
def decorator(func):
@wraps(func, assigned=available_attrs(func))
def inner(request, *args, **kwargs):
response = func(request, *args, **kwargs)
response[name] = value
return response

return inner

return decorator


def x_ua_compatible(ie):
return header('X-UA-Compatible', ie)
Binary file added teamtemp/mediafiles/test.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions teamtemp/tests/headers/test_headers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from django.shortcuts import render
from django.test import TestCase, RequestFactory
from rest_framework import status

from measure_mate.headers import header, x_ua_compatible


class HeadersTestCases(TestCase):
def test_double_header(self):
@header('X-Test-Header1', 'one')
@header('X-Test-Header2', 'two')
@x_ua_compatible('IE=edge')
def test_headers(req):
return render(req, 'index.html')

request = RequestFactory()
response = test_headers(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response['X-Test-Header1'], 'one')
self.assertEqual(response['X-Test-Header2'], 'two')
self.assertEqual(response['X-UA-Compatible'], 'IE=edge')
12 changes: 12 additions & 0 deletions teamtemp/tests/view/test_media_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django.core.urlresolvers import reverse
from django.test import TestCase


class MediaViewTestCases(TestCase):
def test_media_view(self):
response = self.client.get('/media/test.png')
self.assertEqual(response.status_code, 200)
self.assertEqual(response['Content-Type'], 'image/png')
self.assertEqual(response['Cache-Control'], 'public, max-age=315360000')
self.assertTemplateNotUsed(response, 'index.html')
self.assertGreater(len(response.getvalue()), 0)
1 change: 1 addition & 0 deletions teamtemp/tests/view/test_robots_txt_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ def test_robots_txt_view(self):
response = self.client.get(reverse('robots_txt'))
self.assertEqual(response.status_code, 200)
self.assertEqual(response['Content-Type'], 'text/plain')
self.assertEqual(response['Cache-Control'], 'public, max-age=86400')
self.assertTemplateNotUsed(response, 'index.html')
self.assertEqual(response.content, '')
13 changes: 6 additions & 7 deletions teamtemp/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@
from django.contrib.staticfiles.storage import staticfiles_storage
from django.views.generic import TemplateView
from django.views.generic.base import RedirectView
from django.views.static import serve
from django.views.static import serve as serve_static
from rest_framework import routers

from teamtemp.views import home_view, admin_view, submit_view, reset_view, bvc_view, team_view, cron_view, set_view, \
filter_view, health_check_view, \
robots_txt_view, WordCloudImageViewSet, UserViewSet, TeamTemperatureViewSet, TemperatureResponseViewSet, \
TeamResponseHistoryViewSet, TeamsViewSet
from teamtemp.views import TeamResponseHistoryViewSet, TeamTemperatureViewSet, TeamsViewSet, TemperatureResponseViewSet, \
UserViewSet, WordCloudImageViewSet, admin_view, bvc_view, cron_view, filter_view, health_check_view, home_view, \
media_view, reset_view, robots_txt_view, set_view, submit_view, team_view

router = routers.DefaultRouter()
router.register(r'word_cloud_images', WordCloudImageViewSet)
Expand Down Expand Up @@ -64,8 +63,8 @@
url(r'^team/(?P<survey_id>[0-9a-zA-Z]{8})/(?P<team_name>[-\w]{1,64})$', team_view, name='team'),
url(r'^team/(?P<survey_id>[0-9a-zA-Z]{8})$', team_view, name='team'),
url(r'^filter/(?P<survey_id>[0-9a-zA-Z]{8})$', filter_view),
url(r'^static/(.*)$', serve, {'document_root': settings.STATIC_ROOT}),
url(r'^media/(.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
url(r'^static/(.*)$', serve_static, {'document_root': settings.STATIC_ROOT}, name='static'),
url(r'^media/(.*)$', media_view, {'document_root': settings.MEDIA_ROOT}, name='media'),
url(r'^healthcheck/?$', health_check_view, name='healthcheck'),
url(r'^robots\.txt', robots_txt_view, name='robots_txt'),
url(r'^favicon\.ico', RedirectView.as_view(url=staticfiles_storage.url('favicon.ico')), name='favicon'),
Expand Down
6 changes: 6 additions & 0 deletions teamtemp/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@
from django.http import Http404, HttpResponse
from django.shortcuts import HttpResponseRedirect, get_object_or_404, render
from django.utils import timezone
from django.views.static import serve as serve_static
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, viewsets

from responses.forms import AddTeamForm, CreateSurveyForm, ErrorBox, FilteredBvcForm, ResultsPasswordForm, \
SurveyResponseForm, SurveySettingsForm
from responses.serializers import *
from teamtemp import responses, utils
from teamtemp.headers import header


class WordCloudImageViewSet(viewsets.ModelViewSet):
Expand Down Expand Up @@ -78,9 +80,13 @@ def health_check_view(request):
return HttpResponse('ok', content_type='text/plain')


@header('Cache-Control', 'public, max-age=86400')
def robots_txt_view(request):
return HttpResponse('', content_type='text/plain')

@header('Cache-Control', 'public, max-age=315360000')
def media_view(request, *args, **kwargs):
return serve_static(request, *args, **kwargs)

def utc_timestamp():
return "[%s UTC]" % str(timezone.localtime(timezone.now(), timezone=timezone.utc))
Expand Down

0 comments on commit 821f022

Please sign in to comment.