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()