qrurls/views.py
author Tero Marttila <terom@fixme.fi>
Mon, 02 Sep 2013 02:50:16 +0300
changeset 71 04f4f312d4ad
parent 70 e8a8d490df2f
child 72 ea7a5a5ce7d4
permissions -rw-r--r--
optimize item view to JOIN across models, using common _get_url_item for both views
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render
from django.utils import timezone

from qrurls.models import URL, URLItem

"""
    Public frontend UI.
"""

class URLNotFound (Http404):
    pass

class URLItemNotFound (Http404):
    pass

def _get_url_item (shorturl=None, shorturl_id=None, item_id=None, related=()) :
    # JOIN against shorturl, urlimage
    url_item = URLItem.objects.select_related(*related)

    if shorturl:
        url_item = url_item.filter(shorturl__shorturl=shorturl)
    elif shorturl_id:
        shorturl_id = int(shorturl_id)
        url_item = url_item.filter(shorturl__id=shorturl_id)
    else:
        raise URLNotFound()
    
    # match for published items
    now = timezone.now()
    url_item = url_item.filter(published__lt=now).order_by('-published')
    
    if item_id:
        return url_item.get(id=int(item_id))
    else:
        # most recent
        try:
            return url_item[0]
        except IndexError:
            raise URLItemNotFound()

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

def shorturl (request, **opts) :
    """
        Primary frontend for redirecting based on current time.
    """

    url_item = _get_url_item(**opts)

    # redirect, either directly, or to image()
    return HttpResponseRedirect(url_item.get_absolute_url())
    
def item (request, **opts) :
    """
        Frontend for a specific item.
    """

    url_item = _get_url_item(related=('shorturl', 'image',), **opts)

    if url_item.url :
        return 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(
            title   = title,
            image   = url_item.image,
        ))
    else :
        raise Http404()