--- a/qrurls/views.py Mon Sep 02 02:31:55 2013 +0300
+++ b/qrurls/views.py Mon Sep 02 02:50:16 2013 +0300
@@ -8,21 +8,36 @@
Public frontend UI.
"""
-def _get_url_feed (shorturl=None, shorturl_id=None) :
- if shorturl :
- shorturl = shorturl.strip(' /')
- try :
- return URL.objects.get(shorturl=shorturl)
- except URL.DoesNotExist :
- raise Http404()
- elif shorturl_id :
- shorturl_id = int(shorturl_id.strip(' /'))
- try :
- return URL.objects.get(id=shorturl_id)
- except URL.DoesNotExist :
- raise Http404()
- else :
- raise Http404()
+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()
@@ -30,44 +45,23 @@
urls = urls,
))
-def shorturl (request, shorturl=None, shorturl_id=None) :
+def shorturl (request, **opts) :
"""
Primary frontend for redirecting based on current time.
"""
-
- # JOIN against shorturl
- url_item = URLItem.objects.select_related()
-
- if shorturl:
- shorturl = shorturl.strip(' /')
- url_item = url_item.filter(shorturl__shorturl=shorturl)
- elif shorturl_id:
- shorturl_id = int(shorturl_id.strip(' /'))
- url_item = url_item.filter(shorturl__id=shorturl_id)
- else:
- raise Http404()
-
- # match for most recent item
- now = timezone.now()
- url_item = url_item.filter(published__lt=now).order_by('-published')
-
- try:
- url_item = url_item[0]
- except IndexError:
- raise Http404()
+
+ url_item = _get_url_item(**opts)
# redirect, either directly, or to image()
return HttpResponseRedirect(url_item.get_absolute_url())
-def item (request, shorturl, item_id) :
- url_feed = _get_url_feed(shorturl=shorturl)
+def item (request, **opts) :
+ """
+ Frontend for a specific item.
+ """
- now = timezone.now()
- try :
- url_item = URLItem.objects.get(shorturl=url_feed, id=int(item_id), published__lt=now)
- except URLItem.DoesNotExist :
- raise Http404()
-
+ url_item = _get_url_item(related=('shorturl', 'image',), **opts)
+
if url_item.url :
return HttpResponseRedirect(url_item.url)
elif url_item.image :