add Last-Modified to urlitem responses (redirect and html)
authorTero Marttila <terom@fixme.fi>
Mon, 02 Sep 2013 03:20:10 +0300
changeset 72 ea7a5a5ce7d4
parent 71 04f4f312d4ad
child 73 66b572c06b0a
add Last-Modified to urlitem responses (redirect and html)
qrurls/models.py
qrurls/views.py
--- a/qrurls/models.py	Mon Sep 02 02:50:16 2013 +0300
+++ b/qrurls/models.py	Mon Sep 02 03:20:10 2013 +0300
@@ -212,6 +212,10 @@
         else :
             return "({age})".format(age=age)
 
+    def last_modified (self) :
+        # XXX: this asumes that URLImage is never changed after publishing..
+        return self.published
+
     def __unicode__ (self) :
         return u"{published_state} {url}".format(
                 published_state=self.published_state(),
--- a/qrurls/views.py	Mon Sep 02 02:50:16 2013 +0300
+++ b/qrurls/views.py	Mon Sep 02 03:20:10 2013 +0300
@@ -1,9 +1,11 @@
 from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.shortcuts import render
-from django.utils import timezone
+from django.utils import timezone, http
 
 from qrurls.models import URL, URLItem
 
+import calendar # timegm
+
 """
     Public frontend UI.
 """
@@ -14,6 +16,9 @@
 class URLItemNotFound (Http404):
     pass
 
+def http_datetime (dt) :
+    return http.http_date(calendar.timegm(dt.utctimetuple()))
+
 def _get_url_item (shorturl=None, shorturl_id=None, item_id=None, related=()) :
     # JOIN against shorturl, urlimage
     url_item = URLItem.objects.select_related(*related)
@@ -53,7 +58,11 @@
     url_item = _get_url_item(**opts)
 
     # redirect, either directly, or to image()
-    return HttpResponseRedirect(url_item.get_absolute_url())
+    response = HttpResponseRedirect(url_item.get_absolute_url())
+
+    # set cache
+    response['Last-Modified'] = http_datetime(url_item.last_modified())
+    return response
     
 def item (request, **opts) :
     """
@@ -63,13 +72,18 @@
     url_item = _get_url_item(related=('shorturl', 'image',), **opts)
 
     if url_item.url :
-        return HttpResponseRedirect(url_item.url)
+        response = HttpResponseRedirect(url_item.url)
     elif url_item.image :
         title = url_item.image.title or url_item.shorturl.title
 
-        return render(request, 'qrurls/image.html', dict(
+        response = render(request, 'qrurls/image.html', dict(
             title   = title,
             image   = url_item.image,
         ))
     else :
         raise Http404()
+
+    # set cache
+    response['Last-Modified'] = http_datetime(url_item.last_modified())
+    return response
+