qrurls/views.py
changeset 71 04f4f312d4ad
parent 70 e8a8d490df2f
child 72 ea7a5a5ce7d4
--- 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 :