qrurls/models.py
changeset 80 3aaac91a6654
parent 78 7e40b1d2be3e
child 81 3a2fdc820c41
--- a/qrurls/models.py	Fri Sep 06 01:36:33 2013 +0300
+++ b/qrurls/models.py	Sat Sep 07 15:35:56 2013 +0300
@@ -1,5 +1,6 @@
 import datetime
 import hashlib
+import logging
 import os.path
 
 from django.db import models
@@ -9,6 +10,8 @@
 from django.contrib.sites.models import get_current_site
 from django.utils import timezone
 
+log = logging.getLogger('qrurls.models')
+
 QRCODE_API = 'https://chart.googleapis.com/chart?cht=qr&chs={width}x{height}&chl={url}&chld=H'
 IMAGES_MEDIA = 'qrurls-images'
 
@@ -179,6 +182,41 @@
         verbose_name_plural = u"URL Items"
         ordering = ['published']
 
+    @classmethod
+    def search (cls, shorturl=None, shorturl_id=None, item_id=None, related=()) :
+        """
+            Return the URLItem for a given shorturl, either the given specific one,
+            or the latest, from the database.
+
+            Raises URLItem.NotFound
+        """
+        # JOIN against shorturl, urlimage
+        url_item = cls.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 cls.DoesNotExist()
+        
+        # match for published items
+        now = timezone.now()
+        url_item = url_item.filter(published__lt=now).order_by('-published')
+        
+        log.info("Search URLItem @ %s", now)
+       
+        if item_id :
+            # specific, but still the published on
+            return url_item.get(id=int(item_id)) # raises DoesNotExist
+        else :
+            # most recent
+            try:
+                return url_item[0]
+            except IndexError:
+                raise DoesNotExist()
+
     def get_absolute_url (self) :
         if self.url :
             return self.url