qrurls/views.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Sep 2013 15:38:24 +0300
changeset 81 3a2fdc820c41
parent 80 3aaac91a6654
child 82 6442e5c97b48
permissions -rw-r--r--
drop separate shorturl_id= lookup key, match shorturl.isdigit()
import calendar # timegm
import logging

from django.core.cache import cache
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render
from django.utils import timezone, http

from qrurls.models import URL, URLItem

log = logging.getLogger('qrurls.views')

"""
    Public frontend UI.
"""

class URLNotFound (Http404):
    pass

class URLItemNotFound (Http404):
    pass

def http_datetime (dt) :
    return http.http_date(calendar.timegm(dt.utctimetuple()))

def index (request) :
    urls = URL.objects.all()
    return render(request, 'qrurls/index.html', dict(
        urls    = urls,
    ))

def shorturl (request, shorturl=None) :
    """
        Primary frontend for redirecting based on current time.
    """
    
    key = 'qrurls/urlfeed/{shorturl}'.format(shorturl=shorturl) # format as dict
    data = cache.get(key)
    
    if data :
        url, modified = data
        log.info("get cache: %s: %s", key, url)
    else:
        url_item = URLItem.search(shorturl=shorturl)

        modified = url_item.last_modified()
        url = url_item.get_absolute_url()
        
        log.info("set cache: %s: %s", key, url)
        cache.set(key, (url, modified)) # XXX: expiry

    # redirect, either directly, or to image()
    response = HttpResponseRedirect(url)
    response['Vary'] = ''
    response['Last-Modified'] = http_datetime(modified)
    return response
    
def item (request, shorturl, item_id) :
    """
        Frontend for a specific item.
    """
    
    url_item = _get_url_item(
            shorturl=shorturl, item_id=item_id,
            related=('shorturl', 'image')
    )

    if url_item.url :
        response = HttpResponseRedirect(url_item.url)
    elif url_item.image :
        response = render(request, 'qrurls/image.html', dict(
            title   = url_item.title(),
            image   = url_item.image,
        ))
    else :
        raise Http404()

    # set cache
    response['Vary'] = ''
    response['Last-Modified'] = http_datetime(url_item.last_modified())
    return response